authorize('create', [Mutation::class, $ledger]); // If the user is an owner, default status to 'approved'. Otherwise default to 'pending'. $status = $request->user()->can('update', $ledger) ? 'approved' : 'pending'; $mutation = DB::transaction(function () use ($request, $ledger, $status) { $mutation = $ledger->mutations()->create([ ...$request->except(['media', 'type', 'status']), 'user_id' => $request->user()->id, 'type' => $request->input('type', $request->input('amount') >= 0 ? 'addition' : 'subtraction'), 'status' => $status, ]); if ($request->hasFile('media')) { foreach ($request->file('media') as $file) { $path = $file->store('media', 'public'); $mutation->media()->create([ 'file_path' => $path, 'file_name' => $file->getClientOriginalName(), 'mime_type' => $file->getMimeType(), ]); } } // Only increment score if the status is approved! if ($status === 'approved') { $ledger->increment('score', $request->validated('amount')); } return $mutation; }); // Broadcast the real-time creation event! broadcast(new MutationCreated($mutation)); return redirect()->route('dynamics.ledgers.show', [$dynamic, $ledger]); } /** * Display the specified resource. */ public function show(Dynamic $dynamic, Ledger $ledger, Mutation $mutation) { $this->authorize('view', $mutation); return new MutationResource($mutation); } /** * Show the form for editing the specified resource. */ public function edit(Dynamic $dynamic, Ledger $ledger, Mutation $mutation) { // } /** * Update the specified resource in storage. */ public function update(Request $request, Dynamic $dynamic, Ledger $ledger, Mutation $mutation) { $this->authorize('update', $mutation); $request->validate([ 'status' => ['required', 'string', 'in:approved,rejected'], ]); $oldStatus = $mutation->status; $newStatus = $request->input('status'); DB::transaction(function () use ($mutation, $ledger, $oldStatus, $newStatus) { $mutation->update(['status' => $newStatus]); // Adjust the ledger score if status transitions to approved or from approved! if ($oldStatus !== 'approved' && $newStatus === 'approved') { $ledger->increment('score', $mutation->amount); } elseif ($oldStatus === 'approved' && $newStatus !== 'approved') { $ledger->decrement('score', $mutation->amount); } }); // Log to Mutation and Dynamic chats $user = $request->user(); $statusText = strtoupper($newStatus); $mutationMsg = $mutation->chat->messages()->create([ 'user_id' => null, 'content' => "Suggestion was {$statusText} by id}>.", 'subject_id' => $mutation->id, 'subject_type' => Mutation::class, ]); 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.", 'subject_id' => $mutation->id, 'subject_type' => Mutation::class, ]); } else { $dynamicMsg = $dynamic->chat->messages()->create([ 'user_id' => null, 'content' => "id}> REJECTED the suggestion \"{$mutation->description}\" on \"{$ledger->name}\" ledger.", 'subject_id' => $mutation->id, 'subject_type' => Mutation::class, ]); } broadcast(new MessageSent($dynamicMsg)); // Broadcast the real-time update event! broadcast(new MutationUpdated($mutation)); return redirect()->back(); } public function void(Request $request, Dynamic $dynamic, Ledger $ledger, Mutation $mutation) { $this->authorize('void', $mutation); $mutation->update(['status' => 'voided']); return redirect()->route('dynamics.ledgers.show', [$dynamic, $ledger]); } /** * Remove the specified resource from storage. */ public function destroy(Dynamic $dynamic, Ledger $ledger, Mutation $mutation) { // } }