import { and, eq } from "drizzle-orm"; import { type Response, Router } from "express"; import z from "zod"; import { db } from "../db/db.controller.js"; import { notificationSub } from "../db/schema/notifications.sub.schema.js"; import { apiReturn } from "../utils/returnHelper.utils.js"; import { tryCatch } from "../utils/trycatch.utils.js"; import { modifiedNotification } from "./notification.controller.js"; const newSubscribe = z.object({ emails: z.email().array().describe("An array of emails"), userId: z.string().describe("User id."), notificationId: z.string().describe("Notification id"), }); const r = Router(); r.patch("/", async (req, res: Response) => { try { const validated = newSubscribe.parse(req.body); const emails = validated.emails .map((e) => e.trim().toLowerCase()) .filter(Boolean); const uniqueEmails = [...new Set(emails)]; const { data, error } = await tryCatch( db .update(notificationSub) .set({ emails: uniqueEmails }) .where( and( eq(notificationSub.userId, validated.userId), eq(notificationSub.notificationId, validated.notificationId), ), ) .returning(), ); await modifiedNotification(validated.notificationId); if (error) { return apiReturn(res, { success: false, level: "error", module: "notification", subModule: "update", message: `There was an error updating the notifications `, data: [error], status: 400, }); } return apiReturn(res, { success: true, level: "info", module: "notification", subModule: "update", message: `Subscription updated`, data: data ?? [], status: 200, }); } catch (err) { if (err instanceof z.ZodError) { const flattened = z.flattenError(err); // return res.status(400).json({ // error: "Validation failed", // details: flattened, // }); return apiReturn(res, { success: false, level: "error", //connect.success ? "info" : "error", module: "routes", subModule: "notification", message: "Validation failed", data: [flattened.fieldErrors], status: 400, //connect.success ? 200 : 400, }); } } }); export default r;