import { PrismaClient, EventType, CharacterClass, } from "@/prisma/generated/prisma/client"; import { PrismaBetterSqlite3 } from "@prisma/adapter-better-sqlite3"; import bcrypt from "bcryptjs"; const adapter = new PrismaBetterSqlite3({ url: process.env.DATABASE_URL || "file:./dev.db", }); const prisma = new PrismaClient({ adapter }); async function main() { // Créer un utilisateur admin const adminPassword = await bcrypt.hash("admin123", 10); const admin = await prisma.user.upsert({ where: { email: "admin@got-mc.com" }, update: {}, create: { email: "admin@got-mc.com", username: "Admin", password: adminPassword, role: "ADMIN", score: 0, level: 1, }, }); // Créer quelques utilisateurs de test const userPassword = await bcrypt.hash("user123", 10); const users = await Promise.all([ prisma.user.upsert({ where: { email: "user1@got-mc.com" }, update: { avatar: "/avatar-1.jpg", bio: "DragonSlayer99 est né dans les flammes d'un volcan en éruption, dernier survivant d'un clan de guerriers légendaires. Formé dès l'enfance aux arts martiaux ancestraux, il a passé sa vie à traquer et terrasser les créatures les plus redoutables du royaume numérique. Sa lame, forgée dans le métal des serveurs en fusion, brille de la lueur des milliers d'âmes qu'il a libérées.\n\nAujourd'hui, DragonSlayer99 est un Guerrier d'élite, un combattant capable de défier les plus puissants adversaires grâce à sa force brute et sa détermination inébranlable.", characterClass: CharacterClass.WARRIOR, }, create: { email: "user1@got-mc.com", username: "DragonSlayer99", password: userPassword, score: 125000, level: 85, hp: 750, maxHp: 1000, xp: 3250, maxXp: 5000, avatar: "/avatar-1.jpg", bio: "DragonSlayer99 est né dans les flammes d'un volcan en éruption, dernier survivant d'un clan de guerriers légendaires. Formé dès l'enfance aux arts martiaux ancestraux, il a passé sa vie à traquer et terrasser les créatures les plus redoutables du royaume numérique. Sa lame, forgée dans le métal des serveurs en fusion, brille de la lueur des milliers d'âmes qu'il a libérées.\n\nAujourd'hui, DragonSlayer99 est un Guerrier d'élite, un combattant capable de défier les plus puissants adversaires grâce à sa force brute et sa détermination inébranlable.", characterClass: CharacterClass.WARRIOR, }, }), prisma.user.upsert({ where: { email: "user2@got-mc.com" }, update: { avatar: "/avatar-2.jpg", bio: "MineMaster a découvert sa connexion avec les arcanes à l'âge de sept ans, lorsqu'il a accidentellement transformé son premier ordinateur en cristal magique. Élève prodige de l'Académie des Sciences Occultes, il a maîtrisé les arts de la manipulation élémentaire et de la transmutation numérique. Ses sorts peuvent réduire une montagne en poussière ou créer des réalités parallèles dans l'espace virtuel.\n\nAujourd'hui, MineMaster est un Mage de renommée mondiale, un sorcier capable de canaliser la puissance brute des algorithmes quantiques pour façonner la réalité à sa volonté.", characterClass: CharacterClass.MAGE, }, create: { email: "user2@got-mc.com", username: "MineMaster", password: userPassword, score: 118500, level: 82, avatar: "/avatar-2.jpg", bio: "MineMaster a découvert sa connexion avec les arcanes à l'âge de sept ans, lorsqu'il a accidentellement transformé son premier ordinateur en cristal magique. Élève prodige de l'Académie des Sciences Occultes, il a maîtrisé les arts de la manipulation élémentaire et de la transmutation numérique. Ses sorts peuvent réduire une montagne en poussière ou créer des réalités parallèles dans l'espace virtuel.\n\nAujourd'hui, MineMaster est un Mage de renommée mondiale, un sorcier capable de canaliser la puissance brute des algorithmes quantiques pour façonner la réalité à sa volonté.", characterClass: CharacterClass.MAGE, }, }), prisma.user.upsert({ where: { email: "user3@got-mc.com" }, update: { avatar: "/avatar-3.jpg", bio: "CraftKing a grandi dans les bas-fonds du réseau, survivant grâce à son agilité et sa ruse exceptionnelles. Recruté par la Guilde des Ombres à l'adolescence, il a perfectionné l'art de l'infiltration et de l'assassinat numérique. Ses dagues virtuelles ont tranché plus de connexions que personne ne peut compter, et son nom inspire la terreur dans les couloirs des corporations.\n\nAujourd'hui, CraftKing est un Voleur légendaire, un maître de la furtivité capable de s'infiltrer dans les systèmes les plus sécurisés sans laisser la moindre trace de son passage.", characterClass: CharacterClass.ROGUE, }, create: { email: "user3@got-mc.com", username: "CraftKing", password: userPassword, score: 112000, level: 80, avatar: "/avatar-3.jpg", bio: "CraftKing a grandi dans les bas-fonds du réseau, survivant grâce à son agilité et sa ruse exceptionnelles. Recruté par la Guilde des Ombres à l'adolescence, il a perfectionné l'art de l'infiltration et de l'assassinat numérique. Ses dagues virtuelles ont tranché plus de connexions que personne ne peut compter, et son nom inspire la terreur dans les couloirs des corporations.\n\nAujourd'hui, CraftKing est un Voleur légendaire, un maître de la furtivité capable de s'infiltrer dans les systèmes les plus sécurisés sans laisser la moindre trace de son passage.", characterClass: CharacterClass.ROGUE, }, }), prisma.user.upsert({ where: { email: "user4@got-mc.com" }, update: { avatar: "/avatar-4.jpg", bio: "ForestWalker a passé sa jeunesse à explorer les territoires sauvages du réseau profond, apprenant les secrets de la nature numérique auprès des anciens gardiens des forêts de données. Expert en survie et en pistage, il connaît chaque sentier caché et chaque créature qui habite les zones non cartographiées. Son arc, taillé dans le bois des serveurs ancestraux, ne manque jamais sa cible.\n\nAujourd'hui, ForestWalker est un Rôdeur respecté, un chasseur capable de naviguer dans les environnements les plus hostiles grâce à sa connexion profonde avec les forces naturelles du cyberespace.", characterClass: CharacterClass.RANGER, }, create: { email: "user4@got-mc.com", username: "ForestWalker", password: userPassword, score: 105000, level: 78, avatar: "/avatar-4.jpg", bio: "ForestWalker a passé sa jeunesse à explorer les territoires sauvages du réseau profond, apprenant les secrets de la nature numérique auprès des anciens gardiens des forêts de données. Expert en survie et en pistage, il connaît chaque sentier caché et chaque créature qui habite les zones non cartographiées. Son arc, taillé dans le bois des serveurs ancestraux, ne manque jamais sa cible.\n\nAujourd'hui, ForestWalker est un Rôdeur respecté, un chasseur capable de naviguer dans les environnements les plus hostiles grâce à sa connexion profonde avec les forces naturelles du cyberespace.", characterClass: CharacterClass.RANGER, }, }), prisma.user.upsert({ where: { email: "user5@got-mc.com" }, update: { avatar: "/avatar-5.jpg", bio: "HolyGuardian a été choisi par les Gardiens Célestes pour servir de protecteur des innocents dans le monde numérique. Formé dans les temples sacrés de l'Ordre de la Lumière, il a juré de défendre les faibles et de punir les malfaiteurs. Sa foi inébranlable lui confère des pouvoirs de guérison et de protection, tandis que son épée bénie brûle avec la fureur de la justice divine.\n\nAujourd'hui, HolyGuardian est un Paladin vénéré, un champion de la lumière capable de repousser les ténèbres et de protéger ceux qui ne peuvent se défendre seuls.", characterClass: CharacterClass.PALADIN, }, create: { email: "user5@got-mc.com", username: "HolyGuardian", password: userPassword, score: 98000, level: 75, avatar: "/avatar-5.jpg", bio: "HolyGuardian a été choisi par les Gardiens Célestes pour servir de protecteur des innocents dans le monde numérique. Formé dans les temples sacrés de l'Ordre de la Lumière, il a juré de défendre les faibles et de punir les malfaiteurs. Sa foi inébranlable lui confère des pouvoirs de guérison et de protection, tandis que son épée bénie brûle avec la fureur de la justice divine.\n\nAujourd'hui, HolyGuardian est un Paladin vénéré, un champion de la lumière capable de repousser les ténèbres et de protéger ceux qui ne peuvent se défendre seuls.", characterClass: CharacterClass.PALADIN, }, }), prisma.user.upsert({ where: { email: "user6@got-mc.com" }, update: { avatar: "/avatar-6.jpg", bio: "TechSmith a commencé sa carrière comme apprenti dans les ateliers secrets des Maîtres Artificiers, où il a appris à fusionner la technologie moderne avec les anciennes traditions magiques. Ses inventions révolutionnaires ont transformé le paysage numérique, créant des artefacts capables de défier les lois de la physique. Chacune de ses créations est une œuvre d'art fonctionnelle, alliant l'élégance de la magie à la précision de l'ingénierie.\n\nAujourd'hui, TechSmith est un Ingénieur de génie, un créateur capable de forger des outils qui transcendent les limites entre le possible et l'impossible.", characterClass: CharacterClass.ENGINEER, }, create: { email: "user6@got-mc.com", username: "TechSmith", password: userPassword, score: 92000, level: 73, avatar: "/avatar-6.jpg", bio: "TechSmith a commencé sa carrière comme apprenti dans les ateliers secrets des Maîtres Artificiers, où il a appris à fusionner la technologie moderne avec les anciennes traditions magiques. Ses inventions révolutionnaires ont transformé le paysage numérique, créant des artefacts capables de défier les lois de la physique. Chacune de ses créations est une œuvre d'art fonctionnelle, alliant l'élégance de la magie à la précision de l'ingénierie.\n\nAujourd'hui, TechSmith est un Ingénieur de génie, un créateur capable de forger des outils qui transcendent les limites entre le possible et l'impossible.", characterClass: CharacterClass.ENGINEER, }, }), ]); // Créer des événements (vérifier s'ils existent déjà) const eventData = [ { date: new Date("2025-12-15"), name: "Builder pattern : construction et refactoring", description: "Lors de cet atelier, nous utiliserons le design pattern Builder pour structurer pas à pas la création d'objets complexes… sans transformer notre code en film digne de Red Is Dead.\n\nVous découvrirez comment ce pattern permet de découpler proprement la logique de construction, d'améliorer la lisibilité et de faciliter l'évolution du code — notamment lors de phases de refactoring où les responsabilités se mélangent plus vite que la foule au Palais des Festivals.\n\nL'objectif : poser les fondations pour introduire un vrai modèle, sans rien casser du comportement existant.\n\nQue vous souhaitiez renforcer vos compétences en conception, préparer votre prochain refactoring, ou simplement coder avec plus de style que Serge Karamazov dansant la carioca, venez construire avec nous.", type: EventType.CODE_KATA, room: "Nautilus", time: "11h-12h", maxPlaces: 25, }, { date: new Date("2025-12-01"), name: "Monoids everywhere ?", description: "Nous manipulons tous, au quotidien, des données que nous devons combiner : additionner des montants, calculer des moyennes, regrouper des résultats, agréger des indicateurs. Pourtant, derrière ces opérations, se cachent souvent des règles implicites, des exceptions, amenant une complexité qui rend le code difficile à comprendre et à faire évoluer.\n\nLes monoids permettent d'aborder ces problématiques avec une grille de lecture claire et structurante. Ils reposent sur une idée simple : pour agréger correctement des valeurs, il faut savoir comment elles se combinent et définir ce qui représente une valeur neutre.\n\nCet atelier propose une approche progressive pour comprendre comment ce concept peut transformer la manière de modéliser et de concevoir des comportements métier. Nous découvrirons comment les monoids aident à réduire la charge cognitive et à rendre le code plus cohérent avec l'intention métier.", type: EventType.CODE_KATA, room: "Nautilus", time: "11h-12h", maxPlaces: 25, }, { date: new Date("2025-11-24"), name: "Naming as a Process", description: "Rech. proj. pr proj. priv. self-dem.brt. poss. S'adr.à l'hôt. MART.\n\nBien sûr, S'adr.à l'hôt. MART. et plus si affinités, c'est plus humain… mais pas forcément plus compréhensible : on a beau lire et relire le contenu de la méthode, on est quasiment sûr que son nom, il bluffe !\n\nFaut-il pour autant laisser de mauvais noms tromper 1000 fois 1000 personnes ?\n\nDans cette nouvelle session, nous appliquerons Naming as a Process, une méthode de refactoring progressive centrée sur le nommage.\n\nObjectif : faire émerger la logique métier à travers des noms clairs, précis et alignés avec l'intention réelle du code. Au fil des étapes, nous transformerons un bloc obscur en fonctions lisibles, maintenables et prêtes à danser la carioca.\n\nPrenez un chewing-gum, ouvrez votre IDE, et venez explorer un moyen simple de refactorer vers un code plus respectueux des principes S, puis O, D, I et L ...", type: EventType.CODE_KATA, room: "Nautilus", time: "11h-12h", maxPlaces: 25, }, { date: new Date("2025-11-10"), name: "The Rule Design Pattern", description: "Les ateliers d'Event Storming permettent de faire émerger des Policies : des règles métier qui traduisent comment le système réagit à un événement ou déclenche une action. Sur le papier, tout est clair — mais au moment de coder, ces règles se diluent souvent dans des if/else, des services surchargés ou des comportements implicites.\n\nLe design pattern Rule offre une façon concrète de ramener ces Policies au cœur du code, sous une forme explicite, modulaire et testable. Chaque règle devient un objet du domaine, capable de dire si elle s'applique et d'exécuter sa logique, en respectant les invariants du modèle.\n\nCe pattern facilite la traduction du langage métier en code exécutable : les règles deviennent lisibles, combinables et extensibles en limitant la complexité.\n\nEn explorant le Rule Pattern, nous découvrirons ainsi comment faire vivre les Policies dans notre code, au service d'un modèle plus riche, plus compréhensible, et mieux aligné avec la connaissance du métier.", type: EventType.CODE_KATA, room: "Nautilus", time: "11h-12h", maxPlaces: 25, }, { date: new Date("2025-11-10"), name: "Wrap refactoring techniques", description: "Lorsque le code commence à vieillir, il arrive qu'une méthode ou une classe devienne trop risquée à modifier directement : effets de bord, dépendances invisibles, tests manquants... le moindre changement entraîne des régressions.\n\nLes Wrap Techniques offrent une approche sûre et progressive : plutôt que de changer directement le code existant, on l'enveloppe dans une nouvelle abstraction ou une nouvelle méthode. On peut alors introduire de la logique ou un nouveau comportement, en changeant le contrat initial, sans casser les tests.\n\nDurant cette session nous verrons comment et quand utiliser ces techniques et nous en explorerons leurs bénéfices : isolation du risque, refactorings incrémentaux, amélioration de la testabilité.\n\nNous mettrons bien sûr en pratique sur un exemple de code pour comprendre comment ces refactorings facilitent les transitions vers un meilleur design.", type: EventType.CODE_KATA, room: "Nautilus", time: "11h-12h", maxPlaces: 25, }, ]; // Supprimer tous les événements existants avant de les recréer await prisma.event.deleteMany({}); // Créer les nouveaux événements (le statut est calculé automatiquement côté client) const events = await Promise.all( eventData.map(async (data) => { return prisma.event.create({ data }); }) ); console.log("Seed completed:", { admin, users, events }); } main() .catch((e) => { console.error(e); process.exit(1); }) .finally(async () => { await prisma.$disconnect(); });