This commit is contained in:
Your Name committed 2026-06-22 20:09:42 -04:00
1 parent 7cd288e67e
commit ed69a4b840
6 files changed
+3 -626

No files matched your search

-28
View File
@@ -147,34 +147,6 @@ model CustomerAddress {
updatedAt DateTime @updatedAt
}
model Hero {
id Int @id @default(autoincrement())
tagline String
title String
description String
imageUrl String
buttonText String @default("Explore Collection")
buttonLink String @default("/shop")
isActive Boolean @default(true)
translations HeroTranslation[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model HeroTranslation {
id Int @id @default(autoincrement())
heroId Int
hero Hero @relation(fields: [heroId], references: [id], onDelete: Cascade)
langCode String
tagline String?
title String?
description String?
buttonText String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@unique([heroId, langCode])
}
model Coupon {
id Int @id @default(autoincrement())
+1 -2
View File
@@ -7,7 +7,6 @@ import { categoriesRoute } from "./routes/categories";
import { productsRoute } from "./routes/products";
import { authRoute } from "./routes/auth";
import { uploadRoute } from "./routes/upload";
import { heroRoute } from "./routes/hero";
import { ordersRoute } from "./routes/orders";
import { settingsRoute } from "./routes/settings";
import { articlesRoute } from "./routes/articles";
@@ -126,7 +125,7 @@ const app = new Elysia()
return file;
})
.group("/api", (app) =>
app.use(authRoute).use(categoriesRoute).use(productsRoute).use(uploadRoute).use(heroRoute).use(ordersRoute).use(settingsRoute).use(articlesRoute).use(tiktokRoute).use(rawMaterialsRoute).use(shopeeRoute).use(tiktokOrderRoute).use(lazadaOrderRoute).use(customersRoute).use(couponsRoute).use(reviewsRoute).use(promotionsRoute).use(pagesRoute).use(paymentsRoute).use(profileRoute).use(lineRoutes).use(menusRoute).use(newsletterRoute).use(mediaRoute).use(contactsRoute)
app.use(authRoute).use(categoriesRoute).use(productsRoute).use(uploadRoute).use(ordersRoute).use(settingsRoute).use(articlesRoute).use(tiktokRoute).use(rawMaterialsRoute).use(shopeeRoute).use(tiktokOrderRoute).use(lazadaOrderRoute).use(customersRoute).use(couponsRoute).use(reviewsRoute).use(promotionsRoute).use(pagesRoute).use(paymentsRoute).use(profileRoute).use(lineRoutes).use(menusRoute).use(newsletterRoute).use(mediaRoute).use(contactsRoute)
)
.listen({ port: PORT, hostname: "0.0.0.0" });
-127
View File
@@ -1,127 +0,0 @@
import { Elysia, t } from "elysia";
import prisma from "../lib/prisma";
export const heroRoute = new Elysia({ prefix: "/hero" })
.get("/", async () => {
return await prisma.hero.findFirst({
where: { isActive: true },
orderBy: { updatedAt: 'desc' }
}) || await prisma.hero.findFirst({
orderBy: { updatedAt: 'desc' }
});
})
.get("/all", async () => {
return await prisma.hero.findMany({
orderBy: { updatedAt: 'desc' }
});
})
.post("/", async ({ body, set }) => {
try {
const data = body as any;
const { id, ...heroData } = data;
if (id) {
return await prisma.hero.update({
where: { id: Number(id) },
data: heroData
});
} else {
return await prisma.hero.create({
data: heroData
});
}
} catch (err) {
console.error("[Hero] Error:", err);
set.status = 500;
return { error: "Failed to save hero data" };
}
}, {
body: t.Object({
id: t.Optional(t.Number()),
tagline: t.String(),
title: t.String(),
description: t.String(),
imageUrl: t.String(),
buttonText: t.String(),
buttonLink: t.String(),
isActive: t.Boolean()
})
})
.patch("/:id/activate", async ({ params: { id }, set }) => {
try {
await prisma.$transaction([
prisma.hero.updateMany({
data: { isActive: false }
}),
prisma.hero.update({
where: { id: Number(id) },
data: { isActive: true }
})
]);
return { success: true };
} catch (err) {
set.status = 500;
return { error: "Failed to activate hero" };
}
})
.delete("/:id", async ({ params: { id }, set }) => {
try {
await prisma.hero.delete({
where: { id: Number(id) }
});
return { success: true };
} catch (err) {
set.status = 500;
return { error: "Failed to delete hero" };
}
})
.patch("/:id/translations", async ({ params, body, set }) => {
const id = Number(params.id);
if (isNaN(id)) {
set.status = 400;
return { error: "Invalid hero ID" };
}
const payload = body as any;
const results: any[] = [];
const LANGS = ['th', 'en', 'ja', 'zh', 'vi', 'ko'];
for (const lang of LANGS) {
const tagline = typeof payload.tagline === 'string' ? (lang === 'th' ? payload.tagline : null) : payload.tagline?.[lang];
const title = typeof payload.title === 'string' ? (lang === 'th' ? payload.title : null) : payload.title?.[lang];
const description = typeof payload.description === 'string' ? (lang === 'th' ? payload.description : null) : payload.description?.[lang];
const buttonText = typeof payload.buttonText === 'string' ? (lang === 'th' ? payload.buttonText : null) : payload.buttonText?.[lang];
if (!tagline && !title && !description && !buttonText) continue;
const existing = await prisma.heroTranslation.findUnique({
where: { heroId_langCode: { heroId: id, langCode: lang } }
});
const updateData: any = {};
if (tagline) updateData.tagline = tagline;
if (title) updateData.title = title;
if (description) updateData.description = description;
if (buttonText) updateData.buttonText = buttonText;
if (existing) {
const updated = await prisma.heroTranslation.update({
where: { id: existing.id },
data: updateData
});
results.push(updated);
} else {
const created = await prisma.heroTranslation.create({
data: { heroId: id, langCode: lang, ...updateData }
});
results.push(created);
}
}
const updated = await prisma.hero.findUnique({
where: { id },
include: { translations: true }
});
return { success: true, translations: results, hero: updated };
});