Struktur¶
Filstruktur¶
Strukturen för en backend-tjänst. Exempel på dessa är minilith och fed-auth.
Note
Det bästa sättet att skapa något nytt är att se hur liknande saker
redan gjorts. T.ex. kan tests/lib.rs filen kopieras nästan rakt av och början
av alla andra tests/*.rs filer är samma.
schema: definitionen av schemat, se denna guidenmigrations:.sql-filer som genereras avschemasom ändrar schemat på databasen när schemat ischemauppdateras.src/main.rs: väldigt standard, startar bara en server med endpointen frånlib.rssrc/lib.rs: här skapas endpointen, alltså vilka tjänster som är tillgängliga i APIetsrc/context.rs: här definieras och laddas all data som behövs av alla handlers (alltså de funktioner som hanterar HTTP requests). T.ex. skapas kopplingen till databasen här. Nycklar laddas från miljön etc.src/<..>.rs: andra filer isrckan innehålla hjälpfunktioner för t.ex. cookies, men främst innehåller de routes (som är ett struct som heter*Router, derivearClone) och#[OpenAPI]-impl-block som definierar alla handlers.tests/lib.rs: hjälpfunktioner för tester, ofta innehållande en funktion för att få en test-klienttests/<..>.rsolika integration-tests..env.example: ett exempel på hur ens.env-fil kan se ut, med dummy-nycklar etc. Kopiera denna till.envföre du börjar utveckla.env: filen med alla miljövariabler. Den ignoreras av git, så om du lägger till en miljövariabel kom ihåg att lägga till den i.env.exampleockså!
Namngivning¶
- Om en handler tar en body, bör denna heta
<Handler's name>Request. - Handlern's retur-typ bör vara
Result<..., <Handler's name>Error>. <Handler's name>Errorär ett enum av fel (se exempeln).- Om en handler returnerar data i ett struct borde detta heta
<Handler's name>Response.
Extras¶
Alla Route objekt bör implementera Deref<Target = Context>. Detta gör så att
man kan skriva t.ex. &self.db i en handler, istället för &self.context.db.
Föredra gärna sqlx::query! över sqlx::query_as! och en struct för att
returnera data till klienten. Detta då datan väldigt sällan stämmer överrens 1:1
med databasen (t.ex. användardata är kryterad, där kan finnas listor av
delobjekt som är separata SQL queries etc).