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 [
'user_model' => \App\Models\User::class,
'guard' => null,
];

View File

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

View File

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

View File

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

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 IICN\Subscription\Http\Controllers\Controller;
use IICN\Subscription\Subscription;
use Illuminate\Support\Facades\Auth;
class Test extends Controller
{
public function __invoke()
{
$user = User::query()->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);
}
}

View File

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

View File

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

View File

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

View File

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

View File

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