Files
animexe/app/Http/Controllers/Api/CommentApiController.php
T
2026-07-14 00:01:48 +03:00

109 lines
3.8 KiB
PHP

<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Models\Comment;
use App\Models\CommentLike;
use App\Models\Anime;
use Illuminate\Http\Request;
class CommentApiController extends Controller
{
public function index(Request $request)
{
$animeId = $request->input('anime_id');
$episodeId = $request->input('episode_id');
$query = Comment::with('user:id,name,username,avatar')
->where('status', 'approved')
->orderByDesc('is_pinned')
->orderByDesc('created_at');
if ($episodeId) {
$query->where('commentable_type', \App\Models\Episode::class)
->where('commentable_id', $episodeId);
} elseif ($animeId) {
$query->where('commentable_type', Anime::class)
->where('commentable_id', $animeId);
}
$items = $query->paginate(20);
$userId = $request->user()?->id;
return response()->json([
'data' => collect($items->items())->map(fn($c) => $this->fmt($c, $userId)),
'total' => $items->total(),
'last_page' => $items->lastPage(),
]);
}
public function store(Request $request)
{
$data = $request->validate([
'anime_id' => 'nullable|exists:animes,id',
'episode_id' => 'nullable|exists:episodes,id',
'body' => 'required|string|max:1000',
'gif_url' => 'nullable|url|max:500',
]);
if (empty($data['anime_id']) && empty($data['episode_id'])) {
return response()->json(['error' => 'anime_id veya episode_id gerekli.'], 422);
}
$isEpisode = !empty($data['episode_id']);
$comment = Comment::create([
'user_id' => $request->user()->id,
'commentable_type' => $isEpisode ? \App\Models\Episode::class : Anime::class,
'commentable_id' => $isEpisode ? $data['episode_id'] : $data['anime_id'],
'content' => $data['body'],
'gif_url' => $data['gif_url'] ?? null,
'status' => 'approved',
]);
$comment->load('user:id,name,username,avatar');
return response()->json($this->fmt($comment, $request->user()->id), 201);
}
public function like(Request $request, Comment $comment)
{
$userId = $request->user()->id;
$existing = CommentLike::where('user_id', $userId)
->where('comment_id', $comment->id)->first();
if ($existing) {
$existing->delete();
$comment->decrement('like_count');
return response()->json(['liked' => false, 'likes' => $comment->fresh()->like_count]);
}
CommentLike::create(['user_id' => $userId, 'comment_id' => $comment->id]);
$comment->increment('like_count');
return response()->json(['liked' => true, 'likes' => $comment->fresh()->like_count]);
}
private function fmt(Comment $c, ?int $userId): array
{
return [
'id' => $c->id,
'body' => $c->content,
'gif_url' => $c->gif_url,
'likes_count' => $c->like_count ?? 0,
'is_pinned' => $c->is_pinned ?? false,
'created_at' => $c->created_at?->diffForHumans(),
'user_liked' => $userId
? CommentLike::where('user_id', $userId)->where('comment_id', $c->id)->exists()
: false,
'user' => $c->user ? [
'id' => $c->user->id,
'name' => $c->user->name,
'username' => $c->user->username,
'avatar' => $c->user->avatar
? \App\Support\MediaUrl::fromStoragePath($c->user->avatar)
: null,
] : null,
];
}
}