rebours/prisma/seed.mjs

114 lines
4.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { PrismaClient } from '@prisma/client'
import bcrypt from 'bcrypt'
const prisma = new PrismaClient()
const PRODUCTS = [
{
slug: 'solar-altar',
sortOrder: 0,
index: 'PROJET_001',
name: 'Solar_Altar',
type: 'LAMPE DE TABLE',
materials: 'BÉTON TEXTURÉ + DÔME CÉRAMIQUE LAQUÉ',
year: '2026',
status: 'PROTOTYPE [80%]',
description: 'Exploration de la lumière à travers des contraintes géométriques. Le dôme sphérique en céramique laquée coiffe un corps en béton texturé peint à la main. Chaque pièce est unique.',
specs: 'H: 45cm / Ø: 18cm\nPoids: 3.2kg\nAlimentation: 220V — E27\nCâble: tressé rouge 2m',
notes: 'Inspiré des lampadaires soviétiques des années 60. Le béton est coulé à la main dans des moules uniques. La peinture acrylique est appliquée au spalter.',
imagePath: '/assets/lamp-violet.jpg',
imageAlt: 'Solar Altar — Lampe béton violet, dôme céramique bleu, REBOURS 2026',
seoTitle: 'REBOURS — Solar Altar | Collection 001',
seoDescription: 'Lampe de table unique. Béton texturé coulé à la main + dôme céramique laqué. Pièce unique fabriquée à Paris.',
ogImage: 'https://rebours.studio/assets/lamp-violet.jpg',
productDisplayName: 'Solar Altar',
price: 180000, // 1800 EUR in cents
currency: 'EUR',
availability: 'https://schema.org/LimitedAvailability',
stripePriceId: 'price_1T5SBlE5wMMoCUP5ZcjEStwe',
stripeKey: 'lumiere_orbitale',
isPublished: true,
},
{
slug: 'table-terrazzo',
sortOrder: 1,
index: 'PROJET_002',
name: 'TABLE_TERRAZZO',
type: 'TABLE BASSE + ÉTAGÈRE MODULAIRE',
materials: 'TERRAZZO + ACIER TUBULAIRE + RÉSINE',
year: '2026',
status: 'STRUCTURAL_TEST',
description: "Collision du brutalisme et de la couleur Memphis. Le plateau en terrazzo fait à la main intègre des inclusions de marbre rose et bleu. Les colonnes cylindriques bicolores sont en acier peint au four.",
specs: 'Table: L120 × P60 × H38cm\nPoids plateau: 28kg\nPieds: acier Ø60mm\nÉtagère: H180 × L80 × P35cm',
notes: "Le terrazzo est réalisé dans l'atelier de Pantin. Chaque dalle est unique. L'étagère est assemblée à partir de tubes industriels récupérés et de panneaux laqués.",
imagePath: '/assets/table-terrazzo.jpg',
imageAlt: 'TABLE TERRAZZO — Table basse terrazzo et étagère acier, REBOURS 2026',
seoTitle: 'REBOURS — TABLE TERRAZZO | Collection 001',
seoDescription: 'Table basse et étagère modulaire. Terrazzo fait main + acier tubulaire. Pièce unique fabriquée à Paris.',
ogImage: 'https://rebours.studio/assets/table-terrazzo.jpg',
productDisplayName: 'Table Terrazzo',
price: null,
currency: 'EUR',
availability: 'https://schema.org/PreOrder',
stripePriceId: null,
stripeKey: 'table_terrazzo',
isPublished: true,
},
{
slug: 'module-serie',
sortOrder: 2,
index: 'PROJET_003',
name: 'MODULE_SÉRIE',
type: 'LAMPES — SÉRIE LIMITÉE',
materials: 'BÉTON COLORÉ + DÔME LAQUÉ + NÉON',
year: '2026',
status: 'FINAL_ASSEMBLY',
description: "Série de 7 lampes aux corps béton colorés, chacune avec un dôme d'une couleur différente. Les néons horizontaux créent un anneau lumineux entre le dôme et le corps.",
specs: 'H: 3565cm (7 tailles)\nDôme: Ø1528cm\nAnneau néon: 8W — 3000K\nÉdition: 7 ex. par coloris',
notes: 'Les corps sont coulés en série mais peints individuellement. Les dômes sont réalisés par un souffleur de verre artisanal. Le câble tressé rouge est la signature de la série.',
imagePath: '/assets/lampes-serie.jpg',
imageAlt: 'MODULE SÉRIE — Collection de 7 lampes béton colorées, REBOURS 2026',
seoTitle: 'REBOURS — MODULE SÉRIE | Collection 001',
seoDescription: 'Série de 7 lampes béton colorées, dôme laqué et néon. Édition limitée fabriquée à Paris.',
ogImage: 'https://rebours.studio/assets/lampes-serie.jpg',
productDisplayName: 'Module Série',
price: null,
currency: 'EUR',
availability: 'https://schema.org/PreOrder',
stripePriceId: null,
stripeKey: 'module_serie',
isPublished: true,
},
]
async function main() {
// Seed products
for (const product of PRODUCTS) {
await prisma.product.upsert({
where: { slug: product.slug },
update: product,
create: product,
})
console.log(`✓ Product: ${product.name}`)
}
// Seed admin user
const email = process.env.ADMIN_EMAIL ?? 'admin@rebours.studio'
const password = process.env.ADMIN_PASSWORD ?? 'changeme'
const passwordHash = await bcrypt.hash(password, 10)
await prisma.adminUser.upsert({
where: { email },
update: { passwordHash },
create: { email, passwordHash },
})
console.log(`✓ Admin user: ${email}`)
}
main()
.catch((e) => {
console.error(e)
process.exit(1)
})
.finally(() => prisma.$disconnect())