Ekorre Àr sektionens nya backend driven av Node och GraphQL och skriven i TypeScript.
Förhoppningsvis har nÄgon hÄllit denna README:n uppdaterad!
Börja med att installera alla node modules med š
npm installKopiera .env.example till .env och fyll i miljövariablerna.
.env-filen innehÄller konfigurationsvariabler till servern
ekorre anvÀnder docker compose för att fÄ upp en fungerande en databas, dvs.
docker compose up(förutsatt att du installerat docker).
För att generera en PrismaClient (som anvÀnds för att kommunicera med databasen) och
fylla databasen med rÀtt schemas anvÀnds
npm run prisma:resetvilket Àven brukar lösa dryga problem. Detta seedar Àven databasen med lite testdata. Sedan körs projektet med
npm run devLĂ€s semver
TL;DR
npm run generate # Generera typescript frÄn gql och en Prisma client
npm run dev # Kompilera kontiuerligt och öppna för debugger
npm run prettier-format # Formatera kod, finns IDE intergration oftastFör att separera kod och underlÀtta utveckling sÄ finns det en struktur. För den som ska utöka funktionaliteten i programmet finns det fyra mappar som Àr viktiga:
src
âââ api
â âââ <modul>.api.ts
âââ resolvers
â âââ index.ts
â âââ <modul>.resolver.ts
âââ reducers
â âââ <modul>.reducer.ts
âââ schema
âââ <modul>.graphql
dÀr schemas och resolvers Àr viktigast. För
att hÄlla en konsekvent och stabil struktur bör
alla databasfrÄgor skötas frÄn en klass i api
och sql Àr dedikerad till att skapa de tabeller
som behövs för din funktion. Det finns mer djupgÄende
README:s i undermapparna.
Förutom dessa finns Àven prisma/, som Àr vÄr ORM (isch). Detta
Àr delen som sköter databasstruktur och vÄra queries till databasen
(Postgres).
Det Àr rekomenderat att du bekantar dig lite med de verktyg som anvÀnds:
- Typescript
- GraphQL
- Prisma (vilket egentligen Àr SQL)
- graphql-codegen
- apollo-server*
- graphql-tools*
- jwt*
*kursivt
För att underlÀtta utveckling sÄ anvÀnds graphql-codegen.
Detta gör att en typescript fil vid namn 'graphql.ts' i mappen src/models/generated
generas som innehÄller typdefintioner för graphql frÄgor.
AnvÀnd denna!
För att generera:
npm run graphql:generate
Det kan hÀnda att VScode eller annan IDE gnÀller pÄ dina typer Àven om du genererat nya. DÄ bör du i VScode köra Ctrl+Shift+P följt av Reload Window.
Eslint och prettier Àr konfigurerat och det rekomenderas att du följer de regler som Àr givna.
npm run lint // Testa kodfel, brukar göras av IDE
npm run prettier-format // Formatera all kodDet hÀnder att prettier och eslint brÄkar, frÀmst vid lÄnga typdeklarationer som i
src/models/mappers.d.ts. DÄ Àr det praktiskt att prega in en
// prettier-ignoreovanför typen.
Versionshantering följer semantic versioning specificationen. Detta Àr viktigt eftersom releases ska taggas med semver för att kunna automatiskt deployas.
Parallellt med SEMVER (som ska uppdateras i package.json) skrivs Àven förÀndringar ner i CHANGELOG.MD. Detta för att
hÄlla reda pÄ vad som förÀndrats, och för att ha en lÀttlÀst historik över projektet (vilket Àr kul!). git-historik Àr
inte en ersÀttning till en bra CHANGELOG! Kolla in Keep a Changelog för mer info.
NÀr du utvecklar en modul ser det troligen ut pÄ följande sÀtt.
- Du har en idé om vad man ska kunna göra och ungefÀr hur det ska fungera
- Du skapar en ny typ i
prisma/schema.prismaoch lÀgger till testdata iprisma/data/. Prisma sköter sjÀlv att skapa databasen nÀr man körnpm run prisma:push, sÄ du behöver inte skapa SQL-schemas sjÀlv! - Du skapar ett nytt GraphQL-schema i
src/schemas - Du skapar en ny API i
src/api/, som bara har i uppgift att prata med din nya SQL - Du inser att du inte kan fÄ all information ur SQL och skapar en mapper-typ i
src/models/mappers.d.ts, t.ex.AmazingFeatureResponse - Du skapar en reducer som omvandlar
DatabaseAmazingFeaturetillAmazingFeatureResponse - Du skapar en resolver i
src/resolvers/. Funktionerna dÀr anvÀnder din API och returnerar t.ex.AmazingFeatureResponse - Du lÀgger till resolver-metoder för att omvandla
AmazingFeatureResponsetillAmazingFeature, t.ex. omAmazingFeatureinnehÄllerUser-objekt.AmazingFeatureAPIkan inte sjÀlv lösa dessa, sÄ resolvern anvÀnderctx.userDataLoaderför att omvandlaAmazingFeatureResponses halvfÀrdigaUser-objekt till fullvÀrdiga (detta görs automatiskt om resolvern har rÀtt fÀlt/metoder!) - Du kan behöva skapa en ny
DataLoaderför att undvika n + 1-problemet. - Du skriver enhetstester i
src/test/unit/för din nya API och reducer, och integrationstester itest/integrationför din resolver - Du uppdaterar
CHANGELOG.MDmed din nya uppdatering, och Àndrar samtidigt versionsnummret ipackage.json! - Du ber om code review i GitHub pÄ din nya PR!
Glöm inte att köra npm run generate nÀr du pillat med GraphQL eller Prisma!
Detta kan tyckas vara mÄnga steg, men det finns gott om fÀrdiga exempel. Dessutom finns det gott om hjÀlpfunktioner, och mÄnga problem man kan tÀnkas finns lösta nÄnstans! Försök att följa de konventioner som finns, i design, namngiving och förvÀntade returvÀrden. API:n Àr mycket enklare att anvÀnda om man Àr konsekvent!
För att dels garantera att det som utvecklas gör det vi vill, och dessutom att koden fungerar som den ska, anvÀnder ekorre
automatisk testning. Testerna hittas i test/ och baseras pÄ testningsramverket jest. Genom lite lek med GitLab CI
trackas code coverage (alltsÄ hur stor del av koden som körs i tester) pÄ GitLab. Högt coverage garanterar inte att saker
fungerar som de ska, men utan nÄgot coverage famlar man helt i blinda. Det Àr nÀstan krav att ny kod Àven kommer med tester.
Hur ska du annars kunna bevisa att din kod gör det du sÀger?
Det finns en pipeline som kommer bygga docker bilder med hjÀlp av Dockerfile. Dessa publiceras sedan till en registry som tillhör detta projekt. Dessa bilder Àr i huvudsak designade för servern (som i skrivande stund Àr extrovert).
Referera till ddgwiki för mer information.
Ha det bra!
