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 install .
Kopiera .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:reset
vilket Àven brukar lösa dryga problem. Detta seedar Àven databasen med lite testdata. Sedan körs projektet med
npm run dev
LĂ€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 oftast
Fö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 kod
Det 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-ignore
ovanfö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.prisma
och 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
DatabaseAmazingFeature
tillAmazingFeatureResponse
- 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
AmazingFeatureResponse
tillAmazingFeature
, t.ex. omAmazingFeature
innehÄllerUser
-objekt.AmazingFeatureAPI
kan inte sjÀlv lösa dessa, sÄ resolvern anvÀnderctx.userDataLoader
för att omvandlaAmazingFeatureResponse
s 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
DataLoader
för att undvika n + 1-problemet. - Du skriver enhetstester i
src/test/unit/
för din nya API och reducer, och integrationstester itest/integration
för din resolver - Du uppdaterar
CHANGELOG.MD
med 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.