Arkitektur - idatt2106-v25-02/krisefikser GitHub Wiki
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-applikasjonen følger en komponentbasert arkitektur:
- Komponentbibliotek: Inneholder gjenbrukbare UI-elementer som
Button
,Card
ogModal
- 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 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
JWT-basert autentisering er implementert med følgende flyt:
- Bruker logger inn → mottar access/refresh tokens
- Access token brukes i Authorization-header
- Ved utløp → refresh token brukes for nye tokens
- Tokens lagres i localStorage
Eksempel på token-struktur:
{
"sub": "[email protected]",
"roles": ["USER"],
"exp": 1616516156
}
Frontend bruker Pinia stores implementert med Composition API:
// useAuthStore.ts
export const useAuthStore = defineStore('auth', () => {
// State og actions implementert med ref/computed
// ...
})
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);
}
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);
}
}
- 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
Spring Boot 3.4 med Java 21 gir oss tilgang til:
- Pattern Matching for switch
- Record Patterns
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
- 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)
- 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)
Git-workflow med beskyttede branches:
- Feature branches → Develop → Main
- Pull requests krever:
- Kodegjennomgang
- Passerte tester
- Ingen kritiske Sonar-issues
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.
Automatiserte sjekker inkluderer:
- ESLint med TypeScript
- Prettier for formatering
- Checkstyle for Java
- REST API dokumentert med OpenAPI
- Separasjon mellom frontend og backend
- SQL-database med migrasjoner
- Minimum testdekning
- CI/CD-pipeline
Nye teknologier vurderes etter:
- Kompatibilitet med eksisterende stack
- Påvirkning på byggeprosess
- Teamets kompetanse
- Vedlikeholdbarhet