update lang

This commit is contained in:
Your Name committed 2026-06-14 18:58:45 -04:00
1 parent 46f00c76a4
commit f5b60ff63e
30 files changed
+546 -652

No files matched your search

+60 -24
View File
@@ -7,7 +7,8 @@ export const menusRoute = new Elysia({ prefix: "/menus" })
return await prisma.menu.findMany({
include: {
items: {
orderBy: { order: "asc" }
orderBy: { order: "asc" },
include: { translations: true }
}
}
});
@@ -17,19 +18,12 @@ export const menusRoute = new Elysia({ prefix: "/menus" })
where: { name },
include: {
items: {
orderBy: { order: "asc" }
orderBy: { order: "asc" },
include: { translations: true }
}
}
});
if (!menu) {
// Return fallback defaults instead of 404 to prevent frontend breakage
if (name === "main") {
return { name, items: [{ id: 1, label: "Home", url: "/", order: 1 }, { id: 2, label: "Shop", url: "/shop", order: 2 }, { id: 3, label: "Scent Guide", url: "/scent-guide", order: 3 }, { id: 4, label: "About Us", url: "/about", order: 4 }] };
} else if (name === "footer-explore") {
return { name, items: [{ id: 5, label: "Home", url: "/", order: 1 }, { id: 6, label: "Shop", url: "/shop", order: 2 }, { id: 7, label: "Scent Guide", url: "/scent-guide", order: 3 }, { id: 8, label: "About Us", url: "/about", order: 4 }] };
} else if (name === "footer-support") {
return { name, items: [{ id: 9, label: "Track Order", url: "/track-order", order: 1 }, { id: 10, label: "FAQ", url: "/faq", order: 2 }, { id: 11, label: "Contact Us", url: "/contact", order: 3 }, { id: 12, label: "Delivery & Returns", url: "/delivery", order: 4 }] };
}
return { name, items: [] };
}
return menu;
@@ -65,28 +59,60 @@ export const menusRoute = new Elysia({ prefix: "/menus" })
})
.put("/:name", async ({ params: { name }, body, set }) => {
try {
const { items } = body as { items: { id?: number; label: string; url: string; order: number }[] };
const { items } = body as { items: { id?: number; label: string; url: string; order: number; translations?: { langCode: string; label: string }[] }[] };
let menu = await prisma.menu.findUnique({ where: { name } });
if (!menu) {
menu = await prisma.menu.create({ data: { name } });
}
await prisma.$transaction([
prisma.menuItem.deleteMany({ where: { menuId: menu.id } }),
prisma.menuItem.createMany({
data: items.map(item => ({
menuId: menu.id,
label: item.label,
url: item.url,
order: item.order
}))
})
]);
await prisma.$transaction(async (tx: any) => {
const existingItems = await tx.menuItem.findMany({ where: { menuId: menu!.id } });
const existingItemIds = existingItems.map((i: any) => i.id);
const payloadItemIds = items.map(i => i.id).filter(id => id != null);
const itemsToDelete = existingItemIds.filter((id: number) => !payloadItemIds.includes(id));
if (itemsToDelete.length > 0) {
await tx.menuItem.deleteMany({ where: { id: { in: itemsToDelete } } });
}
for (const item of items) {
if (item.id && existingItemIds.includes(item.id)) {
await tx.menuItem.update({
where: { id: item.id },
data: { label: item.label, url: item.url, order: item.order }
});
if (item.translations?.length) {
for (const t of item.translations) {
await tx.menuItemTranslation.upsert({
where: { menuItemId_langCode: { menuItemId: item.id, langCode: t.langCode } },
update: { label: t.label },
create: { menuItemId: item.id, langCode: t.langCode, label: t.label }
});
}
}
} else {
await tx.menuItem.create({
data: {
menuId: menu!.id,
label: item.label,
url: item.url,
order: item.order,
translations: item.translations?.length ? {
create: item.translations.map(t => ({
langCode: t.langCode,
label: t.label
}))
} : undefined
}
});
}
}
});
return await prisma.menu.findUnique({
where: { name },
include: { items: { orderBy: { order: "asc" } } }
include: { items: { orderBy: { order: "asc" }, include: { translations: true } } }
});
} catch (err) {
console.error(err);
@@ -99,7 +125,11 @@ export const menusRoute = new Elysia({ prefix: "/menus" })
id: t.Optional(t.Number()),
label: t.String(),
url: t.String(),
order: t.Number()
order: t.Number(),
translations: t.Optional(t.Array(t.Object({
langCode: t.String(),
label: t.String()
})))
}))
})
})
@@ -110,6 +140,12 @@ export const menusRoute = new Elysia({ prefix: "/menus" })
return { error: "Invalid menu item ID" };
}
const menuItem = await prisma.menuItem.findUnique({ where: { id } });
if (!menuItem) {
set.status = 404;
return { error: "Menu item not found. Please ensure database is seeded or the item exists." };
}
const payload = body as any;
const results: any[] = [];
const LANGS = ['th', 'en', 'ja', 'zh', 'vi', 'ko'];
+3 -1
View File
@@ -51,7 +51,9 @@ export const settingsRoute = new Elysia({ prefix: "/settings" })
newsletterTitle: t.Optional(t.String()),
newsletterDescription: t.Optional(t.String()),
newsletterPlaceholder: t.Optional(t.String()),
newsletterButtonText: t.Optional(t.String())
newsletterButtonText: t.Optional(t.String()),
footerSupportHeading: t.Optional(t.Any()),
footerCopyrightText: t.Optional(t.Any())
})
})
.patch("/translations", async ({ body, set }) => {