146 lines
5.4 KiB
PHP
146 lines
5.4 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Events\MessageSent;
|
|
use App\Events\MutationCreated;
|
|
use App\Events\MutationUpdated;
|
|
use App\Http\Requests\StoreMutationRequest;
|
|
use App\Models\Dynamic;
|
|
use App\Models\Ledger;
|
|
use App\Models\Mutation;
|
|
use App\Notifications\NewActivityNotification;
|
|
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Facades\Notification;
|
|
|
|
class MutationController extends Controller
|
|
{
|
|
use AuthorizesRequests;
|
|
|
|
public function store(StoreMutationRequest $request, Dynamic $dynamic, Ledger $ledger)
|
|
{
|
|
$this->authorize('create', [Mutation::class, $ledger]);
|
|
|
|
$status = $request->user()->can('update', $ledger) ? 'approved' : 'pending';
|
|
|
|
$mutation = DB::transaction(function () use ($request, $ledger, $status) {
|
|
$predefinedId = null;
|
|
if ($request->filled('predefined_mutation_id')) {
|
|
$predefinedId = \App\Models\PredefinedMutation::where('uuid', $request->input('predefined_mutation_id'))->value('id');
|
|
}
|
|
|
|
$mutation = $ledger->mutations()->create([
|
|
...$request->except(['media', 'type', 'status', 'predefined_mutation_id']),
|
|
'predefined_mutation_id' => $predefinedId,
|
|
'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(),
|
|
]);
|
|
}
|
|
}
|
|
|
|
if ($status === 'approved') {
|
|
$ledger->increment('score', $request->validated('amount'));
|
|
}
|
|
|
|
return $mutation;
|
|
});
|
|
|
|
$recipients = $dynamic->participants()->where('users.id', '!=', $request->user()->id)->get();
|
|
$message = $status === 'approved'
|
|
? "{$request->user()->name} added a new entry: \"{$mutation->description}\"."
|
|
: "{$request->user()->name} suggested a new entry: \"{$mutation->description}\".";
|
|
|
|
if ($recipients->isNotEmpty()) {
|
|
Notification::send($recipients, new NewActivityNotification([
|
|
'content' => $message,
|
|
'url' => route('dynamics.ledgers.show', [$dynamic, $ledger]),
|
|
]));
|
|
}
|
|
|
|
return redirect()->route('dynamics.ledgers.show', [$dynamic, $ledger]);
|
|
}
|
|
|
|
public function show(Request $request, Dynamic $dynamic, Ledger $ledger, Mutation $mutation)
|
|
{
|
|
$this->authorize('view', $mutation);
|
|
|
|
$mutation->load('user', 'ledger', 'media', 'chat.messages.user');
|
|
$dynamic = $mutation->ledger->dynamic;
|
|
|
|
$dynamic->load('participants');
|
|
|
|
return inertia('Mutations/Show', [
|
|
'mutation' => $mutation,
|
|
'dynamic' => $dynamic,
|
|
]);
|
|
}
|
|
|
|
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]);
|
|
|
|
if ($oldStatus !== 'approved' && $newStatus === 'approved') {
|
|
$ledger->increment('score', $mutation->amount);
|
|
} elseif ($oldStatus === 'approved' && $newStatus !== 'approved') {
|
|
$ledger->decrement('score', $mutation->amount);
|
|
}
|
|
});
|
|
|
|
$user = $request->user();
|
|
$statusText = strtoupper($newStatus);
|
|
|
|
// Notify the suggester
|
|
$suggester = $mutation->user;
|
|
if ($suggester && $suggester->id !== $user->id) {
|
|
Notification::send($suggester, new NewActivityNotification([
|
|
'content' => "Your suggestion \"{$mutation->description}\" was {$statusText} by {$user->name}.",
|
|
'url' => route('dynamics.ledgers.show', [$dynamic, $ledger]),
|
|
]));
|
|
}
|
|
|
|
return redirect()->back();
|
|
}
|
|
|
|
public function void(Request $request, Dynamic $dynamic, Ledger $ledger, Mutation $mutation)
|
|
{
|
|
$this->authorize('void', $mutation);
|
|
|
|
DB::transaction(function() use ($mutation, $ledger) {
|
|
if ($mutation->status === 'approved') {
|
|
$ledger->decrement('score', $mutation->amount);
|
|
}
|
|
$mutation->update(['status' => 'voided']);
|
|
});
|
|
|
|
$recipients = $dynamic->participants()->where('users.id', '!=', $request->user()->id)->get();
|
|
if ($recipients->isNotEmpty()) {
|
|
Notification::send($recipients, new NewActivityNotification([
|
|
'content' => "{$request->user()->name} voided an entry: \"{$mutation->description}\".",
|
|
'url' => route('dynamics.ledgers.show', [$dynamic, $ledger]),
|
|
]));
|
|
}
|
|
|
|
return redirect()->route('dynamics.ledgers.show', [$dynamic, $ledger]);
|
|
}
|
|
}
|