diff --git a/backend/src/server/routes/v1/index.ts b/backend/src/server/routes/v1/index.ts index 99b9de14e..848bd4f31 100644 --- a/backend/src/server/routes/v1/index.ts +++ b/backend/src/server/routes/v1/index.ts @@ -42,7 +42,7 @@ import { registerProjectEnvRouter } from "./project-env-router"; import { registerProjectKeyRouter } from "./project-key-router"; import { registerProjectMembershipRouter } from "./project-membership-router"; import { registerProjectRouter } from "./project-router"; -import { registerReminderRouter } from "./reminder-router"; +import { SECRET_REMINDER_REGISTER_ROUTER_MAP } from "./reminder-routers"; import { registerSecretFolderRouter } from "./secret-folder-router"; import { registerSecretImportRouter } from "./secret-import-router"; import { registerSecretRequestsRouter } from "./secret-requests-router"; @@ -85,7 +85,6 @@ export const registerV1Routes = async (server: FastifyZodProvider) => { await server.register(registerInviteOrgRouter, { prefix: "/invite-org" }); await server.register(registerUserActionRouter, { prefix: "/user-action" }); await server.register(registerSecretImportRouter, { prefix: "/secret-imports" }); - await server.register(registerReminderRouter, { prefix: "/reminders" }); await server.register(registerSecretFolderRouter, { prefix: "/folders" }); await server.register( @@ -174,4 +173,14 @@ export const registerV1Routes = async (server: FastifyZodProvider) => { }, { prefix: "/secret-syncs" } ); + + await server.register( + async (reminderRouter) => { + // register service specific reminder endpoints (reminders/secret) + for await (const [reminderType, router] of Object.entries(SECRET_REMINDER_REGISTER_ROUTER_MAP)) { + await reminderRouter.register(router, { prefix: `/${reminderType}` }); + } + }, + { prefix: "/reminders" } + ); }; diff --git a/backend/src/server/routes/v1/reminder-routers/index.ts b/backend/src/server/routes/v1/reminder-routers/index.ts new file mode 100644 index 000000000..863915c9c --- /dev/null +++ b/backend/src/server/routes/v1/reminder-routers/index.ts @@ -0,0 +1,8 @@ +import { ReminderType } from "@app/services/reminder/reminder-enums"; + +import { registerSecretReminderRouter } from "./secret-reminder-router"; + +export const SECRET_REMINDER_REGISTER_ROUTER_MAP: Record Promise> = + { + [ReminderType.SECRETS]: registerSecretReminderRouter + }; diff --git a/backend/src/server/routes/v1/reminder-router.ts b/backend/src/server/routes/v1/reminder-routers/secret-reminder-router.ts similarity index 87% rename from backend/src/server/routes/v1/reminder-router.ts rename to backend/src/server/routes/v1/reminder-routers/secret-reminder-router.ts index e3ce9fdf6..658f75752 100644 --- a/backend/src/server/routes/v1/reminder-router.ts +++ b/backend/src/server/routes/v1/reminder-routers/secret-reminder-router.ts @@ -6,18 +6,20 @@ import { readLimit, writeLimit } from "@app/server/config/rateLimiter"; import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; import { AuthMode } from "@app/services/auth/auth-type"; -export const registerReminderRouter = async (server: FastifyZodProvider) => { +export const registerSecretReminderRouter = async (server: FastifyZodProvider) => { server.route({ - url: "/:projectId/reminder/:secretId", + url: "/:secretId", method: "POST", config: { rateLimit: writeLimit }, schema: { params: z.object({ - projectId: z.string().uuid(), secretId: z.string().uuid() }), + querystring: z.object({ + projectId: z.string().uuid() + }), body: z .object({ message: z.string().trim().max(1024).optional(), @@ -41,7 +43,7 @@ export const registerReminderRouter = async (server: FastifyZodProvider) => { actor: req.permission.type, actorOrgId: req.permission.orgId, actorAuthMethod: req.permission.authMethod, - projectId: req.params.projectId, + projectId: req.query.projectId, reminder: { secretId: req.params.secretId, message: req.body.message, @@ -54,7 +56,7 @@ export const registerReminderRouter = async (server: FastifyZodProvider) => { await server.services.auditLog.createAuditLog({ ...req.auditLogInfo, orgId: req.permission.orgId, - projectId: req.params.projectId, + projectId: req.query.projectId, event: { type: EventType.CREATE_SECRET_REMINDER, metadata: { @@ -72,16 +74,18 @@ export const registerReminderRouter = async (server: FastifyZodProvider) => { }); server.route({ - url: "/:projectId/reminder/:secretId", + url: "/:secretId", method: "GET", config: { rateLimit: readLimit }, schema: { params: z.object({ - projectId: z.string().uuid(), secretId: z.string().uuid() }), + querystring: z.object({ + projectId: z.string().uuid() + }), response: { 200: z.object({ reminder: RemindersSchema.extend({ @@ -100,13 +104,13 @@ export const registerReminderRouter = async (server: FastifyZodProvider) => { actorOrgId: req.permission.orgId, actorAuthMethod: req.permission.authMethod, secretId: req.params.secretId, - projectId: req.params.projectId + projectId: req.query.projectId }); await server.services.auditLog.createAuditLog({ ...req.auditLogInfo, orgId: req.permission.orgId, - projectId: req.params.projectId, + projectId: req.query.projectId, event: { type: EventType.GET_SECRET_REMINDER, metadata: { @@ -119,16 +123,18 @@ export const registerReminderRouter = async (server: FastifyZodProvider) => { }); server.route({ - url: "/:projectId/reminder/:secretId", + url: "/:secretId", method: "DELETE", config: { rateLimit: writeLimit }, schema: { params: z.object({ - projectId: z.string().uuid(), secretId: z.string().uuid() }), + querystring: z.object({ + projectId: z.string().uuid() + }), response: { 200: z.object({ message: z.string() @@ -143,13 +149,13 @@ export const registerReminderRouter = async (server: FastifyZodProvider) => { actorOrgId: req.permission.orgId, actorAuthMethod: req.permission.authMethod, secretId: req.params.secretId, - projectId: req.params.projectId + projectId: req.query.projectId }); await server.services.auditLog.createAuditLog({ ...req.auditLogInfo, orgId: req.permission.orgId, - projectId: req.params.projectId, + projectId: req.query.projectId, event: { type: EventType.DELETE_SECRET_REMINDER, metadata: { diff --git a/backend/src/services/reminder/reminder-enums.ts b/backend/src/services/reminder/reminder-enums.ts new file mode 100644 index 000000000..c6650b593 --- /dev/null +++ b/backend/src/services/reminder/reminder-enums.ts @@ -0,0 +1,3 @@ +export enum ReminderType { + SECRETS = "secrets" +} diff --git a/frontend/src/hooks/api/reminders/queries.tsx b/frontend/src/hooks/api/reminders/queries.tsx index e9b29807c..613afef56 100644 --- a/frontend/src/hooks/api/reminders/queries.tsx +++ b/frontend/src/hooks/api/reminders/queries.tsx @@ -15,7 +15,7 @@ export const useCreateReminder = (secretId: string, projectId: string) => { return useMutation({ mutationFn: async ({ message, repeatDays, nextReminderDate, recipients }) => { const { data } = await apiRequest.post<{ reminder: Reminder }>( - `/api/v1/reminders/${projectId}/reminder/${secretId}`, + `/api/v1/reminders/secrets/${secretId}?projectId=${projectId}`, { message, repeatDays, @@ -37,7 +37,7 @@ export const useDeleteReminder = (secretId: string, projectId: string) => { return useMutation({ mutationFn: async () => { const { data } = await apiRequest.delete<{ reminder: Reminder }>( - `/api/v1/reminders/${projectId}/reminder/${secretId}` + `/api/v1/reminders/secrets/${secretId}?projectId=${projectId}` ); return data.reminder; }, @@ -52,7 +52,7 @@ export const useGetReminder = (secretId: string, projectId: string) => { queryKey: reminderKeys.getReminder(secretId, projectId), queryFn: async () => { const { data } = await apiRequest.get<{ reminder: Reminder }>( - `/api/v1/reminders/${projectId}/reminder/${secretId}` + `/api/v1/reminders/secrets/${secretId}?projectId=${projectId}` ); return data.reminder; },