Files
homaroma/apps/backend/src/routes/promotions.ts
T

80 lines
2.1 KiB
TypeScript

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" };
}
});