77 lines
2.6 KiB
TypeScript
77 lines
2.6 KiB
TypeScript
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,
|
|
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');
|
|
}
|
|
};
|