63 lines
2.0 KiB
JavaScript
63 lines
2.0 KiB
JavaScript
import { Elysia, t } from "elysia";
|
|
import prisma from "../lib/prisma";
|
|
export const customersRoute = new Elysia({ prefix: "/customers" })
|
|
.get("/", async ({ query }) => {
|
|
const search = query.search;
|
|
const whereClause = search ? {
|
|
OR: [
|
|
{ displayName: { contains: search, mode: "insensitive" } },
|
|
{ email: { contains: search, mode: "insensitive" } },
|
|
{ phone: { contains: search, mode: "insensitive" } },
|
|
{ lineUserId: { contains: search, mode: "insensitive" } }
|
|
]
|
|
} : {};
|
|
return await prisma.customer.findMany({
|
|
where: whereClause,
|
|
orderBy: { createdAt: 'desc' },
|
|
include: {
|
|
_count: {
|
|
select: { orders: true }
|
|
}
|
|
}
|
|
});
|
|
})
|
|
.get("/:id", async ({ params: { id }, set }) => {
|
|
const customer = await prisma.customer.findUnique({
|
|
where: { id: Number(id) },
|
|
include: { orders: { orderBy: { createdAt: 'desc' } } }
|
|
});
|
|
if (!customer) {
|
|
set.status = 404;
|
|
return { error: "Customer not found" };
|
|
}
|
|
return customer;
|
|
})
|
|
.patch("/:id/points", async ({ params: { id }, body, set }) => {
|
|
try {
|
|
const { pointsDelta, reason } = body;
|
|
const customer = await prisma.customer.findUnique({
|
|
where: { id: Number(id) }
|
|
});
|
|
if (!customer) {
|
|
set.status = 404;
|
|
return { error: "Customer not found" };
|
|
}
|
|
const newPoints = Math.max(0, customer.points + pointsDelta);
|
|
const updatedCustomer = await prisma.customer.update({
|
|
where: { id: Number(id) },
|
|
data: { points: newPoints }
|
|
});
|
|
return updatedCustomer;
|
|
}
|
|
catch (err) {
|
|
console.error("[Customers] Adjust Points Error:", err);
|
|
set.status = 500;
|
|
return { error: "Failed to adjust points" };
|
|
}
|
|
}, {
|
|
body: t.Object({
|
|
pointsDelta: t.Number(),
|
|
reason: t.Optional(t.String())
|
|
})
|
|
});
|
|
//# sourceMappingURL=customers.js.map
|