From 8cee9d6e9170af46d44c2f0f0e5dd1b15bb855d1 Mon Sep 17 00:00:00 2001 From: Matilde Lund Date: Tue, 13 Oct 2026 15:17:02 +0200 Subject: [PATCH 1/2] =?UTF-8?q?jobber=20videre=20med=20formatering=20p?= =?UTF-8?q?=C3=A5=20backend?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/data/recipes.json | 2239 +++++++++++++++++++++++++++++++++ server/package.json | 6 +- server/prisma/schema.prisma | 5 +- server/prisma/seed.ts | 94 +- server/scripts/export-mock.ts | 28 + 5 files changed, 2341 insertions(+), 31 deletions(-) create mode 100644 server/data/recipes.json create mode 100644 server/scripts/export-mock.ts diff --git a/server/data/recipes.json b/server/data/recipes.json new file mode 100644 index 0000000..97a2d19 --- /dev/null +++ b/server/data/recipes.json @@ -0,0 +1,2239 @@ +[ + { + "id": "seed-r1", + "authorId": "u1", + "title": "Pannekaker", + "description": "Klassiske tynne pannekaker som passer til middag eller dessert.", + "prepTimeMinutes": 30, + "servings": 4, + "averageRating": 4.5, + "category": "Dessert", + "imageUrl": "/images/pannekaker.webp", + "status": "PUBLISHED", + "createdAt": "2026-09-28T12:00:00Z", + "ingredients": [ + { + "name": "Hvetemel", + "amount": 3, + "unit": "dl", + "order": 1 + }, + { + "name": "Melk", + "amount": 6, + "unit": "dl", + "order": 2 + }, + { + "name": "Egg", + "amount": 3, + "unit": "stk", + "order": 3 + }, + { + "name": "Salt", + "amount": 0.5, + "unit": "ts", + "order": 4 + }, + { + "name": "Smør", + "amount": 2, + "unit": "ss", + "order": 5 + } + ], + "steps": [ + { + "order": 1, + "instruction": "Visp sammen mel og halvparten av melken til en klumpfri røre." + }, + { + "order": 2, + "instruction": "Spe med resten av melken, og visp inn egg og salt." + }, + { + "order": 3, + "instruction": "La røren svelle i 15 minutter." + }, + { + "order": 4, + "instruction": "Stek tynne pannekaker i smør på middels varme." + } + ], + "tags": [ + "Vegetar", + "Barnevennlig" + ] + }, + { + "id": "seed-r2", + "authorId": "u2", + "title": "Spaghetti bolognese", + "description": "Italiensk kjøttsaus med tomat, servert med spaghetti.", + "prepTimeMinutes": 45, + "servings": 4, + "averageRating": 4, + "category": "Middag", + "imageUrl": "/images/spaghetti-bolognese.webp", + "status": "PUBLISHED", + "createdAt": "2026-06-02T17:30:00Z", + "ingredients": [ + { + "name": "Kjøttdeig", + "amount": 400, + "unit": "g", + "order": 1 + }, + { + "name": "Løk", + "amount": 1, + "unit": "stk", + "order": 2 + }, + { + "name": "Hvitløk", + "amount": 2, + "unit": "fedd", + "order": 3 + }, + { + "name": "Hakkede tomater", + "amount": 2, + "unit": "boks", + "order": 4 + }, + { + "name": "Spaghetti", + "amount": 400, + "unit": "g", + "order": 5 + }, + { + "name": "Olivenolje", + "amount": 1, + "unit": "ss", + "order": 6 + }, + { + "name": "Salt", + "amount": 1, + "unit": "ts", + "order": 7 + } + ], + "steps": [ + { + "order": 1, + "instruction": "Hakk løk og hvitløk, og fres i olivenolje til løken er myk." + }, + { + "order": 2, + "instruction": "Tilsett kjøttdeigen og brun den godt." + }, + { + "order": 3, + "instruction": "Hell i hakkede tomater, smak til med salt og la sausen småkoke i 20 minutter." + }, + { + "order": 4, + "instruction": "Kok spaghetti etter anvisning på pakken, og server med sausen." + } + ], + "tags": [ + "Barnevennlig", + "Budsjett", + "Laktosefri" + ] + }, + { + "id": "seed-r3", + "authorId": "u3", + "title": "Kyllingwok med grønnsaker", + "description": "Rask wok med kylling, sprø grønnsaker og soyasaus.", + "prepTimeMinutes": 25, + "servings": 3, + "averageRating": 3.5, + "category": "Middag", + "imageUrl": "/images/kyllingwok.webp", + "status": "PUBLISHED", + "createdAt": "2026-06-10T16:00:00Z", + "ingredients": [ + { + "name": "Kyllingfilet", + "amount": 400, + "unit": "g", + "order": 1 + }, + { + "name": "Brokkoli", + "amount": 1, + "unit": "stk", + "order": 2 + }, + { + "name": "Paprika", + "amount": 1, + "unit": "stk", + "order": 3 + }, + { + "name": "Gulrot", + "amount": 2, + "unit": "stk", + "order": 4 + }, + { + "name": "Soyasaus", + "amount": 3, + "unit": "ss", + "order": 5 + }, + { + "name": "Ingefær", + "amount": 1, + "unit": "ss", + "order": 6 + }, + { + "name": "Ris", + "amount": 3, + "unit": "dl", + "order": 7 + } + ], + "steps": [ + { + "order": 1, + "instruction": "Kok risen etter anvisning på pakken." + }, + { + "order": 2, + "instruction": "Skjær kyllingen i strimler og stek den i en varm wokpanne." + }, + { + "order": 3, + "instruction": "Tilsett grønnsakene og stek i 4–5 minutter, de skal fortsatt være sprø." + }, + { + "order": 4, + "instruction": "Rør inn soyasaus og revet ingefær, og server med risen." + } + ], + "tags": [ + "Kylling", + "Rask", + "Laktosefri" + ] + }, + { + "id": "seed-r4", + "authorId": "u1", + "title": "Ovnsbakt laks med poteter", + "description": "Saftig laks bakt i ovn med sitron, servert med ovnspoteter.", + "prepTimeMinutes": 40, + "servings": 4, + "averageRating": 5, + "category": "Middag", + "imageUrl": "/images/ovnsbakt-laks.webp", + "status": "PUBLISHED", + "createdAt": "2026-06-15T18:00:00Z", + "ingredients": [ + { + "name": "Laksefilet", + "amount": 600, + "unit": "g", + "order": 1 + }, + { + "name": "Poteter", + "amount": 800, + "unit": "g", + "order": 2 + }, + { + "name": "Sitron", + "amount": 1, + "unit": "stk", + "order": 3 + }, + { + "name": "Olivenolje", + "amount": 3, + "unit": "ss", + "order": 4 + }, + { + "name": "Dill", + "amount": 1, + "unit": "ss", + "order": 5 + }, + { + "name": "Salt", + "amount": 1, + "unit": "ts", + "order": 6 + } + ], + "steps": [ + { + "order": 1, + "instruction": "Forvarm ovnen til 200 °C." + }, + { + "order": 2, + "instruction": "Del potetene i båter, vend dem i olivenolje og salt, og stek i 20 minutter." + }, + { + "order": 3, + "instruction": "Legg laksen i en ildfast form med sitronskiver og dill." + }, + { + "order": 4, + "instruction": "Sett laksen inn i ovnen sammen med potetene og stek i 15 minutter til." + } + ], + "tags": [ + "Fisk", + "Glutenfri", + "Sunn", + "Laktosefri" + ] + }, + { + "id": "seed-r5", + "authorId": "u4", + "title": "Linsesuppe", + "description": "Mettende og rimelig suppe med røde linser og krydder.", + "prepTimeMinutes": 35, + "servings": 4, + "averageRating": 4, + "category": "Suppe", + "imageUrl": "/images/linsesuppe.webp", + "status": "PUBLISHED", + "createdAt": "2026-06-20T12:00:00Z", + "ingredients": [ + { + "name": "Røde linser", + "amount": 3, + "unit": "dl", + "order": 1 + }, + { + "name": "Løk", + "amount": 1, + "unit": "stk", + "order": 2 + }, + { + "name": "Gulrot", + "amount": 2, + "unit": "stk", + "order": 3 + }, + { + "name": "Hakkede tomater", + "amount": 1, + "unit": "boks", + "order": 4 + }, + { + "name": "Grønnsaksbuljong", + "amount": 1, + "unit": "l", + "order": 5 + }, + { + "name": "Spisskummen", + "amount": 1, + "unit": "ts", + "order": 6 + } + ], + "steps": [ + { + "order": 1, + "instruction": "Hakk løk og gulrot, og fres dem i en kjele." + }, + { + "order": 2, + "instruction": "Tilsett spisskummen og la det frese i ett minutt." + }, + { + "order": 3, + "instruction": "Ha i linser, tomater og buljong, og kok i 20 minutter." + }, + { + "order": 4, + "instruction": "Kjør suppen jevn med en stavmikser og smak til med salt." + } + ], + "tags": [ + "Vegansk", + "Vegetar", + "Budsjett", + "Glutenfri" + ] + }, + { + "id": "seed-r6", + "authorId": "u2", + "title": "Havregrøt med bær", + "description": "Varm og enkel frokost med havregryn, melk og friske bær.", + "prepTimeMinutes": 10, + "servings": 2, + "averageRating": 3, + "category": "Frokost", + "imageUrl": "/images/havregrot.webp", + "status": "PUBLISHED", + "createdAt": "2026-06-25T07:00:00Z", + "ingredients": [ + { + "name": "Havregryn", + "amount": 2, + "unit": "dl", + "order": 1 + }, + { + "name": "Melk", + "amount": 4, + "unit": "dl", + "order": 2 + }, + { + "name": "Blåbær", + "amount": 100, + "unit": "g", + "order": 3 + }, + { + "name": "Honning", + "amount": 1, + "unit": "ss", + "order": 4 + }, + { + "name": "Salt", + "amount": 1, + "unit": "klype", + "order": 5 + } + ], + "steps": [ + { + "order": 1, + "instruction": "Ha havregryn, melk og salt i en kjele." + }, + { + "order": 2, + "instruction": "Kok opp under omrøring og la grøten småkoke i 3–4 minutter." + }, + { + "order": 3, + "instruction": "Server med blåbær og honning på toppen." + } + ], + "tags": [ + "Vegetar", + "Rask", + "Sunn" + ] + }, + { + "id": "seed-r7", + "authorId": "u3", + "title": "Tacos", + "description": "Fredagsfavoritt med kjøttdeig, grønnsaker og lefser.", + "prepTimeMinutes": 30, + "servings": 4, + "averageRating": 4.5, + "category": "Middag", + "imageUrl": "/images/tacos.webp", + "status": "PUBLISHED", + "createdAt": "2026-07-03T17:00:00Z", + "ingredients": [ + { + "name": "Kjøttdeig", + "amount": 400, + "unit": "g", + "order": 1 + }, + { + "name": "Tacokrydder", + "amount": 1, + "unit": "pose", + "order": 2 + }, + { + "name": "Tortillalefser", + "amount": 8, + "unit": "stk", + "order": 3 + }, + { + "name": "Salat", + "amount": 1, + "unit": "stk", + "order": 4 + }, + { + "name": "Tomat", + "amount": 2, + "unit": "stk", + "order": 5 + }, + { + "name": "Revet ost", + "amount": 150, + "unit": "g", + "order": 6 + }, + { + "name": "Rømme", + "amount": 3, + "unit": "dl", + "order": 7 + } + ], + "steps": [ + { + "order": 1, + "instruction": "Brun kjøttdeigen i en panne." + }, + { + "order": 2, + "instruction": "Tilsett tacokrydder og vann etter anvisning, og la det småkoke i 5 minutter." + }, + { + "order": 3, + "instruction": "Kutt salat og tomat i biter." + }, + { + "order": 4, + "instruction": "Varm lefsene og server alt på bordet, så kan alle lage sin egen taco." + } + ], + "tags": [ + "Barnevennlig" + ] + }, + { + "id": "seed-r8", + "authorId": "u4", + "title": "Kjøttkaker i brun saus", + "description": "Hjemmelagde kjøttkaker med brun saus, poteter og ertestuing.", + "prepTimeMinutes": 60, + "servings": 4, + "averageRating": 4, + "category": "Middag", + "imageUrl": "/images/kjottkaker.webp", + "status": "PUBLISHED", + "createdAt": "2026-07-08T16:30:00Z", + "ingredients": [ + { + "name": "Kjøttdeig", + "amount": 500, + "unit": "g", + "order": 1 + }, + { + "name": "Egg", + "amount": 1, + "unit": "stk", + "order": 2 + }, + { + "name": "Potetmel", + "amount": 1, + "unit": "ss", + "order": 3 + }, + { + "name": "Melk", + "amount": 1, + "unit": "dl", + "order": 4 + }, + { + "name": "Hvetemel", + "amount": 3, + "unit": "ss", + "order": 5 + }, + { + "name": "Smør", + "amount": 3, + "unit": "ss", + "order": 6 + }, + { + "name": "Poteter", + "amount": 800, + "unit": "g", + "order": 7 + } + ], + "steps": [ + { + "order": 1, + "instruction": "Bland kjøttdeig, egg, potetmel og melk til en jevn farse." + }, + { + "order": 2, + "instruction": "Form kjøttkaker og brun dem i smør." + }, + { + "order": 3, + "instruction": "Brun mel i smør, spe med vann og kok opp til en brun saus." + }, + { + "order": 4, + "instruction": "Legg kjøttkakene i sausen og la dem trekke i 15 minutter." + }, + { + "order": 5, + "instruction": "Kok potetene og server sammen med kjøttkakene." + } + ], + "tags": [ + "Barnevennlig" + ] + }, + { + "id": "seed-r9", + "authorId": "u1", + "title": "Bergensk fiskesuppe", + "description": "Kremet fiskesuppe med hvit fisk, laks og grønnsaker.", + "prepTimeMinutes": 40, + "servings": 4, + "averageRating": 3.5, + "category": "Suppe", + "imageUrl": "/images/fiskesuppe.webp", + "status": "PUBLISHED", + "createdAt": "2026-07-12T18:00:00Z", + "ingredients": [ + { + "name": "Torskefilet", + "amount": 300, + "unit": "g", + "order": 1 + }, + { + "name": "Laksefilet", + "amount": 200, + "unit": "g", + "order": 2 + }, + { + "name": "Gulrot", + "amount": 2, + "unit": "stk", + "order": 3 + }, + { + "name": "Purre", + "amount": 1, + "unit": "stk", + "order": 4 + }, + { + "name": "Fiskebuljong", + "amount": 1, + "unit": "l", + "order": 5 + }, + { + "name": "Matfløte", + "amount": 3, + "unit": "dl", + "order": 6 + } + ], + "steps": [ + { + "order": 1, + "instruction": "Skjær gulrot og purre i biter, og kok dem i buljongen i 10 minutter." + }, + { + "order": 2, + "instruction": "Tilsett matfløten og kok opp." + }, + { + "order": 3, + "instruction": "Skjær fisken i terninger, legg den i suppen og la den trekke i 5 minutter." + } + ], + "tags": [ + "Fisk", + "Glutenfri" + ] + }, + { + "id": "seed-r10", + "authorId": "u2", + "title": "Gresk salat", + "description": "Frisk salat med tomat, agurk, oliven og fetaost.", + "prepTimeMinutes": 15, + "servings": 2, + "averageRating": 4, + "category": "Salat", + "imageUrl": "/images/gresk-salat.webp", + "status": "PUBLISHED", + "createdAt": "2026-07-15T12:00:00Z", + "ingredients": [ + { + "name": "Tomat", + "amount": 3, + "unit": "stk", + "order": 1 + }, + { + "name": "Agurk", + "amount": 1, + "unit": "stk", + "order": 2 + }, + { + "name": "Rødløk", + "amount": 1, + "unit": "stk", + "order": 3 + }, + { + "name": "Fetaost", + "amount": 150, + "unit": "g", + "order": 4 + }, + { + "name": "Oliven", + "amount": 1, + "unit": "dl", + "order": 5 + }, + { + "name": "Olivenolje", + "amount": 2, + "unit": "ss", + "order": 6 + } + ], + "steps": [ + { + "order": 1, + "instruction": "Skjær tomat, agurk og rødløk i biter." + }, + { + "order": 2, + "instruction": "Ha grønnsakene i en bolle sammen med oliven." + }, + { + "order": 3, + "instruction": "Smuldre fetaost over og drypp med olivenolje." + } + ], + "tags": [ + "Vegetar", + "Glutenfri", + "Rask", + "Sunn" + ] + }, + { + "id": "seed-r11", + "authorId": "u3", + "title": "Sjokoladekake i langpanne", + "description": "Saftig sjokoladekake med glasur, perfekt til bursdager.", + "prepTimeMinutes": 50, + "servings": 16, + "averageRating": 5, + "category": "Bakst", + "imageUrl": "/images/sjokoladekake.webp", + "status": "PUBLISHED", + "createdAt": "2026-07-19T14:00:00Z", + "ingredients": [ + { + "name": "Hvetemel", + "amount": 5, + "unit": "dl", + "order": 1 + }, + { + "name": "Sukker", + "amount": 4, + "unit": "dl", + "order": 2 + }, + { + "name": "Kakao", + "amount": 4, + "unit": "ss", + "order": 3 + }, + { + "name": "Egg", + "amount": 4, + "unit": "stk", + "order": 4 + }, + { + "name": "Smør", + "amount": 250, + "unit": "g", + "order": 5 + }, + { + "name": "Melk", + "amount": 2, + "unit": "dl", + "order": 6 + }, + { + "name": "Bakepulver", + "amount": 2, + "unit": "ts", + "order": 7 + } + ], + "steps": [ + { + "order": 1, + "instruction": "Forvarm ovnen til 180 °C." + }, + { + "order": 2, + "instruction": "Smelt smøret og la det avkjøles litt." + }, + { + "order": 3, + "instruction": "Visp egg og sukker lyst og luftig." + }, + { + "order": 4, + "instruction": "Bland inn de tørre ingrediensene, smør og melk." + }, + { + "order": 5, + "instruction": "Hell røren i en langpanne og stek i ca. 25 minutter." + } + ], + "tags": [ + "Vegetar", + "Barnevennlig" + ] + }, + { + "id": "seed-r12", + "authorId": "u4", + "title": "Grovbrød", + "description": "Luftig grovbrød med sammalt hvete, godt til frokost og lunsj.", + "prepTimeMinutes": 180, + "servings": 12, + "averageRating": 3, + "category": "Bakst", + "imageUrl": "/images/grovbrod.webp", + "status": "PUBLISHED", + "createdAt": "2026-07-22T09:00:00Z", + "ingredients": [ + { + "name": "Sammalt hvete", + "amount": 5, + "unit": "dl", + "order": 1 + }, + { + "name": "Hvetemel", + "amount": 7, + "unit": "dl", + "order": 2 + }, + { + "name": "Tørrgjær", + "amount": 1, + "unit": "pose", + "order": 3 + }, + { + "name": "Vann", + "amount": 6, + "unit": "dl", + "order": 4 + }, + { + "name": "Salt", + "amount": 2, + "unit": "ts", + "order": 5 + }, + { + "name": "Olivenolje", + "amount": 2, + "unit": "ss", + "order": 6 + } + ], + "steps": [ + { + "order": 1, + "instruction": "Bland de tørre ingrediensene i en bolle." + }, + { + "order": 2, + "instruction": "Tilsett lunkent vann og olje, og elt deigen i 10 minutter." + }, + { + "order": 3, + "instruction": "La deigen heve i 1 time." + }, + { + "order": 4, + "instruction": "Form et brød, legg det i en brødform og la det etterheve i 30 minutter." + }, + { + "order": 5, + "instruction": "Stek på 200 °C i ca. 45 minutter." + } + ], + "tags": [ + "Vegansk", + "Vegetar", + "Budsjett" + ] + }, + { + "id": "seed-r13", + "authorId": "u1", + "title": "Kanelboller", + "description": "Myke boller med kanel og sukker, best rett fra ovnen.", + "prepTimeMinutes": 120, + "servings": 16, + "averageRating": 4.5, + "category": "Bakst", + "imageUrl": "/images/kanelboller.webp", + "status": "PUBLISHED", + "createdAt": "2026-07-26T13:00:00Z", + "ingredients": [ + { + "name": "Hvetemel", + "amount": 9, + "unit": "dl", + "order": 1 + }, + { + "name": "Melk", + "amount": 3, + "unit": "dl", + "order": 2 + }, + { + "name": "Smør", + "amount": 100, + "unit": "g", + "order": 3 + }, + { + "name": "Sukker", + "amount": 1, + "unit": "dl", + "order": 4 + }, + { + "name": "Tørrgjær", + "amount": 1, + "unit": "pose", + "order": 5 + }, + { + "name": "Kanel", + "amount": 2, + "unit": "ss", + "order": 6 + }, + { + "name": "Egg", + "amount": 1, + "unit": "stk", + "order": 7 + } + ], + "steps": [ + { + "order": 1, + "instruction": "Smelt smøret, tilsett melken og varm til det er fingervarmt." + }, + { + "order": 2, + "instruction": "Bland inn gjær, sukker og mel, og elt til en smidig deig." + }, + { + "order": 3, + "instruction": "La deigen heve i 45 minutter." + }, + { + "order": 4, + "instruction": "Kjevle ut deigen, smør på smør, kanel og sukker, og rull sammen." + }, + { + "order": 5, + "instruction": "Skjær i skiver, la dem etterheve, pensle med egg og stek på 220 °C i 10 minutter." + } + ], + "tags": [ + "Vegetar", + "Barnevennlig" + ] + }, + { + "id": "seed-r14", + "authorId": "u2", + "title": "Chili sin carne", + "description": "Vegansk chili med bønner, mais og mye smak.", + "prepTimeMinutes": 50, + "servings": 4, + "averageRating": 3.5, + "category": "Middag", + "imageUrl": "/images/chili-sin-carne.webp", + "status": "PUBLISHED", + "createdAt": "2026-08-01T17:00:00Z", + "ingredients": [ + { + "name": "Kidneybønner", + "amount": 2, + "unit": "boks", + "order": 1 + }, + { + "name": "Mais", + "amount": 1, + "unit": "boks", + "order": 2 + }, + { + "name": "Hakkede tomater", + "amount": 2, + "unit": "boks", + "order": 3 + }, + { + "name": "Løk", + "amount": 1, + "unit": "stk", + "order": 4 + }, + { + "name": "Paprika", + "amount": 1, + "unit": "stk", + "order": 5 + }, + { + "name": "Chilipulver", + "amount": 2, + "unit": "ts", + "order": 6 + }, + { + "name": "Spisskummen", + "amount": 1, + "unit": "ts", + "order": 7 + } + ], + "steps": [ + { + "order": 1, + "instruction": "Hakk løk og paprika, og fres dem i en kjele." + }, + { + "order": 2, + "instruction": "Tilsett chilipulver og spisskummen." + }, + { + "order": 3, + "instruction": "Ha i tomater, bønner og mais, og la det småkoke i 30 minutter." + }, + { + "order": 4, + "instruction": "Smak til med salt og server med ris eller brød." + } + ], + "tags": [ + "Vegansk", + "Vegetar", + "Sterk", + "Glutenfri", + "Budsjett" + ] + }, + { + "id": "seed-r15", + "authorId": "u3", + "title": "Tomatsuppe", + "description": "Varmende tomatsuppe med basilikum, god med brød til.", + "prepTimeMinutes": 30, + "servings": 4, + "averageRating": 4, + "category": "Suppe", + "imageUrl": "/images/tomatsuppe.webp", + "status": "PUBLISHED", + "createdAt": "2026-08-04T12:00:00Z", + "ingredients": [ + { + "name": "Hakkede tomater", + "amount": 2, + "unit": "boks", + "order": 1 + }, + { + "name": "Løk", + "amount": 1, + "unit": "stk", + "order": 2 + }, + { + "name": "Hvitløk", + "amount": 2, + "unit": "fedd", + "order": 3 + }, + { + "name": "Grønnsaksbuljong", + "amount": 5, + "unit": "dl", + "order": 4 + }, + { + "name": "Matfløte", + "amount": 1, + "unit": "dl", + "order": 5 + }, + { + "name": "Basilikum", + "amount": 1, + "unit": "stk", + "order": 6 + } + ], + "steps": [ + { + "order": 1, + "instruction": "Fres hakket løk og hvitløk i en kjele." + }, + { + "order": 2, + "instruction": "Tilsett tomater og buljong, og kok i 15 minutter." + }, + { + "order": 3, + "instruction": "Kjør suppen jevn, rør inn fløten og topp med basilikum." + } + ], + "tags": [ + "Vegetar", + "Glutenfri", + "Budsjett" + ] + }, + { + "id": "seed-r16", + "authorId": "u4", + "title": "Smoothie bowl", + "description": "Tykk smoothie med frosne bær og banan, toppet med granola.", + "prepTimeMinutes": 10, + "servings": 1, + "averageRating": null, + "category": "Frokost", + "imageUrl": "/images/smoothie-bowl.webp", + "status": "PUBLISHED", + "createdAt": "2026-08-07T08:00:00Z", + "ingredients": [ + { + "name": "Frosne bær", + "amount": 200, + "unit": "g", + "order": 1 + }, + { + "name": "Banan", + "amount": 1, + "unit": "stk", + "order": 2 + }, + { + "name": "Havremelk", + "amount": 1, + "unit": "dl", + "order": 3 + }, + { + "name": "Granola", + "amount": 3, + "unit": "ss", + "order": 4 + } + ], + "steps": [ + { + "order": 1, + "instruction": "Kjør frosne bær, banan og havremelk i en blender til en tykk smoothie." + }, + { + "order": 2, + "instruction": "Hell smoothien i en bolle." + }, + { + "order": 3, + "instruction": "Topp med granola og eventuelt friske bær." + } + ], + "tags": [ + "Vegansk", + "Vegetar", + "Rask", + "Sunn" + ] + }, + { + "id": "seed-r17", + "authorId": "u1", + "title": "Butter chicken", + "description": "Indisk kyllinggryte i mild og kremet tomatsaus.", + "prepTimeMinutes": 50, + "servings": 4, + "averageRating": 4.5, + "category": "Middag", + "imageUrl": "/images/butter-chicken.webp", + "status": "PUBLISHED", + "createdAt": "2026-08-10T17:30:00Z", + "ingredients": [ + { + "name": "Kyllingfilet", + "amount": 600, + "unit": "g", + "order": 1 + }, + { + "name": "Smør", + "amount": 3, + "unit": "ss", + "order": 2 + }, + { + "name": "Løk", + "amount": 1, + "unit": "stk", + "order": 3 + }, + { + "name": "Hvitløk", + "amount": 3, + "unit": "fedd", + "order": 4 + }, + { + "name": "Garam masala", + "amount": 2, + "unit": "ts", + "order": 5 + }, + { + "name": "Hakkede tomater", + "amount": 1, + "unit": "boks", + "order": 6 + }, + { + "name": "Matfløte", + "amount": 2, + "unit": "dl", + "order": 7 + }, + { + "name": "Ris", + "amount": 3, + "unit": "dl", + "order": 8 + } + ], + "steps": [ + { + "order": 1, + "instruction": "Skjær kyllingen i biter og brun den i smør. Ta den ut av gryta." + }, + { + "order": 2, + "instruction": "Fres løk, hvitløk og garam masala i samme gryte." + }, + { + "order": 3, + "instruction": "Tilsett tomater og fløte, og la sausen koke i 10 minutter." + }, + { + "order": 4, + "instruction": "Ha kyllingen tilbake og la den trekke i sausen i 10 minutter." + }, + { + "order": 5, + "instruction": "Server med kokt ris." + } + ], + "tags": [ + "Kylling", + "Sterk", + "Glutenfri" + ] + }, + { + "id": "seed-r18", + "authorId": "u2", + "title": "Pizza margherita", + "description": "Hjemmelaget pizza med tomatsaus, mozzarella og basilikum.", + "prepTimeMinutes": 90, + "servings": 2, + "averageRating": 5, + "category": "Middag", + "imageUrl": "/images/pizza-margherita.webp", + "status": "PUBLISHED", + "createdAt": "2026-08-14T18:00:00Z", + "ingredients": [ + { + "name": "Hvetemel", + "amount": 5, + "unit": "dl", + "order": 1 + }, + { + "name": "Tørrgjær", + "amount": 0.5, + "unit": "pose", + "order": 2 + }, + { + "name": "Vann", + "amount": 2, + "unit": "dl", + "order": 3 + }, + { + "name": "Hakkede tomater", + "amount": 1, + "unit": "boks", + "order": 4 + }, + { + "name": "Mozzarella", + "amount": 125, + "unit": "g", + "order": 5 + }, + { + "name": "Basilikum", + "amount": 1, + "unit": "stk", + "order": 6 + }, + { + "name": "Olivenolje", + "amount": 1, + "unit": "ss", + "order": 7 + } + ], + "steps": [ + { + "order": 1, + "instruction": "Bland mel, gjær, lunkent vann og olje, og elt til en smidig deig." + }, + { + "order": 2, + "instruction": "La deigen heve i 1 time." + }, + { + "order": 3, + "instruction": "Kjevle ut deigen og smør tomatene utover som saus." + }, + { + "order": 4, + "instruction": "Legg på mozzarella og stek på 250 °C i 10–12 minutter." + }, + { + "order": 5, + "instruction": "Topp med frisk basilikum." + } + ], + "tags": [ + "Vegetar", + "Barnevennlig" + ] + }, + { + "id": "seed-r19", + "authorId": "u3", + "title": "Fårikål", + "description": "Norges nasjonalrett med fårekjøtt, kål og hel pepper.", + "prepTimeMinutes": 180, + "servings": 6, + "averageRating": 3.5, + "category": "Middag", + "imageUrl": "/images/farikal.webp", + "status": "PUBLISHED", + "createdAt": "2026-08-18T16:00:00Z", + "ingredients": [ + { + "name": "Fårekjøtt", + "amount": 1.5, + "unit": "kg", + "order": 1 + }, + { + "name": "Hodekål", + "amount": 1.5, + "unit": "kg", + "order": 2 + }, + { + "name": "Hel sort pepper", + "amount": 2, + "unit": "ss", + "order": 3 + }, + { + "name": "Salt", + "amount": 1, + "unit": "ss", + "order": 4 + }, + { + "name": "Vann", + "amount": 5, + "unit": "dl", + "order": 5 + }, + { + "name": "Poteter", + "amount": 1, + "unit": "kg", + "order": 6 + } + ], + "steps": [ + { + "order": 1, + "instruction": "Del kålen i båter." + }, + { + "order": 2, + "instruction": "Legg kjøtt og kål lagvis i en gryte, og dryss salt og pepper mellom lagene." + }, + { + "order": 3, + "instruction": "Hell over vann, kok opp og la det småkoke i 2–2,5 timer." + }, + { + "order": 4, + "instruction": "Server med kokte poteter." + } + ], + "tags": [ + "Glutenfri", + "Laktosefri" + ] + }, + { + "id": "seed-r20", + "authorId": "u4", + "title": "Eggerøre med gressløk", + "description": "Myk og kremet eggerøre, klar på få minutter.", + "prepTimeMinutes": 10, + "servings": 2, + "averageRating": 3, + "category": "Frokost", + "imageUrl": "/images/eggerore.webp", + "status": "PUBLISHED", + "createdAt": "2026-08-21T07:30:00Z", + "ingredients": [ + { + "name": "Egg", + "amount": 4, + "unit": "stk", + "order": 1 + }, + { + "name": "Melk", + "amount": 0.5, + "unit": "dl", + "order": 2 + }, + { + "name": "Smør", + "amount": 1, + "unit": "ss", + "order": 3 + }, + { + "name": "Gressløk", + "amount": 1, + "unit": "ss", + "order": 4 + }, + { + "name": "Salt", + "amount": 1, + "unit": "klype", + "order": 5 + } + ], + "steps": [ + { + "order": 1, + "instruction": "Visp sammen egg, melk og salt." + }, + { + "order": 2, + "instruction": "Smelt smøret i en panne på lav varme." + }, + { + "order": 3, + "instruction": "Hell i eggeblandingen og rør forsiktig til den stivner." + }, + { + "order": 4, + "instruction": "Dryss over hakket gressløk." + } + ], + "tags": [ + "Vegetar", + "Rask", + "Glutenfri" + ] + }, + { + "id": "seed-r21", + "authorId": "u1", + "title": "Hummus", + "description": "Kremet hummus av kikerter og tahini, god som dipp.", + "prepTimeMinutes": 15, + "servings": 4, + "averageRating": 4, + "category": "Snacks", + "imageUrl": "/images/hummus.webp", + "status": "PUBLISHED", + "createdAt": "2026-08-24T15:00:00Z", + "ingredients": [ + { + "name": "Kikerter", + "amount": 1, + "unit": "boks", + "order": 1 + }, + { + "name": "Tahini", + "amount": 3, + "unit": "ss", + "order": 2 + }, + { + "name": "Sitron", + "amount": 1, + "unit": "stk", + "order": 3 + }, + { + "name": "Hvitløk", + "amount": 1, + "unit": "fedd", + "order": 4 + }, + { + "name": "Olivenolje", + "amount": 3, + "unit": "ss", + "order": 5 + }, + { + "name": "Salt", + "amount": 0.5, + "unit": "ts", + "order": 6 + } + ], + "steps": [ + { + "order": 1, + "instruction": "Skyll kikertene i kaldt vann." + }, + { + "order": 2, + "instruction": "Kjør alle ingrediensene i en foodprosessor til en jevn masse." + }, + { + "order": 3, + "instruction": "Spe med litt vann hvis hummusen er for tykk." + } + ], + "tags": [ + "Vegansk", + "Vegetar", + "Glutenfri", + "Rask" + ] + }, + { + "id": "seed-r22", + "authorId": "u2", + "title": "Rabarbrapai", + "description": "Syrlig rabarbra under et sprøtt smuldredekke.", + "prepTimeMinutes": 60, + "servings": 8, + "averageRating": 2.5, + "category": "Dessert", + "imageUrl": "/images/rabarbrapai.webp", + "status": "PUBLISHED", + "createdAt": "2026-08-27T14:00:00Z", + "ingredients": [ + { + "name": "Rabarbra", + "amount": 500, + "unit": "g", + "order": 1 + }, + { + "name": "Sukker", + "amount": 2, + "unit": "dl", + "order": 2 + }, + { + "name": "Hvetemel", + "amount": 3, + "unit": "dl", + "order": 3 + }, + { + "name": "Smør", + "amount": 150, + "unit": "g", + "order": 4 + }, + { + "name": "Havregryn", + "amount": 1, + "unit": "dl", + "order": 5 + } + ], + "steps": [ + { + "order": 1, + "instruction": "Forvarm ovnen til 200 °C." + }, + { + "order": 2, + "instruction": "Skjær rabarbraen i biter, legg den i en form og dryss over halvparten av sukkeret." + }, + { + "order": 3, + "instruction": "Smuldre sammen mel, smør, havregryn og resten av sukkeret." + }, + { + "order": 4, + "instruction": "Fordel smuldredeigen over rabarbraen og stek i 30 minutter." + } + ], + "tags": [ + "Vegetar" + ] + }, + { + "id": "seed-r23", + "authorId": "u3", + "title": "Poke bowl med laks", + "description": "Hawaiisk risbolle med rå laks, avokado og edamame.", + "prepTimeMinutes": 30, + "servings": 2, + "averageRating": 4.5, + "category": "Lunsj", + "imageUrl": "/images/poke-bowl.webp", + "status": "PUBLISHED", + "createdAt": "2026-08-30T12:00:00Z", + "ingredients": [ + { + "name": "Sushiris", + "amount": 2, + "unit": "dl", + "order": 1 + }, + { + "name": "Laksefilet", + "amount": 250, + "unit": "g", + "order": 2 + }, + { + "name": "Avokado", + "amount": 1, + "unit": "stk", + "order": 3 + }, + { + "name": "Edamamebønner", + "amount": 1, + "unit": "dl", + "order": 4 + }, + { + "name": "Agurk", + "amount": 0.5, + "unit": "stk", + "order": 5 + }, + { + "name": "Soyasaus", + "amount": 2, + "unit": "ss", + "order": 6 + } + ], + "steps": [ + { + "order": 1, + "instruction": "Kok risen etter anvisning på pakken og la den avkjøles." + }, + { + "order": 2, + "instruction": "Skjær laks, avokado og agurk i terninger." + }, + { + "order": 3, + "instruction": "Legg risen i boller og fordel laks og grønnsaker på toppen." + }, + { + "order": 4, + "instruction": "Drypp over soyasaus." + } + ], + "tags": [ + "Fisk", + "Sunn", + "Laktosefri" + ] + }, + { + "id": "seed-r24", + "authorId": "u4", + "title": "Ramen med kylling", + "description": "Japansk nudelsuppe med kylling, egg og vårløk.", + "prepTimeMinutes": 60, + "servings": 2, + "averageRating": null, + "category": "Middag", + "imageUrl": "/images/ramen.webp", + "status": "DRAFT", + "createdAt": "2026-09-02T18:00:00Z", + "ingredients": [ + { + "name": "Kyllingfilet", + "amount": 250, + "unit": "g", + "order": 1 + }, + { + "name": "Ramennudler", + "amount": 2, + "unit": "pakke", + "order": 2 + }, + { + "name": "Kyllingbuljong", + "amount": 1, + "unit": "l", + "order": 3 + }, + { + "name": "Egg", + "amount": 2, + "unit": "stk", + "order": 4 + }, + { + "name": "Vårløk", + "amount": 2, + "unit": "stk", + "order": 5 + }, + { + "name": "Soyasaus", + "amount": 3, + "unit": "ss", + "order": 6 + }, + { + "name": "Ingefær", + "amount": 1, + "unit": "ss", + "order": 7 + } + ], + "steps": [ + { + "order": 1, + "instruction": "Kok buljongen med soyasaus og ingefær i 15 minutter." + }, + { + "order": 2, + "instruction": "Kok eggene i 7 minutter, avkjøl dem i kaldt vann og del dem i to." + }, + { + "order": 3, + "instruction": "Stek kyllingen og skjær den i skiver." + }, + { + "order": 4, + "instruction": "Kok nudlene, fordel dem i boller og hell over buljongen." + }, + { + "order": 5, + "instruction": "Topp med kylling, egg og hakket vårløk." + } + ], + "tags": [ + "Kylling", + "Laktosefri" + ] + }, + { + "id": "seed-r25", + "authorId": "u1", + "title": "Falafel i pita", + "description": "Sprø falafel av kikerter, servert i pitabrød med salat.", + "prepTimeMinutes": 45, + "servings": 4, + "averageRating": 4, + "category": "Lunsj", + "imageUrl": "/images/falafel.webp", + "status": "PUBLISHED", + "createdAt": "2026-09-05T12:30:00Z", + "ingredients": [ + { + "name": "Kikerter", + "amount": 2, + "unit": "boks", + "order": 1 + }, + { + "name": "Løk", + "amount": 1, + "unit": "stk", + "order": 2 + }, + { + "name": "Hvitløk", + "amount": 2, + "unit": "fedd", + "order": 3 + }, + { + "name": "Persille", + "amount": 1, + "unit": "dl", + "order": 4 + }, + { + "name": "Spisskummen", + "amount": 2, + "unit": "ts", + "order": 5 + }, + { + "name": "Hvetemel", + "amount": 3, + "unit": "ss", + "order": 6 + }, + { + "name": "Pitabrød", + "amount": 4, + "unit": "stk", + "order": 7 + } + ], + "steps": [ + { + "order": 1, + "instruction": "Kjør kikerter, løk, hvitløk, persille og krydder grovt i en foodprosessor." + }, + { + "order": 2, + "instruction": "Bland inn melet og form små boller." + }, + { + "order": 3, + "instruction": "Stek bollene i olje til de er gylne og sprø." + }, + { + "order": 4, + "instruction": "Server i pitabrød med salat og tahinisaus." + } + ], + "tags": [ + "Vegansk", + "Vegetar" + ] + }, + { + "id": "seed-r26", + "authorId": "u2", + "title": "Pasta carbonara", + "description": "Klassisk romersk pasta med egg, bacon og parmesan.", + "prepTimeMinutes": 25, + "servings": 4, + "averageRating": 5, + "category": "Middag", + "imageUrl": "/images/carbonara.webp", + "status": "PUBLISHED", + "createdAt": "2026-09-08T17:00:00Z", + "ingredients": [ + { + "name": "Spaghetti", + "amount": 400, + "unit": "g", + "order": 1 + }, + { + "name": "Bacon", + "amount": 200, + "unit": "g", + "order": 2 + }, + { + "name": "Egg", + "amount": 3, + "unit": "stk", + "order": 3 + }, + { + "name": "Parmesan", + "amount": 80, + "unit": "g", + "order": 4 + }, + { + "name": "Sort pepper", + "amount": 1, + "unit": "ts", + "order": 5 + } + ], + "steps": [ + { + "order": 1, + "instruction": "Kok spaghetti etter anvisning på pakken." + }, + { + "order": 2, + "instruction": "Stek baconet sprøtt i en panne." + }, + { + "order": 3, + "instruction": "Visp sammen egg og revet parmesan." + }, + { + "order": 4, + "instruction": "Bland den varme pastaen med bacon, ta pannen av varmen og rør inn eggeblandingen." + }, + { + "order": 5, + "instruction": "Krydre med pepper og server med én gang." + } + ], + "tags": [ + "Rask" + ] + }, + { + "id": "seed-r27", + "authorId": "u3", + "title": "Riskrem", + "description": "Tradisjonell dessert med risgrøt og krem, servert med rød saus.", + "prepTimeMinutes": 20, + "servings": 6, + "averageRating": 3.5, + "category": "Dessert", + "imageUrl": "/images/riskrem.webp", + "status": "PUBLISHED", + "createdAt": "2026-09-11T15:00:00Z", + "ingredients": [ + { + "name": "Kald risgrøt", + "amount": 5, + "unit": "dl", + "order": 1 + }, + { + "name": "Kremfløte", + "amount": 3, + "unit": "dl", + "order": 2 + }, + { + "name": "Sukker", + "amount": 2, + "unit": "ss", + "order": 3 + }, + { + "name": "Vaniljesukker", + "amount": 1, + "unit": "ts", + "order": 4 + }, + { + "name": "Rød saus", + "amount": 3, + "unit": "dl", + "order": 5 + } + ], + "steps": [ + { + "order": 1, + "instruction": "Pisk kremfløten stiv med sukker og vaniljesukker." + }, + { + "order": 2, + "instruction": "Vend kremen forsiktig inn i den kalde risgrøten." + }, + { + "order": 3, + "instruction": "Server med rød saus." + } + ], + "tags": [ + "Vegetar", + "Glutenfri", + "Barnevennlig" + ] + }, + { + "id": "seed-r28", + "authorId": "u4", + "title": "Quinoasalat med kikerter", + "description": "Proteinrik salat med quinoa, kikerter og friske grønnsaker.", + "prepTimeMinutes": 25, + "servings": 3, + "averageRating": 4, + "category": "Salat", + "imageUrl": "/images/quinoasalat.webp", + "status": "PUBLISHED", + "createdAt": "2026-09-14T12:00:00Z", + "ingredients": [ + { + "name": "Quinoa", + "amount": 2, + "unit": "dl", + "order": 1 + }, + { + "name": "Kikerter", + "amount": 1, + "unit": "boks", + "order": 2 + }, + { + "name": "Agurk", + "amount": 1, + "unit": "stk", + "order": 3 + }, + { + "name": "Tomat", + "amount": 2, + "unit": "stk", + "order": 4 + }, + { + "name": "Sitron", + "amount": 1, + "unit": "stk", + "order": 5 + }, + { + "name": "Olivenolje", + "amount": 3, + "unit": "ss", + "order": 6 + } + ], + "steps": [ + { + "order": 1, + "instruction": "Kok quinoaen etter anvisning på pakken og la den avkjøles." + }, + { + "order": 2, + "instruction": "Skjær agurk og tomat i biter, og skyll kikertene." + }, + { + "order": 3, + "instruction": "Bland alt og vend inn sitronsaft og olivenolje." + } + ], + "tags": [ + "Vegansk", + "Vegetar", + "Glutenfri", + "Sunn" + ] + }, + { + "id": "seed-r29", + "authorId": "u1", + "title": "Vafler", + "description": "Norske vafler med rømme, perfekt til kaffen.", + "prepTimeMinutes": 20, + "servings": 4, + "averageRating": 4.5, + "category": "Dessert", + "imageUrl": "/images/vafler.webp", + "status": "PUBLISHED", + "createdAt": "2026-09-18T14:30:00Z", + "ingredients": [ + { + "name": "Hvetemel", + "amount": 4, + "unit": "dl", + "order": 1 + }, + { + "name": "Melk", + "amount": 4, + "unit": "dl", + "order": 2 + }, + { + "name": "Egg", + "amount": 3, + "unit": "stk", + "order": 3 + }, + { + "name": "Sukker", + "amount": 0.5, + "unit": "dl", + "order": 4 + }, + { + "name": "Smør", + "amount": 50, + "unit": "g", + "order": 5 + }, + { + "name": "Rømme", + "amount": 1, + "unit": "dl", + "order": 6 + } + ], + "steps": [ + { + "order": 1, + "instruction": "Visp egg og sukker lett sammen." + }, + { + "order": 2, + "instruction": "Rør inn mel og melk vekselvis til en jevn røre." + }, + { + "order": 3, + "instruction": "Smelt smøret og rør det inn sammen med rømmen." + }, + { + "order": 4, + "instruction": "Stek vaflene gylne i et varmt vaffeljern." + } + ], + "tags": [ + "Vegetar", + "Barnevennlig", + "Rask" + ] + }, + { + "id": "seed-r30", + "authorId": "u2", + "title": "Ovnsbakt blomkål med tahini", + "description": "Hel blomkål bakt i ovn med krydder og tahinidressing.", + "prepTimeMinutes": 40, + "servings": 3, + "averageRating": null, + "category": "Middag", + "imageUrl": "/images/ovnsbakt-blomkal.webp", + "status": "DRAFT", + "createdAt": "2026-09-22T17:00:00Z", + "ingredients": [ + { + "name": "Blomkål", + "amount": 1, + "unit": "stk", + "order": 1 + }, + { + "name": "Olivenolje", + "amount": 3, + "unit": "ss", + "order": 2 + }, + { + "name": "Spisskummen", + "amount": 1, + "unit": "ts", + "order": 3 + }, + { + "name": "Tahini", + "amount": 3, + "unit": "ss", + "order": 4 + }, + { + "name": "Sitron", + "amount": 1, + "unit": "stk", + "order": 5 + }, + { + "name": "Salt", + "amount": 1, + "unit": "ts", + "order": 6 + } + ], + "steps": [ + { + "order": 1, + "instruction": "Forvarm ovnen til 220 °C." + }, + { + "order": 2, + "instruction": "Pensle blomkålen med olivenolje, spisskummen og salt." + }, + { + "order": 3, + "instruction": "Stek i 30–35 minutter til den er gyllen." + }, + { + "order": 4, + "instruction": "Rør sammen tahini, sitronsaft og litt vann, og drypp over." + } + ], + "tags": [ + "Vegansk", + "Vegetar", + "Glutenfri", + "Sunn" + ] + } +] \ No newline at end of file diff --git a/server/package.json b/server/package.json index 3085a63..ac1b42c 100644 --- a/server/package.json +++ b/server/package.json @@ -17,9 +17,11 @@ "seed": "tsx prisma/seed.ts" }, "devDependencies": { + "@types/bcryptjs": "^2.4.6", "@types/cookie-parser": "^1.4.10", "@types/cors": "^2.8.19", "@types/express": "^5.0.6", + "@types/jsonwebtoken": "^9.0.10", "@types/multer": "^2.2.0", "@types/node": "^24.19.0", "@types/supertest": "^7.2.1", @@ -34,8 +36,10 @@ "@apollo/server": "^5.5.1", "@as-integrations/express5": "^1.1.2", "@prisma/client": "^6.19.3", + "bcryptjs": "^3.0.3", "cors": "^2.8.6", "express": "^5.2.1", - "graphql": "^16.14.2" + "graphql": "^16.14.2", + "jsonwebtoken": "^9.0.3" } } diff --git a/server/prisma/schema.prisma b/server/prisma/schema.prisma index 85ef5b9..7fb82e6 100644 --- a/server/prisma/schema.prisma +++ b/server/prisma/schema.prisma @@ -11,9 +11,10 @@ datasource db { //brukeren sin oversikt model User { id String @id @default(uuid()) - googleId String? @unique + username String @unique + passwordHash String? name String - email String @unique + email String? @unique languagePref String @default("nb") unitSystem String @default("metric") createdAt DateTime @default(now()) diff --git a/server/prisma/seed.ts b/server/prisma/seed.ts index d6c15f1..b9bc0c8 100644 --- a/server/prisma/seed.ts +++ b/server/prisma/seed.ts @@ -1,42 +1,80 @@ import { PrismaClient } from '@prisma/client'; +import { readFileSync } from 'fs'; +import { join } from 'path'; + const prisma = new PrismaClient(); +type SeedRecipe = { + id: string; + authorId: string; + title: string; + description: string; + prepTimeMinutes: number; + servings: number; + category: string; + imageUrl: string | null; + status: 'DRAFT' | 'PUBLISHED'; + createdAt: string; + ingredients: { name: string; amount: number; unit: string; order: number }[]; + steps: { order: number; instruction: string }[]; + tags: string[]; +}; + async function main() { - const tagPasta = await prisma.tag.upsert({ where: { name: 'vegetar' }, update: {}, create: { name: 'vegetar'}}); + const recipes: SeedRecipe[] = JSON.parse( + readFileSync(join(__dirname, '../data/recipes.json'), 'utf-8'), + ); - const user = await prisma.user.upsert({ + // Testbruker for forfatter frem til auth er ferdig + await prisma.user.upsert({ where: { id: 'dev-user' }, update: {}, - create: { id: 'dev-user', name: 'Test Bruker', email: 'test@example.com'} + create: { id: 'dev-user', name: 'Test Bruker', email: 'test@example.com' }, }); - await prisma.recipe.create({ - data: { - title: "Pesto Pasta", - description: "beste studentmiddagen vi har", - prepTimeMinutes: 15, - servings: 1, - category: 'middag', - status: 'PUBLISHED', - authorId: 'dev-user', - tags: { connect: [{ id: tagPasta.id}]}, - ingredients: { - create: [ - { name: 'Pasta', amount: 200, unit: 'g', order: 1}, - { name: 'Pesto', amount: 0.5, unit: 'stk', order: 2}, - ], - }, + // En testbruker per forfatter i mocken (u1, u2 osv.) + for (const id of new Set(recipes.map((r) => r.authorId))) { + await prisma.user.upsert({ + where: { id }, + update: {}, + create: { id, username: id, name: `Testbruker ${id}` }, + }); + } - steps: { - create: [ - { order: 1, instruction: 'Kok opp vann og ha i pasta når det koker. følg koketid på pakka'}, - { order: 2, instruction: 'Ha ferdigkokt pasta i en bolle og ha over et halvt glass pesto, bland sammen'}, - { order: 3, instruction: 'Spis yummy pasta.'} - ], + // upsert med tom update gjør seed trygg å kjøre flere ganger (ingen duplikater) + for (const r of recipes) { + await prisma.recipe.upsert({ + where: { id: r.id }, + update: {}, + create: { + id: r.id, + authorId: r.authorId, + title: r.title, + description: r.description, + prepTimeMinutes: r.prepTimeMinutes, + servings: r.servings, + category: r.category, + imageUrl: r.imageUrl, + status: r.status, + createdAt: new Date(r.createdAt), + ingredients: { create: r.ingredients }, + steps: { create: r.steps }, + tags: { + connectOrCreate: r.tags.map((name) => ({ + where: { name }, + create: { name }, + })), + }, }, - }, - }); + }); + } + console.log(`Seedet ${recipes.length} oppskrifter`); } -main().finally(() => prisma.$disconnect()); \ No newline at end of file +main() + .catch((e) => { + console.error(e); + process.exitCode = 1; + }) + .finally(() => prisma.$disconnect()); \ No newline at end of file diff --git a/server/scripts/export-mock.ts b/server/scripts/export-mock.ts new file mode 100644 index 0000000..40ef6a4 --- /dev/null +++ b/server/scripts/export-mock.ts @@ -0,0 +1,28 @@ +import { mkdirSync, writeFileSync } from 'fs'; +import { recipes } from '../../client/src/mocks/recipes'; + +const out = recipes.map((r) => ({ + id: `seed-${r.recipeId}`, + authorId: r.authorId, + title: r.title, + description: r.description, + prepTimeMinutes: r.prepTime, + servings: r.portions, + averageRating: r.averageRating, // lagres ikke i databasen, se punkt 2 under + category: r.category, + imageUrl: r.imageURL, + status: r.status.toUpperCase(), // 'Published' -> 'PUBLISHED' + createdAt: r.created, + ingredients: r.ingredients.map((i, idx) => ({ + name: i.name, + amount: i.amount, + unit: i.unit, + order: idx + 1, + })), + steps: r.steps.map((s) => ({ order: s.order, instruction: s.instruction })), + tags: r.tags.map((t) => t.tagName), +})); + +mkdirSync('data', { recursive: true }); +writeFileSync('data/recipes.json', JSON.stringify(out, null, 2)); +console.log(`Skrev ${out.length} oppskrifter til data/recipes.json`); \ No newline at end of file From 881c287298e9ca9cbf392031ba255b8e9a52e37e Mon Sep 17 00:00:00 2001 From: Matilde Lund Date: Tue, 13 Oct 2026 15:25:35 +0200 Subject: [PATCH 2/2] =?UTF-8?q?woops=20m=C3=A5tte=20fikse=20dette=20ogs?= =?UTF-8?q?=C3=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../20261013132220_username_auth/migration.sql | 13 +++++++++++++ server/prisma/seed.ts | 4 ++-- 2 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 server/prisma/migrations/20261013132220_username_auth/migration.sql diff --git a/server/prisma/migrations/20261013132220_username_auth/migration.sql b/server/prisma/migrations/20261013132220_username_auth/migration.sql new file mode 100644 index 0000000..5fb2371 --- /dev/null +++ b/server/prisma/migrations/20261013132220_username_auth/migration.sql @@ -0,0 +1,13 @@ +DROP INDEX "User_googleId_key"; + +ALTER TABLE "User" DROP COLUMN "googleId", +ADD COLUMN "passwordHash" TEXT, +ADD COLUMN "username" TEXT, +ALTER COLUMN "email" DROP NOT NULL; + +-- Eksisterende brukere får id som brukernavn (id er allerede unik) +UPDATE "User" SET "username" = "id" WHERE "username" IS NULL; + +ALTER TABLE "User" ALTER COLUMN "username" SET NOT NULL; + +CREATE UNIQUE INDEX "User_username_key" ON "User"("username"); \ No newline at end of file diff --git a/server/prisma/seed.ts b/server/prisma/seed.ts index b9bc0c8..d49dbf0 100644 --- a/server/prisma/seed.ts +++ b/server/prisma/seed.ts @@ -29,7 +29,7 @@ async function main() { await prisma.user.upsert({ where: { id: 'dev-user' }, update: {}, - create: { id: 'dev-user', name: 'Test Bruker', email: 'test@example.com' }, + create: { id: 'dev-user', username: 'dev-user', name: 'Test Bruker' }, }); // En testbruker per forfatter i mocken (u1, u2 osv.) @@ -37,7 +37,7 @@ async function main() { await prisma.user.upsert({ where: { id }, update: {}, - create: { id, username: id, name: `Testbruker ${id}` }, + create: { id, username: id, name: `Testbruker ${id}` }, }); }