Skip to content

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.

  • 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
  • PostgreSQL - Hoveddatabase
  • Drizzle ORM - Database toolkit
  • PGlite - Embedded PostgreSQL for testing
  • Date-fns - Dato/tid utilities
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
// GET / - API status
{
status: "ok",
timestamp: "2024-01-01T12:00:00Z"
}
  • GET /admin/users - Hent alle brukere
  • POST /admin/users - Opprett ny bruker
  • PUT /admin/users/:id - Oppdater bruker
  • DELETE /admin/users/:id - Slett bruker
  • GET /happenings - Hent arrangementer
  • GET /happenings/:id - Hent spesifikt arrangement
  • POST /happenings - Opprett arrangement
  • PUT /happenings/:id - Oppdater arrangement
  • POST /feedback - Send tilbakemelding
  • GET /feedback - Hent tilbakemeldinger (admin)
  • PUT /feedback/:id - Marker som lest
  • GET /shopping-list - Hent handleliste
  • POST /shopping-list/items - Legg til vare
  • DELETE /shopping-list/items/:id - Fjern vare
  • GET /birthdays - Hent dagens bursdager
  • GET /birthdays/upcoming - Kommende bursdager
  • GET /degrees - Hent alle studieretninger
  • POST /degrees - Opprett ny studieretning
  • GET /strikes - Hent brukerens prikker
  • POST /strikes - Gi prikk (admin)
  • DELETE /strikes/:id - Fjern prikk (admin)
Terminal window
# Generer ny migration
pnpm db:generate
# Kjør migrations
pnpm db:migrate
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 endpoint
const result = createUserSchema.safeParse(await c.req.json());
if (!result.success) {
return c.json({ error: "Invalid data", details: result.error }, 400);
}
Terminal window
# Kjør tester
pnpm test:unit
# Med watch mode
pnpm test:unit --watch
test/services/admin.test.ts
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);
});
});
import { logger } from "./lib/logger";
// Log levels: debug, info, warn, error
logger.info("User created", { userId, email });
logger.error("Database error", { error: error.message });
services/ny-service.ts
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;
// Med error handling
try {
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);
}