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->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();
});
}

View File

@ -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');
}
}

View File

@ -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");
}
}

View File

@ -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

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'
];
}