Openstatus www.openstatus.dev

fix: cron procedure (#439)

authored by

Maximilian Kaske and committed by
GitHub
d93391c7 122fde37

+32 -3
+8 -3
packages/api/src/router/monitor.ts
··· 15 15 import { allPlans } from "@openstatus/plans"; 16 16 17 17 import { trackNewMonitor } from "../analytics"; 18 - import { createTRPCRouter, protectedProcedure, publicProcedure } from "../trpc"; 18 + import { 19 + createTRPCRouter, 20 + cronProcedure, 21 + protectedProcedure, 22 + publicProcedure, 23 + } from "../trpc"; 19 24 20 25 export const monitorRouter = createTRPCRouter({ 21 26 create: protectedProcedure ··· 219 224 return z.array(selectMonitorSchema).parse(monitors); 220 225 }), 221 226 222 - getMonitorsForPeriodicity: protectedProcedure 227 + getMonitorsForPeriodicity: cronProcedure 223 228 .input(z.object({ periodicity: monitorPeriodicitySchema })) 224 229 .query(async (opts) => { 225 230 const result = await opts.ctx.db ··· 235 240 return z.array(selectMonitorSchema).parse(result); 236 241 }), 237 242 238 - getAllPagesForMonitor: protectedProcedure 243 + getAllPagesForMonitor: cronProcedure 239 244 .input(z.object({ monitorId: z.number() })) 240 245 .query(async (opts) => { 241 246 const allPages = await opts.ctx.db
+24
packages/api/src/trpc.ts
··· 176 176 * @see https://trpc.io/docs/procedures 177 177 */ 178 178 export const protectedProcedure = t.procedure.use(enforceUserIsAuthed); 179 + 180 + /** 181 + * Reusable middleware that enforces only cron before running the 182 + * procedure 183 + */ 184 + const enforeUserIsCron = t.middleware(async ({ ctx, next }) => { 185 + if (!ctx.auth?.userId || ctx.auth.userId !== "cron") { 186 + throw new TRPCError({ code: "UNAUTHORIZED" }); 187 + } 188 + 189 + return next({ 190 + ctx: { 191 + auth: { 192 + ...ctx.auth, 193 + userId: ctx.auth.userId, 194 + }, 195 + }, 196 + }); 197 + }); 198 + 199 + /** 200 + * Protected (cron) procedure 201 + */ 202 + export const cronProcedure = t.procedure.use(enforeUserIsCron);