fix
This commit is contained in:
parent
be3f7bb67f
commit
899a77e49e
@ -2,4 +2,6 @@
|
|||||||
|
|
||||||
return [
|
return [
|
||||||
'user_model' => \App\Models\User::class,
|
'user_model' => \App\Models\User::class,
|
||||||
|
|
||||||
|
'guard' => null,
|
||||||
];
|
];
|
||||||
|
@ -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();
|
||||||
|
@ -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();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -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
14
src/HasSubscription.php
Normal 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;
|
||||||
|
}
|
@ -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");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -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'
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
@ -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";
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
*/
|
*/
|
||||||
|
@ -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());
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user