diff --git a/src/notification/notification.controller.ts b/src/notification/notification.controller.ts index 5852188..1dec0b0 100644 --- a/src/notification/notification.controller.ts +++ b/src/notification/notification.controller.ts @@ -1,7 +1,28 @@ import { FastifyRequest, FastifyReply } from "fastify"; import { PageQueryParams } from "../pagination"; -import { listNotifications, updateNotification } from "./notification.service"; -import { UpdateNotificationInput } from "./notification.schema"; +import { + createNotification, + listNotifications, + updateNotification, +} from "./notification.service"; +import { + CreateNotificationInput, + UpdateNotificationInput, +} from "./notification.schema"; + +export async function createNotificationHandler( + req: FastifyRequest, + res: FastifyReply +) { + const input = req.body as CreateNotificationInput; + + try { + const notification = await createNotification(input, req.user.tenantId); + return res.code(201).send(notification); + } catch (err) { + return err; + } +} export async function listNotificationsHandler( req: FastifyRequest, diff --git a/src/notification/notification.route.ts b/src/notification/notification.route.ts index 9c2aa32..52425ba 100644 --- a/src/notification/notification.route.ts +++ b/src/notification/notification.route.ts @@ -1,11 +1,24 @@ import { FastifyInstance } from "fastify"; import { $notification } from "./notification.schema"; import { + createNotificationHandler, listNotificationsHandler, updateNotificationHandler, } from "./notification.controller"; export async function notificationRoutes(fastify: FastifyInstance) { + fastify.post( + "/", + { + schema: { + body: $notification("createNotificationInput"), + }, + config: { requiredClaims: ["notification:write"] }, + preHandler: [fastify.authorize], + }, + createNotificationHandler + ); + fastify.get( "/", { diff --git a/src/notification/notification.schema.ts b/src/notification/notification.schema.ts index b9696c7..f6975f2 100644 --- a/src/notification/notification.schema.ts +++ b/src/notification/notification.schema.ts @@ -1,6 +1,6 @@ import { buildJsonSchemas } from "fastify-zod"; import mongoose from "mongoose"; -import { z } from "zod"; +import { TypeOf, z } from "zod"; import { pageQueryParams } from "../pagination"; const notificationSchema = new mongoose.Schema({ @@ -31,15 +31,29 @@ export const notificationModel = mongoose.model( notificationSchema ); +const createNotificationInput = z.object({ + permitId: z.string(), + permitNumber: z.string(), + link: z.string(), + status: z.string(), + accelaStatus: z.string(), + changes: z.object({}).passthrough(), + county: z.object({}).passthrough(), + client: z.string(), + clientData: z.object({}).passthrough(), +}); + const updateNotificationInput = z.object({ status: z.string(), }); +export type CreateNotificationInput = z.infer; export type UpdateNotificationInput = z.infer; export const { schemas: notificationSchemas, $ref: $notification } = buildJsonSchemas( { + createNotificationInput, updateNotificationInput, pageQueryParams, }, diff --git a/src/notification/notification.service.ts b/src/notification/notification.service.ts index d03a20a..64c91ab 100644 --- a/src/notification/notification.service.ts +++ b/src/notification/notification.service.ts @@ -1,10 +1,24 @@ import { getFilterObject, getSortObject, PageQueryParams } from "../pagination"; +import { generateId } from "../utils/id"; import { + CreateNotificationInput, notificationFields, notificationModel, UpdateNotificationInput, } from "./notification.schema"; +export async function createNotification( + input: CreateNotificationInput, + tenantId: string +) { + return await notificationModel.create({ + ...input, + pid: generateId(), + tenantId: tenantId, + createdAt: new Date(), + }); +} + export async function updateNotification( notifId: string, input: UpdateNotificationInput, diff --git a/src/permit/permit.schema.ts b/src/permit/permit.schema.ts index 6c0ac17..ec16a05 100644 --- a/src/permit/permit.schema.ts +++ b/src/permit/permit.schema.ts @@ -133,6 +133,7 @@ const updatePermitInput = z.object({ .nullable() .optional(), assignedTo: z.string().optional(), + newPayment: z.array(z.any()), }); export type CreatePermitInput = z.infer; diff --git a/src/permit/permit.service.ts b/src/permit/permit.service.ts index 302ebe5..1adc14d 100644 --- a/src/permit/permit.service.ts +++ b/src/permit/permit.service.ts @@ -156,7 +156,7 @@ export async function updatePermit( { $and: [{ tenantId: user.tenantId }, { pid: permitId }], }, - { ...input, updatedAt: new Date() }, + { ...input, lastUpdateDate: new Date() }, { new: true } ) .populate({ path: "county", select: "pid name avatar" }) diff --git a/src/utils/roles.ts b/src/utils/roles.ts index 17a2e81..f62ceea 100644 --- a/src/utils/roles.ts +++ b/src/utils/roles.ts @@ -31,6 +31,9 @@ export const rules: Record< "view:read", "view:write", "view:delete", + "token:read", + "token:write", + "token:delete", ], hiddenFields: { orgs: ["__v"],