refactoring:

Ein Backend-UseCase wurde implementiert, der nach Login prüft, ob ein Member-Profil existiert, und bei Bedarf ein neues Profil mit OEPS-Daten anlegt. Ein API-Endpunkt /api/members/sync wurde hinzugefügt, der vom Frontend nach Login aufgerufen wird. Der Gesamt-Build und die Tests laufen erfolgreich ohne Fehler.
This commit is contained in:
2025-11-24 22:27:39 +01:00
parent a6a35a2eda
commit 45109b5f9d
4 changed files with 156 additions and 0 deletions
@@ -24,6 +24,9 @@ dependencies {
implementation("org.springframework:spring-web")
implementation("org.springdoc:springdoc-openapi-starter-common")
// Security/JWT for extracting claims from principal
implementation(libs.spring.boot.starter.security)
implementation(libs.spring.boot.starter.oauth2.resource.server)
testImplementation(projects.platform.platformTesting)
}
@@ -17,6 +17,8 @@ import org.springframework.http.HttpStatus
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.*
import org.springframework.security.access.prepost.PreAuthorize
import org.springframework.security.core.annotation.AuthenticationPrincipal
import org.springframework.security.oauth2.jwt.Jwt
import io.swagger.v3.oas.annotations.responses.ApiResponse as SwaggerApiResponse
/**
@@ -55,6 +57,7 @@ class MemberController(
private val findExpiringMembershipsUseCase = FindExpiringMembershipsUseCase(memberRepository)
private val findMembersByDateRangeUseCase = FindMembersByDateRangeUseCase(memberRepository)
private val validateMemberDataUseCase = ValidateMemberDataUseCase(memberRepository)
private val ensureMemberProfileExistsUseCase = EnsureMemberProfileExistsUseCase(memberRepository, eventPublisher)
/**
* Hilfsmethode zur Behandlung gemeinsamer Antwortmuster für Use-Case-Ausführung
@@ -88,6 +91,33 @@ class MemberController(
}
}
// ---------------------------------------------------------------------
// Synchronisation nach Login: Stellt sicher, dass Member-Profil existiert
// ---------------------------------------------------------------------
@Operation(
summary = "Synchronisiert das Member-Profil für den eingeloggten Benutzer",
description = "Erstellt bei Bedarf ein Mitglied basierend auf den JWT-Claims (mock OEPS fetch)"
)
@PostMapping("/sync")
fun syncMemberProfile(
@AuthenticationPrincipal jwt: Jwt
): ResponseEntity<ApiResponse<*>> = handleUseCaseExecution(
operation = {
val sub = jwt.subject
val email = jwt.getClaimAsString("email")
val username = jwt.getClaimAsString("preferred_username")
val response = ensureMemberProfileExistsUseCase.execute(
EnsureMemberProfileExistsUseCase.Request(
userSub = sub,
email = email,
username = username
)
)
ApiResponse.success(response)
},
successStatus = HttpStatus.OK
) { it }
/**
* Hilfsmethode zur Behandlung von Repository-Operationen mit gemeinsamer Fehlerbehandlung
*/