feat: subscriptions
CI / 🧪 Tests Laravel (push) Successful in 2m48s
CI / 🐳 Build & Push Image (push) Successful in 3m0s

This commit is contained in:
2026-08-07 11:53:46 +02:00
parent 99cb0e63e6
commit 2ece4b6e3e
51 changed files with 1489 additions and 254 deletions
+27
View File
@@ -47,6 +47,8 @@ class User extends Authenticatable implements FilamentUser, HasAvatar, HasLocale
'height',
'bio',
'account_verified_at',
'certification_purchased_at',
'trial_ends_at',
'daily_calorie_goal',
'daily_protein_goal',
'daily_carbs_goal',
@@ -82,6 +84,7 @@ class User extends Authenticatable implements FilamentUser, HasAvatar, HasLocale
return [
'email_verified_at' => 'datetime',
'account_verified_at' => 'datetime',
'certification_purchased_at' => 'datetime',
'password' => 'hashed',
'daily_calorie_goal' => 'integer',
'daily_protein_goal' => 'float',
@@ -129,6 +132,11 @@ class User extends Authenticatable implements FilamentUser, HasAvatar, HasLocale
return $this->hasMany(PaymentTransaction::class);
}
public function identityVerificationRequest(): HasOne
{
return $this->hasOne(IdentityVerificationRequest::class);
}
public function workouts(): HasMany
{
return $this->hasMany(WorkoutSessions::class);
@@ -188,6 +196,25 @@ class User extends Authenticatable implements FilamentUser, HasAvatar, HasLocale
return $this->suspended_at !== null;
}
public function canAnalyzeMeals(): bool
{
return $this->subscribed('default') || $this->onGenericTrial();
}
public function analysisAccessLevel(): string
{
if ($this->subscribed('default')) {
return 'subscribed';
}
return $this->onGenericTrial() ? 'trial' : 'free';
}
public function hasPurchasedCertification(): bool
{
return $this->certification_purchased_at !== null;
}
public function routeNotificationForExpoPush(): array
{
return $this->deviceTokens()