diff --git a/config/subscription.php b/config/subscription.php index da97947..63ace6d 100644 --- a/config/subscription.php +++ b/config/subscription.php @@ -2,4 +2,6 @@ return [ 'user_model' => \App\Models\User::class, + + 'guard' => null, ]; diff --git a/database/migrations/2024_01_14_164441_create_subscription_abilities_table.php b/database/migrations/2024_01_14_164441_create_subscription_abilities_table.php index 050f3fa..c3f39ff 100644 --- a/database/migrations/2024_01_14_164441_create_subscription_abilities_table.php +++ b/database/migrations/2024_01_14_164441_create_subscription_abilities_table.php @@ -15,7 +15,6 @@ return new class extends Migration $table->id(); $table->string('slug'); $table->string('name'); - $table->string('condition_class')->nullable(); $table->string('type'); $table->unsignedInteger('count')->default(999999); $table->unsignedInteger('subscription_id')->nullable(); diff --git a/database/migrations/2024_01_14_164441_create_subscription_logs_table.php b/database/migrations/2024_01_14_164441_create_subscription_logs_table.php index c267ce1..f621212 100644 --- a/database/migrations/2024_01_14_164441_create_subscription_logs_table.php +++ b/database/migrations/2024_01_14_164441_create_subscription_logs_table.php @@ -15,7 +15,7 @@ return new class extends Migration $table->id(); $table->unsignedBigInteger('subscription_ability_id'); $table->unsignedBigInteger('user_id'); - $table->enum('type', ['used', 'rollback']); + $table->enum('type', ['used', 'rollback', 'new']); $table->timestamps(); }); } diff --git a/src/Concerns/ManagesSubscriptions.php b/src/Concerns/ManagesSubscriptions.php index 5c815a4..30143e7 100644 --- a/src/Concerns/ManagesSubscriptions.php +++ b/src/Concerns/ManagesSubscriptions.php @@ -3,87 +3,49 @@ namespace IICN\Subscription\Concerns; use Carbon\Carbon; -use IICN\Subscription\Models\Subscription; use IICN\Subscription\Models\SubscriptionUser; -use IICN\Subscription\SubscriptionBuilder; +use IICN\Subscription\Services\Subscription; use Illuminate\Database\Eloquent\Relations\BelongsToMany; trait ManagesSubscriptions { - /** - * Begin creating a new subscription. - * - * @param string $type - * @param string|string[] $prices - * @return \Laravel\Cashier\SubscriptionBuilder - */ - public function newSubscription($type, $prices = []) + public function newSubscription(int $subscription_id): bool { -// return new SubscriptionBuilder($this, $type, $prices); + $subscription = new Subscription($this); + + return $subscription->create($subscription_id); } - /** - * Determine if the Stripe model has a given subscription. - * - * @param string $type - * @return bool - */ - public function useSubscribe(string $type) + public function useSubscription(string $type): bool { - $subscription = $this->activeSubscriptionsWithType($type); + $subscription = new Subscription($this); - if (! isset($subscription[0]) ) { - return false; - } - -// $subscription->pivot->remaining_number[$type] = $subscription->pivot->remaining_number[$type] - 1; -// -// $subscription->pivot->save(); - - return true; + return $subscription->used($type); } - /** - * Get a subscription instance by $type. - * - * @param string $type - * @return BelongsToMany - */ - public function activeSubscriptionsWithType(string $type): array + public function getActiveSubscriptionsWithTypeAndHasCount(string $type): array { - $subscriptions = $this->activeSubscriptions()->whereHas('subscriptionAbilities', function ($query) use ($type) { + $subscription = new Subscription($this); + + return $subscription->getActiveWithCount($type); + } + + public function activeSubscriptionsWithType(string $type): BelongsToMany + { + return $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 BelongsToMany - */ public function subscriptions(): BelongsToMany { return $this->belongsToMany(\IICN\Subscription\Models\Subscription::class, SubscriptionUser::class, 'user_id', 'subscription_id') - ->withPivot(['expiry_at', 'remaining_number'])->withTimestamps() + ->withPivot(['expiry_at', 'remaining_number', 'id'])->withTimestamps() ->orderBy('pivot_created_at'); } } diff --git a/src/HasSubscription.php b/src/HasSubscription.php new file mode 100644 index 0000000..6124d6b --- /dev/null +++ b/src/HasSubscription.php @@ -0,0 +1,14 @@ +with("subscriptions")->find(2); - - return $user->useSubscribe("istikhara"); - return $user->SubscriptionremaningNumber("istikhara"); + $user = User::query()->with('subscriptions')->find(1); + return $user->useSubscription("Istikhara"); + $user->newSubscription(1); } } diff --git a/src/Http/Middlware/ValidateSubscription.php b/src/Http/Middleware/ValidateSubscription.php similarity index 82% rename from src/Http/Middlware/ValidateSubscription.php rename to src/Http/Middleware/ValidateSubscription.php index 4ababe1..32ef904 100644 --- a/src/Http/Middlware/ValidateSubscription.php +++ b/src/Http/Middleware/ValidateSubscription.php @@ -3,8 +3,7 @@ namespace IICN\Subscription\Http\Middleware; use Closure; -use IICN\Subscription\Facades\Subscription; -use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; +use IICN\Subscription\Subscription; class ValidateSubscription { @@ -22,7 +21,7 @@ class ValidateSubscription if (Subscription::canUse($type)) { return $next($request); } else { - + abort(403); } } } diff --git a/src/Models/SubscriptionUser.php b/src/Models/SubscriptionUser.php index c9a0423..72e53ed 100644 --- a/src/Models/SubscriptionUser.php +++ b/src/Models/SubscriptionUser.php @@ -15,4 +15,8 @@ class SubscriptionUser extends Pivot protected $fillable = [ 'user_id', 'subscription_id', 'created_at', 'expiry_at', 'remaining_number' ]; + + protected $casts = [ + 'remaining_number' => 'json' + ]; } diff --git a/src/Services/Subscription.php b/src/Services/Subscription.php index d3cea63..e68ad7a 100644 --- a/src/Services/Subscription.php +++ b/src/Services/Subscription.php @@ -2,21 +2,73 @@ namespace IICN\Subscription\Services; +use Carbon\Carbon; +use IICN\Subscription\HasSubscription; + class Subscription { - public function used($type) + + public function __construct(protected HasSubscription $model) { - return "Hello, Greetings"; + } + + public function create(int $subscription_id): bool + { + $subscription = \IICN\Subscription\Models\Subscription::query()->find($subscription_id); + + if (isset($subscription->id)) { + $expiryAt = Carbon::now()->addDays($subscription->duration_day); + + $data = []; + foreach ($subscription->subscriptionAbilities as $ability) { + $data[$ability->type] = $ability->count; + } + + $this->model->subscriptions()->attach($subscription_id, ['expiry_at' => $expiryAt, 'remaining_number' => $data]); + + return true; + } + + return false; + } + + public function used(string $type): bool + { + $subscription = $this->getActiveWithCount($type); + + if (! isset($subscription[0]) ) { + return false; + } + + $data = $subscription[0]->pivot->remaining_number; + + $data[$type] = ((int) ($data[$type]) - 1); + + $subscription[0]->pivot->remaining_number = $data; + + $subscription[0]->pivot->save(); + + return true; + } + + public function getActiveWithCount(string $type): array + { + $subscriptions = $this->model->activeSubscriptionsWithType($type)->get(); + + $activeSubscriptions = []; + + foreach ($subscriptions as $subscription) { + if (isset($subscription->pivot->remaining_number[$type]) and (int) $subscription->pivot->remaining_number[$type] > 0) { + $activeSubscriptions[] = $subscription; + } + } + + return $activeSubscriptions; } - public function canUse($type) + public function canUse(string $type): bool { - return "Hello, Greetings"; - } - - public function rollback($type) - { - return "Hello, Greetings"; + return isset($this->getActiveWithCount($type)[0]); } } diff --git a/src/Subscription.php b/src/Subscription.php index 69d51e0..505826d 100644 --- a/src/Subscription.php +++ b/src/Subscription.php @@ -4,9 +4,9 @@ namespace IICN\Subscription; use Illuminate\Support\Facades\Facade; /** + * @method static \IICN\Subscription\Services\Subscription create(int $subscription_id) * @method static \IICN\Subscription\Services\Subscription used(string $type) * @method static \IICN\Subscription\Services\Subscription canUse(string $type) - * @method static \IICN\Subscription\Services\Subscription rollback(string $type) * * @see \IICN\Subscription\Services\Subscription */ diff --git a/src/SubscriptionServiceProvider.php b/src/SubscriptionServiceProvider.php index aab5035..c7f489d 100644 --- a/src/SubscriptionServiceProvider.php +++ b/src/SubscriptionServiceProvider.php @@ -2,6 +2,8 @@ namespace IICN\Subscription; +use App\Models\User; +use Illuminate\Support\Facades\Auth; use Illuminate\Support\ServiceProvider; class SubscriptionServiceProvider extends ServiceProvider @@ -33,9 +35,15 @@ class SubscriptionServiceProvider extends ServiceProvider __DIR__.'/../config/subscription.php', 'subscription' ); - $this->app->bind('subscription',function(){ - return new \IICN\Subscription\Services\Subscription(); - }); +// $this->app->bind('subscription',function() { +// if (Auth::guard(config('subscription.guard'))->check() and +// Auth::guard(config('subscription.guard'))->hasUser() and +// Auth::guard(config('subscription.guard'))->user() instanceof HasSubscription +// ) { +// return new \IICN\Subscription\Services\Subscription(Auth::guard(config('subscription.guard'))->user()); +// } +// }); + } /**