This repository has been archived on 2025-08-19. You can view files and clone it, but you cannot make any changes to its state, such as pushing and creating new issues, pull requests or comments.
coinstorge/website/src/routes/api/notifications/+server.ts

79 lines
2.6 KiB
TypeScript
Raw Normal View History

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,
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');
}
};