import { Elysia, t } from "elysia"; import prisma from "../lib/prisma"; export const promotionsRoute = new Elysia({ prefix: "/promotions" }) .get("/active", async () => { const now = new Date() return await prisma.promotion.findMany({ where: { isActive: true, OR: [ { startDate: null }, { startDate: { lte: now } } ], AND: [ { OR: [{ endDate: null }, { endDate: { gte: now } }] } ] }, orderBy: { level: 'asc' } }); }) .get("/", async () => { return await prisma.promotion.findMany({ orderBy: [{ level: 'asc' }, { createdAt: 'desc' }] }); }) .post("/", async ({ body, set }) => { try { const data = body as any; return await prisma.promotion.create({ data }); } catch (err) { set.status = 500; return { error: "Failed to create promotion" }; } }, { body: t.Object({ name: t.String(), level: t.Number(), type: t.String(), value: t.Number(), minPurchase: t.Number(), isActive: t.Boolean(), startDate: t.Optional(t.Nullable(t.String())), endDate: t.Optional(t.Nullable(t.String())) }) }) .put("/:id", async ({ params: { id }, body, set }) => { try { const data = body as any; return await prisma.promotion.update({ where: { id: Number(id) }, data }); } catch (err) { set.status = 500; return { error: "Failed to update promotion" }; } }, { body: t.Object({ name: t.String(), level: t.Number(), type: t.String(), value: t.Number(), minPurchase: t.Number(), isActive: t.Boolean(), startDate: t.Optional(t.Nullable(t.String())), endDate: t.Optional(t.Nullable(t.String())) }) }) .delete("/:id", async ({ params: { id }, set }) => { try { await prisma.promotion.delete({ where: { id: Number(id) } }); return { success: true }; } catch (err) { set.status = 500; return { error: "Failed to delete promotion" }; } });