diff --git a/database/factories/UserLimitationFactory.php b/database/factories/UserLimitationFactory.php new file mode 100644 index 00000000..0dcd51af --- /dev/null +++ b/database/factories/UserLimitationFactory.php @@ -0,0 +1,30 @@ + $this->faker->uuid, + 'max_storage_amount' => $this->faker->randomElement([100, 200, 300]), + 'max_team_members' => $this->faker->randomElement([10, 20, 30]), + ]; + } +} diff --git a/src/App/Users/Actions/CreateNewUserAction.php b/src/App/Users/Actions/CreateNewUserAction.php index 0de3e8b8..009b87bd 100644 --- a/src/App/Users/Actions/CreateNewUserAction.php +++ b/src/App/Users/Actions/CreateNewUserAction.php @@ -3,7 +3,6 @@ namespace App\Users\Actions; use App\Users\Models\User; use Illuminate\Http\Response; -use App\Users\Models\UserSettings; use App\Http\Controllers\Controller; use Illuminate\Auth\Events\Registered; use App\Users\Requests\RegisterUserRequest; diff --git a/src/App/Users/Models/User.php b/src/App/Users/Models/User.php index 39367bd7..7c821138 100644 --- a/src/App/Users/Models/User.php +++ b/src/App/Users/Models/User.php @@ -1,5 +1,4 @@ $this->usedCapacity, 'used_formatted' => Metric::bytes($this->usedCapacity)->format(), @@ -101,7 +100,7 @@ class User extends Authenticatable implements MustVerifyEmail } return [ - 'used' => (float)get_storage_fill_percentage($this->usedCapacity, $this->limitations->max_storage_amount), + 'used' => (float) get_storage_fill_percentage($this->usedCapacity, $this->limitations->max_storage_amount), 'used_formatted' => get_storage_fill_percentage($this->usedCapacity, $this->limitations->max_storage_amount) . '%', 'capacity' => $this->limitations->max_storage_amount, 'capacity_formatted' => format_gigabytes($this->limitations->max_storage_amount), @@ -114,7 +113,7 @@ class User extends Authenticatable implements MustVerifyEmail public function getUsedCapacityAttribute(): int { return $this->filesWithTrashed - ->map(fn($item) => $item->getRawOriginal())->sum('filesize'); + ->map(fn ($item) => $item->getRawOriginal())->sum('filesize'); } /** diff --git a/src/App/Users/Models/UserLimitation.php b/src/App/Users/Models/UserLimitation.php index 5393a160..1089d80b 100644 --- a/src/App/Users/Models/UserLimitation.php +++ b/src/App/Users/Models/UserLimitation.php @@ -2,9 +2,13 @@ namespace App\Users\Models; use Illuminate\Database\Eloquent\Model; +use Database\Factories\UserLimitationFactory; +use Illuminate\Database\Eloquent\Factories\HasFactory; class UserLimitation extends Model { + use HasFactory; + public $timestamps = false; protected $guarded = []; @@ -16,4 +20,9 @@ class UserLimitation extends Model public $incrementing = false; protected $keyType = 'string'; + + protected static function newFactory(): UserLimitationFactory + { + return UserLimitationFactory::new(); + } } diff --git a/src/App/Users/Resources/SettingsResource.php b/src/App/Users/Resources/SettingsResource.php index 65aecd8f..02e03711 100644 --- a/src/App/Users/Resources/SettingsResource.php +++ b/src/App/Users/Resources/SettingsResource.php @@ -31,6 +31,4 @@ class SettingsResource extends JsonResource ], ]; } - - } diff --git a/src/App/Users/Resources/UserResource.php b/src/App/Users/Resources/UserResource.php index 0c6efd34..c30e0502 100644 --- a/src/App/Users/Resources/UserResource.php +++ b/src/App/Users/Resources/UserResource.php @@ -1,5 +1,4 @@ [ 'id' => $this->id, 'type' => 'limitations', - 'data' => [ + 'data' => [ 'attributes' => $this->limitations, ], ], - $this->mergeWhen($this->hasSubscription(), fn() => [ + $this->mergeWhen($this->hasSubscription(), fn () => [ 'subscription' => new SubscriptionResource($this->subscription), ]), ], ], ]; } - - } diff --git a/src/Domain/Admin/Controllers/Users/UserController.php b/src/Domain/Admin/Controllers/Users/UserController.php index 3e33139c..a5b1a860 100644 --- a/src/Domain/Admin/Controllers/Users/UserController.php +++ b/src/Domain/Admin/Controllers/Users/UserController.php @@ -3,7 +3,6 @@ namespace Domain\Admin\Controllers\Users; use App\Users\Models\User; use Illuminate\Http\Response; -use App\Users\Models\UserSettings; use App\Http\Controllers\Controller; use App\Users\Resources\UserResource; use App\Users\Resources\UsersCollection; diff --git a/src/Support/Listeners/SubscriptionEventSubscriber.php b/src/Support/Listeners/SubscriptionEventSubscriber.php index 39c38496..c32a3923 100644 --- a/src/Support/Listeners/SubscriptionEventSubscriber.php +++ b/src/Support/Listeners/SubscriptionEventSubscriber.php @@ -1,5 +1,4 @@ user->limitations()->update([ - 'max_storage_amount' => $subscription->feature('max_storage_amount'), - 'max_team_members' => $subscription->feature('max_team_members'), + $event->subscription->user->limitations()->update([ + 'max_storage_amount' => $event->subscription->feature('max_storage_amount'), + 'max_team_members' => $event->subscription->feature('max_team_members'), ]); } - public function handleSubscriptionWasUpdated($subscription) + public function handleSubscriptionWasUpdated($event) { - $subscription->user->limitations()->update([ - 'max_storage_amount' => $subscription->feature('max_storage_amount'), - 'max_team_members' => $subscription->feature('max_team_members'), + $event->subscription->user->limitations()->update([ + 'max_storage_amount' => $event->subscription->feature('max_storage_amount'), + 'max_team_members' => $event->subscription->feature('max_team_members'), ]); } - public function handleSubscriptionWasExpired($subscription) + public function handleSubscriptionWasExpired($event) { - $subscription->user->limitations()->update([ - 'max_storage_amount' => get_settings('default_storage_amount'), + $event->subscription->user->limitations()->update([ + 'max_storage_amount' => get_settings('default_storage_amount') ?? 1, 'max_team_members' => 5, ]); } diff --git a/tests/App/Users/SignFlowTest.php b/tests/App/Users/SignFlowTest.php index f046a797..40fbd51a 100644 --- a/tests/App/Users/SignFlowTest.php +++ b/tests/App/Users/SignFlowTest.php @@ -1,5 +1,4 @@ [ 'id' => $user->id, 'type' => 'limitations', - 'data' => [ + 'data' => [ 'attributes' => $user->limitations, ], ], diff --git a/tests/App/Users/UserSubscriptionTest.php b/tests/App/Users/UserSubscriptionTest.php new file mode 100644 index 00000000..93d8ba89 --- /dev/null +++ b/tests/App/Users/UserSubscriptionTest.php @@ -0,0 +1,102 @@ +has(PlanFeature::factory() + ->count(2) + ->sequence( + [ + 'key' => 'max_storage_amount', + 'value' => 200, + ], + [ + 'key' => 'max_team_members', + 'value' => 20, + ], + ), 'features') + ->create(); + + $user = User::factory() + ->hasSubscription([ + 'plan_id' => $plan->id, + ]) + ->create(); + + SubscriptionWasCreated::dispatch($user->subscription); + + $this->assertDatabaseHas('user_limitations', [ + 'max_storage_amount' => 200, + 'max_team_members' => 20, + ]); + } + /** + * @test + */ + public function it_set_user_limitations_for_updated_subscription() + { + $plan = Plan::factory() + ->has(PlanFeature::factory() + ->count(2) + ->sequence( + [ + 'key' => 'max_storage_amount', + 'value' => 200, + ], + [ + 'key' => 'max_team_members', + 'value' => 20, + ], + ), 'features') + ->create(); + + $user = User::factory() + ->hasSubscription([ + 'plan_id' => $plan->id, + ]) + ->create(); + + SubscriptionWasUpdated::dispatch($user->subscription); + + $this->assertDatabaseHas('user_limitations', [ + 'max_storage_amount' => 200, + 'max_team_members' => 20, + ]); + } + + /** + * @test + */ + public function it_set_user_limitations_for_expired_subscription() + { + $user = User::factory() + ->hasSubscription() + ->create(); + + $user->limitations()->update([ + 'max_storage_amount' => 200, + 'max_team_members' => 20, + ]); + + SubscriptionWasExpired::dispatch($user->subscription); + + $this->assertDatabaseHas('user_limitations', [ + 'max_storage_amount' => 1, + 'max_team_members' => 5, + ]); + } +}