2025-06-11 18:37:03 +03:00
import { auth } from '$lib/auth' ;
import { error , json } from '@sveltejs/kit' ;
import { db } from '$lib/server/db' ;
import { notifications } from '$lib/server/db/schema' ;
import { eq , desc , and , count , inArray } from 'drizzle-orm' ;
import type { RequestHandler } from './$types' ;
export const GET : RequestHandler = async ( { url , request } ) = > {
const session = await auth . api . getSession ( { headers : request.headers } ) ;
if ( ! session ? . user ) throw error ( 401 , 'Not authenticated' ) ;
const userId = Number ( session . user . id ) ;
const unreadOnly = url . searchParams . get ( 'unread_only' ) === 'true' ;
try {
const conditions = [ eq ( notifications . userId , userId ) ] ;
if ( unreadOnly ) {
conditions . push ( eq ( notifications . isRead , false ) ) ;
}
const whereCondition = and ( . . . conditions ) ;
const notificationsList = await db . select ( {
id : notifications.id ,
type : notifications . type ,
title : notifications.title ,
message : notifications.message ,
2025-07-01 15:52:30 +01:00
link : notifications.link ,
2025-06-11 18:37:03 +03:00
isRead : notifications.isRead ,
createdAt : notifications.createdAt ,
} )
. from ( notifications )
. where ( whereCondition )
. orderBy ( desc ( notifications . createdAt ) )
. limit ( 50 ) ;
const unreadCount = await db
. select ( { count : count ( ) } )
. from ( notifications )
. where ( and ( eq ( notifications . userId , userId ) , eq ( notifications . isRead , false ) ) )
. then ( result = > result [ 0 ] ? . count || 0 ) ;
return json ( {
notifications : notificationsList ,
unreadCount
} ) ;
} catch ( e ) {
console . error ( 'Failed to fetch notificationss:' , e ) ;
throw error ( 500 , 'Failed to fetch notificationss' ) ;
}
} ;
export const PATCH : RequestHandler = async ( { request } ) = > {
const session = await auth . api . getSession ( { headers : request.headers } ) ;
if ( ! session ? . user ) throw error ( 401 , 'Not authenticated' ) ;
const userId = Number ( session . user . id ) ;
const { ids , markAsRead } = await request . json ( ) ;
if ( ! Array . isArray ( ids ) || typeof markAsRead !== 'boolean' ) {
throw error ( 400 , 'Invalid request body' ) ;
}
try {
await db
. update ( notifications )
. set ( { isRead : markAsRead } )
. where ( and (
eq ( notifications . userId , userId ) ,
inArray ( notifications . id , ids )
) ) ;
return json ( { success : true } ) ;
} catch ( e ) {
console . error ( 'Failed to update notifications:' , e ) ;
throw error ( 500 , 'Failed to update notifications' ) ;
}
} ;