From be3f7bb67f56652a426084f23b39b95a55a66848 Mon Sep 17 00:00:00 2001 From: aliqasemi Date: Wed, 17 Jan 2024 21:41:40 +0330 Subject: [PATCH] fix --- ..._153625_create_subscription_user_table.php | 4 +- src/Concerns/ManagesSubscriptions.php | 79 ++++++++++--------- src/Http/Controllers/Test/Test.php | 6 +- src/Models/Subscription.php | 10 ++- src/Models/SubscriptionUser.php | 18 +++++ 5 files changed, 76 insertions(+), 41 deletions(-) create mode 100644 src/Models/SubscriptionUser.php diff --git a/database/migrations/2024_01_14_153625_create_subscription_user_table.php b/database/migrations/2024_01_14_153625_create_subscription_user_table.php index 58a0f27..c8c0dff 100644 --- a/database/migrations/2024_01_14_153625_create_subscription_user_table.php +++ b/database/migrations/2024_01_14_153625_create_subscription_user_table.php @@ -15,9 +15,9 @@ return new class extends Migration $table->id(); $table->unsignedInteger('user_id'); $table->unsignedInteger('subscription_id'); - $table->unsignedInteger('remaining_number')->default(0); + $table->json('remaining_number'); $table->timestamp('expiry_at')->nullable(); - $table->timestamp('created_at'); + $table->timestamps(); }); } diff --git a/src/Concerns/ManagesSubscriptions.php b/src/Concerns/ManagesSubscriptions.php index ccf3744..5c815a4 100644 --- a/src/Concerns/ManagesSubscriptions.php +++ b/src/Concerns/ManagesSubscriptions.php @@ -3,7 +3,10 @@ namespace IICN\Subscription\Concerns; use Carbon\Carbon; +use IICN\Subscription\Models\Subscription; +use IICN\Subscription\Models\SubscriptionUser; use IICN\Subscription\SubscriptionBuilder; +use Illuminate\Database\Eloquent\Relations\BelongsToMany; trait ManagesSubscriptions { @@ -19,64 +22,68 @@ trait ManagesSubscriptions // return new SubscriptionBuilder($this, $type, $prices); } - /** - * Get the ending date of the trial. - * - * @param string $type - * @return \Illuminate\Support\Carbon|null - */ - public function trialEndsAt($type = 'default') - { -// if (func_num_args() === 0 && $this->onGenericTrial()) { -// return $this->trial_ends_at; -// } -// -// if ($subscription = $this->subscription($type)) { -// return $subscription->trial_ends_at; -// } -// -// return $this->trial_ends_at; - } - /** * Determine if the Stripe model has a given subscription. * * @param string $type * @return bool */ - public function useSubscribe($type) + public function useSubscribe(string $type) { -// $subscription = $this->subscription($type); + $subscription = $this->activeSubscriptionsWithType($type); + + if (! isset($subscription[0]) ) { + return false; + } + +// $subscription->pivot->remaining_number[$type] = $subscription->pivot->remaining_number[$type] - 1; // -// if (! $subscription || ! $subscription->valid()) { -// return false; -// } -// -// return $subscription->hasPrice($price); +// $subscription->pivot->save(); + + return true; } /** * Get a subscription instance by $type. * * @param string $type - * @return \Laravel\Cashier\Subscription|null + * @return BelongsToMany */ - public function activeSubscriptions() + public function activeSubscriptionsWithType(string $type): array { - return $this->subscriptions->where(function ($query) { - $query->wherePivot('expiry_at', '>', Carbon::now())->orWherePivotNull('expiry_at'); - })->wherePivot('remaining_number', '>', 0); + $subscriptions = $this->activeSubscriptions()->whereHas('subscriptionAbilities', function ($query) use ($type) { + $query->where('type', $type); + })->get(); + + $activeSubscriptions = []; + foreach ($subscriptions as $subscription) { + if (isset($subscription->pivot->remaining_number[$type]) and $subscription->pivot->remaining_number[$type] > 0) { + $activeSubscriptions[] = $subscription->pivot->remaining_number[$type]; + } + } + + return $activeSubscriptions; + } + + /** + * Get a subscription instance by $type. + * + * @return BelongsToMany + */ + public function activeSubscriptions(): BelongsToMany + { + return $this->subscriptions()->wherePivot('expiry_at', '>', Carbon::now()); } /** * Get all of the subscriptions for the Stripe model. * - * @return \Illuminate\Database\Eloquent\Relations\HasMany + * @return BelongsToMany */ - public function subscriptions() + public function subscriptions(): BelongsToMany { - return $this->belongsToMany(\IICN\Subscription\Models\Subscription::class, 'subscription_user', 'user_id', 'subscription_id') - ->with(['created_at', 'expiry_at', 'remaining_number']) - ->orderBy('created_at'); + return $this->belongsToMany(\IICN\Subscription\Models\Subscription::class, SubscriptionUser::class, 'user_id', 'subscription_id') + ->withPivot(['expiry_at', 'remaining_number'])->withTimestamps() + ->orderBy('pivot_created_at'); } } diff --git a/src/Http/Controllers/Test/Test.php b/src/Http/Controllers/Test/Test.php index 2a4fca8..de6f926 100644 --- a/src/Http/Controllers/Test/Test.php +++ b/src/Http/Controllers/Test/Test.php @@ -2,6 +2,7 @@ namespace IICN\Subscription\Http\Controllers\Test; +use App\Models\User; use IICN\Subscription\Http\Controllers\Controller; use IICN\Subscription\Subscription; @@ -9,6 +10,9 @@ class Test extends Controller { public function __invoke() { - return Subscription::canUse('ss'); + $user = User::query()->with("subscriptions")->find(2); + + return $user->useSubscribe("istikhara"); + return $user->SubscriptionremaningNumber("istikhara"); } } diff --git a/src/Models/Subscription.php b/src/Models/Subscription.php index f5f222a..f1d6a3c 100644 --- a/src/Models/Subscription.php +++ b/src/Models/Subscription.php @@ -5,6 +5,7 @@ namespace IICN\Subscription\Models; use Carbon\Carbon; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsToMany; +use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\SoftDeletes; class Subscription extends Model @@ -27,9 +28,14 @@ class Subscription extends Model 'description', ]; - public function users(): BelongsToMany +// public function users(): BelongsToMany +// { +// return $this->belongsToMany(config('subscription.user_model'), 'subscription_user')->with(['created_at', 'expiry_at', 'remaining_number']); +// } + + public function subscriptionAbilities(): HasMany { - return $this->belongsToMany(config('subscription.user_model'), 'subscription_user')->with(['created_at', 'expiry_at', 'remaining_number']); + return $this->hasMany(SubscriptionAbility::class); } public function activeUsers(): BelongsToMany diff --git a/src/Models/SubscriptionUser.php b/src/Models/SubscriptionUser.php new file mode 100644 index 0000000..c9a0423 --- /dev/null +++ b/src/Models/SubscriptionUser.php @@ -0,0 +1,18 @@ + + */ + protected $fillable = [ + 'user_id', 'subscription_id', 'created_at', 'expiry_at', 'remaining_number' + ]; +}