diff --git a/media.db b/media.db index 07b7ff4..fbd3112 100644 Binary files a/media.db and b/media.db differ diff --git a/src/app/api/bookmarks/[id]/route.ts b/src/app/api/bookmarks/[id]/route.ts index 79a8949..e6dfc1f 100644 --- a/src/app/api/bookmarks/[id]/route.ts +++ b/src/app/api/bookmarks/[id]/route.ts @@ -1,33 +1,78 @@ import { NextResponse } from 'next/server'; import db from '@/db'; -export async function DELETE(request: Request, { params }: { params: Promise<{ id: string }> }) { +export async function POST(request: Request, { params }: { params: Promise<{ id: string }> }) { const { id } = await params; try { - const parsedId = parseInt(id); + const mediaId = parseInt(id); - if (isNaN(parsedId)) { - return NextResponse.json({ error: 'Invalid bookmark ID' }, { status: 400 }); + if (isNaN(mediaId)) { + return NextResponse.json({ error: 'Invalid media ID' }, { status: 400 }); } - // Get media_id before deleting - const bookmark = db.prepare(` - SELECT media_id FROM bookmarks WHERE id = ? - `).get(parsedId) as { media_id: number } | undefined; + // Check if media exists + const media = db.prepare(` + SELECT id FROM media WHERE id = ? + `).get(mediaId) as { id: number } | undefined; - if (!bookmark) { - return NextResponse.json({ error: 'Bookmark not found' }, { status: 404 }); + if (!media) { + return NextResponse.json({ error: 'Media not found' }, { status: 404 }); } - // Delete bookmark - db.prepare(`DELETE FROM bookmarks WHERE id = ?`).run(parsedId); + // Check if already bookmarked + const existing = db.prepare(` + SELECT id FROM bookmarks WHERE media_id = ? + `).get(mediaId); + + if (existing) { + return NextResponse.json({ error: 'Already bookmarked' }, { status: 400 }); + } + + // Insert bookmark + const result = db.prepare(` + INSERT INTO bookmarks (media_id) VALUES (?) + `).run(mediaId); // Update media bookmark count db.prepare(` UPDATE media SET bookmark_count = (SELECT COUNT(*) FROM bookmarks WHERE media_id = ?) WHERE id = ? - `).run(bookmark.media_id, bookmark.media_id); + `).run(mediaId, mediaId); + + return NextResponse.json({ id: result.lastInsertRowid }); + } catch (error: any) { + return NextResponse.json({ error: error.message }, { status: 500 }); + } +} + +export async function DELETE(request: Request, { params }: { params: Promise<{ id: string }> }) { + const { id } = await params; + try { + const mediaId = parseInt(id); + + if (isNaN(mediaId)) { + return NextResponse.json({ error: 'Invalid media ID' }, { status: 400 }); + } + + // Check if bookmark exists + const bookmark = db.prepare(` + SELECT id FROM bookmarks WHERE media_id = ? + `).get(mediaId) as { id: number } | undefined; + + if (!bookmark) { + return NextResponse.json({ error: 'Bookmark not found' }, { status: 404 }); + } + + // Delete bookmark + db.prepare(`DELETE FROM bookmarks WHERE media_id = ?`).run(mediaId); + + // Update media bookmark count + db.prepare(` + UPDATE media + SET bookmark_count = (SELECT COUNT(*) FROM bookmarks WHERE media_id = ?) + WHERE id = ? + `).run(mediaId, mediaId); return NextResponse.json({ success: true }); } catch (error: any) { diff --git a/src/app/videos/page.tsx b/src/app/videos/page.tsx index 327f596..194074d 100644 --- a/src/app/videos/page.tsx +++ b/src/app/videos/page.tsx @@ -67,6 +67,37 @@ const VideosPage = () => { setSelectedVideo(null); }; + const handleBookmark = async (videoId: number) => { + try { + await fetch(`/api/bookmarks/${videoId}`, { method: 'POST' }); + fetchVideos(); + } catch (error) { + console.error('Error bookmarking video:', error); + } + }; + + const handleUnbookmark = async (videoId: number) => { + try { + await fetch(`/api/bookmarks/${videoId}`, { method: 'DELETE' }); + fetchVideos(); + } catch (error) { + console.error('Error unbookmarking video:', error); + } + }; + + const handleRate = async (videoId: number, rating: number) => { + try { + await fetch(`/api/stars/${videoId}`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ rating }) + }); + fetchVideos(); + } catch (error) { + console.error('Error rating video:', error); + } + }; + if (loading) { return (