import Router from "koa-router"; import type { WhereOptions } from "sequelize"; import { Op } from "sequelize"; import auth from "@server/middlewares/authentication"; import { rateLimiter } from "@server/middlewares/rateLimiter"; import { transaction } from "@server/middlewares/transaction"; import validate from "@server/middlewares/validate"; import { Collection, Template } from "@server/models"; import { authorize } from "@server/policies"; import { presentPolicies, presentTemplate } from "@server/presenters"; import type { APIContext } from "@server/types"; import { RateLimiterStrategy } from "@server/utils/RateLimiter"; import pagination from "../middlewares/pagination"; import * as T from "./schema"; const router = new Router(); router.post( "templates.create", auth(), rateLimiter(RateLimiterStrategy.TwentyFivePerMinute), validate(T.TemplatesCreateSchema), transaction(), async (ctx: APIContext) => { const { id, title, data, icon, color, collectionId } = ctx.input.body; const editorVersion = ctx.headers["x-editor-version"] as string | undefined; const { transaction } = ctx.state; const { user } = ctx.state.auth; let collection; if (collectionId) { collection = await Collection.findByPk(collectionId, { userId: user.id, transaction, }); authorize(user, "createTemplate", collection); } else { authorize(user, "createTemplate", user.team); } let template = await Template.createWithCtx(ctx, { id, title, icon, color, content: data, collectionId: collection?.id, publishedAt: new Date(), createdById: user.id, lastModifiedById: user.id, teamId: user.teamId, editorVersion, }); template = await Template.findByPk(template.id, { userId: user.id, rejectOnEmpty: true, transaction, }); ctx.body = { data: presentTemplate(template), policies: presentPolicies(user, [template]), }; } ); router.post( "templates.list", auth(), pagination(), validate(T.TemplatesListSchema), async (ctx: APIContext) => { const { sort, direction, collectionId } = ctx.input.body; const { user } = ctx.state.auth; const where: WhereOptions