user(); if (!$user) { return response()->json(['message' => 'Unauthenticated.'], 401); } $thank = PostThank::firstOrCreate([ 'post_id' => $post->id, 'user_id' => $user->id, ]); return response()->json([ 'id' => $thank->id, 'post_id' => $post->id, 'user_id' => $user->id, ], 201); } public function destroy(Request $request, Post $post): JsonResponse { $user = $request->user(); if (!$user) { return response()->json(['message' => 'Unauthenticated.'], 401); } PostThank::where('post_id', $post->id) ->where('user_id', $user->id) ->delete(); return response()->json(null, 204); } public function given(User $user): JsonResponse { $thanks = PostThank::query() ->where('user_id', $user->id) ->with(['post.thread', 'post.user.rank', 'post.user.roles']) ->latest('created_at') ->get() ->map(fn (PostThank $thank) => $this->serializeGiven($thank)); return response()->json($thanks); } public function received(User $user): JsonResponse { $thanks = PostThank::query() ->whereHas('post', fn ($query) => $query->where('user_id', $user->id)) ->with(['post.thread', 'user.rank', 'user.roles']) ->latest('created_at') ->get() ->map(fn (PostThank $thank) => $this->serializeReceived($thank)); return response()->json($thanks); } private function serializeGiven(PostThank $thank): array { return [ 'id' => $thank->id, 'post_id' => $thank->post_id, 'thread_id' => $thank->post?->thread_id, 'thread_title' => $thank->post?->thread?->title, 'post_excerpt' => $thank->post?->body ? Str::limit($thank->post->body, 120) : null, 'post_author_id' => $thank->post?->user_id, 'post_author_name' => $thank->post?->user?->name, 'post_author_rank_color' => $thank->post?->user?->rank?->color, 'post_author_group_color' => $this->resolveGroupColor($thank->post?->user), 'thanked_at' => $thank->created_at?->toIso8601String(), ]; } private function serializeReceived(PostThank $thank): array { return [ 'id' => $thank->id, 'post_id' => $thank->post_id, 'thread_id' => $thank->post?->thread_id, 'thread_title' => $thank->post?->thread?->title, 'post_excerpt' => $thank->post?->body ? Str::limit($thank->post->body, 120) : null, 'thanker_id' => $thank->user_id, 'thanker_name' => $thank->user?->name, 'thanker_rank_color' => $thank->user?->rank?->color, 'thanker_group_color' => $this->resolveGroupColor($thank->user), 'thanked_at' => $thank->created_at?->toIso8601String(), ]; } private function resolveGroupColor(?\App\Models\User $user): ?string { if (!$user) { return null; } $roles = $user->roles; if (!$roles) { return null; } foreach ($roles->sortBy('name') as $role) { if (!empty($role->color)) { return $role->color; } } return null; } }