97 lines
2.6 KiB
TypeScript
97 lines
2.6 KiB
TypeScript
import { FlowExecCtx } from "@/core/flow.execution.context";
|
|
import { okAsync } from "neverthrow";
|
|
import {
|
|
NotificationFilters,
|
|
PaginationOptions,
|
|
} from "./data";
|
|
import { NotificationRepository } from "./repository";
|
|
import { db } from "@pkg/db";
|
|
|
|
export class NotificationController {
|
|
constructor(private notifsRepo: NotificationRepository) {}
|
|
|
|
getNotifications(
|
|
fctx: FlowExecCtx,
|
|
filters: NotificationFilters,
|
|
pagination: PaginationOptions,
|
|
) {
|
|
return this.notifsRepo.getNotifications(fctx, filters, pagination);
|
|
}
|
|
|
|
markAsRead(
|
|
fctx: FlowExecCtx,
|
|
notificationIds: number[],
|
|
userId: string,
|
|
) {
|
|
return this.notifsRepo.markAsRead(fctx, notificationIds, userId);
|
|
}
|
|
|
|
markAsUnread(
|
|
fctx: FlowExecCtx,
|
|
notificationIds: number[],
|
|
userId: string,
|
|
) {
|
|
return this.notifsRepo.markAsUnread(fctx, notificationIds, userId);
|
|
}
|
|
|
|
archive(
|
|
fctx: FlowExecCtx,
|
|
notificationIds: number[],
|
|
userId: string,
|
|
) {
|
|
return this.notifsRepo.archive(fctx, notificationIds, userId);
|
|
}
|
|
|
|
unarchive(
|
|
fctx: FlowExecCtx,
|
|
notificationIds: number[],
|
|
userId: string,
|
|
) {
|
|
return this.notifsRepo.unarchive(fctx, notificationIds, userId);
|
|
}
|
|
|
|
deleteNotifications(
|
|
fctx: FlowExecCtx,
|
|
notificationIds: number[],
|
|
userId: string,
|
|
) {
|
|
return this.notifsRepo.deleteNotifications(fctx, notificationIds, userId);
|
|
}
|
|
|
|
getUnreadCount(
|
|
fctx: FlowExecCtx,
|
|
userId: string,
|
|
) {
|
|
return this.notifsRepo.getUnreadCount(fctx, userId);
|
|
}
|
|
|
|
markAllAsRead(
|
|
fctx: FlowExecCtx,
|
|
userId: string,
|
|
) {
|
|
// Get all unread notification IDs for this user
|
|
const filters: NotificationFilters = {
|
|
userId,
|
|
isRead: false,
|
|
isArchived: false,
|
|
};
|
|
|
|
// Get a large number to handle bulk operations
|
|
const pagination: PaginationOptions = { page: 1, pageSize: 1000 };
|
|
|
|
return this.notifsRepo
|
|
.getNotifications(fctx, filters, pagination)
|
|
.map((paginated) => paginated.data.map((n) => n.id))
|
|
.andThen((notificationIds) => {
|
|
if (notificationIds.length === 0) {
|
|
return okAsync(true);
|
|
}
|
|
return this.notifsRepo.markAsRead(fctx, notificationIds, userId);
|
|
});
|
|
}
|
|
}
|
|
|
|
export function getNotificationController(): NotificationController {
|
|
return new NotificationController(new NotificationRepository(db));
|
|
}
|