Files
meldestelle/api-gateway/src/main/kotlin/at/mocode/gateway/routing/RoutingConfig.kt
T
2025-07-18 23:07:05 +02:00

191 lines
6.2 KiB
Kotlin

package at.mocode.gateway.routing
import at.mocode.dto.base.BaseDto
import at.mocode.horses.infrastructure.api.HorseController
import at.mocode.horses.infrastructure.repository.HorseRepositoryImpl
import at.mocode.masterdata.application.usecase.CreateCountryUseCase
import at.mocode.masterdata.application.usecase.GetCountryUseCase
import at.mocode.masterdata.infrastructure.api.CountryController
import at.mocode.masterdata.infrastructure.repository.LandRepositoryImpl
import at.mocode.members.domain.service.AuthenticationService
import at.mocode.members.domain.service.JwtService
import at.mocode.members.domain.service.UserAuthorizationService
import at.mocode.members.domain.service.PasswordService
import at.mocode.members.infrastructure.repository.*
import io.ktor.http.*
import io.ktor.server.application.*
import io.ktor.server.response.*
import io.ktor.server.routing.*
import kotlinx.serialization.Serializable
/**
* Main routing configuration for the API Gateway.
*
* This aggregates routes from all bounded contexts into a unified API
* while maintaining the independence and self-contained nature of each context.
*/
fun Application.configureRouting() {
// Initialize repository implementations for each context
val landRepository = LandRepositoryImpl()
val horseRepository = HorseRepositoryImpl()
// Initialize authentication repositories
val userRepository = UserRepositoryImpl()
val personRolleRepository = PersonRolleRepositoryImpl()
val rolleRepository = RolleRepositoryImpl()
val rolleBerechtigungRepository = RolleBerechtigungRepositoryImpl()
val berechtigungRepository = BerechtigungRepositoryImpl()
// Initialize authentication services
val passwordService = PasswordService()
val userAuthorizationService = UserAuthorizationService(
userRepository,
personRolleRepository,
rolleRepository,
rolleBerechtigungRepository,
berechtigungRepository
)
val jwtService = JwtService(userAuthorizationService)
val authenticationService = AuthenticationService(
userRepository,
passwordService,
jwtService
)
// Initialize use cases
val getCountryUseCase = GetCountryUseCase(landRepository)
val createCountryUseCase = CreateCountryUseCase(landRepository)
// Initialize controllers for each bounded context
val countryController = CountryController(getCountryUseCase, createCountryUseCase)
val horseController = HorseController(horseRepository)
routing {
// Root endpoint - API Gateway health check and info
get("/") {
call.respond(HttpStatusCode.OK, BaseDto.success(
ApiGatewayInfo(
name = "Meldestelle API Gateway",
version = "1.0.0",
description = "Self-Contained Systems API Gateway for Austrian Equestrian Federation",
availableContexts = listOf(
"authentication",
"master-data",
"horse-registry"
),
endpoints = mapOf(
"authentication" to "/auth/*",
"master-data" to "/api/masterdata/*",
"horse-registry" to "/api/horses/*"
)
)
))
}
// Health check endpoint
get("/health") {
call.respond(HttpStatusCode.OK, BaseDto.success(
HealthStatus(
status = "UP",
contexts = mapOf(
"authentication" to "UP",
"master-data" to "UP",
"horse-registry" to "UP"
)
)
))
}
// API documentation endpoint
get("/api") {
call.respond(HttpStatusCode.OK, BaseDto.success(
ApiDocumentation(
title = "Meldestelle Self-Contained Systems API",
description = "Unified API Gateway for all bounded contexts",
contexts = listOf(
ContextInfo(
name = "Authentication Context",
path = "/auth",
description = "User authentication, registration, and profile management"
),
ContextInfo(
name = "Master Data Context",
path = "/api/masterdata",
description = "Reference data management (countries, states, age classes, venues)"
),
ContextInfo(
name = "Horse Registry Context",
path = "/api/horses",
description = "Horse registration, ownership, and pedigree management"
)
)
)
))
}
// Configure routes for each bounded context
// Authentication Routes
authRoutes(authenticationService, jwtService)
// Master Data Context Routes
countryController.configureRoutes(this)
// Horse Registry Context Routes
horseController.configureRoutes(this)
// Catch-all for undefined routes
route("{...}") {
handle {
call.respond(
HttpStatusCode.NotFound,
BaseDto.error<Any>("Endpoint not found. Check /api for available endpoints.")
)
}
}
}
}
/**
* API Gateway information DTO.
*/
@Serializable
data class ApiGatewayInfo(
val name: String,
val version: String,
val description: String,
val availableContexts: List<String>,
val endpoints: Map<String, String>
)
/**
* Health status DTO.
*/
@Serializable
data class HealthStatus(
val status: String,
val contexts: Map<String, String>
)
/**
* API documentation DTO.
*/
@Serializable
data class ApiDocumentation(
val title: String,
val description: String,
val contexts: List<ContextInfo>
)
/**
* Context information DTO.
*/
@Serializable
data class ContextInfo(
val name: String,
val path: String,
val description: String
)