This commit is contained in:
aliqasemi 2024-01-17 21:41:40 +03:30
parent 33e8091a34
commit be3f7bb67f
5 changed files with 76 additions and 41 deletions

View File

@ -15,9 +15,9 @@ return new class extends Migration
$table->id(); $table->id();
$table->unsignedInteger('user_id'); $table->unsignedInteger('user_id');
$table->unsignedInteger('subscription_id'); $table->unsignedInteger('subscription_id');
$table->unsignedInteger('remaining_number')->default(0); $table->json('remaining_number');
$table->timestamp('expiry_at')->nullable(); $table->timestamp('expiry_at')->nullable();
$table->timestamp('created_at'); $table->timestamps();
}); });
} }

View File

@ -3,7 +3,10 @@
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\SubscriptionBuilder; use IICN\Subscription\SubscriptionBuilder;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
trait ManagesSubscriptions trait ManagesSubscriptions
{ {
@ -19,64 +22,68 @@ trait ManagesSubscriptions
// return new SubscriptionBuilder($this, $type, $prices); // 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. * Determine if the Stripe model has a given subscription.
* *
* @param string $type * @param string $type
* @return bool * @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()) { // $subscription->pivot->save();
// return false;
// } return true;
//
// return $subscription->hasPrice($price);
} }
/** /**
* Get a subscription instance by $type. * Get a subscription instance by $type.
* *
* @param string $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) { $subscriptions = $this->activeSubscriptions()->whereHas('subscriptionAbilities', function ($query) use ($type) {
$query->wherePivot('expiry_at', '>', Carbon::now())->orWherePivotNull('expiry_at'); $query->where('type', $type);
})->wherePivot('remaining_number', '>', 0); })->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. * 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') return $this->belongsToMany(\IICN\Subscription\Models\Subscription::class, SubscriptionUser::class, 'user_id', 'subscription_id')
->with(['created_at', 'expiry_at', 'remaining_number']) ->withPivot(['expiry_at', 'remaining_number'])->withTimestamps()
->orderBy('created_at'); ->orderBy('pivot_created_at');
} }
} }

View File

@ -2,6 +2,7 @@
namespace IICN\Subscription\Http\Controllers\Test; namespace IICN\Subscription\Http\Controllers\Test;
use App\Models\User;
use IICN\Subscription\Http\Controllers\Controller; use IICN\Subscription\Http\Controllers\Controller;
use IICN\Subscription\Subscription; use IICN\Subscription\Subscription;
@ -9,6 +10,9 @@ class Test extends Controller
{ {
public function __invoke() public function __invoke()
{ {
return Subscription::canUse('ss'); $user = User::query()->with("subscriptions")->find(2);
return $user->useSubscribe("istikhara");
return $user->SubscriptionremaningNumber("istikhara");
} }
} }

View File

@ -5,6 +5,7 @@ namespace IICN\Subscription\Models;
use Carbon\Carbon; use Carbon\Carbon;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\SoftDeletes;
class Subscription extends Model class Subscription extends Model
@ -27,9 +28,14 @@ class Subscription extends Model
'description', '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 public function activeUsers(): BelongsToMany

View File

@ -0,0 +1,18 @@
<?php
namespace IICN\Subscription\Models;
use Illuminate\Database\Eloquent\Relations\Pivot;
class SubscriptionUser extends Pivot
{
/**
* The attributes that are mass assignable.
*
* @var array<int, string>
*/
protected $fillable = [
'user_id', 'subscription_id', 'created_at', 'expiry_at', 'remaining_number'
];
}