server/database/entities/Notification.ts

66 lines
2 KiB
TypeScript
Raw Normal View History

import type { InferSelectModel } from "drizzle-orm";
import { db } from "~/drizzle/db";
import type { Notifications } from "~/drizzle/schema";
import { Note } from "~/packages/database-interface/note";
import { User } from "~/packages/database-interface/user";
import type { Notification as APINotification } from "~/types/mastodon/notification";
import type { StatusWithRelations } from "./Status";
2024-04-11 14:12:16 +02:00
import {
type UserWithRelations,
transformOutputToUserWithRelations,
userExtrasTemplate,
userRelations,
2024-04-11 14:12:16 +02:00
} from "./User";
export type Notification = InferSelectModel<typeof Notifications>;
export type NotificationWithRelations = Notification & {
2024-04-07 07:30:49 +02:00
status: StatusWithRelations | null;
account: UserWithRelations;
};
2024-04-11 14:12:16 +02:00
export const findManyNotifications = async (
query: Parameters<typeof db.query.Notifications.findMany>[0],
userId?: string,
2024-04-11 14:12:16 +02:00
): Promise<NotificationWithRelations[]> => {
const output = await db.query.Notifications.findMany({
2024-04-11 14:12:16 +02:00
...query,
with: {
...query?.with,
account: {
with: {
...userRelations,
},
extras: userExtrasTemplate("Notifications_account"),
2024-04-11 14:12:16 +02:00
},
},
extras: {
...query?.extras,
},
});
return await Promise.all(
output.map(async (notif) => ({
...notif,
account: transformOutputToUserWithRelations(notif.account),
status:
(await Note.fromId(notif.noteId, userId))?.getStatus() ?? null,
2024-04-11 14:12:16 +02:00
})),
);
};
export const notificationToAPI = async (
2024-04-07 07:30:49 +02:00
notification: NotificationWithRelations,
): Promise<APINotification> => {
const account = new User(notification.account);
2024-04-07 07:30:49 +02:00
return {
account: account.toAPI(),
2024-04-07 07:30:49 +02:00
created_at: new Date(notification.createdAt).toISOString(),
id: notification.id,
type: notification.type,
status: notification.status
? await Note.fromStatus(notification.status).toAPI(account)
2024-04-07 07:30:49 +02:00
: undefined,
};
};