Files
kozmos-qr-menu/data/menu.ts
T
2026-06-03 04:11:30 +03:00

103 lines
2.7 KiB
TypeScript

import prisma from '@/lib/prisma'
export type LocalizedString = { tr: string; en: string }
export type MenuItem = {
id: string
emoji?: string
image?: string
name: LocalizedString
description?: LocalizedString
price?: number
highlight?: boolean
}
export type Category = {
id: string
emoji: string
label: LocalizedString
items: MenuItem[]
}
export const WHATSAPP_NUMBER = '905XXXXXXXXXX'
export async function getCategories(): Promise<Category[]> {
try {
const categories = await prisma.category.findMany({
orderBy: { order: 'asc' },
include: {
items: {
orderBy: { order: 'asc' },
},
},
})
return categories.map((c) => ({
id: c.id,
emoji: c.emoji,
label: { tr: c.labelTr, en: c.labelEn },
items: c.items.map((i) => ({
id: i.id,
emoji: i.emoji || undefined,
image: i.image || undefined,
name: { tr: i.nameTr, en: i.nameEn },
description:
i.descriptionTr && i.descriptionEn
? { tr: i.descriptionTr, en: i.descriptionEn }
: undefined,
price: i.price !== null ? i.price : undefined,
highlight: i.highlight,
})),
}))
} catch (error) {
console.error('Error reading from database:', error)
return []
}
}
export async function saveCategories(categories: Category[]): Promise<void> {
try {
await prisma.$transaction(async (tx) => {
// 1. Delete all existing records (mimics overwriting the JSON file)
await tx.menuItem.deleteMany()
await tx.category.deleteMany()
// 2. Insert new records
for (let cIndex = 0; cIndex < categories.length; cIndex++) {
const c = categories[cIndex]
await tx.category.create({
data: {
id: c.id,
emoji: c.emoji,
labelTr: c.label.tr,
labelEn: c.label.en || c.label.tr,
order: cIndex,
},
})
for (let iIndex = 0; iIndex < c.items.length; iIndex++) {
const i = c.items[iIndex]
await tx.menuItem.create({
data: {
id: i.id,
categoryId: c.id,
emoji: i.emoji || null,
image: i.image || null,
nameTr: i.name.tr,
nameEn: i.name.en || i.name.tr,
descriptionTr: i.description?.tr || null,
descriptionEn: i.description?.en || null,
price: i.price ?? null,
highlight: i.highlight ?? false,
order: iIndex,
},
})
}
}
})
} catch (error) {
console.error('Error saving to database:', error)
throw new Error('Failed to save menu data to database')
}
}