CASE STUDY

EngiiCore — Multi-Tenant Angular-Platform Ombygning

Engii-Softs frontend stod fast på Angular 12 — omkring ti major-versioner bagud — mens domænelogikken under den blev ved med at vokse. I stedet for at lappe det gamle system arkitekterede og opstartede jeg en ny platform fra bunden: samme domænelogik, ny arkitektur, nyt framework.

Kontekst

Bygget på Angular 22 med standalone components og signals, Angular Material, et Connect/gRPC-Web-servicelag, MSAL-login og multi-tenancy, der afgøres ud fra hostname ved opstart.

Omfang

Det er en stor, aktiv, multi-tenant platform — ikke en demo:

  • Snesevis af featureområder, med hundredvis af komponenter og services
  • Et stort antal .proto-filer, der genererer typede Connect-ES-klienter
  • Omfattende intern dokumentation, heriblandt udvikler-/arkitekturdokumentation
  • Et fuldt sæt CI/CD-workflows
  • Selvskrevne ESLint-regler, der håndhæver arkitekturen
  • Fire testniveauer — unit, komponent, ende-til-ende og et nyudviklet "wire-compat"-niveau — med bred dækning på tværs af kodebasen

Hvad jeg har bygget og ejer

  • Repositoriets struktur og kernearkitektur — routing samt den multi-tenant-opstart, der afgør tenant ud fra hostname, før login og gRPC initialiseres.
  • gRPC/Connect-servicelaget: typede fetch()/mutate()-wrappere, der samler loading-state og succes/fejl-håndtering ét sted, samt den buf-drevne proto-genereringspipeline. En lint-regel sikrer, at ingen kode kalder gRPC direkte uden om laget.
  • Fundamentet til et generisk komponentbibliotek — heriblandt det oprindelige kalendersystem — og det genbrugsmønster, teamet bygger videre på. En lint-regel håndhæver brugen af de generiske komponenter frem for engangsløsninger.
  • Det oprindelige theming- og design-token-system: flere temaer bygget på et fælles fundament-token-lag, hvor hardkodet styling er forbudt via lint.
  • Formaterings-/i18n-laget (dansk/engelsk parallelitet) og størstedelen af den udviklerrettede arkitekturdokumentation.
  • Testinfrastrukturen på tværs af alle fire niveauer, heriblandt et wire-compat-niveau, jeg byggede specifikt til at fange protobuf-wire-format-drift, når afhængigheder opdateres — og jeg har personligt skrevet størstedelen af testsuiten.
  • CI/CD-workflowsene samt en fuld gennemgang af GitHub-organisationen: erstattede en "alle er admin"-opsætning med afgrænsede rettigheder og påkrævet 2FA, indførte branch protection og migrerede projektstyring fra Jira til GitHub Projects (boards, sprints og rapporteringsvisninger).
  • Selvskrevne ESLint-regler, der gør arkitekturen til håndhævet konvention frem for dokumentation, ingen læser — eksempler er regler, der forbyder direkte gRPC-kald uden om servicelaget, kræver standalone components, og foretrækker den generiske tabelkomponent frem for skræddersyede løsninger.
  • Guard-opsætningen, der afgør, hvad hver rute og hvert featureområde er betinget af.

Bygget af teamet, ikke af mig alene

Det er en fælles kodebase, ikke et solo-projekt. Jeg har arkitekteret frontend'en, sat konventionerne og leder frontend-teamet, der bygger videre på den — jeg har ikke bygget det hele selv, og platformen er stærkere af den grund.

Vil du se noget kode?

Intet ovenfor linker videre — EngiiCore er en levende kommerciel platform, så selve kodebasen er ikke offentlig. For et fuldt åbent eksempel på samme slags arkitektur (Angular, realtidsdata, server-side rendering, et struktureret komponent-/servicelag og en fuld testsuite), se WiseWatt, et solo-eksamensprojekt jeg byggede fra bunden og som fik topkarakter.

Se WiseWatt på GitHub