179 lines
5.3 KiB
TypeScript
179 lines
5.3 KiB
TypeScript
import "dotenv/config";
|
||
import { PrismaBetterSqlite3 } from "@prisma/adapter-better-sqlite3";
|
||
import { PrismaClient } from "../src/generated/prisma/client";
|
||
import { hashPassword } from "../src/lib/password";
|
||
import { DEFAULT_PUBLIC_SITE_COPY } from "../src/lib/site-content-defaults";
|
||
import { WAFFLE_CATEGORIES } from "../src/lib/constants";
|
||
import { formatDateIso } from "../src/lib/week-calendar";
|
||
|
||
const url = process.env.DATABASE_URL ?? "file:./dev.db";
|
||
const adapter = new PrismaBetterSqlite3({ url });
|
||
const prisma = new PrismaClient({ adapter });
|
||
|
||
async function main() {
|
||
const email =
|
||
process.env.ADMIN_EMAIL?.trim().toLowerCase() || "admin@lagaufredor.local";
|
||
const password = process.env.ADMIN_PASSWORD || "changeme123";
|
||
|
||
const existing = await prisma.user.findUnique({ where: { email } });
|
||
if (!existing) {
|
||
await prisma.user.create({
|
||
data: {
|
||
email,
|
||
passwordHash: await hashPassword(password),
|
||
},
|
||
});
|
||
console.log(
|
||
`Compte admin créé : ${email} (mot de passe : variable ADMIN_PASSWORD ou défaut changeme123)`
|
||
);
|
||
}
|
||
|
||
const count = await prisma.waffle.count();
|
||
if (count === 0) {
|
||
await prisma.waffle.createMany({
|
||
data: [
|
||
{
|
||
name: "Coco-Belge",
|
||
ingredients:
|
||
"Pâte Liège, perles de sucre, noix de coco râpée, touche de vanille Bourbon.",
|
||
price: 6.5,
|
||
isNew: true,
|
||
category: WAFFLE_CATEGORIES.DU_MOIS,
|
||
imageUrl: "/gallery/hero-coco.png",
|
||
},
|
||
{
|
||
name: "Classique dorée",
|
||
ingredients: "Sucre perlé, beurre AOP, sirop d’érable ou chocolat.",
|
||
price: 5.9,
|
||
isNew: false,
|
||
category: WAFFLE_CATEGORIES.SUCREE,
|
||
imageUrl: "/gallery/gaufres-sucrees.png",
|
||
},
|
||
{
|
||
name: "Bubble chantilly",
|
||
ingredients: "Bubble waffle, chantilly maison, copeaux de chocolat noir.",
|
||
price: 7.2,
|
||
isNew: false,
|
||
category: WAFFLE_CATEGORIES.SUCREE,
|
||
imageUrl: "/gallery/bubble-waffle.png",
|
||
},
|
||
{
|
||
name: "Montagnarde",
|
||
ingredients:
|
||
"Pâte aux herbes, comté fondant, jambon cru, poivre noir concassé.",
|
||
price: 8.5,
|
||
isNew: false,
|
||
category: WAFFLE_CATEGORIES.SALEE,
|
||
imageUrl: "/gallery/gaufre-salee.png",
|
||
},
|
||
{
|
||
name: "Bacon & ciboulette",
|
||
ingredients: "Crème légère, bacon croustillant, ciboulette fraîche.",
|
||
price: 7.9,
|
||
isNew: false,
|
||
category: WAFFLE_CATEGORIES.SALEE,
|
||
imageUrl: "/gallery/gaufre-salee.png",
|
||
},
|
||
],
|
||
});
|
||
console.log("Gaufres d’exemple insérées.");
|
||
}
|
||
|
||
const galleryCount = await prisma.galleryImage.count();
|
||
if (galleryCount === 0) {
|
||
await prisma.galleryImage.createMany({
|
||
data: [
|
||
{
|
||
imageUrl: "/gallery/hero-coco.png",
|
||
alt: "Gaufres belges caramélisées sur ardoise, noix de coco et drapeau belge.",
|
||
sortOrder: 0,
|
||
},
|
||
{
|
||
imageUrl: "/gallery/gaufres-sucrees.png",
|
||
alt: "Stack de gaufres dorées, sucre glace et sirop.",
|
||
sortOrder: 1,
|
||
},
|
||
{
|
||
imageUrl: "/gallery/bubble-waffle.png",
|
||
alt: "Bubble waffles en cornet, chantilly et chocolat.",
|
||
sortOrder: 2,
|
||
},
|
||
{
|
||
imageUrl: "/gallery/gaufre-salee.png",
|
||
alt: "Gaufre salée aux herbes, crème, bacon et ciboulette.",
|
||
sortOrder: 3,
|
||
},
|
||
],
|
||
});
|
||
console.log("Galerie d’exemple insérée.");
|
||
}
|
||
|
||
await prisma.siteContent.upsert({
|
||
where: { id: "default" },
|
||
create: {
|
||
id: "default",
|
||
...DEFAULT_PUBLIC_SITE_COPY,
|
||
},
|
||
update: {},
|
||
});
|
||
|
||
const truckCount = await prisma.truckEvent.count();
|
||
if (truckCount === 0) {
|
||
const start = new Date();
|
||
const day = start.getDay();
|
||
const diff = day === 0 ? -6 : 1 - day;
|
||
start.setDate(start.getDate() + diff);
|
||
|
||
const dateAt = (offset: number) => {
|
||
const d = new Date(start);
|
||
d.setDate(start.getDate() + offset);
|
||
return formatDateIso(d);
|
||
};
|
||
|
||
await prisma.truckEvent.createMany({
|
||
data: [
|
||
{
|
||
eventDate: dateAt(1),
|
||
timeLabel: "9h — 13h",
|
||
location: "Marché de Bagnols-sur-Cèze",
|
||
note: "Place du marché",
|
||
},
|
||
{
|
||
eventDate: dateAt(3),
|
||
timeLabel: "11h — 19h",
|
||
location: "Festival gourmand — Uzès",
|
||
note: "",
|
||
},
|
||
{
|
||
eventDate: dateAt(5),
|
||
timeLabel: "10h — 18h",
|
||
location: "Place de la République, Alès",
|
||
note: "Food truck zone nord",
|
||
},
|
||
],
|
||
});
|
||
console.log("Événements food truck d’exemple insérés.");
|
||
}
|
||
|
||
const recurCount = await prisma.truckEventRecurrence.count();
|
||
if (recurCount === 0) {
|
||
await prisma.truckEventRecurrence.create({
|
||
data: {
|
||
dayOfWeek: 1,
|
||
timeLabel: "9h — 13h",
|
||
location: "Marché hebdomadaire — Bagnols-sur-Cèze",
|
||
note: "Place du marché",
|
||
},
|
||
});
|
||
console.log("Récurrence food truck d’exemple insérée.");
|
||
}
|
||
}
|
||
|
||
main()
|
||
.then(() => prisma.$disconnect())
|
||
.catch((e) => {
|
||
console.error(e);
|
||
prisma.$disconnect();
|
||
process.exit(1);
|
||
});
|