Arkitektur - idatt2106-v25-02/krisefikser GitHub Wiki

Systemstruktur

Krisefikser.no er implementert som to separate prosjekter som kommuniserer over REST. Denne separasjonen muliggjør uavhengig utvikling og utrulling av hver del, noe som har vist seg verdifullt, for eksempel ved frontend-oppdateringer uten nedetid på backend-tjenester.

Frontend-struktur

Frontend-applikasjonen følger en komponentbasert arkitektur:

  • Komponentbibliotek: Inneholder gjenbrukbare UI-elementer som Button, Card og Modal
  • Views: Sidekomponenter som DashboardView, InventoryView
  • Stores: Tilstandshåndtering med Pinia, eksempelvis useAuthStore, useNotificationStore, useAccessibilityStore (implementert med Composition API)
  • Router: Vue Router med definerte ruter og tilgangskontroll
  • API-klienter: Autogenererte TypeScript-klienter fra OpenAPI-spesifikasjon
  • Tester: Vitest for enhetstester, Cypress for ende-til-ende-tester

Backend-struktur

Backend følger en standard lagdelt arkitektur:

  • Controllers: REST-endepunkter (f.eks. UserController, InventoryController)
  • Services: Forretningslogikk (f.eks. AuthenticationService, InventoryService, NotificationWebSocketService)
  • Repositories: Dataaksess (f.eks. UserRepository, ItemRepository)
  • Models: Domenemodeller og DTO-er
  • Konfigurasjon: Spring Security, JPA-oppsett
  • Tester: JUnit med Mockito for enhetstesting

Implementerte funksjonaliteter

Autentisering

JWT-basert autentisering er implementert med følgende flyt:

  1. Bruker logger inn → mottar access/refresh tokens
  2. Access token brukes i Authorization-header
  3. Ved utløp → refresh token brukes for nye tokens
  4. Tokens lagres i localStorage

Eksempel på token-struktur:

{
  "sub": "[email protected]",
  "roles": ["USER"],
  "exp": 1616516156
}

Tilstandshåndtering

Frontend bruker Pinia stores implementert med Composition API:

// useAuthStore.ts
export const useAuthStore = defineStore('auth', () => {
  // State og actions implementert med ref/computed
  // ...
})

Datalagring

Repository-mønsteret er implementert med Spring Data JPA:

@Repository
public interface UserRepository extends JpaRepository<User, UUID> {
    Optional<User> findByEmail(String email);
    boolean existsByEmail(String email);
    List<User> findByRolesName(Role.RoleType rolesName);
}

Sanntidskommunikasjon

Sanntidsoppdateringer håndteres med WebSocket og STOMP:

// Frontend (NotificationService)
await webSocket.subscribe<NotificationResponse>(
  `/user/${userEmail}/queue/notifications`,
  (notification) => {
    notificationStore.addNotification(notification)
    // TTS hvis aktivert
  }
)
// Backend (NotificationWebSocketService)
@Service
public class NotificationWebSocketService {
  private final SimpMessagingTemplate messagingTemplate;

  public void sendNotification(User user, NotificationResponse notificationResponse) {
    messagingTemplate.convertAndSendToUser(
        user.getEmail(),
        "/queue/notifications",
        notificationResponse);
  }
}

Teknisk stack

Frontend

  • Vue 3 med Composition API for bedre TypeScript-integrasjon
  • Tailwind CSS for styling (reduserer bundle-størrelse med 60% sammenlignet med Bootstrap)
  • Vite som byggesystem

Backend

Spring Boot 3.4 med Java 21 gir oss tilgang til:

  • Pattern Matching for switch
  • Record Patterns

Database

MySQL er valgt basert på følgende kriterier:

  • Støtte for komplekse joins i inventar-queries
  • Transaksjonssikkerhet for kritiske operasjoner
  • Robust backup-løsning
  • Enkel integrasjon med Spring Data JPA

Testing

Backend

  • JUnit (med Mockito) for enhets-, controller- og integrasjonstester
  • Kjøres med: ./mvnw test -Dspring.profiles.active=test
  • Testdekning: 77% linjer, 58% grener (se JaCoCo-rapport for detaljer)

Frontend

  • Vitest for enhetstester, Cypress for ende-til-ende-tester
  • Kjør enhetstester med: pnpm test:unit --coverage
  • Testdekning: 7,5% linjer/statements (se /frontend/coverage/index.html for detaljer)

Utviklingsprosess

Versjonskontroll

Git-workflow med beskyttede branches:

  • Feature branches → Develop → Main
  • Pull requests krever:
    • Kodegjennomgang
    • Passerte tester
    • Ingen kritiske Sonar-issues

Kontinuerlig integrasjon

CI håndteres av GitHub Actions og kjøres på hver push og pull request til main og develop:

  • Backend:

    • Renser Maven-cache og bygde artefakter
    • Formaterer Java-kode (auto-committes ved behov)
    • Kjører alle tester og genererer JaCoCo-dekningsrapport (mvn -Dspring.profiles.active=test clean verify jacoco:report)
    • Laster opp dekningsrapport som artifact
  • Frontend:

    • Renser node_modules og bygde artefakter
    • Installerer avhengigheter med pnpm
    • Bygger frontend
    • Kjører ESLint for kodekvalitet
    • Kjører alle enhetstester med Vitest

Artifacts (som backend-dekningsrapporten) beholdes i 7 dager.

Kodekvalitet

Automatiserte sjekker inkluderer:

  • ESLint med TypeScript
  • Prettier for formatering
  • Checkstyle for Java

Prosjektkrav

Tekniske krav

  • REST API dokumentert med OpenAPI
  • Separasjon mellom frontend og backend
  • SQL-database med migrasjoner
  • Minimum testdekning
  • CI/CD-pipeline

Teknologivalg

Nye teknologier vurderes etter:

  • Kompatibilitet med eksisterende stack
  • Påvirkning på byggeprosess
  • Teamets kompetanse
  • Vedlikeholdbarhet
⚠️ **GitHub.com Fallback** ⚠️