over naar uuids, policies, predefined mutations aan kunnen passen
linter / quality (push) Failing after 1m5s
tests / ci (8.4) (push) Failing after 1m7s
tests / ci (8.5) (push) Failing after 1m5s
tests / ci (8.3) (push) Failing after 12m5s

This commit is contained in:
Daan Meijer
2026-06-21 23:09:38 +02:00
parent 06e5600447
commit 1e0782385b
46 changed files with 1287 additions and 160 deletions
+2 -2
View File
@@ -11,10 +11,10 @@ class DashboardController extends Controller
public function index(Request $request, ActivityService $activityService)
{
$user = $request->user();
$unreadEntities = $activityService->getUnreadEntitiesGrouped($user);
$unreadDynamics = $activityService->getUnreadDynamicsGrouped($user);
return Inertia::render('Dashboard', [
'unreadEntities' => $unreadEntities,
'unreadDynamics' => $unreadDynamics,
]);
}
}
+14 -13
View File
@@ -2,8 +2,10 @@
namespace App\Http\Controllers;
use App\Http\Requests\StoreDynamicRequest;
use App\Http\Requests\UpdateDynamicRequest;
use App\Http\Resources\DynamicResource;
use App\Http\Resources\LedgerResource;
use App\Http\Resources\MessageResource;
use App\Http\Resources\UserResource;
use App\Models\Dynamic;
use App\Services\ActivityService;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
@@ -19,7 +21,7 @@ class DynamicController extends Controller
public function index(Request $request)
{
return Inertia::render('Dynamics/Index', [
'dynamics' => $request->user()->dynamics()->get(),
'dynamics' => DynamicResource::collection($request->user()->dynamics()->get()),
]);
}
@@ -54,15 +56,14 @@ class DynamicController extends Controller
$dynamic->load(['ledgers.media', 'participants', 'chat']);
$isOwner = $dynamic->participants()
->where('user_id', $request->user()->id)
->where('role', 'owner')
->exists();
return Inertia::render('Dynamics/Show', [
'dynamic' => $dynamic,
'isOwner' => $isOwner,
'messages' => $dynamic->chat->messages()->with(['user', 'media'])->latest()->paginate(20),
'dynamic' => new DynamicResource($dynamic),
'ledgers' => LedgerResource::collection($dynamic->ledgers),
'participants' => UserResource::collection($dynamic->participants),
'messages' => MessageResource::collection($dynamic->chat->messages()->with(['user', 'media'])->latest()->paginate(20)),
'can' => [
'update' => $request->user()->can('update', $dynamic),
],
]);
}
@@ -70,7 +71,7 @@ class DynamicController extends Controller
{
$this->authorize('view', $dynamic);
return $dynamic->chat->messages()->with(['user', 'media'])->latest()->paginate(20);
return MessageResource::collection($dynamic->chat->messages()->with(['user', 'media'])->latest()->paginate(20));
}
/**
@@ -81,7 +82,7 @@ class DynamicController extends Controller
$this->authorize('update', $dynamic);
return Inertia::render('Dynamics/Settings', [
'dynamic' => $dynamic,
'dynamic' => new DynamicResource($dynamic),
]);
}
@@ -125,6 +125,6 @@ class DynamicInvitationController extends Controller
$invitation->delete();
});
return redirect()->route('dynamics.show', $invitation->dynamic_id)->with('success', 'Successfully joined the dynamic!');
return redirect()->route('dynamics.show', $invitation->dynamic)->with('success', 'Successfully joined the dynamic!');
}
}
+39 -15
View File
@@ -3,6 +3,11 @@
namespace App\Http\Controllers;
use App\Http\Requests\StoreLedgerRequest;
use App\Http\Resources\DynamicResource;
use App\Http\Resources\LedgerResource;
use App\Http\Resources\MessageResource;
use App\Http\Resources\MutationResource;
use App\Http\Resources\UserResource;
use App\Models\Dynamic;
use App\Models\Ledger;
use App\Services\ActivityService;
@@ -30,7 +35,7 @@ class LedgerController extends Controller
$this->authorize('update', $dynamic);
return Inertia::render('Ledgers/Create', [
'dynamic' => $dynamic,
'dynamic' => new DynamicResource($dynamic),
]);
}
@@ -39,6 +44,7 @@ class LedgerController extends Controller
*/
public function store(StoreLedgerRequest $request, Dynamic $dynamic)
{
$this->authorize('create', [Ledger::class, $dynamic]);
$ledger = $dynamic->ledgers()->create($request->except('media'));
if ($request->hasFile('media')) {
@@ -76,16 +82,16 @@ class LedgerController extends Controller
'mutations.chat',
]);
$isOwner = $dynamic->participants()
->where('user_id', $request->user()->id)
->where('role', 'owner')
->exists();
return Inertia::render('Ledgers/Show', [
'dynamic' => $dynamic,
'ledger' => $ledger,
'isOwner' => $isOwner,
'messages' => $dynamic->chat->messages()->with(['user', 'media'])->latest()->paginate(20),
'dynamic' => new DynamicResource($dynamic),
'ledger' => new LedgerResource($ledger),
'mutations' => MutationResource::collection($ledger->mutations),
'participants' => UserResource::collection($dynamic->participants),
'messages' => MessageResource::collection($dynamic->chat->messages()->with(['user', 'media'])->latest()->paginate(20)),
'can' => [
'update' => $request->user()->can('update', $ledger),
'close' => $request->user()->can('close', $ledger),
],
]);
}
@@ -93,23 +99,41 @@ class LedgerController extends Controller
{
$this->authorize('view', $ledger);
return $dynamic->chat->messages()->with(['user', 'media'])->latest()->paginate(20);
return MessageResource::collection($dynamic->chat->messages()->with(['user', 'media'])->latest()->paginate(20));
}
/**
* Show the form for editing the specified resource.
*/
public function edit(Ledger $ledger)
public function edit(Dynamic $dynamic, Ledger $ledger)
{
//
$this->authorize('update', $ledger);
return Inertia::render('Ledgers/Edit', [
'dynamic' => new DynamicResource($dynamic),
'ledger' => new LedgerResource($ledger),
]);
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, Ledger $ledger)
public function update(StoreLedgerRequest $request, Dynamic $dynamic, Ledger $ledger)
{
//
$this->authorize('update', $ledger);
$ledger->update($request->validated());
return redirect()->route('dynamics.ledgers.show', [$dynamic, $ledger]);
}
public function close(Request $request, Dynamic $dynamic, Ledger $ledger)
{
$this->authorize('close', $ledger);
$ledger->update(['status' => 'closed']);
return redirect()->route('dynamics.ledgers.show', [$dynamic, $ledger]);
}
/**
+19 -15
View File
@@ -2,15 +2,19 @@
namespace App\Http\Controllers;
use App\Http\Resources\MutationResource;
use App\Http\Requests\StoreMutationRequest;
use App\Models\Dynamic;
use App\Models\Ledger;
use App\Models\Mutation;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
class MutationController extends Controller
{
use AuthorizesRequests;
/**
* Display a listing of the resource.
*/
@@ -32,13 +36,10 @@ class MutationController extends Controller
*/
public function store(StoreMutationRequest $request, Dynamic $dynamic, Ledger $ledger)
{
$isOwner = $dynamic->participants()
->where('user_id', $request->user()->id)
->where('role', 'owner')
->exists();
$this->authorize('create', [Mutation::class, $ledger]);
// If the user is an owner, default status to 'approved'. Otherwise default to 'pending'.
$status = $isOwner ? 'approved' : 'pending';
$status = $request->user()->can('update', $ledger) ? 'approved' : 'pending';
$mutation = DB::transaction(function () use ($request, $ledger, $status) {
$mutation = $ledger->mutations()->create([
@@ -78,7 +79,9 @@ class MutationController extends Controller
*/
public function show(Dynamic $dynamic, Ledger $ledger, Mutation $mutation)
{
//
$this->authorize('view', $mutation);
return new MutationResource($mutation);
}
/**
@@ -94,15 +97,7 @@ class MutationController extends Controller
*/
public function update(Request $request, Dynamic $dynamic, Ledger $ledger, Mutation $mutation)
{
// 1. Authorize - only owners can update mutation status!
$isOwner = $dynamic->participants()
->where('user_id', $request->user()->id)
->where('role', 'owner')
->exists();
if (!$isOwner) {
abort(403, 'Only dynamic owners can approve or reject mutations.');
}
$this->authorize('update', $mutation);
$request->validate([
'status' => ['required', 'string', 'in:approved,rejected'],
@@ -157,6 +152,15 @@ class MutationController extends Controller
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.
*/
@@ -16,21 +16,20 @@ class PredefinedMutationController extends Controller
/**
* Display a listing of the resource.
*/
public function index(Dynamic $dynamic, Ledger $ledger)
public function index(Dynamic $dynamic)
{
$this->authorize('update', $dynamic);
return Inertia::render('Ledgers/PredefinedMutations/Index', [
return Inertia::render('Dynamics/PredefinedMutations/Index', [
'dynamic' => $dynamic,
'ledger' => $ledger,
'predefined_mutations' => $ledger->predefinedMutations()->latest()->get(),
'predefined_mutations' => $dynamic->predefinedMutations()->latest()->get(),
]);
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request, Dynamic $dynamic, Ledger $ledger)
public function store(Request $request, Dynamic $dynamic)
{
$this->authorize('update', $dynamic);
@@ -38,10 +37,55 @@ class PredefinedMutationController extends Controller
'name' => ['required', 'string', 'max:255'],
'description' => ['nullable', 'string'],
'amount' => ['required', 'integer'],
'type' => ['required', 'string', 'in:reward,penalty'],
]);
$ledger->predefinedMutations()->create($request->all());
$dynamic->predefinedMutations()->create($request->all());
return redirect()->route('dynamics.ledgers.predefined-mutations.index', [$dynamic, $ledger]);
return redirect()->route('dynamics.predefined-mutations.index', $dynamic);
}
/**
* Show the form for editing the specified resource.
*/
public function edit(Dynamic $dynamic, PredefinedMutation $predefinedMutation)
{
$this->authorize('update', $dynamic);
return Inertia::render('Dynamics/PredefinedMutations/Edit', [
'dynamic' => $dynamic,
'predefined_mutation' => $predefinedMutation,
]);
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, Dynamic $dynamic, PredefinedMutation $predefinedMutation)
{
$this->authorize('update', $dynamic);
$request->validate([
'name' => ['required', 'string', 'max:255'],
'description' => ['nullable', 'string'],
'amount' => ['required', 'integer'],
'type' => ['required', 'string', 'in:reward,penalty'],
]);
$predefinedMutation->update($request->all());
return redirect()->route('dynamics.predefined-mutations.index', $dynamic);
}
/**
* Remove the specified resource from storage.
*/
public function destroy(Dynamic $dynamic, PredefinedMutation $predefinedMutation)
{
$this->authorize('update', $dynamic);
$predefinedMutation->delete();
return redirect()->route('dynamics.predefined-mutations.index', $dynamic);
}
}