2. Prisma
2. Prisma
Tijdens deze oefeningenreeks oefen je op
- Prisma instellen in je project
- Schema opbouwen met relaties
- Prisma gebruiken voor CRUD operaties
Startbestanden
Voorbereiding
Gebruik de compose.yaml om je Docker container aan te maken en installeer + initialiseer Prisma in je project voor een Postgres databank. Zet indien nodig de Docker container van het lesvoorbeeld uit (deze gebruikt dezelfde poort).
Pas de connectiestring aan, deze is grotendeels hetzelfde als in het lesvoorbeeld, maar moet nu gebruik maken van de database 'backend-exercise' in plaats van 'backend-lecture'.
Maak een Prisma client aan (zoals in het lesvoorbeeld). Installeer ook de sever-only package.
Je zal merken dat een heel aantal zaken op dit moment fouten geven. De startbestanden zijn zo opgebouwd dat je deze oplost wanneer je de oefening afwerkt. Het kan zijn dat je de modellen in de actions nog van naam moet wijzigen.
Schema aanmaken
Maak een schema aan waar je de boeken en series alvast toevoegt op basis van de modellen van vorige les (laat de seriesId en author properties weg, anders kan je fouten krijgen). Maak ook een één-op-veel relatie tussen boek en serie (Prisma zal de serieId zelf opnieuw toevoegen als je de Prisma ORM plugin hebt). Als een serie verwijderd wordt, moeten ook alle boeken van die serie verwijderd worden. Voorzie dus een cascade relatie. Zorg voor consistent gebruik van hoofdletters en maak zowel de aangemaakte property als FK verplicht.
Info
Het seed script verwacht dat je de tabellen Book en Series noemt, in het Engels bestaat 'serie' niet.
De amazonURL en wikipediaURL moeten lange string toestaan, gebruik hiervoor de @db.Text annotatie.
Maak een nieuwe tabel Author die enkel een id en name heeft. We veronderstellen dat meerdere auteurs aan één serie kunnen werken en een auteur aan meerdere series kan werken: maak een veel-op-veel relatie tussen de series en auteurs.
Zorg voor de nodige migrations en voer daarna het seed script uit.
Models aanpassen
Verwijder de ISeries en IBook interfaces uit het project en vervang deze in de hele applicatie met de types die Prisma gegenereerd heeft.
Read
Op dit moment worden de boeken nog opgehaald uit de array in bookData.ts. We gaan stap-per-stap alles vervangen zodat je deze ophaalt uit de database.
Start met de methode om alle boeken op te halen, en die om een boek op te halen met een specifieke ID. Zorg dat de methode om alle boeken op te halen optioneel een zoekstring gebruikt op titel.
Vervang ook de methodes om boeken op te halen van een specifieke serie, om een specifieke serie op te halen en om alle series op te halen.
Maak een methode om alle auteurs op te halen en een methode om één auteur op te halen, telkens inclusief de series. LET OP: hiervoor moet je een nieuw model aanmaken.
Je kan de resultaten al testen in de frontend.
Create
Voorzie een methode om een nieuw boek te maken. Test je methode via de UI.
Optioneel Create or connect
Pas de methode aan zodat deze werkt als je een id van de series meegeeft, maar ook als je informatie meegeeft om een nieuwe serie aan te maken.
Hiervoor begin je met een nieuwe interface aan te maken die een series property heeft die ofwel een string ofwel een object met de informatie voor een nieuwe serie kan bevatten.
export interface CreateBookParamsV2 extends Prisma.BookCreateWithoutSeriesInput {
series: string | Prisma.SeriesCreateInput
}Vervolgens bepaald je, aan de hand van het type van de series property of je een create of connect moet gebruiken.
De oplossingen bevatten zowel de eerste als de tweede versie de create methode.
Update
Voorzie een methode om een boek te updaten. Zorg ervoor dat het ook mogelijk is om een andere serie toe te wijzen aan het boek. Je kan dit testen in de frontend. LET OP: hiervoor moet je een nieuw model aanmaken.
Delete
Zorg ervoor dat je een boek kan verwijderen. Dit kan je testen door in het overzicht van de boeken op 'delete' te klikken.
Veel-op-veel relaties
Zorg ervoor dat je series aan auteurs kan koppelen en loskoppelen. Dit kan je op de auteurs pagina testen door de vinkjes te verzetten.
Logging
Zorg ervoor dat de globale console.error, warn, ... methodes overschreven worden door de Pino equivalenten.