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