feat(admin): implement promotions management and loyalty points configuration

This commit is contained in:
Your Name committed 2026-06-06 20:03:39 +07:00
1 parent 77c52e0534
commit f72876587e
7 files changed
+325 -2

No files matched your search

+59
View File
@@ -17,4 +17,63 @@ export const promotionsRoute = new Elysia({ prefix: "/promotions" })
},
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" };
}
});