API Backend
API backend er en moderne Node.js applikasjon bygget med Hono.js som tilbyr REST endpoints for echo’s webapplikasjoner. Den håndterer business logic, database operasjoner, og integrasjoner med eksterne tjenester.
Teknologi
Section titled “Teknologi”Core Stack
Section titled “Core Stack”- Hono.js - Moderne web framework for Node.js
- TypeScript - Type safety og developer experience
- Drizzle ORM - Type-safe database queries
- Zod - Runtime validation og schema parsing
- esbuild - Rask bundling og building
Database og data
Section titled “Database og data”- PostgreSQL - Hoveddatabase
- Drizzle ORM - Database toolkit
- PGlite - Embedded PostgreSQL for testing
- Date-fns - Dato/tid utilities
Struktur
Section titled “Struktur”apps/api/├── src/│ ├── app.ts # Hono app konfigurasjon│ ├── index.ts # Server entry point│ ├── lib/ # Shared utilities│ │ ├── db.ts # Database connection│ │ ├── hono.ts # Hono helpers│ │ └── logger.ts # Logging setup│ ├── middleware/ # Custom middleware│ │ └── admin.ts # Admin authentication│ ├── services/ # API endpoints│ │ ├── admin.ts # Admin operations│ │ ├── happening.ts # Arrangementsstyring│ │ ├── feedback.ts # Tilbakemeldinger│ │ ├── birthdays.ts # Bursdagsdata│ │ ├── degrees.ts # Studieretninger│ │ ├── shopping-list.ts # Hyggkom handleliste│ │ └── strikes.ts # Prikksystem│ └── utils/ # Helper functions├── test/ # Unit og integration tests└── Dockerfile # Container konfigurasjon
API Services
Section titled “API Services”Health Check (/
)
Section titled “Health Check (/)”// GET / - API status{ status: "ok", timestamp: "2024-01-01T12:00:00Z"}
Admin (/admin
)
Section titled “Admin (/admin)”- GET /admin/users - Hent alle brukere
- POST /admin/users - Opprett ny bruker
- PUT /admin/users/:id - Oppdater bruker
- DELETE /admin/users/:id - Slett bruker
Arrangementer (/happenings
)
Section titled “Arrangementer (/happenings)”- GET /happenings - Hent arrangementer
- GET /happenings/:id - Hent spesifikt arrangement
- POST /happenings - Opprett arrangement
- PUT /happenings/:id - Oppdater arrangement
Tilbakemeldinger (/feedback
)
Section titled “Tilbakemeldinger (/feedback)”- POST /feedback - Send tilbakemelding
- GET /feedback - Hent tilbakemeldinger (admin)
- PUT /feedback/:id - Marker som lest
Handleliste (/shopping-list
)
Section titled “Handleliste (/shopping-list)”- GET /shopping-list - Hent handleliste
- POST /shopping-list/items - Legg til vare
- DELETE /shopping-list/items/:id - Fjern vare
Bursdager (/birthdays
)
Section titled “Bursdager (/birthdays)”- GET /birthdays - Hent dagens bursdager
- GET /birthdays/upcoming - Kommende bursdager
Studieretninger (/degrees
)
Section titled “Studieretninger (/degrees)”- GET /degrees - Hent alle studieretninger
- POST /degrees - Opprett ny studieretning
Prikker (/strikes
)
Section titled “Prikker (/strikes)”- GET /strikes - Hent brukerens prikker
- POST /strikes - Gi prikk (admin)
- DELETE /strikes/:id - Fjern prikk (admin)
Database integrasjon
Section titled “Database integrasjon”Migrations
Section titled “Migrations”# Generer ny migrationpnpm db:generate
# Kjør migrationspnpm db:migrate
Error Handling
Section titled “Error Handling”Validation med Zod
Section titled “Validation med Zod”import { z } from "zod";
const createUserSchema = z.object({ name: z.string().min(1), email: z.string().email(), year: z.number().min(1).max(5),});
// I endpointconst result = createUserSchema.safeParse(await c.req.json());if (!result.success) { return c.json({ error: "Invalid data", details: result.error }, 400);}
Testing
Section titled “Testing”Unit tests
Section titled “Unit tests”# Kjør testerpnpm test:unit
# Med watch modepnpm test:unit --watch
Test struktur
Section titled “Test struktur”import { describe, expect, it } from "vitest";
import app from "../../src/app";
describe("Admin API", () => { it("should require authentication", async () => { const res = await app.request("/admin/users"); expect(res.status).toBe(401); });});
Monitoring og logging
Section titled “Monitoring og logging”Structured logging
Section titled “Structured logging”import { logger } from "./lib/logger";
// Log levels: debug, info, warn, errorlogger.info("User created", { userId, email });logger.error("Database error", { error: error.message });
Vanlige oppgaver
Section titled “Vanlige oppgaver”Legge til ny endpoint
Section titled “Legge til ny endpoint”import { Hono } from "hono";import { z } from "zod";
const app = new Hono();
app.get("/ny-endpoint", async (c) => { // Implementasjon her return c.json({ message: "Success" });});
export default app;
Database operasjoner
Section titled “Database operasjoner”// Med error handlingtry { const result = await db.insert(users).values(userData); return c.json(result, 201);} catch (error) { logger.error("Database error", { error }); return c.json({ error: "Failed to create user" }, 500);}