From 10bd46a53eb2a7f63dc1fe4dd36eff575e71ffcf Mon Sep 17 00:00:00 2001 From: Daan Meijer Date: Mon, 22 Jun 2026 00:10:39 +0200 Subject: [PATCH] formatting, juiste use voor UpdateDynamicRequest --- app/Events/MutationCreated.php | 1 + app/Events/MutationUpdated.php | 1 + app/Http/Controllers/DynamicController.php | 2 ++ .../DynamicInvitationController.php | 12 +++++---- app/Http/Controllers/LedgerController.php | 2 +- app/Http/Controllers/MutationController.php | 19 ++++++++------ .../Controllers/ParticipantController.php | 5 ++-- .../PredefinedMutationController.php | 1 - app/Http/Middleware/HandleInertiaRequests.php | 6 +++-- app/Http/Requests/UpdateDynamicRequest.php | 4 +-- app/Http/Resources/BaseResource.php | 3 +-- app/Http/Resources/DynamicResource.php | 1 - app/Http/Resources/LedgerResource.php | 1 - app/Http/Resources/MutationResource.php | 1 - .../Resources/PredefinedMutationResource.php | 1 - app/Http/Resources/UserResource.php | 1 - app/Mail/DynamicInvitationMail.php | 14 +++++++---- app/Models/Dynamic.php | 3 ++- app/Models/DynamicInvitation.php | 9 ++++--- app/Models/Ledger.php | 6 +++-- app/Models/Media.php | 11 +++++--- app/Models/Message.php | 4 +-- app/Models/Mutation.php | 15 ++++++----- app/Models/PredefinedMutation.php | 3 ++- app/Models/User.php | 5 ++-- app/Notifications/NewActivityNotification.php | 3 --- app/Providers/AppServiceProvider.php | 2 +- app/Services/ActivityService.php | 18 ++++++------- bootstrap/app.php | 8 +++--- bootstrap/providers.php | 6 +++-- database/factories/DynamicFactory.php | 2 +- database/factories/LedgerFactory.php | 4 +-- database/factories/MessageFactory.php | 2 +- database/factories/MutationFactory.php | 2 +- .../2026_06_15_223630_create_media_table.php | 9 ++++--- ...23640_create_dynamic_invitations_table.php | 9 ++++--- ...6_21_203737_add_uuid_to_dynamics_table.php | 6 +++-- ...06_21_203807_add_uuid_to_ledgers_table.php | 6 +++-- ..._21_203835_add_uuid_to_mutations_table.php | 6 +++-- ...add_uuid_to_predefined_mutations_table.php | 6 +++-- ...6_06_21_204007_add_uuid_to_users_table.php | 6 +++-- ...211120_create_push_subscriptions_table.php | 4 +-- database/seeders/DatabaseSeeder.php | 7 +++--- routes/web.php | 25 +++++++++++-------- tests/Browser/AuthenticationTest.php | 1 - tests/Browser/AuthorizationTest.php | 5 ++-- tests/Browser/RealtimeChatTest.php | 8 +++--- tests/DuskTestCase.php | 4 +-- tests/Feature/DashboardTest.php | 5 ++-- tests/Feature/InvitationTest.php | 4 +-- tests/Feature/LedgerTest.php | 2 +- tests/Feature/MediaTest.php | 6 ++--- tests/Feature/MutationTest.php | 2 +- tests/Feature/ParticipantDetailTest.php | 10 ++++---- tests/Feature/ParticipantTest.php | 4 +-- tests/Feature/PredefinedMutationTest.php | 3 +-- 56 files changed, 174 insertions(+), 142 deletions(-) diff --git a/app/Events/MutationCreated.php b/app/Events/MutationCreated.php index 17f3089..da7e57c 100644 --- a/app/Events/MutationCreated.php +++ b/app/Events/MutationCreated.php @@ -30,6 +30,7 @@ class MutationCreated implements ShouldBroadcast public function broadcastOn(): array { $chatId = $this->mutation->ledger->dynamic->chat->id; + return [ new PrivateChannel('chats.'.$chatId), ]; diff --git a/app/Events/MutationUpdated.php b/app/Events/MutationUpdated.php index 26e1c6e..46ca180 100644 --- a/app/Events/MutationUpdated.php +++ b/app/Events/MutationUpdated.php @@ -30,6 +30,7 @@ class MutationUpdated implements ShouldBroadcast public function broadcastOn(): array { $chatId = $this->mutation->ledger->dynamic->chat->id; + return [ new PrivateChannel('chats.'.$chatId), ]; diff --git a/app/Http/Controllers/DynamicController.php b/app/Http/Controllers/DynamicController.php index 3fef526..f859cea 100644 --- a/app/Http/Controllers/DynamicController.php +++ b/app/Http/Controllers/DynamicController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers; +use App\Http\Requests\UpdateDynamicRequest; use App\Http\Resources\DynamicResource; use App\Http\Resources\LedgerResource; use App\Http\Resources\MessageResource; @@ -15,6 +16,7 @@ use Inertia\Inertia; class DynamicController extends Controller { use AuthorizesRequests; + /** * Display a listing of the resource. */ diff --git a/app/Http/Controllers/DynamicInvitationController.php b/app/Http/Controllers/DynamicInvitationController.php index 6d35a74..2661b00 100644 --- a/app/Http/Controllers/DynamicInvitationController.php +++ b/app/Http/Controllers/DynamicInvitationController.php @@ -5,16 +5,18 @@ namespace App\Http\Controllers; use App\Mail\DynamicInvitationMail; use App\Models\Dynamic; use App\Models\DynamicInvitation; +use App\Models\User; use Illuminate\Foundation\Auth\Access\AuthorizesRequests; use Illuminate\Http\Request; -use Illuminate\Support\Facades\Mail; use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\Mail; use Illuminate\Support\Str; use Inertia\Inertia; class DynamicInvitationController extends Controller { use AuthorizesRequests; + /** * Show the form for creating a new invitation. */ @@ -39,7 +41,7 @@ class DynamicInvitationController extends Controller ->where('role', 'owner') ->exists(); - if (!$isOwner) { + if (! $isOwner) { abort(403, 'Only dynamic owners can invite other users.'); } @@ -92,7 +94,7 @@ class DynamicInvitationController extends Controller public function accept(Request $request, string $token) { // Must be signed! - if (!$request->hasValidSignature()) { + if (! $request->hasValidSignature()) { abort(401, 'Invalid or expired signature.'); } @@ -116,9 +118,9 @@ class DynamicInvitationController extends Controller // Log to Dynamic chat activity log! $dynamic->chat->messages()->create([ 'user_id' => null, - 'content' => "user()->id}> joined the Dynamic as a " . strtoupper($invitation->role), + 'content' => "user()->id}> joined the Dynamic as a ".strtoupper($invitation->role), 'subject_id' => $request->user()->id, - 'subject_type' => \App\Models\User::class, + 'subject_type' => User::class, ]); // Delete the invitation record diff --git a/app/Http/Controllers/LedgerController.php b/app/Http/Controllers/LedgerController.php index c9ac0cb..ee04fc7 100644 --- a/app/Http/Controllers/LedgerController.php +++ b/app/Http/Controllers/LedgerController.php @@ -11,8 +11,8 @@ use App\Http\Resources\UserResource; use App\Models\Dynamic; use App\Models\Ledger; use App\Services\ActivityService; -use Illuminate\Http\Request; use Illuminate\Foundation\Auth\Access\AuthorizesRequests; +use Illuminate\Http\Request; use Inertia\Inertia; class LedgerController extends Controller diff --git a/app/Http/Controllers/MutationController.php b/app/Http/Controllers/MutationController.php index 65da010..7333f8f 100644 --- a/app/Http/Controllers/MutationController.php +++ b/app/Http/Controllers/MutationController.php @@ -2,14 +2,17 @@ namespace App\Http\Controllers; -use App\Http\Resources\MutationResource; +use App\Events\MessageSent; +use App\Events\MutationCreated; +use App\Events\MutationUpdated; use App\Http\Requests\StoreMutationRequest; +use App\Http\Resources\MutationResource; use App\Models\Dynamic; use App\Models\Ledger; use App\Models\Mutation; +use Illuminate\Foundation\Auth\Access\AuthorizesRequests; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; -use Illuminate\Foundation\Auth\Access\AuthorizesRequests; class MutationController extends Controller { @@ -69,7 +72,7 @@ class MutationController extends Controller }); // Broadcast the real-time creation event! - broadcast(new \App\Events\MutationCreated($mutation)); + broadcast(new MutationCreated($mutation)); return redirect()->route('dynamics.ledgers.show', [$dynamic, $ledger]); } @@ -80,7 +83,7 @@ class MutationController extends Controller public function show(Dynamic $dynamic, Ledger $ledger, Mutation $mutation) { $this->authorize('view', $mutation); - + return new MutationResource($mutation); } @@ -127,12 +130,12 @@ class MutationController extends Controller 'subject_id' => $mutation->id, 'subject_type' => Mutation::class, ]); - broadcast(new \App\Events\MessageSent($mutationMsg)); + broadcast(new MessageSent($mutationMsg)); if ($newStatus === 'approved') { $dynamicMsg = $dynamic->chat->messages()->create([ 'user_id' => null, - 'content' => "id}> APPROVED the suggestion \"{$mutation->description}\" for " . ($mutation->amount >= 0 ? '+' : '') . "{$mutation->amount} points on \"{$ledger->name}\" ledger.", + 'content' => "id}> APPROVED the suggestion \"{$mutation->description}\" for ".($mutation->amount >= 0 ? '+' : '')."{$mutation->amount} points on \"{$ledger->name}\" ledger.", 'subject_id' => $mutation->id, 'subject_type' => Mutation::class, ]); @@ -144,10 +147,10 @@ class MutationController extends Controller 'subject_type' => Mutation::class, ]); } - broadcast(new \App\Events\MessageSent($dynamicMsg)); + broadcast(new MessageSent($dynamicMsg)); // Broadcast the real-time update event! - broadcast(new \App\Events\MutationUpdated($mutation)); + broadcast(new MutationUpdated($mutation)); return redirect()->back(); } diff --git a/app/Http/Controllers/ParticipantController.php b/app/Http/Controllers/ParticipantController.php index 040db65..7d937bf 100644 --- a/app/Http/Controllers/ParticipantController.php +++ b/app/Http/Controllers/ParticipantController.php @@ -30,14 +30,14 @@ class ParticipantController extends Controller public function show(Request $request, Dynamic $dynamic, User $user) { // Ensure both the authenticated user and the target user are in the dynamic - if (!$dynamic->participants()->where('user_id', $request->user()->id)->exists()) { + if (! $dynamic->participants()->where('user_id', $request->user()->id)->exists()) { abort(403); } $participant = $dynamic->participants()->where('user_id', $user->id)->firstOrFail(); $mutations = $user->mutations() - ->whereHas('ledger', fn($query) => $query->where('dynamic_id', $dynamic->id)) + ->whereHas('ledger', fn ($query) => $query->where('dynamic_id', $dynamic->id)) ->with('ledger') ->latest('id') ->take(10) @@ -54,5 +54,4 @@ class ParticipantController extends Controller 'mutations' => $mutations, ]); } - } diff --git a/app/Http/Controllers/PredefinedMutationController.php b/app/Http/Controllers/PredefinedMutationController.php index ae02836..4b8151a 100644 --- a/app/Http/Controllers/PredefinedMutationController.php +++ b/app/Http/Controllers/PredefinedMutationController.php @@ -3,7 +3,6 @@ namespace App\Http\Controllers; use App\Models\Dynamic; -use App\Models\Ledger; use App\Models\PredefinedMutation; use Illuminate\Foundation\Auth\Access\AuthorizesRequests; use Illuminate\Http\Request; diff --git a/app/Http/Middleware/HandleInertiaRequests.php b/app/Http/Middleware/HandleInertiaRequests.php index 0043228..f991367 100644 --- a/app/Http/Middleware/HandleInertiaRequests.php +++ b/app/Http/Middleware/HandleInertiaRequests.php @@ -2,6 +2,7 @@ namespace App\Http\Middleware; +use App\Services\ActivityService; use Illuminate\Http\Request; use Inertia\Middleware; @@ -46,8 +47,9 @@ class HandleInertiaRequests extends Middleware if (! $request->user()) { return 0; } - - $service = app(\App\Services\ActivityService::class); + + $service = app(ActivityService::class); + return count($service->getUnreadDynamicsGrouped($request->user())); }, ]; diff --git a/app/Http/Requests/UpdateDynamicRequest.php b/app/Http/Requests/UpdateDynamicRequest.php index 2401284..089f349 100644 --- a/app/Http/Requests/UpdateDynamicRequest.php +++ b/app/Http/Requests/UpdateDynamicRequest.php @@ -5,8 +5,6 @@ namespace App\Http\Requests; use Illuminate\Contracts\Validation\ValidationRule; use Illuminate\Foundation\Http\FormRequest; -use App\Models\Dynamic; - class UpdateDynamicRequest extends FormRequest { /** @@ -22,7 +20,7 @@ class UpdateDynamicRequest extends FormRequest /** * Get the validation rules that apply to the request. * - * @return array + * @return array */ public function rules(): array { diff --git a/app/Http/Resources/BaseResource.php b/app/Http/Resources/BaseResource.php index 1db8906..a4f02da 100644 --- a/app/Http/Resources/BaseResource.php +++ b/app/Http/Resources/BaseResource.php @@ -2,9 +2,8 @@ namespace App\Http\Resources; -use Illuminate\Http\Resources\Json\JsonResource; - use Illuminate\Http\Request; +use Illuminate\Http\Resources\Json\JsonResource; class BaseResource extends JsonResource { diff --git a/app/Http/Resources/DynamicResource.php b/app/Http/Resources/DynamicResource.php index 69b9069..96fdfda 100644 --- a/app/Http/Resources/DynamicResource.php +++ b/app/Http/Resources/DynamicResource.php @@ -3,7 +3,6 @@ namespace App\Http\Resources; use Illuminate\Http\Request; -use Illuminate\Http\Resources\Json\JsonResource; class DynamicResource extends BaseResource { diff --git a/app/Http/Resources/LedgerResource.php b/app/Http/Resources/LedgerResource.php index 1bc420f..5a912b6 100644 --- a/app/Http/Resources/LedgerResource.php +++ b/app/Http/Resources/LedgerResource.php @@ -3,7 +3,6 @@ namespace App\Http\Resources; use Illuminate\Http\Request; -use Illuminate\Http\Resources\Json\JsonResource; class LedgerResource extends BaseResource { diff --git a/app/Http/Resources/MutationResource.php b/app/Http/Resources/MutationResource.php index 2ccdcbf..31cb2a3 100644 --- a/app/Http/Resources/MutationResource.php +++ b/app/Http/Resources/MutationResource.php @@ -3,7 +3,6 @@ namespace App\Http\Resources; use Illuminate\Http\Request; -use Illuminate\Http\Resources\Json\JsonResource; class MutationResource extends BaseResource { diff --git a/app/Http/Resources/PredefinedMutationResource.php b/app/Http/Resources/PredefinedMutationResource.php index 6bb4e96..170bc43 100644 --- a/app/Http/Resources/PredefinedMutationResource.php +++ b/app/Http/Resources/PredefinedMutationResource.php @@ -3,7 +3,6 @@ namespace App\Http\Resources; use Illuminate\Http\Request; -use Illuminate\Http\Resources\Json\JsonResource; class PredefinedMutationResource extends BaseResource { diff --git a/app/Http/Resources/UserResource.php b/app/Http/Resources/UserResource.php index 45b2b35..e771b0c 100644 --- a/app/Http/Resources/UserResource.php +++ b/app/Http/Resources/UserResource.php @@ -3,7 +3,6 @@ namespace App\Http\Resources; use Illuminate\Http\Request; -use Illuminate\Http\Resources\Json\JsonResource; class UserResource extends BaseResource { diff --git a/app/Mail/DynamicInvitationMail.php b/app/Mail/DynamicInvitationMail.php index 135165e..9dfc97e 100644 --- a/app/Mail/DynamicInvitationMail.php +++ b/app/Mail/DynamicInvitationMail.php @@ -10,20 +10,24 @@ use Illuminate\Mail\Mailables\Envelope; use Illuminate\Queue\SerializesModels; use Illuminate\Support\Facades\URL; -class DynamicInvitationMail extends Mailable { +class DynamicInvitationMail extends Mailable +{ use Queueable, SerializesModels; - public function __construct(public DynamicInvitation $invitation, public string $inviterName) { + public function __construct(public DynamicInvitation $invitation, public string $inviterName) + { // } - public function envelope(): Envelope { + public function envelope(): Envelope + { return new Envelope( - subject: 'Invitation to Join Dynamic: ' . $this->invitation->dynamic->name, + subject: 'Invitation to Join Dynamic: '.$this->invitation->dynamic->name, ); } - public function content(): Content { + public function content(): Content + { $acceptUrl = URL::temporarySignedRoute( 'dynamics.invitations.accept', $this->invitation->expires_at, diff --git a/app/Models/Dynamic.php b/app/Models/Dynamic.php index 7cb68f3..fd22f3e 100644 --- a/app/Models/Dynamic.php +++ b/app/Models/Dynamic.php @@ -8,6 +8,7 @@ use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\MorphOne; +use Illuminate\Support\Str; class Dynamic extends Model { @@ -47,7 +48,7 @@ class Dynamic extends Model protected static function booted(): void { static::creating(function ($model) { - $model->uuid = (string) \Illuminate\Support\Str::uuid(); + $model->uuid = (string) Str::uuid(); }); static::created(function (Dynamic $dynamic) { diff --git a/app/Models/DynamicInvitation.php b/app/Models/DynamicInvitation.php index 1c46647..2b1097d 100644 --- a/app/Models/DynamicInvitation.php +++ b/app/Models/DynamicInvitation.php @@ -6,7 +6,8 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; -class DynamicInvitation extends Model { +class DynamicInvitation extends Model +{ use HasFactory; protected $fillable = [ @@ -21,11 +22,13 @@ class DynamicInvitation extends Model { 'expires_at' => 'datetime', ]; - public function dynamic(): BelongsTo { + public function dynamic(): BelongsTo + { return $this->belongsTo(Dynamic::class); } - public function isExpired(): bool { + public function isExpired(): bool + { return $this->expires_at->isPast(); } } diff --git a/app/Models/Ledger.php b/app/Models/Ledger.php index 97d9b34..b89a280 100644 --- a/app/Models/Ledger.php +++ b/app/Models/Ledger.php @@ -7,6 +7,8 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\HasMany; +use Illuminate\Database\Eloquent\Relations\MorphMany; +use Illuminate\Support\Str; class Ledger extends Model { @@ -37,7 +39,7 @@ class Ledger extends Model return $this->hasMany(PredefinedMutation::class); } - public function media(): \Illuminate\Database\Eloquent\Relations\MorphMany + public function media(): MorphMany { return $this->morphMany(Media::class, 'mediable'); } @@ -45,7 +47,7 @@ class Ledger extends Model protected static function booted(): void { static::creating(function ($model) { - $model->uuid = (string) \Illuminate\Support\Str::uuid(); + $model->uuid = (string) Str::uuid(); }); } diff --git a/app/Models/Media.php b/app/Models/Media.php index 71158b8..e0cf937 100644 --- a/app/Models/Media.php +++ b/app/Models/Media.php @@ -6,7 +6,8 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\MorphTo; -class Media extends Model { +class Media extends Model +{ use HasFactory; protected $fillable = [ @@ -17,11 +18,13 @@ class Media extends Model { protected $appends = ['url']; - public function mediable(): MorphTo { + public function mediable(): MorphTo + { return $this->morphTo(); } - public function getUrlAttribute(): string { - return asset('storage/' . $this->file_path); + public function getUrlAttribute(): string + { + return asset('storage/'.$this->file_path); } } diff --git a/app/Models/Message.php b/app/Models/Message.php index 6442a91..b737da8 100644 --- a/app/Models/Message.php +++ b/app/Models/Message.php @@ -6,7 +6,7 @@ use Database\Factories\MessageFactory; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; - +use Illuminate\Database\Eloquent\Relations\MorphMany; use Illuminate\Database\Eloquent\Relations\MorphTo; class Message extends Model @@ -37,7 +37,7 @@ class Message extends Model return $this->morphTo(); } - public function media(): \Illuminate\Database\Eloquent\Relations\MorphMany + public function media(): MorphMany { return $this->morphMany(Media::class, 'mediable'); } diff --git a/app/Models/Mutation.php b/app/Models/Mutation.php index 0c512de..a1cf37f 100644 --- a/app/Models/Mutation.php +++ b/app/Models/Mutation.php @@ -2,11 +2,14 @@ namespace App\Models; +use App\Events\MessageSent; use Database\Factories\MutationFactory; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Database\Eloquent\Relations\MorphMany; use Illuminate\Database\Eloquent\Relations\MorphOne; +use Illuminate\Support\Str; class Mutation extends Model { @@ -43,7 +46,7 @@ class Mutation extends Model return $this->morphOne(Chat::class, 'chatable'); } - public function media(): \Illuminate\Database\Eloquent\Relations\MorphMany + public function media(): MorphMany { return $this->morphMany(Media::class, 'mediable'); } @@ -51,7 +54,7 @@ class Mutation extends Model protected static function booted(): void { static::creating(function ($model) { - $model->uuid = (string) \Illuminate\Support\Str::uuid(); + $model->uuid = (string) Str::uuid(); }); static::created(function (Mutation $mutation) { @@ -71,24 +74,24 @@ class Mutation extends Model 'subject_id' => $mutation->id, 'subject_type' => Mutation::class, ]); - broadcast(new \App\Events\MessageSent($mutationMsg)); + broadcast(new MessageSent($mutationMsg)); if ($status === 'approved') { $dynamicMsg = $dynamic->chat->messages()->create([ 'user_id' => null, - 'content' => "id}> added entry \"{$mutation->description}\" for " . ($mutation->amount >= 0 ? '+' : '') . "{$mutation->amount} points on \"{$ledger->name}\" ledger.", + 'content' => "id}> added entry \"{$mutation->description}\" for ".($mutation->amount >= 0 ? '+' : '')."{$mutation->amount} points on \"{$ledger->name}\" ledger.", 'subject_id' => $mutation->id, 'subject_type' => Mutation::class, ]); } else { $dynamicMsg = $dynamic->chat->messages()->create([ 'user_id' => null, - 'content' => "id}> suggested \"{$mutation->description}\" for " . ($mutation->amount >= 0 ? '+' : '') . "{$mutation->amount} points on \"{$ledger->name}\" ledger.", + 'content' => "id}> suggested \"{$mutation->description}\" for ".($mutation->amount >= 0 ? '+' : '')."{$mutation->amount} points on \"{$ledger->name}\" ledger.", 'subject_id' => $mutation->id, 'subject_type' => Mutation::class, ]); } - broadcast(new \App\Events\MessageSent($dynamicMsg)); + broadcast(new MessageSent($dynamicMsg)); }); } diff --git a/app/Models/PredefinedMutation.php b/app/Models/PredefinedMutation.php index 0ab9ae4..4460d99 100644 --- a/app/Models/PredefinedMutation.php +++ b/app/Models/PredefinedMutation.php @@ -5,6 +5,7 @@ namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Support\Str; class PredefinedMutation extends Model { @@ -26,7 +27,7 @@ class PredefinedMutation extends Model protected static function booted(): void { static::creating(function ($model) { - $model->uuid = (string) \Illuminate\Support\Str::uuid(); + $model->uuid = (string) Str::uuid(); }); } diff --git a/app/Models/User.php b/app/Models/User.php index 4aa28b1..2c6e9a4 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -10,6 +10,7 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Illuminate\Support\Carbon; +use Illuminate\Support\Str; use Laravel\Fortify\Contracts\PasskeyUser; use Laravel\Fortify\PasskeyAuthenticatable; use Laravel\Fortify\TwoFactorAuthenticatable; @@ -33,7 +34,7 @@ use NotificationChannels\WebPush\HasPushSubscriptions; class User extends Authenticatable implements PasskeyUser { /** @use HasFactory */ - use HasFactory, Notifiable, PasskeyAuthenticatable, TwoFactorAuthenticatable, HasPushSubscriptions; + use HasFactory, HasPushSubscriptions, Notifiable, PasskeyAuthenticatable, TwoFactorAuthenticatable; public function dynamics() { @@ -74,7 +75,7 @@ class User extends Authenticatable implements PasskeyUser protected static function booted(): void { static::creating(function ($model) { - $model->uuid = (string) \Illuminate\Support\Str::uuid(); + $model->uuid = (string) Str::uuid(); }); } diff --git a/app/Notifications/NewActivityNotification.php b/app/Notifications/NewActivityNotification.php index 404d3ee..1decdfc 100644 --- a/app/Notifications/NewActivityNotification.php +++ b/app/Notifications/NewActivityNotification.php @@ -3,10 +3,7 @@ namespace App\Notifications; use Illuminate\Bus\Queueable; -use Illuminate\Contracts\Queue\ShouldQueue; -use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Notification; - use NotificationChannels\WebPush\WebPushChannel; use NotificationChannels\WebPush\WebPushMessage; diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 7d7b56a..ee05a42 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -3,9 +3,9 @@ namespace App\Providers; use Carbon\CarbonImmutable; +use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Support\Facades\Date; use Illuminate\Support\Facades\DB; -use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Support\ServiceProvider; use Illuminate\Validation\Rules\Password; diff --git a/app/Services/ActivityService.php b/app/Services/ActivityService.php index 22e2cef..e653f47 100644 --- a/app/Services/ActivityService.php +++ b/app/Services/ActivityService.php @@ -2,16 +2,14 @@ namespace App\Services; -use App\Models\User; use App\Models\Dynamic; use App\Models\Ledger; -use App\Models\Mutation; use App\Models\Message; use App\Models\ReadCursor; -use Illuminate\Support\Carbon; -use Illuminate\Support\Str; - +use App\Models\User; use App\Notifications\NewActivityNotification; +use Carbon\CarbonInterface; +use Illuminate\Support\Carbon; class ActivityService { @@ -35,7 +33,7 @@ class ActivityService /** * Get the read cursor timestamp for a user on a specific entity. */ - public function getCursorReadAt(User $user, $entity): \Carbon\CarbonInterface + public function getCursorReadAt(User $user, $entity): CarbonInterface { $cursor = ReadCursor::where([ 'user_id' => $user->id, @@ -97,6 +95,7 @@ class ActivityService $participants = $dynamic->participants()->withPivot('display_name')->get(); $participantsMap = $participants->reduce(function ($acc, $p) { $acc[$p->id] = $p->pivot->display_name ?? $p->name; + return $acc; }, []); @@ -112,6 +111,7 @@ class ActivityService // Resolve placeholders to actual names/display names $messageData['content'] = preg_replace_callback('//', function ($matches) use ($participantsMap) { $userId = $matches[1]; + return $participantsMap[$userId] ?? "User #{$userId}"; }, $message->content); @@ -140,7 +140,7 @@ class ActivityService /** * Partition activities into read and unread, and construct the grouped entity metadata. */ - private function partitionAndGroupActivities(array $activities, \Carbon\CarbonInterface $readAt, Dynamic $dynamic, array &$groupedDynamics): void + private function partitionAndGroupActivities(array $activities, CarbonInterface $readAt, Dynamic $dynamic, array &$groupedDynamics): void { $alreadyRead = []; $unread = []; @@ -153,7 +153,7 @@ class ActivityService } } - if (!empty($unread)) { + if (! empty($unread)) { $context = array_slice($alreadyRead, 0, 2); $groupedDynamics[] = [ @@ -192,4 +192,4 @@ class ActivityService return ''; } -} \ No newline at end of file +} diff --git a/bootstrap/app.php b/bootstrap/app.php index 9e80d91..dca865b 100644 --- a/bootstrap/app.php +++ b/bootstrap/app.php @@ -10,9 +10,9 @@ use Illuminate\Http\Request; return Application::configure(basePath: dirname(__DIR__)) ->withRouting( - web: __DIR__ . '/../routes/web.php', - commands: __DIR__ . '/../routes/console.php', - channels: __DIR__ . '/../routes/channels.php', + web: __DIR__.'/../routes/web.php', + commands: __DIR__.'/../routes/console.php', + channels: __DIR__.'/../routes/channels.php', health: '/up', ) ->withMiddleware(function (Middleware $middleware): void { @@ -31,6 +31,6 @@ return Application::configure(basePath: dirname(__DIR__)) }) ->withExceptions(function (Exceptions $exceptions): void { $exceptions->shouldRenderJsonWhen( - fn(Request $request) => $request->is('api/*'), + fn (Request $request) => $request->is('api/*'), ); })->create(); diff --git a/bootstrap/providers.php b/bootstrap/providers.php index b1c89a0..374d2eb 100644 --- a/bootstrap/providers.php +++ b/bootstrap/providers.php @@ -3,11 +3,13 @@ use App\Providers\AppServiceProvider; use App\Providers\AuthServiceProvider; use App\Providers\FortifyServiceProvider; +use Illuminate\Broadcasting\BroadcastServiceProvider; +use Tighten\Ziggy\ZiggyServiceProvider; return [ AppServiceProvider::class, AuthServiceProvider::class, FortifyServiceProvider::class, - \Illuminate\Broadcasting\BroadcastServiceProvider::class, - \Tighten\Ziggy\ZiggyServiceProvider::class, + BroadcastServiceProvider::class, + ZiggyServiceProvider::class, ]; diff --git a/database/factories/DynamicFactory.php b/database/factories/DynamicFactory.php index 55ee3a0..a525d68 100644 --- a/database/factories/DynamicFactory.php +++ b/database/factories/DynamicFactory.php @@ -23,7 +23,7 @@ class DynamicFactory extends Factory 'Obsidian Household Agreement', 'Crimson Castle Protocol', 'Dungeon Master-Sub Board', - 'Coffee Club Ledger' + 'Coffee Club Ledger', ]), 'rules' => "1. All rules must be strictly adhered to.\n2. Scores must be updated after every task.\n3. Disputed scores can be discussed in the dedicated chat.", ]; diff --git a/database/factories/LedgerFactory.php b/database/factories/LedgerFactory.php index 358d68c..595b5f9 100644 --- a/database/factories/LedgerFactory.php +++ b/database/factories/LedgerFactory.php @@ -2,8 +2,8 @@ namespace Database\Factories; -use App\Models\Ledger; use App\Models\Dynamic; +use App\Models\Ledger; use Illuminate\Database\Eloquent\Factories\Factory; /** @@ -26,7 +26,7 @@ class LedgerFactory extends Factory 'Dungeon Cleaning', 'Silence Protocol', 'Task Completion', - 'Tribute Points' + 'Tribute Points', ]), 'rules' => 'Scores are added by Doms and subtracted for protocol breaches.', 'score' => 0, diff --git a/database/factories/MessageFactory.php b/database/factories/MessageFactory.php index 74d1a23..b30f7c5 100644 --- a/database/factories/MessageFactory.php +++ b/database/factories/MessageFactory.php @@ -2,8 +2,8 @@ namespace Database\Factories; -use App\Models\Message; use App\Models\Chat; +use App\Models\Message; use App\Models\User; use Illuminate\Database\Eloquent\Factories\Factory; diff --git a/database/factories/MutationFactory.php b/database/factories/MutationFactory.php index f41251c..6467b40 100644 --- a/database/factories/MutationFactory.php +++ b/database/factories/MutationFactory.php @@ -2,8 +2,8 @@ namespace Database\Factories; -use App\Models\Mutation; use App\Models\Ledger; +use App\Models\Mutation; use App\Models\User; use Illuminate\Database\Eloquent\Factories\Factory; diff --git a/database/migrations/2026_06_15_223630_create_media_table.php b/database/migrations/2026_06_15_223630_create_media_table.php index 438b400..1d8da2b 100644 --- a/database/migrations/2026_06_15_223630_create_media_table.php +++ b/database/migrations/2026_06_15_223630_create_media_table.php @@ -4,8 +4,10 @@ use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; -return new class extends Migration { - public function up(): void { +return new class extends Migration +{ + public function up(): void + { Schema::create('media', function (Blueprint $table) { $table->id(); $table->morphs('mediable'); // mediable_type, mediable_id @@ -16,7 +18,8 @@ return new class extends Migration { }); } - public function down(): void { + public function down(): void + { Schema::dropIfExists('media'); } }; diff --git a/database/migrations/2026_06_15_223640_create_dynamic_invitations_table.php b/database/migrations/2026_06_15_223640_create_dynamic_invitations_table.php index f139925..8bc59bb 100644 --- a/database/migrations/2026_06_15_223640_create_dynamic_invitations_table.php +++ b/database/migrations/2026_06_15_223640_create_dynamic_invitations_table.php @@ -4,8 +4,10 @@ use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; -return new class extends Migration { - public function up(): void { +return new class extends Migration +{ + public function up(): void + { Schema::create('dynamic_invitations', function (Blueprint $table) { $table->id(); $table->foreignId('dynamic_id')->constrained()->cascadeOnDelete(); @@ -17,7 +19,8 @@ return new class extends Migration { }); } - public function down(): void { + public function down(): void + { Schema::dropIfExists('dynamic_invitations'); } }; diff --git a/database/migrations/2026_06_21_203737_add_uuid_to_dynamics_table.php b/database/migrations/2026_06_21_203737_add_uuid_to_dynamics_table.php index d6b5f33..49beda1 100644 --- a/database/migrations/2026_06_21_203737_add_uuid_to_dynamics_table.php +++ b/database/migrations/2026_06_21_203737_add_uuid_to_dynamics_table.php @@ -1,8 +1,10 @@ each(function ($model) { - $model->uuid = \Illuminate\Support\Str::uuid(); + Dynamic::all()->each(function ($model) { + $model->uuid = Str::uuid(); $model->save(); }); diff --git a/database/migrations/2026_06_21_203807_add_uuid_to_ledgers_table.php b/database/migrations/2026_06_21_203807_add_uuid_to_ledgers_table.php index c1b76b2..693d225 100644 --- a/database/migrations/2026_06_21_203807_add_uuid_to_ledgers_table.php +++ b/database/migrations/2026_06_21_203807_add_uuid_to_ledgers_table.php @@ -1,8 +1,10 @@ each(function ($model) { - $model->uuid = \Illuminate\Support\Str::uuid(); + Ledger::all()->each(function ($model) { + $model->uuid = Str::uuid(); $model->save(); }); diff --git a/database/migrations/2026_06_21_203835_add_uuid_to_mutations_table.php b/database/migrations/2026_06_21_203835_add_uuid_to_mutations_table.php index c1baf5c..a922a58 100644 --- a/database/migrations/2026_06_21_203835_add_uuid_to_mutations_table.php +++ b/database/migrations/2026_06_21_203835_add_uuid_to_mutations_table.php @@ -1,8 +1,10 @@ each(function ($model) { - $model->uuid = \Illuminate\Support\Str::uuid(); + Mutation::all()->each(function ($model) { + $model->uuid = Str::uuid(); $model->save(); }); diff --git a/database/migrations/2026_06_21_203907_add_uuid_to_predefined_mutations_table.php b/database/migrations/2026_06_21_203907_add_uuid_to_predefined_mutations_table.php index 5c4e347..f485bcf 100644 --- a/database/migrations/2026_06_21_203907_add_uuid_to_predefined_mutations_table.php +++ b/database/migrations/2026_06_21_203907_add_uuid_to_predefined_mutations_table.php @@ -1,8 +1,10 @@ each(function ($model) { - $model->uuid = \Illuminate\Support\Str::uuid(); + PredefinedMutation::all()->each(function ($model) { + $model->uuid = Str::uuid(); $model->save(); }); diff --git a/database/migrations/2026_06_21_204007_add_uuid_to_users_table.php b/database/migrations/2026_06_21_204007_add_uuid_to_users_table.php index b657b76..7989a5e 100644 --- a/database/migrations/2026_06_21_204007_add_uuid_to_users_table.php +++ b/database/migrations/2026_06_21_204007_add_uuid_to_users_table.php @@ -1,8 +1,10 @@ each(function ($model) { - $model->uuid = \Illuminate\Support\Str::uuid(); + User::all()->each(function ($model) { + $model->uuid = Str::uuid(); $model->save(); }); diff --git a/database/migrations/2026_06_21_211120_create_push_subscriptions_table.php b/database/migrations/2026_06_21_211120_create_push_subscriptions_table.php index 567a743..e5b0cbb 100644 --- a/database/migrations/2026_06_21_211120_create_push_subscriptions_table.php +++ b/database/migrations/2026_06_21_211120_create_push_subscriptions_table.php @@ -1,8 +1,8 @@ 'approved', ]); - // ---------------------------------------------------- // 3. Seed Dynamic 2: Obsidian Household Agreement // ---------------------------------------------------- diff --git a/routes/web.php b/routes/web.php index e8fc889..243d520 100644 --- a/routes/web.php +++ b/routes/web.php @@ -2,15 +2,20 @@ use App\Http\Controllers\DashboardController; use App\Http\Controllers\DynamicController; +use App\Http\Controllers\DynamicInvitationController; use App\Http\Controllers\LedgerController; use App\Http\Controllers\MessageController; use App\Http\Controllers\MutationController; +use App\Http\Controllers\ParticipantController; +use App\Http\Controllers\PredefinedMutationController; +use App\Http\Controllers\WebPushController; +use Illuminate\Support\Facades\Broadcast; use Illuminate\Support\Facades\Route; Route::inertia('/', 'Welcome')->name('home'); -Route::post('subscriptions', [\App\Http\Controllers\WebPushController::class, 'store'])->name('subscriptions.store'); -Route::post('subscriptions/delete', [\App\Http\Controllers\WebPushController::class, 'destroy'])->name('subscriptions.destroy'); +Route::post('subscriptions', [WebPushController::class, 'store'])->name('subscriptions.store'); +Route::post('subscriptions/delete', [WebPushController::class, 'destroy'])->name('subscriptions.destroy'); Route::middleware(['auth', 'verified'])->group(function () { Route::get('dashboard', [DashboardController::class, 'index'])->name('dashboard'); @@ -25,23 +30,23 @@ Route::middleware(['auth', 'verified'])->group(function () { Route::put('/dynamics/{dynamic}/ledgers/{ledger}/close', [LedgerController::class, 'close'])->name('dynamics.ledgers.close'); Route::resource('dynamics.ledgers', LedgerController::class)->scoped()->except(['create']); - Route::resource('dynamics.predefined-mutations', \App\Http\Controllers\PredefinedMutationController::class)->scoped(); + Route::resource('dynamics.predefined-mutations', PredefinedMutationController::class)->scoped(); - Route::put('/dynamics/{dynamic}/ledgers/{ledger}/mutations/{mutation}/void', [\App\Http\Controllers\MutationController::class, 'void'])->name('dynamics.ledgers.mutations.void'); + Route::put('/dynamics/{dynamic}/ledgers/{ledger}/mutations/{mutation}/void', [MutationController::class, 'void'])->name('dynamics.ledgers.mutations.void'); Route::resource('dynamics.ledgers.mutations', MutationController::class)->scoped(); - Route::get('/dynamics/{dynamic}/invitations/create', [\App\Http\Controllers\DynamicInvitationController::class, 'create'])->name('dynamics.invitations.create'); - Route::post('/dynamics/{dynamic}/invitations', [\App\Http\Controllers\DynamicInvitationController::class, 'store'])->name('dynamics.invitations.store'); + Route::get('/dynamics/{dynamic}/invitations/create', [DynamicInvitationController::class, 'create'])->name('dynamics.invitations.create'); + Route::post('/dynamics/{dynamic}/invitations', [DynamicInvitationController::class, 'store'])->name('dynamics.invitations.store'); Route::post('/chats/{chat}/messages', [MessageController::class, 'store'])->name('chats.messages.store'); - Route::put('/dynamics/{dynamic}/participant', [\App\Http\Controllers\ParticipantController::class, 'update'])->name('dynamics.participant.update'); - Route::get('/dynamics/{dynamic}/users/{user}', [\App\Http\Controllers\ParticipantController::class, 'show'])->name('dynamics.users.show'); + Route::put('/dynamics/{dynamic}/participant', [ParticipantController::class, 'update'])->name('dynamics.participant.update'); + Route::get('/dynamics/{dynamic}/users/{user}', [ParticipantController::class, 'show'])->name('dynamics.users.show'); }); -Route::get('/invitations/accept/{token}', [\App\Http\Controllers\DynamicInvitationController::class, 'accept']) +Route::get('/invitations/accept/{token}', [DynamicInvitationController::class, 'accept']) ->middleware(['auth', 'signed']) ->name('dynamics.invitations.accept'); -\Illuminate\Support\Facades\Broadcast::routes(); +Broadcast::routes(); require __DIR__.'/settings.php'; diff --git a/tests/Browser/AuthenticationTest.php b/tests/Browser/AuthenticationTest.php index df23fec..400e5e8 100644 --- a/tests/Browser/AuthenticationTest.php +++ b/tests/Browser/AuthenticationTest.php @@ -4,7 +4,6 @@ namespace Tests\Browser; use App\Models\User; use Laravel\Dusk\Browser; -use Tests\DuskTestCase; test('user can register, log in, and log out', function () { $this->browse(function (Browser $browser) { diff --git a/tests/Browser/AuthorizationTest.php b/tests/Browser/AuthorizationTest.php index a6ca13d..cda7829 100644 --- a/tests/Browser/AuthorizationTest.php +++ b/tests/Browser/AuthorizationTest.php @@ -2,12 +2,11 @@ namespace Tests\Browser; -use App\Models\User; use App\Models\Dynamic; use App\Models\Ledger; use App\Models\Mutation; +use App\Models\User; use Laravel\Dusk\Browser; -use Tests\DuskTestCase; test('access control and actions are enforced for owners and participants', function () { // Create database state @@ -46,7 +45,7 @@ test('access control and actions are enforced for owners and participants', func ]); $this->browse(function (Browser $sessionOwner, Browser $sessionParticipant, Browser $sessionOutsider) use ($dynamic, $ledger, $owner, $participant, $outsider) { - + // 1. Test Outsider trying to access dynamic they DO NOT belong to (should be forbidden / 403) $sessionOutsider->loginAs($outsider) ->visit(route('dynamics.show', $dynamic)) diff --git a/tests/Browser/RealtimeChatTest.php b/tests/Browser/RealtimeChatTest.php index 6979ba1..a8c2a39 100644 --- a/tests/Browser/RealtimeChatTest.php +++ b/tests/Browser/RealtimeChatTest.php @@ -2,11 +2,9 @@ namespace Tests\Browser; -use App\Models\User; use App\Models\Dynamic; -use App\Models\Ledger; +use App\Models\User; use Laravel\Dusk\Browser; -use Tests\DuskTestCase; test('multiple sessions can communicate in real time through websockets', function () { // 1. Create realistic database state @@ -15,7 +13,7 @@ test('multiple sessions can communicate in real time through websockets', functi 'email' => 'test-owner@example.com', 'password' => bcrypt('password'), ]); - + $participant = User::factory()->create([ 'name' => 'Submissive Bob', 'email' => 'test-sub@example.com', @@ -32,7 +30,7 @@ test('multiple sessions can communicate in real time through websockets', functi // 2. Spawn two separate browser sessions/browsers in parallel $this->browse(function (Browser $sessionA, Browser $sessionB) use ($dynamic, $owner, $participant) { - + // --- SESSION A: Owner --- $sessionA->loginAs($owner) ->visit(route('dynamics.show', $dynamic)) diff --git a/tests/DuskTestCase.php b/tests/DuskTestCase.php index 296db4a..0ad682c 100644 --- a/tests/DuskTestCase.php +++ b/tests/DuskTestCase.php @@ -2,10 +2,10 @@ namespace Tests; -use Laravel\Dusk\TestCase as BaseTestCase; use Facebook\WebDriver\Chrome\ChromeOptions; -use Facebook\WebDriver\Remote\RemoteWebDriver; use Facebook\WebDriver\Remote\DesiredCapabilities; +use Facebook\WebDriver\Remote\RemoteWebDriver; +use Laravel\Dusk\TestCase as BaseTestCase; abstract class DuskTestCase extends BaseTestCase { diff --git a/tests/Feature/DashboardTest.php b/tests/Feature/DashboardTest.php index 3fa35db..c63aae1 100644 --- a/tests/Feature/DashboardTest.php +++ b/tests/Feature/DashboardTest.php @@ -1,10 +1,9 @@ $user->id, 'content' => 'Old message context', ]); - + // Artificially advance cursor to after past message Carbon::setTestNow(Carbon::now()->addMinutes(5)); $service = app(ActivityService::class); diff --git a/tests/Feature/InvitationTest.php b/tests/Feature/InvitationTest.php index 8a56555..58476aa 100644 --- a/tests/Feature/InvitationTest.php +++ b/tests/Feature/InvitationTest.php @@ -1,9 +1,9 @@ create(); diff --git a/tests/Feature/MediaTest.php b/tests/Feature/MediaTest.php index d2d363f..a54c475 100644 --- a/tests/Feature/MediaTest.php +++ b/tests/Feature/MediaTest.php @@ -1,11 +1,11 @@ create(); diff --git a/tests/Feature/ParticipantDetailTest.php b/tests/Feature/ParticipantDetailTest.php index 61b929c..599be86 100644 --- a/tests/Feature/ParticipantDetailTest.php +++ b/tests/Feature/ParticipantDetailTest.php @@ -1,15 +1,15 @@ create(); $participant = User::factory()->create(); $dynamic = Dynamic::factory()->create(); - + $dynamic->participants()->attach($owner->id, ['role' => 'owner', 'display_name' => 'The Boss']); $dynamic->participants()->attach($participant->id, ['role' => 'participant']); @@ -34,7 +34,7 @@ test('non-participant cannot view participant detail page in dynamic', function $participant = User::factory()->create(); $outsider = User::factory()->create(); $dynamic = Dynamic::factory()->create(); - + $dynamic->participants()->attach($owner->id, ['role' => 'owner']); $dynamic->participants()->attach($participant->id, ['role' => 'participant']); @@ -50,7 +50,7 @@ test('participant detail page displays their recent mutations in dynamic', funct $participant = User::factory()->create(); $dynamic = Dynamic::factory()->create(); $ledger = Ledger::factory()->create(['dynamic_id' => $dynamic->id]); - + $dynamic->participants()->attach($owner->id, ['role' => 'owner']); $dynamic->participants()->attach($participant->id, ['role' => 'participant', 'display_name' => 'Bitch']); @@ -61,7 +61,7 @@ test('participant detail page displays their recent mutations in dynamic', funct 'amount' => 10, 'description' => 'Chore 1', ]); - + $mutation2 = Mutation::factory()->create([ 'ledger_id' => $ledger->id, 'user_id' => $participant->id, diff --git a/tests/Feature/ParticipantTest.php b/tests/Feature/ParticipantTest.php index b862375..e8e84f1 100644 --- a/tests/Feature/ParticipantTest.php +++ b/tests/Feature/ParticipantTest.php @@ -1,7 +1,7 @@ create(['name' => 'Alice']); @@ -34,7 +34,7 @@ test('participant can update their display name', function () { ]); $response->assertRedirect(); - + // Check database $this->assertDatabaseHas('participants', [ 'user_id' => $user->id, diff --git a/tests/Feature/PredefinedMutationTest.php b/tests/Feature/PredefinedMutationTest.php index 8747c55..8211a87 100644 --- a/tests/Feature/PredefinedMutationTest.php +++ b/tests/Feature/PredefinedMutationTest.php @@ -1,9 +1,8 @@ create();