1+ import { NextRequest , NextResponse } from 'next/server' ;
2+ import { createClient } from '@/lib/supabase/server' ;
3+
4+ // Helper to get current user
5+ async function getUser ( ) {
6+ const supabase = await createClient ( ) ;
7+ const { data : { user } } = await supabase . auth . getUser ( ) ;
8+ return user ;
9+ }
10+
11+ // Helper to extract slug from the request URL
12+ function getSlugFromRequest ( req : NextRequest ) : string | null {
13+ // /api/blog/[slug]/like
14+ const url = req . nextUrl || new URL ( req . url ) ;
15+ const match = url . pathname . match ( / \/ b l o g \/ ( [ ^ / ] + ) \/ l i k e / ) ;
16+ return match ? decodeURIComponent ( match [ 1 ] ) : null ;
17+ }
18+
19+ export async function GET ( req : NextRequest ) {
20+ const supabase = await createClient ( ) ;
21+ const blog_slug = getSlugFromRequest ( req ) ;
22+ if ( ! blog_slug ) {
23+ return NextResponse . json ( { error : 'Missing slug' } , { status : 400 } ) ;
24+ }
25+ // Get like count
26+ const { count, error : countError } = await supabase
27+ . from ( 'blog_likes' )
28+ . select ( '*' , { count : 'exact' , head : true } )
29+ . eq ( 'blog_slug' , blog_slug ) ;
30+
31+ // Get current user
32+ const user = await getUser ( ) ;
33+ let likedByUser = false ;
34+ if ( user ) {
35+ const { data : userLike } = await supabase
36+ . from ( 'blog_likes' )
37+ . select ( 'id' )
38+ . eq ( 'blog_slug' , blog_slug )
39+ . eq ( 'user_id' , user . id )
40+ . maybeSingle ( ) ;
41+ likedByUser = ! ! userLike ;
42+ }
43+
44+ if ( countError ) {
45+ return NextResponse . json ( { error : countError . message } , { status : 500 } ) ;
46+ }
47+ return NextResponse . json ( { count : count ?? 0 , likedByUser } ) ;
48+ }
49+
50+ export async function POST ( req : NextRequest ) {
51+ const supabase = await createClient ( ) ;
52+ const user = await getUser ( ) ;
53+ if ( ! user ) {
54+ return NextResponse . json ( { error : 'Unauthorized' } , { status : 401 } ) ;
55+ }
56+ const blog_slug = getSlugFromRequest ( req ) ;
57+ if ( ! blog_slug ) {
58+ return NextResponse . json ( { error : 'Missing slug' } , { status : 400 } ) ;
59+ }
60+ // Insert like (ignore if already exists due to unique constraint)
61+ const { error } = await supabase
62+ . from ( 'blog_likes' )
63+ . insert ( { user_id : user . id , blog_slug } ) ;
64+ if ( error && ! error . message . includes ( 'duplicate key' ) ) {
65+ return NextResponse . json ( { error : error . message } , { status : 500 } ) ;
66+ }
67+ return NextResponse . json ( { success : true } ) ;
68+ }
69+
70+ export async function DELETE ( req : NextRequest ) {
71+ const supabase = await createClient ( ) ;
72+ const user = await getUser ( ) ;
73+ if ( ! user ) {
74+ return NextResponse . json ( { error : 'Unauthorized' } , { status : 401 } ) ;
75+ }
76+ const blog_slug = getSlugFromRequest ( req ) ;
77+ if ( ! blog_slug ) {
78+ return NextResponse . json ( { error : 'Missing slug' } , { status : 400 } ) ;
79+ }
80+ const { error } = await supabase
81+ . from ( 'blog_likes' )
82+ . delete ( )
83+ . eq ( 'user_id' , user . id )
84+ . eq ( 'blog_slug' , blog_slug ) ;
85+ if ( error ) {
86+ return NextResponse . json ( { error : error . message } , { status : 500 } ) ;
87+ }
88+ return NextResponse . json ( { success : true } ) ;
89+ }
0 commit comments