123 lines
3.7 KiB
PHP
123 lines
3.7 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\Post;
|
|
use App\Models\PostThank;
|
|
use App\Models\User;
|
|
use Illuminate\Http\JsonResponse;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Str;
|
|
|
|
class PostThankController extends Controller
|
|
{
|
|
public function store(Request $request, Post $post): JsonResponse
|
|
{
|
|
$user = $request->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;
|
|
}
|
|
}
|