This commit is contained in:
saeid 2024-01-20 03:12:25 +03:30
parent be3f7bb67f
commit 899a77e49e
11 changed files with 119 additions and 79 deletions

View File

@ -2,4 +2,6 @@
return [ return [
'user_model' => \App\Models\User::class, 'user_model' => \App\Models\User::class,
'guard' => null,
]; ];

View File

@ -15,7 +15,6 @@ return new class extends Migration
$table->id(); $table->id();
$table->string('slug'); $table->string('slug');
$table->string('name'); $table->string('name');
$table->string('condition_class')->nullable();
$table->string('type'); $table->string('type');
$table->unsignedInteger('count')->default(999999); $table->unsignedInteger('count')->default(999999);
$table->unsignedInteger('subscription_id')->nullable(); $table->unsignedInteger('subscription_id')->nullable();

View File

@ -15,7 +15,7 @@ return new class extends Migration
$table->id(); $table->id();
$table->unsignedBigInteger('subscription_ability_id'); $table->unsignedBigInteger('subscription_ability_id');
$table->unsignedBigInteger('user_id'); $table->unsignedBigInteger('user_id');
$table->enum('type', ['used', 'rollback']); $table->enum('type', ['used', 'rollback', 'new']);
$table->timestamps(); $table->timestamps();
}); });
} }

View File

@ -3,87 +3,49 @@
namespace IICN\Subscription\Concerns; namespace IICN\Subscription\Concerns;
use Carbon\Carbon; use Carbon\Carbon;
use IICN\Subscription\Models\Subscription;
use IICN\Subscription\Models\SubscriptionUser; use IICN\Subscription\Models\SubscriptionUser;
use IICN\Subscription\SubscriptionBuilder; use IICN\Subscription\Services\Subscription;
use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\BelongsToMany;
trait ManagesSubscriptions trait ManagesSubscriptions
{ {
/** public function newSubscription(int $subscription_id): bool
* Begin creating a new subscription.
*
* @param string $type
* @param string|string[] $prices
* @return \Laravel\Cashier\SubscriptionBuilder
*/
public function newSubscription($type, $prices = [])
{ {
// return new SubscriptionBuilder($this, $type, $prices); $subscription = new Subscription($this);
return $subscription->create($subscription_id);
} }
/** public function useSubscription(string $type): bool
* Determine if the Stripe model has a given subscription.
*
* @param string $type
* @return bool
*/
public function useSubscribe(string $type)
{ {
$subscription = $this->activeSubscriptionsWithType($type); $subscription = new Subscription($this);
if (! isset($subscription[0]) ) { return $subscription->used($type);
return false;
} }
// $subscription->pivot->remaining_number[$type] = $subscription->pivot->remaining_number[$type] - 1; public function getActiveSubscriptionsWithTypeAndHasCount(string $type): array
// {
// $subscription->pivot->save(); $subscription = new Subscription($this);
return true; return $subscription->getActiveWithCount($type);
} }
/** public function activeSubscriptionsWithType(string $type): BelongsToMany
* Get a subscription instance by $type.
*
* @param string $type
* @return BelongsToMany
*/
public function activeSubscriptionsWithType(string $type): array
{ {
$subscriptions = $this->activeSubscriptions()->whereHas('subscriptionAbilities', function ($query) use ($type) { return $this->activeSubscriptions()->whereHas('subscriptionAbilities', function ($query) use ($type) {
$query->where('type', $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 public function activeSubscriptions(): BelongsToMany
{ {
return $this->subscriptions()->wherePivot('expiry_at', '>', Carbon::now()); return $this->subscriptions()->wherePivot('expiry_at', '>', Carbon::now());
} }
/**
* Get all of the subscriptions for the Stripe model.
*
* @return BelongsToMany
*/
public function subscriptions(): BelongsToMany public function subscriptions(): BelongsToMany
{ {
return $this->belongsToMany(\IICN\Subscription\Models\Subscription::class, SubscriptionUser::class, 'user_id', 'subscription_id') 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'); ->orderBy('pivot_created_at');
} }
} }

14
src/HasSubscription.php Normal file
View File

@ -0,0 +1,14 @@
<?php
namespace IICN\Subscription;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
interface HasSubscription
{
public function subscriptions(): BelongsToMany;
public function activeSubscriptions(): BelongsToMany;
public function activeSubscriptionsWithType(string $type): BelongsToMany;
}

View File

@ -5,14 +5,14 @@ namespace IICN\Subscription\Http\Controllers\Test;
use App\Models\User; use App\Models\User;
use IICN\Subscription\Http\Controllers\Controller; use IICN\Subscription\Http\Controllers\Controller;
use IICN\Subscription\Subscription; use IICN\Subscription\Subscription;
use Illuminate\Support\Facades\Auth;
class Test extends Controller class Test extends Controller
{ {
public function __invoke() public function __invoke()
{ {
$user = User::query()->with("subscriptions")->find(2); $user = User::query()->with('subscriptions')->find(1);
return $user->useSubscription("Istikhara");
return $user->useSubscribe("istikhara"); $user->newSubscription(1);
return $user->SubscriptionremaningNumber("istikhara");
} }
} }

View File

@ -3,8 +3,7 @@
namespace IICN\Subscription\Http\Middleware; namespace IICN\Subscription\Http\Middleware;
use Closure; use Closure;
use IICN\Subscription\Facades\Subscription; use IICN\Subscription\Subscription;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
class ValidateSubscription class ValidateSubscription
{ {
@ -22,7 +21,7 @@ class ValidateSubscription
if (Subscription::canUse($type)) { if (Subscription::canUse($type)) {
return $next($request); return $next($request);
} else { } else {
abort(403);
} }
} }
} }

View File

@ -15,4 +15,8 @@ class SubscriptionUser extends Pivot
protected $fillable = [ protected $fillable = [
'user_id', 'subscription_id', 'created_at', 'expiry_at', 'remaining_number' 'user_id', 'subscription_id', 'created_at', 'expiry_at', 'remaining_number'
]; ];
protected $casts = [
'remaining_number' => 'json'
];
} }

View File

@ -2,21 +2,73 @@
namespace IICN\Subscription\Services; namespace IICN\Subscription\Services;
use Carbon\Carbon;
use IICN\Subscription\HasSubscription;
class Subscription 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"; return isset($this->getActiveWithCount($type)[0]);
}
public function rollback($type)
{
return "Hello, Greetings";
} }
} }

View File

@ -4,9 +4,9 @@ namespace IICN\Subscription;
use Illuminate\Support\Facades\Facade; 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 used(string $type)
* @method static \IICN\Subscription\Services\Subscription canUse(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 * @see \IICN\Subscription\Services\Subscription
*/ */

View File

@ -2,6 +2,8 @@
namespace IICN\Subscription; namespace IICN\Subscription;
use App\Models\User;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\ServiceProvider; use Illuminate\Support\ServiceProvider;
class SubscriptionServiceProvider extends ServiceProvider class SubscriptionServiceProvider extends ServiceProvider
@ -33,9 +35,15 @@ class SubscriptionServiceProvider extends ServiceProvider
__DIR__.'/../config/subscription.php', 'subscription' __DIR__.'/../config/subscription.php', 'subscription'
); );
$this->app->bind('subscription',function(){ // $this->app->bind('subscription',function() {
return new \IICN\Subscription\Services\Subscription(); // 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());
// }
// });
} }
/** /**