borsa / nextjs-app /src /app /api /watchlist /route.ts
hfpush
fix: add ai/sentiment_model.py facade
c3c81a6
import { NextRequest, NextResponse } from 'next/server'
import { createClient } from '@/lib/supabase/server'
export const dynamic = 'force-dynamic'
// GET /api/watchlist — kullanıcının takip listesi
export async function GET() {
const supabase = await createClient()
const { data: { user }, error: authErr } = await supabase.auth.getUser()
if (!user || authErr) {
return NextResponse.json({ error: 'Giriş gerekli' }, { status: 401 })
}
const { data, error } = await supabase
.from('watchlists')
.select('*')
.eq('user_id', user.id)
.order('created_at', { ascending: false })
if (error) return NextResponse.json({ error: error.message }, { status: 500 })
return NextResponse.json({ items: data ?? [] })
}
// POST /api/watchlist — takip listesine ekle
export async function POST(req: NextRequest) {
const supabase = await createClient()
const { data: { user }, error: authErr } = await supabase.auth.getUser()
if (!user || authErr) {
return NextResponse.json({ error: 'Giriş gerekli' }, { status: 401 })
}
let body: Record<string, unknown>
try { body = await req.json() } catch { return NextResponse.json({ error: 'Geçersiz JSON' }, { status: 400 }) }
const symbol = String(body.symbol || '').trim().toUpperCase()
if (!symbol) return NextResponse.json({ error: 'symbol gerekli' }, { status: 400 })
// Find stock_id if exists
const { data: stock } = await supabase
.from('stocks')
.select('id')
.eq('symbol', symbol)
.maybeSingle()
const { data, error } = await supabase
.from('watchlists')
.upsert({
user_id: user.id,
stock_id: stock?.id || null,
symbol,
alert_price_above: body.alert_price_above || null,
alert_price_below: body.alert_price_below || null,
alert_on_news: body.alert_on_news || false,
notes: body.notes || null,
}, { onConflict: 'user_id,stock_id' })
.select()
.single()
if (error) return NextResponse.json({ error: error.message }, { status: 500 })
return NextResponse.json({ item: data }, { status: 201 })
}
// DELETE /api/watchlist?symbol=THYAO — takip listesinden çıkar
export async function DELETE(req: NextRequest) {
const supabase = await createClient()
const { data: { user }, error: authErr } = await supabase.auth.getUser()
if (!user || authErr) {
return NextResponse.json({ error: 'Giriş gerekli' }, { status: 401 })
}
const url = new URL(req.url)
const id = url.searchParams.get('id')
const symbol = url.searchParams.get('symbol')
if (!id && !symbol) {
return NextResponse.json({ error: 'id veya symbol gerekli' }, { status: 400 })
}
let query = supabase.from('watchlists').delete().eq('user_id', user.id)
if (id) query = query.eq('id', id)
// For symbol, find via stocks table
if (symbol && !id) {
const { data: stock } = await supabase.from('stocks').select('id').eq('symbol', symbol.toUpperCase()).maybeSingle()
if (stock) query = query.eq('stock_id', stock.id)
else return NextResponse.json({ error: 'Hisse bulunamadı' }, { status: 404 })
}
const { error } = await query
if (error) return NextResponse.json({ error: error.message }, { status: 500 })
return NextResponse.json({ ok: true })
}