80 lines
2.1 KiB
TypeScript
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" };
|
|
}
|
|
});
|