From 5713c82d37d62552ade2d0003d3713e12af9fa38 Mon Sep 17 00:00:00 2001 From: Agents Agent Date: Tue, 30 Jun 2026 11:01:48 +0000 Subject: [PATCH 1/7] feat(cohort): generic target strategy and catalog for all external systems MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Introduce a system-agnostic CohortTarget core: one TargetStrategy port (with a TargetDescriptor carrying kind, labels and capabilities), a TargetStrategies facade, and a generic TargetCatalog + controller. Brevo becomes one strategy; adding Discord/Google is one strategy class plus a TargetSystem value, not a new table/service/picker. The kindFor(system) switches in targeting and provisioning are removed — kind comes from the strategy descriptor. --- .../adapter/brevo/BrevoTargetStrategy.kt | 145 ++++++++++++++++++ .../adapter/web/CohortTargetController.kt | 66 ++++++++ .../application/CohortProvisioningService.kt | 11 +- .../application/CohortTargetingService.kt | 54 ++++--- .../cohort/application/TargetCatalog.kt | 34 ++++ .../cohort/application/TargetStrategies.kt | 22 +++ .../cohort/port/out/TargetStrategy.kt | 50 ++++++ .../integration/mock/MockTargetStrategy.kt | 83 ++++++++++ .../adapter/brevo/BrevoTargetStrategyTest.kt | 86 +++++++++++ .../CohortProvisioningServiceTest.kt | 24 ++- .../application/CohortTargetingServiceTest.kt | 73 +++++++-- .../cohort/application/TargetCatalogTest.kt | 68 ++++++++ 12 files changed, 670 insertions(+), 46 deletions(-) create mode 100644 services/api/src/main/kotlin/net/blueshell/api/platform/integration/cohort/adapter/brevo/BrevoTargetStrategy.kt create mode 100644 services/api/src/main/kotlin/net/blueshell/api/platform/integration/cohort/adapter/web/CohortTargetController.kt create mode 100644 services/api/src/main/kotlin/net/blueshell/api/platform/integration/cohort/application/TargetCatalog.kt create mode 100644 services/api/src/main/kotlin/net/blueshell/api/platform/integration/cohort/application/TargetStrategies.kt create mode 100644 services/api/src/main/kotlin/net/blueshell/api/platform/integration/cohort/port/out/TargetStrategy.kt create mode 100644 services/api/src/main/kotlin/net/blueshell/api/platform/integration/mock/MockTargetStrategy.kt create mode 100644 services/api/src/test/kotlin/net/blueshell/api/platform/integration/cohort/adapter/brevo/BrevoTargetStrategyTest.kt create mode 100644 services/api/src/test/kotlin/net/blueshell/api/platform/integration/cohort/application/TargetCatalogTest.kt diff --git a/services/api/src/main/kotlin/net/blueshell/api/platform/integration/cohort/adapter/brevo/BrevoTargetStrategy.kt b/services/api/src/main/kotlin/net/blueshell/api/platform/integration/cohort/adapter/brevo/BrevoTargetStrategy.kt new file mode 100644 index 000000000..449796d75 --- /dev/null +++ b/services/api/src/main/kotlin/net/blueshell/api/platform/integration/cohort/adapter/brevo/BrevoTargetStrategy.kt @@ -0,0 +1,145 @@ +package net.blueshell.api.platform.integration.cohort.adapter.brevo + +import net.blueshell.api.platform.integration.cohort.persistence.CohortKind +import net.blueshell.api.platform.integration.cohort.port.out.ExternalMember +import net.blueshell.api.platform.integration.cohort.port.out.ExternalTarget +import net.blueshell.api.platform.integration.cohort.port.out.TargetCapability +import net.blueshell.api.platform.integration.cohort.port.out.TargetDescriptor +import net.blueshell.api.platform.integration.cohort.port.out.TargetStrategy +import net.blueshell.api.platform.integration.contact.adapter.ContactListAdapter +import net.blueshell.api.platform.integration.contact.adapter.ContactServiceException +import net.blueshell.api.shared.enums.ContactSystem +import net.blueshell.api.shared.enums.TargetSystem +import net.blueshell.clients.brevo.api.ContactsApi +import net.blueshell.clients.brevo.model.GetLists200ResponseListsInner +import net.blueshell.clients.brevo.model.GetProcessesSortParameter +import org.slf4j.LoggerFactory +import org.springframework.context.annotation.Profile +import org.springframework.stereotype.Service +import org.springframework.web.client.RestClientResponseException + +@Service +@Profile("!test & !dev") +class BrevoTargetStrategy( + contactListAdapters: List, + private val contactsApi: ContactsApi, +) : TargetStrategy { + private val lists = contactListAdapters.single { it.system == ContactSystem.BREVO } + + override val descriptor = TargetDescriptor( + system = TargetSystem.BREVO, + kind = CohortKind.LIST, + systemLabel = "Brevo", + targetLabel = "Brevo list", + idLabel = "List id", + folderLabel = "Folder", + capabilities = setOf( + TargetCapability.CATALOG, + TargetCapability.CREATE, + TargetCapability.READ_MEMBERS, + TargetCapability.WRITE_MEMBERS, + TargetCapability.DELETE, + ), + ) + + override fun catalog(query: String?): List { + val folderNames = folders() + val q = query?.trim()?.lowercase().orEmpty() + return listTargets(folderNames) + .filter { it.matches(q) } + .sortedWith(compareBy({ it.folderLabel.orEmpty() }, { it.label })) + } + + override fun create(label: String, folder: String?): ExternalTarget = + ExternalTarget( + system = system, + externalId = lists.createList(label, folder).toString(), + kind = descriptor.kind, + label = label, + folderLabel = folder, + ) + + override fun members(target: ExternalTarget): List = + lists.listMembers(target.externalId.toBrevoId("externalId", "members")) + .map { ExternalMember(it.externalUserId.toString(), it.email) } + .filter { it.externalUserId.isNotBlank() } + + override fun add(target: ExternalTarget, externalUserId: String) { + lists.addToList( + externalUserId.toBrevoId("externalUserId", "add"), + target.externalId.toBrevoId("externalId", "add"), + ) + } + + override fun remove(target: ExternalTarget, externalUserId: String) { + lists.removeFromList( + externalUserId.toBrevoId("externalUserId", "remove"), + target.externalId.toBrevoId("externalId", "remove"), + ) + } + + override fun delete(target: ExternalTarget) { + lists.deleteList(target.externalId.toBrevoId("externalId", "delete")) + } + + private fun folders(): Map = + page("folders") { limit, offset -> + contactsApi.getFolders(limit, offset, GetProcessesSortParameter.ASC).let { page -> + Page(page.count, page.folders.orEmpty().associate { it.id.toString() to it.name }.entries.toList()) + } + }.associate { it.key to it.value } + + private fun listTargets(folderNames: Map): List = + page("lists") { limit, offset -> + contactsApi.getLists(limit, offset, GetProcessesSortParameter.ASC).let { page -> + Page(page.count, page.lists.orEmpty().map { it.toTarget(folderNames) }) + } + } + + private fun page(kind: String, fetch: (Long, Long) -> Page): List { + val results = mutableListOf() + var offset = 0L + while (true) { + val page = fetchPage(kind) { fetch(PAGE_SIZE, offset) } + results += page.items + if (page.items.size < PAGE_SIZE || page.count != null && results.size >= page.count) break + offset += PAGE_SIZE + } + return results + } + + private fun fetchPage(kind: String, fetch: () -> Page): Page = try { + fetch() + } catch (e: RestClientResponseException) { + if (e.statusCode.value() == 429) log.warn("Brevo target catalog {} fetch was rate limited", kind) + throw ContactServiceException("Failed to fetch Brevo $kind catalog", e) + } + + private fun ExternalTarget.matches(query: String): Boolean = + query.isBlank() || + externalId == query || + label.lowercase().contains(query) || + folderLabel.orEmpty().lowercase().contains(query) + + private fun String.toBrevoId(field: String, operation: String): Long = + toLongOrNull() ?: throw InvalidExternalIdException("Brevo $operation: $field \"$this\" is not numeric") + + private data class Page(val count: Long?, val items: List) + + companion object { + const val PAGE_SIZE: Long = 50 + private val log = LoggerFactory.getLogger(BrevoTargetStrategy::class.java) + } +} + +private fun GetLists200ResponseListsInner.toTarget(folderNames: Map): ExternalTarget { + val folderExternalId = folderId?.toString() + return ExternalTarget( + system = TargetSystem.BREVO, + externalId = id.toString(), + kind = CohortKind.LIST, + label = name, + folderLabel = folderExternalId?.let { folderNames[it] }, + memberCount = uniqueSubscribers, + ) +} diff --git a/services/api/src/main/kotlin/net/blueshell/api/platform/integration/cohort/adapter/web/CohortTargetController.kt b/services/api/src/main/kotlin/net/blueshell/api/platform/integration/cohort/adapter/web/CohortTargetController.kt new file mode 100644 index 000000000..a41c3fb6a --- /dev/null +++ b/services/api/src/main/kotlin/net/blueshell/api/platform/integration/cohort/adapter/web/CohortTargetController.kt @@ -0,0 +1,66 @@ +package net.blueshell.api.platform.integration.cohort.adapter.web + +import io.swagger.v3.oas.annotations.Operation +import io.swagger.v3.oas.annotations.media.Schema +import io.swagger.v3.oas.annotations.tags.Tag +import net.blueshell.api.platform.integration.cohort.application.TargetCatalog +import net.blueshell.api.platform.integration.cohort.persistence.CohortKind +import net.blueshell.api.platform.integration.cohort.port.out.ExternalTarget +import net.blueshell.api.platform.integration.cohort.port.out.TargetCapability +import net.blueshell.api.platform.integration.cohort.port.out.TargetDescriptor +import net.blueshell.api.shared.enums.TargetSystem +import org.springframework.security.access.prepost.PreAuthorize +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PathVariable +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RequestParam +import org.springframework.web.bind.annotation.RestController + +@RestController +@RequestMapping("/management/cohort-targets") +@Tag(name = "Cohort Targets", description = "Admin: external cohort target catalog") +@PreAuthorize("hasAuthority('ADMIN')") +class CohortTargetController( + private val catalog: TargetCatalog, +) { + @GetMapping("/systems") + @Operation(operationId = "listCohortTargetSystems") + fun systems(): List = + catalog.descriptors().map { it.toResponse() } + + @GetMapping("/{system}") + @Operation(operationId = "searchCohortTargets") + fun targets( + @PathVariable system: TargetSystem, + @RequestParam(required = false) query: String?, + ): List = + catalog.search(system, query).map { it.toResponse() } +} + +@Schema(name = "TargetDescriptor") +data class TargetDescriptorResponse( + val system: TargetSystem, + val kind: CohortKind, + val systemLabel: String, + val targetLabel: String, + val idLabel: String, + val folderLabel: String?, + val capabilities: Set, +) + +@Schema(name = "ExternalTarget") +data class ExternalTargetResponse( + val system: TargetSystem, + val externalId: String, + val kind: CohortKind, + val label: String, + val folderLabel: String?, + val memberCount: Long?, + val linkedCohortId: Long?, +) + +private fun TargetDescriptor.toResponse() = + TargetDescriptorResponse(system, kind, systemLabel, targetLabel, idLabel, folderLabel, capabilities) + +private fun ExternalTarget.toResponse() = + ExternalTargetResponse(system, externalId, kind, label, folderLabel, memberCount, linkedCohortId) diff --git a/services/api/src/main/kotlin/net/blueshell/api/platform/integration/cohort/application/CohortProvisioningService.kt b/services/api/src/main/kotlin/net/blueshell/api/platform/integration/cohort/application/CohortProvisioningService.kt index 42279f86f..2c6871bcf 100644 --- a/services/api/src/main/kotlin/net/blueshell/api/platform/integration/cohort/application/CohortProvisioningService.kt +++ b/services/api/src/main/kotlin/net/blueshell/api/platform/integration/cohort/application/CohortProvisioningService.kt @@ -2,7 +2,6 @@ package net.blueshell.api.platform.integration.cohort.application import net.blueshell.api.platform.integration.cohort.persistence.Cohort import net.blueshell.api.platform.integration.cohort.persistence.CohortFactKind -import net.blueshell.api.platform.integration.cohort.persistence.CohortKind import net.blueshell.api.platform.integration.cohort.persistence.CohortSubject import net.blueshell.api.platform.integration.cohort.persistence.CohortSubjectType import net.blueshell.api.platform.integration.cohort.persistence.repository.CohortRepository @@ -23,6 +22,7 @@ import org.springframework.transaction.annotation.Transactional class CohortProvisioningService( private val subjects: CohortSubjectRepository, private val cohorts: CohortRepository, + private val strategies: TargetStrategies, ) { @Transactional fun provision(spec: CohortProvisioningSpec): CohortProvisioningResult { @@ -43,19 +43,14 @@ class CohortProvisioningService( ?: cohorts.save( Cohort( system = spec.system.name, - kind = kindFor(spec.system), + kind = strategies.descriptor(spec.system).kind, label = spec.label, folder = spec.folder, subjectId = subject.id, ), - ) + ) return CohortProvisioningResult.Ready(cohort) } - - private fun kindFor(system: TargetSystem): CohortKind = when (system) { - TargetSystem.BREVO -> CohortKind.LIST - TargetSystem.GOOGLE_CALENDAR -> error("$system has no cohort target kind") - } } /** diff --git a/services/api/src/main/kotlin/net/blueshell/api/platform/integration/cohort/application/CohortTargetingService.kt b/services/api/src/main/kotlin/net/blueshell/api/platform/integration/cohort/application/CohortTargetingService.kt index e433fedb2..e09278dda 100644 --- a/services/api/src/main/kotlin/net/blueshell/api/platform/integration/cohort/application/CohortTargetingService.kt +++ b/services/api/src/main/kotlin/net/blueshell/api/platform/integration/cohort/application/CohortTargetingService.kt @@ -1,12 +1,11 @@ package net.blueshell.api.platform.integration.cohort.application import net.blueshell.api.platform.integration.cohort.persistence.Cohort -import net.blueshell.api.platform.integration.cohort.persistence.CohortKind import net.blueshell.api.platform.integration.cohort.persistence.repository.CohortRepository import net.blueshell.api.platform.integration.cohort.persistence.repository.CohortSubjectRepository import net.blueshell.api.platform.integration.cohort.port.`in`.CohortTargeting import net.blueshell.api.platform.integration.cohort.port.`in`.CohortTargetRef -import net.blueshell.api.platform.integration.cohort.port.out.CohortPortRegistry +import net.blueshell.api.platform.integration.cohort.port.out.ExternalTarget import net.blueshell.api.shared.enums.TargetSystem import net.blueshell.api.shared.job.CohortJobs import net.blueshell.api.shared.job.NonRetryableJobException @@ -29,7 +28,7 @@ class CohortTargetingService( private val cohortRepo: CohortRepository, private val subjectRepo: CohortSubjectRepository, private val targetIds: CohortTargetIds, - private val registry: CohortPortRegistry, + private val strategies: TargetStrategies, private val jobs: TrackedJobDispatcher, transactionManager: PlatformTransactionManager, ) : CohortTargeting { @@ -44,7 +43,12 @@ class CohortTargetingService( propagationBehavior = TransactionDefinition.PROPAGATION_NOT_SUPPORTED } - override fun linkExisting(subjectId: Long, system: TargetSystem, externalId: String): CohortMappingRow = + override fun linkExisting(subjectId: Long, system: TargetSystem, externalId: String): CohortMappingRow { + resolveTarget(system, externalId) + return linkExistingLocal(subjectId, system, externalId) + } + + private fun linkExistingLocal(subjectId: Long, system: TargetSystem, externalId: String): CohortMappingRow = writeTransaction.execute { val subject = requireSubject(subjectId) val existing = cohortRepo.findBySubjectIdAndSystem(subjectId, system.name) @@ -72,12 +76,12 @@ class CohortTargetingService( requireNoExistingMapping(subjectId, system) } - val externalId = outsideTransaction.execute { registry.require(system).createCohort(label, folderHint) }!! + val target = outsideTransaction.execute { strategies.require(system).create(label, folderHint) }!! return writeTransaction.execute { val cohort = cohortRepo.save(newCohort(system, label, folder = folderHint, subjectId = subjectId)) - targetIds.record(cohort, externalId) - CohortMappingRow(cohort, externalId) + targetIds.record(cohort, target.externalId) + CohortMappingRow(cohort, target.externalId) }!! } @@ -88,15 +92,14 @@ class CohortTargetingService( deletePrevious: Boolean, reconcileNow: Boolean, ): CohortMappingRow { + val prep = writeTransaction.execute { + val cohort = requireOwnedCohort(subjectId, cohortId) + TargetSystem.valueOf(cohort.system) + }!! + resolveTarget(prep, externalId) + val switched = writeTransaction.execute { - val cohort = cohortRepo.findById(cohortId).orElseThrow { - ResponseStatusException(HttpStatus.NOT_FOUND, "Cohort $cohortId not found") - } - // The route carries the subject id; reject a cohort that is not its - // target so a wrong-path admin call cannot repoint another subject's. - if (cohort.subjectId != subjectId) { - throw ResponseStatusException(HttpStatus.NOT_FOUND, "Cohort $cohortId is not a target of subject $subjectId") - } + val cohort = requireOwnedCohort(subjectId, cohortId) val system = TargetSystem.valueOf(cohort.system) val previousExternalId = targetIds.find(cohort) targetIds.record(cohort, externalId) @@ -133,7 +136,8 @@ class CohortTargetingService( } override fun deleteTarget(system: TargetSystem, externalTargetId: String) { - outsideTransaction.executeWithoutResult { registry.require(system).deleteCohort(externalTargetId) } + val target = ExternalTarget(system, externalTargetId, strategies.descriptor(system).kind, externalTargetId) + outsideTransaction.executeWithoutResult { strategies.require(system).delete(target) } } private fun requireSubject(subjectId: Long) = @@ -153,16 +157,24 @@ class CohortTargetingService( private fun newCohort(system: TargetSystem, label: String, folder: String?, subjectId: Long) = Cohort( system = system.name, - kind = kindFor(system), + kind = strategies.descriptor(system).kind, label = label, folder = folder, subjectId = subjectId, ) - private fun kindFor(system: TargetSystem): CohortKind = when (system) { - TargetSystem.BREVO -> CohortKind.LIST - TargetSystem.GOOGLE_CALENDAR -> - throw ResponseStatusException(HttpStatus.BAD_REQUEST, "$system has no cohort target kind") + private fun requireOwnedCohort(subjectId: Long, cohortId: Long): Cohort { + val cohort = cohortRepo.findById(cohortId).orElseThrow { + ResponseStatusException(HttpStatus.NOT_FOUND, "Cohort $cohortId not found") + } + if (cohort.subjectId != subjectId) { + throw ResponseStatusException(HttpStatus.NOT_FOUND, "Cohort $cohortId is not a target of subject $subjectId") + } + return cohort + } + + private fun resolveTarget(system: TargetSystem, externalId: String) { + outsideTransaction.execute { strategies.require(system).resolve(externalId) } } private data class Switched(val cohort: Cohort, val system: TargetSystem, val previousExternalId: String?) diff --git a/services/api/src/main/kotlin/net/blueshell/api/platform/integration/cohort/application/TargetCatalog.kt b/services/api/src/main/kotlin/net/blueshell/api/platform/integration/cohort/application/TargetCatalog.kt new file mode 100644 index 000000000..4cb20854e --- /dev/null +++ b/services/api/src/main/kotlin/net/blueshell/api/platform/integration/cohort/application/TargetCatalog.kt @@ -0,0 +1,34 @@ +package net.blueshell.api.platform.integration.cohort.application + +import net.blueshell.api.platform.integration.cohort.persistence.repository.CohortRepository +import net.blueshell.api.platform.integration.cohort.port.out.ExternalTarget +import net.blueshell.api.platform.integration.cohort.port.out.TargetCapability +import net.blueshell.api.platform.integration.cohort.port.out.TargetDescriptor +import net.blueshell.api.shared.enums.TargetSystem +import org.springframework.stereotype.Service +import org.springframework.transaction.annotation.Propagation +import org.springframework.transaction.annotation.Transactional + +@Service +class TargetCatalog( + private val strategies: TargetStrategies, + private val cohorts: CohortRepository, +) { + @Transactional(propagation = Propagation.NOT_SUPPORTED) + fun search(system: TargetSystem, query: String?): List { + val strategy = strategies.require(system) + if (!strategy.descriptor.supports(TargetCapability.CATALOG)) return emptyList() + + val linked = linkedCohorts(system) + return strategy.catalog(query).map { target -> + target.copy(linkedCohortId = linked[target.externalId]) + } + } + + fun descriptors(): List = strategies.descriptors() + + private fun linkedCohorts(system: TargetSystem): Map = + cohorts.findAllBySystem(system.name) + .mapNotNull { cohort -> cohort.externalId?.takeIf { it.isNotBlank() }?.let { it to cohort.id!! } } + .toMap() +} diff --git a/services/api/src/main/kotlin/net/blueshell/api/platform/integration/cohort/application/TargetStrategies.kt b/services/api/src/main/kotlin/net/blueshell/api/platform/integration/cohort/application/TargetStrategies.kt new file mode 100644 index 000000000..c8b2d0278 --- /dev/null +++ b/services/api/src/main/kotlin/net/blueshell/api/platform/integration/cohort/application/TargetStrategies.kt @@ -0,0 +1,22 @@ +package net.blueshell.api.platform.integration.cohort.application + +import net.blueshell.api.platform.integration.cohort.port.out.TargetDescriptor +import net.blueshell.api.platform.integration.cohort.port.out.TargetStrategy +import net.blueshell.api.shared.enums.TargetSystem +import org.springframework.http.HttpStatus +import org.springframework.stereotype.Component +import org.springframework.web.server.ResponseStatusException + +@Component +class TargetStrategies(strategies: List) { + private val bySystem = strategies.associateBy { it.system } + + fun require(system: TargetSystem): TargetStrategy = + bySystem[system] + ?: throw ResponseStatusException(HttpStatus.BAD_REQUEST, "$system is not a cohort target") + + fun descriptor(system: TargetSystem): TargetDescriptor = require(system).descriptor + + fun descriptors(): List = + bySystem.values.map { it.descriptor }.sortedBy { it.systemLabel } +} diff --git a/services/api/src/main/kotlin/net/blueshell/api/platform/integration/cohort/port/out/TargetStrategy.kt b/services/api/src/main/kotlin/net/blueshell/api/platform/integration/cohort/port/out/TargetStrategy.kt new file mode 100644 index 000000000..4e1fa85a7 --- /dev/null +++ b/services/api/src/main/kotlin/net/blueshell/api/platform/integration/cohort/port/out/TargetStrategy.kt @@ -0,0 +1,50 @@ +package net.blueshell.api.platform.integration.cohort.port.out + +import net.blueshell.api.platform.integration.cohort.persistence.CohortKind +import net.blueshell.api.shared.enums.TargetSystem + +enum class TargetCapability { CATALOG, CREATE, READ_MEMBERS, WRITE_MEMBERS, DELETE } + +data class TargetDescriptor( + val system: TargetSystem, + val kind: CohortKind, + val systemLabel: String, + val targetLabel: String, + val idLabel: String, + val folderLabel: String? = null, + val capabilities: Set, +) { + fun supports(capability: TargetCapability): Boolean = capability in capabilities +} + +data class ExternalTarget( + val system: TargetSystem, + val externalId: String, + val kind: CohortKind, + val label: String, + val folderLabel: String? = null, + val memberCount: Long? = null, + val linkedCohortId: Long? = null, +) + +data class ExternalMember(val externalUserId: String, val label: String?) + +interface TargetStrategy { + val descriptor: TargetDescriptor + val system: TargetSystem get() = descriptor.system + + fun catalog(query: String?): List = emptyList() + + fun resolve(externalId: String): ExternalTarget? = + catalog(externalId).firstOrNull { it.externalId == externalId } + + fun members(target: ExternalTarget): List + + fun add(target: ExternalTarget, externalUserId: String) + + fun remove(target: ExternalTarget, externalUserId: String) + + fun create(label: String, folder: String?): ExternalTarget + + fun delete(target: ExternalTarget) +} diff --git a/services/api/src/main/kotlin/net/blueshell/api/platform/integration/mock/MockTargetStrategy.kt b/services/api/src/main/kotlin/net/blueshell/api/platform/integration/mock/MockTargetStrategy.kt new file mode 100644 index 000000000..52dd43530 --- /dev/null +++ b/services/api/src/main/kotlin/net/blueshell/api/platform/integration/mock/MockTargetStrategy.kt @@ -0,0 +1,83 @@ +package net.blueshell.api.platform.integration.mock + +import net.blueshell.api.platform.integration.cohort.persistence.CohortKind +import net.blueshell.api.platform.integration.cohort.port.out.ExternalMember +import net.blueshell.api.platform.integration.cohort.port.out.ExternalTarget +import net.blueshell.api.platform.integration.cohort.port.out.TargetCapability +import net.blueshell.api.platform.integration.cohort.port.out.TargetDescriptor +import net.blueshell.api.platform.integration.cohort.port.out.TargetStrategy +import net.blueshell.api.shared.enums.TargetSystem +import org.springframework.context.annotation.Primary +import org.springframework.context.annotation.Profile +import org.springframework.stereotype.Service +import java.util.concurrent.ConcurrentHashMap +import java.util.concurrent.atomic.AtomicLong + +@Service +@Primary +@Profile("test | dev") +class MockTargetStrategy : TargetStrategy { + override val descriptor = TargetDescriptor( + system = TargetSystem.BREVO, + kind = CohortKind.LIST, + systemLabel = "Brevo", + targetLabel = "Brevo list", + idLabel = "List id", + folderLabel = "Folder", + capabilities = setOf( + TargetCapability.CATALOG, + TargetCapability.CREATE, + TargetCapability.READ_MEMBERS, + TargetCapability.WRITE_MEMBERS, + TargetCapability.DELETE, + ), + ) + + private val targets = ConcurrentHashMap() + private val members = ConcurrentHashMap, String>() + private val ids = AtomicLong(9000) + + override fun catalog(query: String?): List = + targets.values.filter { it.matches(query.orEmpty().trim().lowercase()) } + + override fun resolve(externalId: String): ExternalTarget? = targets[externalId] + + override fun create(label: String, folder: String?): ExternalTarget { + val target = ExternalTarget(system, ids.getAndIncrement().toString(), descriptor.kind, label, folder) + targets[target.externalId] = target + return target + } + + override fun members(target: ExternalTarget): List = + members.entries + .filter { it.key.second == target.externalId } + .map { ExternalMember(it.key.first, it.value.ifBlank { null }) } + + override fun add(target: ExternalTarget, externalUserId: String) { + members[externalUserId to target.externalId] = "" + } + + override fun remove(target: ExternalTarget, externalUserId: String) { + members.remove(externalUserId to target.externalId) + } + + override fun delete(target: ExternalTarget) { + targets.remove(target.externalId) + members.keys.removeIf { it.second == target.externalId } + } + + fun seed(target: ExternalTarget) { + targets[target.externalId] = target + } + + fun clear() { + targets.clear() + members.clear() + } + + private fun ExternalTarget.matches(query: String): Boolean = + query.isBlank() || + externalId == query || + label.lowercase().contains(query) || + folderLabel.orEmpty().lowercase().contains(query) +} diff --git a/services/api/src/test/kotlin/net/blueshell/api/platform/integration/cohort/adapter/brevo/BrevoTargetStrategyTest.kt b/services/api/src/test/kotlin/net/blueshell/api/platform/integration/cohort/adapter/brevo/BrevoTargetStrategyTest.kt new file mode 100644 index 000000000..71ec8e652 --- /dev/null +++ b/services/api/src/test/kotlin/net/blueshell/api/platform/integration/cohort/adapter/brevo/BrevoTargetStrategyTest.kt @@ -0,0 +1,86 @@ +package net.blueshell.api.platform.integration.cohort.adapter.brevo + +import net.blueshell.api.platform.integration.contact.adapter.ContactListAdapter +import net.blueshell.api.platform.integration.contact.adapter.ContactServiceException +import net.blueshell.api.shared.enums.ContactSystem +import net.blueshell.clients.brevo.api.ContactsApi +import net.blueshell.clients.brevo.model.GetFolder +import net.blueshell.clients.brevo.model.GetFolders200Response +import net.blueshell.clients.brevo.model.GetLists200Response +import net.blueshell.clients.brevo.model.GetLists200ResponseListsInner +import net.blueshell.clients.brevo.model.GetProcessesSortParameter +import org.assertj.core.api.Assertions.assertThat +import org.assertj.core.api.Assertions.assertThatThrownBy +import org.junit.jupiter.api.Test +import org.mockito.kotlin.doThrow +import org.mockito.kotlin.eq +import org.mockito.kotlin.mock +import org.mockito.kotlin.whenever +import org.springframework.web.client.RestClientResponseException + +class BrevoTargetStrategyTest { + private val contactsApi: ContactsApi = mock() + private val lists: ContactListAdapter = mock { + whenever(it.system).thenReturn(ContactSystem.BREVO) + } + private val strategy = BrevoTargetStrategy(listOf(lists), contactsApi) + + @Test + fun `pages folders and lists and maps folder names and counts`() { + whenever(contactsApi.getFolders(eq(50L), eq(0L), eq(GetProcessesSortParameter.ASC))) + .thenReturn(GetFolders200Response().count(51).folders((1L..50L).map { folder(it, "Folder $it") })) + whenever(contactsApi.getFolders(eq(50L), eq(50L), eq(GetProcessesSortParameter.ASC))) + .thenReturn(GetFolders200Response().count(51).folders(listOf(folder(51L, "Contribution periods")))) + whenever(contactsApi.getLists(eq(50L), eq(0L), eq(GetProcessesSortParameter.ASC))) + .thenReturn(GetLists200Response().count(51).lists((1L..50L).map { list(it, "List $it", 1L) })) + whenever(contactsApi.getLists(eq(50L), eq(50L), eq(GetProcessesSortParameter.ASC))) + .thenReturn(GetLists200Response().count(51).lists(listOf(list(99L, "Paid 2026", 51L, 728L)))) + + val targets = strategy.catalog(null) + val paid = targets.single { it.externalId == "99" } + + assertThat(targets).hasSize(51) + assertThat(paid.folderLabel).isEqualTo("Contribution periods") + assertThat(paid.memberCount).isEqualTo(728L) + } + + @Test + fun `filters by query after fetching the bounded catalog`() { + whenever(contactsApi.getFolders(eq(50L), eq(0L), eq(GetProcessesSortParameter.ASC))) + .thenReturn(GetFolders200Response().count(1).folders(listOf(folder(1L, "Members")))) + whenever(contactsApi.getLists(eq(50L), eq(0L), eq(GetProcessesSortParameter.ASC))) + .thenReturn(GetLists200Response().count(2).lists(listOf(list(10L, "Guests", 1L), list(11L, "Paid", 1L)))) + + val targets = strategy.catalog("paid") + + assertThat(targets).extracting { it.externalId }.containsExactly("11") + } + + @Test + fun `treats Brevo rate limiting as retryable`() { + doThrow(error(429)).whenever(contactsApi) + .getFolders(eq(50L), eq(0L), eq(GetProcessesSortParameter.ASC)) + + assertThatThrownBy { strategy.catalog(null) } + .isInstanceOf(ContactServiceException::class.java) + .hasCauseInstanceOf(RestClientResponseException::class.java) + } + + private fun folder(id: Long, name: String): GetFolder = + GetFolder().id(id).name(name) + + private fun list( + id: Long, + name: String, + folderId: Long, + unique: Long = 10L + id, + ): GetLists200ResponseListsInner = + GetLists200ResponseListsInner() + .id(id) + .name(name) + .folderId(folderId) + .uniqueSubscribers(unique) + + private fun error(status: Int): RestClientResponseException = + RestClientResponseException("$status error", status, "error", null, ByteArray(0), null) +} diff --git a/services/api/src/test/kotlin/net/blueshell/api/platform/integration/cohort/application/CohortProvisioningServiceTest.kt b/services/api/src/test/kotlin/net/blueshell/api/platform/integration/cohort/application/CohortProvisioningServiceTest.kt index b47c683f9..6982133f8 100644 --- a/services/api/src/test/kotlin/net/blueshell/api/platform/integration/cohort/application/CohortProvisioningServiceTest.kt +++ b/services/api/src/test/kotlin/net/blueshell/api/platform/integration/cohort/application/CohortProvisioningServiceTest.kt @@ -11,6 +11,11 @@ import net.blueshell.api.platform.integration.cohort.persistence.CohortSubject import net.blueshell.api.platform.integration.cohort.persistence.CohortSubjectType import net.blueshell.api.platform.integration.cohort.persistence.repository.CohortRepository import net.blueshell.api.platform.integration.cohort.persistence.repository.CohortSubjectRepository +import net.blueshell.api.platform.integration.cohort.port.out.ExternalMember +import net.blueshell.api.platform.integration.cohort.port.out.ExternalTarget +import net.blueshell.api.platform.integration.cohort.port.out.TargetCapability +import net.blueshell.api.platform.integration.cohort.port.out.TargetDescriptor +import net.blueshell.api.platform.integration.cohort.port.out.TargetStrategy import net.blueshell.api.shared.enums.TargetSystem import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test @@ -19,7 +24,7 @@ class CohortProvisioningServiceTest { private val subjects: CohortSubjectRepository = mockk(relaxed = true) private val cohorts: CohortRepository = mockk(relaxed = true) - private val service = CohortProvisioningService(subjects, cohorts) + private val service = CohortProvisioningService(subjects, cohorts, TargetStrategies(listOf(TestStrategy))) private fun spec(system: TargetSystem = TargetSystem.BREVO) = CohortProvisioningSpec( factKind = CohortFactKind.COMMITTEE, @@ -108,4 +113,21 @@ class CohortProvisioningServiceTest { assertThat(result).isEqualTo(CohortProvisioningResult.Ready(googleCohort)) verify(exactly = 0) { subjects.save(any()) } } + + private object TestStrategy : TargetStrategy { + override val descriptor = TargetDescriptor( + system = TargetSystem.BREVO, + kind = CohortKind.LIST, + systemLabel = "Brevo", + targetLabel = "Brevo list", + idLabel = "List id", + capabilities = setOf(TargetCapability.CREATE), + ) + + override fun members(target: ExternalTarget): List = emptyList() + override fun add(target: ExternalTarget, externalUserId: String) = Unit + override fun remove(target: ExternalTarget, externalUserId: String) = Unit + override fun create(label: String, folder: String?): ExternalTarget = error("not used") + override fun delete(target: ExternalTarget) = Unit + } } diff --git a/services/api/src/test/kotlin/net/blueshell/api/platform/integration/cohort/application/CohortTargetingServiceTest.kt b/services/api/src/test/kotlin/net/blueshell/api/platform/integration/cohort/application/CohortTargetingServiceTest.kt index 61121a693..3cfb50e7c 100644 --- a/services/api/src/test/kotlin/net/blueshell/api/platform/integration/cohort/application/CohortTargetingServiceTest.kt +++ b/services/api/src/test/kotlin/net/blueshell/api/platform/integration/cohort/application/CohortTargetingServiceTest.kt @@ -3,8 +3,13 @@ package net.blueshell.api.platform.integration.cohort.application import net.blueshell.api.platform.integration.cohort.persistence.Cohort import net.blueshell.api.platform.integration.cohort.persistence.repository.CohortRepository import net.blueshell.api.platform.integration.cohort.persistence.repository.CohortSubjectRepository -import net.blueshell.api.platform.integration.cohort.port.out.CohortPort -import net.blueshell.api.platform.integration.cohort.port.out.CohortPortRegistry +import net.blueshell.api.platform.integration.cohort.persistence.CohortKind +import net.blueshell.api.platform.integration.cohort.persistence.CohortSubject +import net.blueshell.api.platform.integration.cohort.persistence.CohortSubjectType +import net.blueshell.api.platform.integration.cohort.port.out.ExternalTarget +import net.blueshell.api.platform.integration.cohort.port.out.TargetCapability +import net.blueshell.api.platform.integration.cohort.port.out.TargetDescriptor +import net.blueshell.api.platform.integration.cohort.port.out.TargetStrategy import net.blueshell.api.shared.enums.TargetSystem import net.blueshell.api.shared.job.CohortJobs import net.blueshell.api.shared.job.NonRetryableJobException @@ -27,7 +32,7 @@ import org.springframework.web.server.ResponseStatusException import java.util.Optional /** - * Unit test for [CohortTargetingService]. The port edges (CohortPort, + * Unit test for [CohortTargetingService]. The strategy edges, * CohortTargetIds, job dispatcher) are the seams — no Spring context. * A no-op transaction manager runs the TransactionTemplate callbacks inline. */ @@ -36,9 +41,9 @@ class CohortTargetingServiceTest { private val cohortRepo = mock() private val subjectRepo = mock() private val targetIds = mock() - private val registry = mock() private val jobs = mock() - private val port = mock() + private val strategy = mock() + private val strategies: TargetStrategies private val txManager = object : PlatformTransactionManager { override fun getTransaction(definition: TransactionDefinition?): TransactionStatus = SimpleTransactionStatus() @@ -46,7 +51,15 @@ class CohortTargetingServiceTest { override fun rollback(status: TransactionStatus) {} } - private val service = CohortTargetingService(cohortRepo, subjectRepo, targetIds, registry, jobs, txManager) + private val service: CohortTargetingService + + init { + whenever(strategy.system).thenReturn(TargetSystem.BREVO) + whenever(strategy.descriptor).thenReturn(brevoDescriptor) + whenever(strategy.resolve(any())).thenReturn(null) + strategies = TargetStrategies(listOf(strategy)) + service = CohortTargetingService(cohortRepo, subjectRepo, targetIds, strategies, jobs, txManager) + } @Test fun `create does not touch the provider when the subject already maps the system`() { @@ -57,7 +70,7 @@ class CohortTargetingServiceTest { service.create(1L, TargetSystem.BREVO, "Members", null) } - verifyNoInteractions(registry) + verify(strategy, never()).create(any(), any()) verify(cohortRepo, never()).save(any()) } @@ -66,13 +79,12 @@ class CohortTargetingServiceTest { val saved = mock { on { id } doReturn 42L } whenever(subjectRepo.findById(1L)).thenReturn(Optional.of(mock())) whenever(cohortRepo.findBySubjectIdAndSystem(1L, "BREVO")).thenReturn(null) - whenever(registry.require(TargetSystem.BREVO)).thenReturn(port) - whenever(port.createCohort("Members", "Lists")).thenReturn("999") + whenever(strategy.create("Members", "Lists")).thenReturn(target("999", "Members", "Lists")) whenever(cohortRepo.save(any())).thenReturn(saved) val row = service.create(1L, TargetSystem.BREVO, "Members", "Lists") - verify(port).createCohort("Members", "Lists") + verify(strategy).create("Members", "Lists") verify(targetIds).record(saved, "999") assert(row.externalId == "999") } @@ -87,13 +99,12 @@ class CohortTargetingServiceTest { } whenever(cohortRepo.findById(7L)).thenReturn(Optional.of(cohort)) whenever(targetIds.find(cohort)).thenReturn(null) - whenever(registry.require(TargetSystem.BREVO)).thenReturn(port) assertThrows { service.materialize(7L) } - verify(port, never()).createCohort(any(), any()) + verify(strategy, never()).create(any(), any()) verify(targetIds, never()).record(any(), any()) } @@ -106,7 +117,7 @@ class CohortTargetingServiceTest { val ref = service.materialize(7L) assert(ref.externalId == "existing") - verifyNoInteractions(registry) + verify(strategy, never()).create(any(), any()) verify(targetIds, never()).record(any(), any()) } @@ -122,12 +133,28 @@ class CohortTargetingServiceTest { val row = service.linkExisting(1L, TargetSystem.BREVO, "list-123") + verify(strategy).resolve("list-123") verify(cohortRepo, never()).save(any()) verify(targetIds).record(cohort, "list-123") assert(row.cohort == cohort) assert(row.externalId == "list-123") } + @Test + fun `linkExisting allows ids that are not present in the catalog`() { + val subject = CohortSubject(CohortSubjectType.CUSTOM, "Members") + val saved = mock { on { id } doReturn 7L } + whenever(subjectRepo.findById(1L)).thenReturn(Optional.of(subject)) + whenever(cohortRepo.findBySubjectIdAndSystem(1L, "BREVO")).thenReturn(null) + whenever(cohortRepo.save(any())).thenReturn(saved) + whenever(strategy.resolve("missing-list")).thenReturn(null) + + service.linkExisting(1L, TargetSystem.BREVO, "missing-list") + + verify(strategy).resolve("missing-list") + verify(targetIds).record(saved, "missing-list") + } + @Test fun `switch enqueues delete-previous and reconcile when asked`() { val cohort = mock { on { system } doReturn "BREVO"; on { subjectId } doReturn 1L } @@ -136,6 +163,7 @@ class CohortTargetingServiceTest { service.switchTarget(1L, 7L, "new-list", deletePrevious = true, reconcileNow = true) + verify(strategy).resolve("new-list") verify(targetIds).record(cohort, "new-list") verify(jobs).enqueue( eq(CohortJobs.DeleteExternalTarget), @@ -173,10 +201,23 @@ class CohortTargetingServiceTest { @Test fun `deleteTarget calls the provider`() { - whenever(registry.require(TargetSystem.BREVO)).thenReturn(port) - service.deleteTarget(TargetSystem.BREVO, "stale-list") - verify(port).deleteCohort("stale-list") + verify(strategy).delete(target("stale-list", "stale-list", null)) + } + + private fun target(id: String, label: String, folder: String?) = + ExternalTarget(TargetSystem.BREVO, id, CohortKind.LIST, label, folder) + + private companion object { + val brevoDescriptor = TargetDescriptor( + system = TargetSystem.BREVO, + kind = CohortKind.LIST, + systemLabel = "Brevo", + targetLabel = "Brevo list", + idLabel = "List id", + folderLabel = "Folder", + capabilities = setOf(TargetCapability.CATALOG, TargetCapability.CREATE, TargetCapability.DELETE), + ) } } diff --git a/services/api/src/test/kotlin/net/blueshell/api/platform/integration/cohort/application/TargetCatalogTest.kt b/services/api/src/test/kotlin/net/blueshell/api/platform/integration/cohort/application/TargetCatalogTest.kt new file mode 100644 index 000000000..c9c9101b9 --- /dev/null +++ b/services/api/src/test/kotlin/net/blueshell/api/platform/integration/cohort/application/TargetCatalogTest.kt @@ -0,0 +1,68 @@ +package net.blueshell.api.platform.integration.cohort.application + +import net.blueshell.api.platform.integration.cohort.persistence.Cohort +import net.blueshell.api.platform.integration.cohort.persistence.CohortKind +import net.blueshell.api.platform.integration.cohort.persistence.repository.CohortRepository +import net.blueshell.api.platform.integration.cohort.port.out.ExternalMember +import net.blueshell.api.platform.integration.cohort.port.out.ExternalTarget +import net.blueshell.api.platform.integration.cohort.port.out.TargetCapability +import net.blueshell.api.platform.integration.cohort.port.out.TargetDescriptor +import net.blueshell.api.platform.integration.cohort.port.out.TargetStrategy +import net.blueshell.api.shared.enums.TargetSystem +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Test +import org.mockito.kotlin.mock +import org.mockito.kotlin.whenever + +class TargetCatalogTest { + private val cohorts: CohortRepository = mock() + private val strategy = RecordingStrategy() + private val catalog = TargetCatalog(TargetStrategies(listOf(strategy)), cohorts) + + @Test + fun `descriptors come from registered target strategies`() { + assertThat(catalog.descriptors()).containsExactly(strategy.descriptor) + } + + @Test + fun `search annotates linked cohort ids from active mappings`() { + val linked = Cohort("BREVO", CohortKind.LIST, "Members").apply { + id = 42L + externalId = "2" + } + whenever(cohorts.findAllBySystem("BREVO")).thenReturn(listOf(linked)) + + val results = catalog.search(TargetSystem.BREVO, "members") + + assertThat(strategy.queries).containsExactly("members") + assertThat(results).extracting { it.linkedCohortId }.containsExactly(null, 42L) + } + + private class RecordingStrategy : TargetStrategy { + val queries = mutableListOf() + + override val descriptor = TargetDescriptor( + system = TargetSystem.BREVO, + kind = CohortKind.LIST, + systemLabel = "Brevo", + targetLabel = "Brevo list", + idLabel = "List id", + folderLabel = "Folder", + capabilities = setOf(TargetCapability.CATALOG), + ) + + override fun catalog(query: String?): List { + queries += query + return listOf(target("1", "Guests"), target("2", "Members")) + } + + override fun members(target: ExternalTarget): List = emptyList() + override fun add(target: ExternalTarget, externalUserId: String) = Unit + override fun remove(target: ExternalTarget, externalUserId: String) = Unit + override fun create(label: String, folder: String?): ExternalTarget = error("not used") + override fun delete(target: ExternalTarget) = Unit + + private fun target(id: String, label: String) = + ExternalTarget(TargetSystem.BREVO, id, CohortKind.LIST, label) + } +} From d15d1a76c33395bad66bdec50fadc3018c812223 Mon Sep 17 00:00:00 2001 From: Agents Agent Date: Tue, 30 Jun 2026 11:01:49 +0000 Subject: [PATCH 2/7] feat(cohort): descriptor-driven external target picker Replace the Brevo-specific picker with one component driven by each system's target descriptor: the CATALOG capability renders a searchable combobox (fetched once, filtered client-side), otherwise a manual id field, with create/folder fields shown per capability. One picker serves Brevo lists, and future Discord roles / Google groups, with no per-system branches. --- .../src/domains/cohorts/adapters/cohorts.ts | 60 +++++++++++++ .../cohorts/components/TargetPickerModal.vue | 78 ++++++++++++++--- .../cohorts/composables/useTargetPicker.ts | 64 +++++++++++++- .../composables/useTargetPicker.test.ts | 84 +++++++++++++++++++ 4 files changed, 273 insertions(+), 13 deletions(-) create mode 100644 services/frontend/tests/unit/domains/cohorts/composables/useTargetPicker.test.ts diff --git a/services/frontend/src/domains/cohorts/adapters/cohorts.ts b/services/frontend/src/domains/cohorts/adapters/cohorts.ts index 93313c486..af7073a86 100644 --- a/services/frontend/src/domains/cohorts/adapters/cohorts.ts +++ b/services/frontend/src/domains/cohorts/adapters/cohorts.ts @@ -9,12 +9,16 @@ import { getDrift, linkExistingTarget, linkUser, + listCohortTargetSystems, + searchCohortTargets, switchTarget, } from "@/services/api" import type { CohortMapping as ApiCohortMapping, DriftReport as ApiDriftReport, + ExternalTarget as ApiExternalTarget, ExtraRow as ApiExtraRow, + TargetDescriptor as ApiTargetDescriptor, } from "@/services/api" export type TargetSystem = ApiDriftReport["system"] @@ -133,6 +137,28 @@ export type TargetMapping = { export type AddTargetResult = { type: "ok"; mapping: TargetMapping } | { type: "conflict" } +export type TargetCapability = ApiTargetDescriptor["capabilities"][number] + +export type TargetDescriptor = { + system: TargetSystem + kind: ApiTargetDescriptor["kind"] + systemLabel: string + targetLabel: string + idLabel: string + folderLabel: string | null + capabilities: TargetCapability[] +} + +export type ExternalTarget = { + system: TargetSystem + externalId: string + kind: ApiExternalTarget["kind"] + label: string + folderLabel: string | null + memberCount: number | null + linkedCohortId: number | null +} + function toTargetMapping(raw: ApiCohortMapping): TargetMapping { return { cohortId: raw.cohortId, @@ -193,3 +219,37 @@ export async function switchCohortTarget( }) return toTargetMapping(res.data!) } + +export async function fetchTargetDescriptors(): Promise { + const res = await listCohortTargetSystems() + return (res.data ?? []).map(toTargetDescriptor) +} + +export async function fetchTargetOptions(system: TargetSystem): Promise { + const res = await searchCohortTargets({ path: { system } }) + return (res.data ?? []).map(toExternalTarget) +} + +function toTargetDescriptor(raw: ApiTargetDescriptor): TargetDescriptor { + return { + system: raw.system, + kind: raw.kind, + systemLabel: raw.systemLabel, + targetLabel: raw.targetLabel, + idLabel: raw.idLabel, + folderLabel: raw.folderLabel ?? null, + capabilities: [...raw.capabilities], + } +} + +function toExternalTarget(raw: ApiExternalTarget): ExternalTarget { + return { + system: raw.system, + externalId: raw.externalId, + kind: raw.kind, + label: raw.label, + folderLabel: raw.folderLabel ?? null, + memberCount: raw.memberCount ?? null, + linkedCohortId: raw.linkedCohortId ?? null, + } +} diff --git a/services/frontend/src/domains/cohorts/components/TargetPickerModal.vue b/services/frontend/src/domains/cohorts/components/TargetPickerModal.vue index 6071b993a..b2241145e 100644 --- a/services/frontend/src/domains/cohorts/components/TargetPickerModal.vue +++ b/services/frontend/src/domains/cohorts/components/TargetPickerModal.vue @@ -1,5 +1,5 @@ + + + + diff --git a/services/frontend/src/domains/cohorts/composables/useInboundReconcile.ts b/services/frontend/src/domains/cohorts/composables/useInboundReconcile.ts new file mode 100644 index 000000000..1840eb344 --- /dev/null +++ b/services/frontend/src/domains/cohorts/composables/useInboundReconcile.ts @@ -0,0 +1,80 @@ +import { computed, ref } from "vue" +import { + applyInboundReconcileSelection, + fetchInboundReconcilePreview, + type InboundReconcileApplyResponse, + type InboundReconcilePreview, +} from "@/domains/cohorts/adapters/cohorts" + +export function useInboundReconcile() { + const preview = ref(null) + const selectedExternalUserIds = ref([]) + const loading = ref(false) + const applying = ref(false) + const errorMessage = ref(null) + const applyResult = ref(null) + + const writableRows = computed(() => preview.value?.matched.filter((row) => row.writable) ?? []) + const canApply = computed(() => + Boolean(preview.value?.writerSupported) && selectedExternalUserIds.value.length > 0 && !applying.value, + ) + + async function load(subjectId: number, cohortId: number): Promise { + loading.value = true + errorMessage.value = null + applyResult.value = null + try { + preview.value = await fetchInboundReconcilePreview(subjectId, cohortId) + selectedExternalUserIds.value = writableRows.value.map((row) => row.externalUserId) + } catch (err: unknown) { + preview.value = null + selectedExternalUserIds.value = [] + errorMessage.value = (err as Error)?.message ?? "Could not load inbound reconcile preview." + } finally { + loading.value = false + } + } + + async function apply(subjectId: number, cohortId: number): Promise { + if (!preview.value || !canApply.value) return false + applying.value = true + errorMessage.value = null + try { + applyResult.value = await applyInboundReconcileSelection( + subjectId, + cohortId, + preview.value.previewToken, + selectedExternalUserIds.value, + ) + return true + } catch (err: unknown) { + errorMessage.value = (err as Error)?.message ?? "Could not apply inbound reconcile." + return false + } finally { + applying.value = false + } + } + + function reset() { + preview.value = null + selectedExternalUserIds.value = [] + errorMessage.value = null + applyResult.value = null + loading.value = false + applying.value = false + } + + return { + preview, + selectedExternalUserIds, + writableRows, + loading, + applying, + errorMessage, + applyResult, + canApply, + load, + apply, + reset, + } +} diff --git a/services/frontend/src/pages/management/CohortSubjectDetail.vue b/services/frontend/src/pages/management/CohortSubjectDetail.vue index 9f0ebc4ea..a38361dd8 100644 --- a/services/frontend/src/pages/management/CohortSubjectDetail.vue +++ b/services/frontend/src/pages/management/CohortSubjectDetail.vue @@ -11,6 +11,7 @@ import { findCohortSubjectById, } from "@/services/api" import CohortDriftPanel from "@/domains/cohorts/components/CohortDriftPanel.vue" +import InboundReconcileModal from "@/domains/cohorts/components/InboundReconcileModal.vue" import TargetPickerModal from "@/domains/cohorts/components/TargetPickerModal.vue" import type { TargetSystem } from "@/domains/cohorts/adapters/cohorts" import store from "@/plugins/store" @@ -31,6 +32,8 @@ const pickerOpen = ref(false) const pickerMode = ref<"add" | "switch">("add") const pickerSystem = ref("BREVO") const pickerCohortId = ref(undefined) +const inboundOpen = ref(false) +const inboundCohortId = ref(undefined) const subjectId = computed(() => { const raw = route.params.id @@ -116,6 +119,15 @@ const onTargetSaved = () => { void load() } +const openInboundReconcile = (cohortId: number) => { + inboundCohortId.value = cohortId + inboundOpen.value = true +} + +const onInboundApplied = () => { + successMessage.value = "Inbound reconcile job enqueued." +} + const backToCategory = () => { if (subject.value == null) return void router.push({ @@ -314,6 +326,17 @@ watch(subjectId, () => void load()) > Switch target + + Inbound reconcile + @@ -427,6 +450,13 @@ watch(subjectId, () => void load()) :system="pickerSystem" @saved="onTargetSaved" /> + diff --git a/services/frontend/src/services/api/blueshell/index.ts b/services/frontend/src/services/api/blueshell/index.ts index 0e96be34d..f81c43eb1 100644 --- a/services/frontend/src/services/api/blueshell/index.ts +++ b/services/frontend/src/services/api/blueshell/index.ts @@ -1,4 +1,4 @@ // This file is auto-generated by @hey-api/openapi-ts -export { addMember, approveEvent, authenticate, boardCreateMembership, createAddress, createBlog, createBoard, createCommittee, createContribution, createContributionPeriod, createEvent, createEventSignup, createMemberProfile, createMembership, createSponsor, createTarget, createTelemetry, createUser, csrf, deleteAddressById, deleteBoard, deleteById, deleteCommitteeById, deleteContribution, deleteContributionPeriodById, deleteEventById, deleteEventSignup, deleteSponsorById, deleteUserById, downloadEventBanner, enqueue, findAddressById, findAllAddresses, findAllBoards, findBlogById, findBlogs, findBoardById, findCohortById, findCohorts, findCohortSubjectById, findCohortSubjects, findCommitteeById, findCommittees, findCommitteesByUserId, findContributionPeriods, findContributionReminders, findContributions, findContributionsByPeriodId, findCurrentContributionPeriod, findDeletedUsers, findEventById, findEvents, findEventSignUps, findEventSignUpsByAccessToken, findEventSignUpsByEventId, findMemberProfileByUserId, findMembershipById, findMemberships, findSponsorById, findSponsors, findTelemetryById, findUserById, findUsers, forwardAuth, getDrift, getStats, getStats1, healthCheck, jobTypes, linkExistingTarget, linkUser, list, list1, listCohortTargetSystems, logout, memberActivate, myServices, type Options, removeMember, repairMissingAdds, resendMemberActivationEmail, resendUserActivation, resetPassword, restoreDeletedUserById, retry, retry1, searchCohortTargets, sendContributionReminder, sendContributionReminderBatch, setPassword, switchTarget, toggleUserRole, updateAddress, updateBlog, updateBoard, updateCommittee, updateContributionPeriod, updateEvent, updateEventSignUp, updateMemberProfile, updateMembership, updateSponsor, updateUser, uploadEventBanner, userActivate } from './sdk.gen'; -export { type Actor, type AddBoardMemberRequest, type AddMemberData, type AddMemberError, type AddMemberErrors, type AddMemberResponse, type AddMemberResponses, type AddressResponse, type AnswerRequest, type AnswerResponse, type ApiError, type ApproveEventData, type ApproveEventError, type ApproveEventErrors, type ApproveEventResponse, type ApproveEventResponses, type AuthenticateData, type AuthenticateError, type AuthenticateErrors, type AuthenticateResponse, type AuthenticateResponses, type BlogResponse, type BoardCreateMembershipData, type BoardCreateMembershipError, type BoardCreateMembershipErrors, type BoardCreateMembershipRequest, type BoardCreateMembershipResponse, type BoardCreateMembershipResponses, type BoardMemberResponse, type BoardResponse, type ClientOptions, type CohortDetail, CohortFactKind, CohortKind, type CohortMapping, type CohortMemberRow, type CohortRepair, type CohortRule, CohortSubjectCategory, type CohortSubjectDetail, type CohortSubjectMember, type CohortSubjectRule, type CohortSubjectSummary, CohortSubjectType, type CohortSummary, type CommitteeDetailResponse, type CommitteeMemberRequest, type CommitteeMemberResponse, type CommitteeResponse, type ContributionPeriodResponse, type ContributionReminderResponse, type ContributionResponse, type CreateAddressData, type CreateAddressError, type CreateAddressErrors, type CreateAddressRequest, type CreateAddressResponse, type CreateAddressResponses, type CreateBlogData, type CreateBlogError, type CreateBlogErrors, type CreateBlogRequest, type CreateBlogResponse, type CreateBlogResponses, type CreateBoardData, type CreateBoardError, type CreateBoardErrors, type CreateBoardRequest, type CreateBoardResponse, type CreateBoardResponses, type CreateCommitteeData, type CreateCommitteeError, type CreateCommitteeErrors, type CreateCommitteeRequest, type CreateCommitteeResponse, type CreateCommitteeResponses, type CreateContributionData, type CreateContributionError, type CreateContributionErrors, type CreateContributionPeriodData, type CreateContributionPeriodError, type CreateContributionPeriodErrors, type CreateContributionPeriodRequest, type CreateContributionPeriodResponse, type CreateContributionPeriodResponses, type CreateContributionReminderRequest, type CreateContributionRequest, type CreateContributionResponse, type CreateContributionResponses, type CreateEventData, type CreateEventError, type CreateEventErrors, type CreateEventRequest, type CreateEventResponse, type CreateEventResponses, type CreateEventSignupData, type CreateEventSignupError, type CreateEventSignupErrors, type CreateEventSignUpRequest, type CreateEventSignupResponse, type CreateEventSignupResponses, type CreateGuestRequest, type CreateMemberProfileData, type CreateMemberProfileError, type CreateMemberProfileErrors, type CreateMemberProfileRequest, type CreateMemberProfileResponse, type CreateMemberProfileResponses, type CreateMembershipData, type CreateMembershipError, type CreateMembershipErrors, type CreateMembershipResponse, type CreateMembershipResponses, type CreateSponsorData, type CreateSponsorError, type CreateSponsorErrors, type CreateSponsorRequest, type CreateSponsorResponse, type CreateSponsorResponses, type CreateTargetData, type CreateTargetError, type CreateTargetErrors, type CreateTargetRequest, type CreateTargetResponse, type CreateTargetResponses, type CreateTelemetryData, type CreateTelemetryError, type CreateTelemetryErrors, type CreateTelemetryRequest, type CreateTelemetryResponse, type CreateTelemetryResponses, type CreateUserData, type CreateUserError, type CreateUserErrors, type CreateUserRequest, type CreateUserResponse, type CreateUserResponses, type CsrfData, type CsrfError, type CsrfErrors, type CsrfResponse, type CsrfResponses, type CsrfToken, type DeleteAddressByIdData, type DeleteAddressByIdError, type DeleteAddressByIdErrors, type DeleteAddressByIdResponse, type DeleteAddressByIdResponses, type DeleteBoardData, type DeleteBoardError, type DeleteBoardErrors, type DeleteBoardResponse, type DeleteBoardResponses, type DeleteByIdData, type DeleteByIdError, type DeleteByIdErrors, type DeleteByIdResponse, type DeleteByIdResponses, type DeleteCommitteeByIdData, type DeleteCommitteeByIdError, type DeleteCommitteeByIdErrors, type DeleteCommitteeByIdResponse, type DeleteCommitteeByIdResponses, type DeleteContributionData, type DeleteContributionError, type DeleteContributionErrors, type DeleteContributionPeriodByIdData, type DeleteContributionPeriodByIdError, type DeleteContributionPeriodByIdErrors, type DeleteContributionPeriodByIdResponse, type DeleteContributionPeriodByIdResponses, type DeleteContributionResponse, type DeleteContributionResponses, type DeleteEventByIdData, type DeleteEventByIdError, type DeleteEventByIdErrors, type DeleteEventByIdResponse, type DeleteEventByIdResponses, type DeleteEventSignupData, type DeleteEventSignupError, type DeleteEventSignupErrors, type DeleteEventSignupResponse, type DeleteEventSignupResponses, type DeleteSponsorByIdData, type DeleteSponsorByIdError, type DeleteSponsorByIdErrors, type DeleteSponsorByIdResponse, type DeleteSponsorByIdResponses, type DeleteUserByIdData, type DeleteUserByIdError, type DeleteUserByIdErrors, type DeleteUserByIdResponse, type DeleteUserByIdResponses, type DownloadEventBannerData, type DownloadEventBannerError, type DownloadEventBannerErrors, type DownloadEventBannerResponse, type DownloadEventBannerResponses, type DriftReport, type Email, type EmailStats, type EnqueueData, type EnqueueError, type EnqueueErrors, type EnqueueJobRequest, type EnqueueResponse, type EnqueueResponses, type EventBannerRequest, type EventBannerResponse, type EventResponse, type EventSignUpResponse, type ExternalTarget, type ExtraRow, type FieldValidationError, type FileResponse, FileType, type FindAddressByIdData, type FindAddressByIdError, type FindAddressByIdErrors, type FindAddressByIdResponse, type FindAddressByIdResponses, type FindAllAddressesData, type FindAllAddressesError, type FindAllAddressesErrors, type FindAllAddressesResponse, type FindAllAddressesResponses, type FindAllBoardsData, type FindAllBoardsError, type FindAllBoardsErrors, type FindAllBoardsResponse, type FindAllBoardsResponses, type FindBlogByIdData, type FindBlogByIdError, type FindBlogByIdErrors, type FindBlogByIdResponse, type FindBlogByIdResponses, type FindBlogsData, type FindBlogsError, type FindBlogsErrors, type FindBlogsResponse, type FindBlogsResponses, type FindBoardByIdData, type FindBoardByIdError, type FindBoardByIdErrors, type FindBoardByIdResponse, type FindBoardByIdResponses, type FindCohortByIdData, type FindCohortByIdError, type FindCohortByIdErrors, type FindCohortByIdResponse, type FindCohortByIdResponses, type FindCohortsData, type FindCohortsError, type FindCohortsErrors, type FindCohortsResponse, type FindCohortsResponses, type FindCohortSubjectByIdData, type FindCohortSubjectByIdError, type FindCohortSubjectByIdErrors, type FindCohortSubjectByIdResponse, type FindCohortSubjectByIdResponses, type FindCohortSubjectsData, type FindCohortSubjectsError, type FindCohortSubjectsErrors, type FindCohortSubjectsResponse, type FindCohortSubjectsResponses, type FindCommitteeByIdData, type FindCommitteeByIdError, type FindCommitteeByIdErrors, type FindCommitteeByIdResponse, type FindCommitteeByIdResponses, type FindCommitteesByUserIdData, type FindCommitteesByUserIdError, type FindCommitteesByUserIdErrors, type FindCommitteesByUserIdResponse, type FindCommitteesByUserIdResponses, type FindCommitteesData, type FindCommitteesError, type FindCommitteesErrors, type FindCommitteesResponse, type FindCommitteesResponses, type FindContributionPeriodsData, type FindContributionPeriodsError, type FindContributionPeriodsErrors, type FindContributionPeriodsResponse, type FindContributionPeriodsResponses, type FindContributionRemindersData, type FindContributionRemindersError, type FindContributionRemindersErrors, type FindContributionRemindersResponse, type FindContributionRemindersResponses, type FindContributionsByPeriodIdData, type FindContributionsByPeriodIdError, type FindContributionsByPeriodIdErrors, type FindContributionsByPeriodIdResponse, type FindContributionsByPeriodIdResponses, type FindContributionsData, type FindContributionsError, type FindContributionsErrors, type FindContributionsResponse, type FindContributionsResponses, type FindCurrentContributionPeriodData, type FindCurrentContributionPeriodError, type FindCurrentContributionPeriodErrors, type FindCurrentContributionPeriodResponse, type FindCurrentContributionPeriodResponses, type FindDeletedUsersData, type FindDeletedUsersError, type FindDeletedUsersErrors, type FindDeletedUsersResponse, type FindDeletedUsersResponses, type FindEventByIdData, type FindEventByIdError, type FindEventByIdErrors, type FindEventByIdResponse, type FindEventByIdResponses, type FindEventsData, type FindEventsError, type FindEventsErrors, type FindEventSignUpsByAccessTokenData, type FindEventSignUpsByAccessTokenError, type FindEventSignUpsByAccessTokenErrors, type FindEventSignUpsByAccessTokenResponse, type FindEventSignUpsByAccessTokenResponses, type FindEventSignUpsByEventIdData, type FindEventSignUpsByEventIdError, type FindEventSignUpsByEventIdErrors, type FindEventSignUpsByEventIdResponse, type FindEventSignUpsByEventIdResponses, type FindEventSignUpsData, type FindEventSignUpsError, type FindEventSignUpsErrors, type FindEventSignUpsResponse, type FindEventSignUpsResponses, type FindEventsResponse, type FindEventsResponses, type FindMemberProfileByUserIdData, type FindMemberProfileByUserIdError, type FindMemberProfileByUserIdErrors, type FindMemberProfileByUserIdResponse, type FindMemberProfileByUserIdResponses, type FindMembershipByIdData, type FindMembershipByIdError, type FindMembershipByIdErrors, type FindMembershipByIdResponse, type FindMembershipByIdResponses, type FindMembershipsData, type FindMembershipsError, type FindMembershipsErrors, type FindMembershipsResponse, type FindMembershipsResponses, type FindSponsorByIdData, type FindSponsorByIdError, type FindSponsorByIdErrors, type FindSponsorByIdResponse, type FindSponsorByIdResponses, type FindSponsorsData, type FindSponsorsError, type FindSponsorsErrors, type FindSponsorsResponse, type FindSponsorsResponses, type FindTelemetryByIdData, type FindTelemetryByIdError, type FindTelemetryByIdErrors, type FindTelemetryByIdResponse, type FindTelemetryByIdResponses, type FindUserByIdData, type FindUserByIdError, type FindUserByIdErrors, type FindUserByIdResponse, type FindUserByIdResponses, type FindUsersData, type FindUsersError, type FindUsersErrors, type FindUsersResponse, type FindUsersResponses, type ForwardAuthData, type ForwardAuthError, type ForwardAuthErrors, type ForwardAuthResponses, type GetDriftData, type GetDriftError, type GetDriftErrors, type GetDriftResponse, type GetDriftResponses, type GetStats1Data, type GetStats1Error, type GetStats1Errors, type GetStats1Response, type GetStats1Responses, type GetStatsData, type GetStatsError, type GetStatsErrors, type GetStatsResponse, type GetStatsResponses, type GuestResponse, type HealthCheckData, type HealthCheckError, type HealthCheckErrors, type HealthCheckResponse, type HealthCheckResponses, type JobExecution, JobExecutionCategory, type JobExecutionRelatedEntity, JobExecutionStatus, type JobPayloadField, JobPayloadFieldKind, type JobStatsDto, type JobTypeDescriptor, type JobTypesData, type JobTypesError, type JobTypesErrors, type JobTypesResponse, type JobTypesResponses, type JwtRequest, type LinkedUser, type LinkExistingTargetData, type LinkExistingTargetError, type LinkExistingTargetErrors, type LinkExistingTargetRequest, type LinkExistingTargetResponse, type LinkExistingTargetResponses, type LinkUserData, type LinkUserError, type LinkUserErrors, type LinkUserRequest, type LinkUserResponse, type LinkUserResponses, type List1Data, type List1Error, type List1Errors, type List1Response, type List1Responses, type ListCohortTargetSystemsData, type ListCohortTargetSystemsError, type ListCohortTargetSystemsErrors, type ListCohortTargetSystemsResponse, type ListCohortTargetSystemsResponses, type ListData, type ListError, type ListErrors, type ListResponse, type ListResponses, type LoginResponse, type LogoutData, type LogoutError, type LogoutErrors, type LogoutResponse, type LogoutResponses, type MemberActivateData, type MemberActivateError, type MemberActivateErrors, type MemberActivateResponse, type MemberActivateResponses, type MemberActivationRequest, type MemberProfileResponse, type MembershipResponse, MemberType, type MissingRow, type MyServicesData, type MyServicesError, type MyServicesErrors, type MyServicesResponse, type MyServicesResponses, type PagedModelEmail, type PagedModelEventResponse, type PagedModelJobExecution, type PagedModelUserDetailResponse, type PageMetadata, type PasswordResetRequest, PlatformType, type QuestionRequest, type QuestionResponse, QuestionType, type RedirectResponse, type RemoveMemberData, type RemoveMemberError, type RemoveMemberErrors, type RemoveMemberResponse, type RemoveMemberResponses, type RepairMissingAddsData, type RepairMissingAddsError, type RepairMissingAddsErrors, type RepairMissingAddsResponse, type RepairMissingAddsResponses, type ResendMemberActivationEmailData, type ResendMemberActivationEmailError, type ResendMemberActivationEmailErrors, type ResendMemberActivationEmailResponse, type ResendMemberActivationEmailResponses, type ResendUserActivationData, type ResendUserActivationError, type ResendUserActivationErrors, type ResendUserActivationResponse, type ResendUserActivationResponses, type ResetPasswordData, type ResetPasswordError, type ResetPasswordErrors, type ResetPasswordResponse, type ResetPasswordResponses, type RestoreDeletedUserByIdData, type RestoreDeletedUserByIdError, type RestoreDeletedUserByIdErrors, type RestoreDeletedUserByIdResponse, type RestoreDeletedUserByIdResponses, type Retry1Data, type Retry1Error, type Retry1Errors, type Retry1Response, type Retry1Responses, type RetryData, type RetryError, type RetryErrors, type RetryResponse, type RetryResponses, Role, type SearchCohortTargetsData, type SearchCohortTargetsError, type SearchCohortTargetsErrors, type SearchCohortTargetsResponse, type SearchCohortTargetsResponses, type SendContributionReminderBatchData, type SendContributionReminderBatchError, type SendContributionReminderBatchErrors, type SendContributionReminderBatchResponse, type SendContributionReminderBatchResponses, type SendContributionReminderData, type SendContributionReminderError, type SendContributionReminderErrors, type SendContributionReminderResponse, type SendContributionReminderResponses, type ServiceEntry, type SetPasswordData, type SetPasswordError, type SetPasswordErrors, type SetPasswordResponse, type SetPasswordResponses, type SponsorResponse, type SurveyRequest, type SurveyResponse, type SwitchTargetData, type SwitchTargetError, type SwitchTargetErrors, type SwitchTargetRequest, type SwitchTargetResponse, type SwitchTargetResponses, type TargetDescriptor, type TelemetryResponse, type ToggleUserRoleData, type ToggleUserRoleError, type ToggleUserRoleErrors, type ToggleUserRoleResponse, type ToggleUserRoleResponses, type UpdateAddressData, type UpdateAddressError, type UpdateAddressErrors, type UpdateAddressRequest, type UpdateAddressResponse, type UpdateAddressResponses, type UpdateBlogData, type UpdateBlogError, type UpdateBlogErrors, type UpdateBlogRequest, type UpdateBlogResponse, type UpdateBlogResponses, type UpdateBoardData, type UpdateBoardError, type UpdateBoardErrors, type UpdateBoardRequest, type UpdateBoardResponse, type UpdateBoardResponses, type UpdateCommitteeData, type UpdateCommitteeError, type UpdateCommitteeErrors, type UpdateCommitteeRequest, type UpdateCommitteeResponse, type UpdateCommitteeResponses, type UpdateContributionPeriodData, type UpdateContributionPeriodError, type UpdateContributionPeriodErrors, type UpdateContributionPeriodRequest, type UpdateContributionPeriodResponse, type UpdateContributionPeriodResponses, type UpdateEventData, type UpdateEventError, type UpdateEventErrors, type UpdateEventRequest, type UpdateEventResponse, type UpdateEventResponses, type UpdateEventSignUpData, type UpdateEventSignUpError, type UpdateEventSignUpErrors, type UpdateEventSignUpRequest, type UpdateEventSignUpResponse, type UpdateEventSignUpResponses, type UpdateMemberProfileData, type UpdateMemberProfileError, type UpdateMemberProfileErrors, type UpdateMemberProfileRequest, type UpdateMemberProfileResponse, type UpdateMemberProfileResponses, type UpdateMembershipData, type UpdateMembershipError, type UpdateMembershipErrors, type UpdateMembershipRequest, type UpdateMembershipResponse, type UpdateMembershipResponses, type UpdateSponsorData, type UpdateSponsorError, type UpdateSponsorErrors, type UpdateSponsorRequest, type UpdateSponsorResponse, type UpdateSponsorResponses, type UpdateUserData, type UpdateUserError, type UpdateUserErrors, type UpdateUserRequest, type UpdateUserResponse, type UpdateUserResponses, type UploadEventBannerData, type UploadEventBannerError, type UploadEventBannerErrors, type UploadEventBannerResponse, type UploadEventBannerResponses, type UpsertMemberProfileRequest, type UserActivateData, type UserActivateError, type UserActivateErrors, type UserActivateResponse, type UserActivateResponses, type UserActivationRequest, type UserDetailResponse, type UserSummaryResponse } from './types.gen'; +export { addMember, applyInboundReconcile, approveEvent, authenticate, boardCreateMembership, createAddress, createBlog, createBoard, createCommittee, createContribution, createContributionPeriod, createEvent, createEventSignup, createMemberProfile, createMembership, createSponsor, createTarget, createTelemetry, createUser, csrf, deleteAddressById, deleteBoard, deleteById, deleteCommitteeById, deleteContribution, deleteContributionPeriodById, deleteEventById, deleteEventSignup, deleteSponsorById, deleteUserById, downloadEventBanner, enqueue, findAddressById, findAllAddresses, findAllBoards, findBlogById, findBlogs, findBoardById, findCohortById, findCohorts, findCohortSubjectById, findCohortSubjects, findCommitteeById, findCommittees, findCommitteesByUserId, findContributionPeriods, findContributionReminders, findContributions, findContributionsByPeriodId, findCurrentContributionPeriod, findDeletedUsers, findEventById, findEvents, findEventSignUps, findEventSignUpsByAccessToken, findEventSignUpsByEventId, findMemberProfileByUserId, findMembershipById, findMemberships, findSponsorById, findSponsors, findTelemetryById, findUserById, findUsers, forwardAuth, getDrift, getStats, getStats1, healthCheck, jobTypes, linkExistingTarget, linkUser, list, list1, listCohortTargetSystems, logout, memberActivate, myServices, type Options, previewInboundReconcile, removeMember, repairMissingAdds, resendMemberActivationEmail, resendUserActivation, resetPassword, restoreDeletedUserById, retry, retry1, searchCohortTargets, sendContributionReminder, sendContributionReminderBatch, setPassword, switchTarget, toggleUserRole, updateAddress, updateBlog, updateBoard, updateCommittee, updateContributionPeriod, updateEvent, updateEventSignUp, updateMemberProfile, updateMembership, updateSponsor, updateUser, uploadEventBanner, userActivate } from './sdk.gen'; +export { type Actor, type AddBoardMemberRequest, type AddMemberData, type AddMemberError, type AddMemberErrors, type AddMemberResponse, type AddMemberResponses, type AddressResponse, type AnswerRequest, type AnswerResponse, type ApiError, type ApplyInboundReconcileData, type ApplyInboundReconcileError, type ApplyInboundReconcileErrors, type ApplyInboundReconcileResponse, type ApplyInboundReconcileResponses, type ApproveEventData, type ApproveEventError, type ApproveEventErrors, type ApproveEventResponse, type ApproveEventResponses, type AuthenticateData, type AuthenticateError, type AuthenticateErrors, type AuthenticateResponse, type AuthenticateResponses, type BlogResponse, type BoardCreateMembershipData, type BoardCreateMembershipError, type BoardCreateMembershipErrors, type BoardCreateMembershipRequest, type BoardCreateMembershipResponse, type BoardCreateMembershipResponses, type BoardMemberResponse, type BoardResponse, type ClientOptions, type CohortDetail, CohortFactKind, CohortKind, type CohortMapping, type CohortMemberRow, type CohortRepair, type CohortRule, CohortSubjectCategory, type CohortSubjectDetail, type CohortSubjectMember, type CohortSubjectRule, type CohortSubjectSummary, CohortSubjectType, type CohortSummary, type CommitteeDetailResponse, type CommitteeMemberRequest, type CommitteeMemberResponse, type CommitteeResponse, type ContributionPeriodResponse, type ContributionReminderResponse, type ContributionResponse, type CreateAddressData, type CreateAddressError, type CreateAddressErrors, type CreateAddressRequest, type CreateAddressResponse, type CreateAddressResponses, type CreateBlogData, type CreateBlogError, type CreateBlogErrors, type CreateBlogRequest, type CreateBlogResponse, type CreateBlogResponses, type CreateBoardData, type CreateBoardError, type CreateBoardErrors, type CreateBoardRequest, type CreateBoardResponse, type CreateBoardResponses, type CreateCommitteeData, type CreateCommitteeError, type CreateCommitteeErrors, type CreateCommitteeRequest, type CreateCommitteeResponse, type CreateCommitteeResponses, type CreateContributionData, type CreateContributionError, type CreateContributionErrors, type CreateContributionPeriodData, type CreateContributionPeriodError, type CreateContributionPeriodErrors, type CreateContributionPeriodRequest, type CreateContributionPeriodResponse, type CreateContributionPeriodResponses, type CreateContributionReminderRequest, type CreateContributionRequest, type CreateContributionResponse, type CreateContributionResponses, type CreateEventData, type CreateEventError, type CreateEventErrors, type CreateEventRequest, type CreateEventResponse, type CreateEventResponses, type CreateEventSignupData, type CreateEventSignupError, type CreateEventSignupErrors, type CreateEventSignUpRequest, type CreateEventSignupResponse, type CreateEventSignupResponses, type CreateGuestRequest, type CreateMemberProfileData, type CreateMemberProfileError, type CreateMemberProfileErrors, type CreateMemberProfileRequest, type CreateMemberProfileResponse, type CreateMemberProfileResponses, type CreateMembershipData, type CreateMembershipError, type CreateMembershipErrors, type CreateMembershipResponse, type CreateMembershipResponses, type CreateSponsorData, type CreateSponsorError, type CreateSponsorErrors, type CreateSponsorRequest, type CreateSponsorResponse, type CreateSponsorResponses, type CreateTargetData, type CreateTargetError, type CreateTargetErrors, type CreateTargetRequest, type CreateTargetResponse, type CreateTargetResponses, type CreateTelemetryData, type CreateTelemetryError, type CreateTelemetryErrors, type CreateTelemetryRequest, type CreateTelemetryResponse, type CreateTelemetryResponses, type CreateUserData, type CreateUserError, type CreateUserErrors, type CreateUserRequest, type CreateUserResponse, type CreateUserResponses, type CsrfData, type CsrfError, type CsrfErrors, type CsrfResponse, type CsrfResponses, type CsrfToken, type DeleteAddressByIdData, type DeleteAddressByIdError, type DeleteAddressByIdErrors, type DeleteAddressByIdResponse, type DeleteAddressByIdResponses, type DeleteBoardData, type DeleteBoardError, type DeleteBoardErrors, type DeleteBoardResponse, type DeleteBoardResponses, type DeleteByIdData, type DeleteByIdError, type DeleteByIdErrors, type DeleteByIdResponse, type DeleteByIdResponses, type DeleteCommitteeByIdData, type DeleteCommitteeByIdError, type DeleteCommitteeByIdErrors, type DeleteCommitteeByIdResponse, type DeleteCommitteeByIdResponses, type DeleteContributionData, type DeleteContributionError, type DeleteContributionErrors, type DeleteContributionPeriodByIdData, type DeleteContributionPeriodByIdError, type DeleteContributionPeriodByIdErrors, type DeleteContributionPeriodByIdResponse, type DeleteContributionPeriodByIdResponses, type DeleteContributionResponse, type DeleteContributionResponses, type DeleteEventByIdData, type DeleteEventByIdError, type DeleteEventByIdErrors, type DeleteEventByIdResponse, type DeleteEventByIdResponses, type DeleteEventSignupData, type DeleteEventSignupError, type DeleteEventSignupErrors, type DeleteEventSignupResponse, type DeleteEventSignupResponses, type DeleteSponsorByIdData, type DeleteSponsorByIdError, type DeleteSponsorByIdErrors, type DeleteSponsorByIdResponse, type DeleteSponsorByIdResponses, type DeleteUserByIdData, type DeleteUserByIdError, type DeleteUserByIdErrors, type DeleteUserByIdResponse, type DeleteUserByIdResponses, type DownloadEventBannerData, type DownloadEventBannerError, type DownloadEventBannerErrors, type DownloadEventBannerResponse, type DownloadEventBannerResponses, type DriftReport, type Email, type EmailStats, type EnqueueData, type EnqueueError, type EnqueueErrors, type EnqueueJobRequest, type EnqueueResponse, type EnqueueResponses, type EventBannerRequest, type EventBannerResponse, type EventResponse, type EventSignUpResponse, type ExternalTarget, type ExtraRow, type FieldValidationError, type FileResponse, FileType, type FindAddressByIdData, type FindAddressByIdError, type FindAddressByIdErrors, type FindAddressByIdResponse, type FindAddressByIdResponses, type FindAllAddressesData, type FindAllAddressesError, type FindAllAddressesErrors, type FindAllAddressesResponse, type FindAllAddressesResponses, type FindAllBoardsData, type FindAllBoardsError, type FindAllBoardsErrors, type FindAllBoardsResponse, type FindAllBoardsResponses, type FindBlogByIdData, type FindBlogByIdError, type FindBlogByIdErrors, type FindBlogByIdResponse, type FindBlogByIdResponses, type FindBlogsData, type FindBlogsError, type FindBlogsErrors, type FindBlogsResponse, type FindBlogsResponses, type FindBoardByIdData, type FindBoardByIdError, type FindBoardByIdErrors, type FindBoardByIdResponse, type FindBoardByIdResponses, type FindCohortByIdData, type FindCohortByIdError, type FindCohortByIdErrors, type FindCohortByIdResponse, type FindCohortByIdResponses, type FindCohortsData, type FindCohortsError, type FindCohortsErrors, type FindCohortsResponse, type FindCohortsResponses, type FindCohortSubjectByIdData, type FindCohortSubjectByIdError, type FindCohortSubjectByIdErrors, type FindCohortSubjectByIdResponse, type FindCohortSubjectByIdResponses, type FindCohortSubjectsData, type FindCohortSubjectsError, type FindCohortSubjectsErrors, type FindCohortSubjectsResponse, type FindCohortSubjectsResponses, type FindCommitteeByIdData, type FindCommitteeByIdError, type FindCommitteeByIdErrors, type FindCommitteeByIdResponse, type FindCommitteeByIdResponses, type FindCommitteesByUserIdData, type FindCommitteesByUserIdError, type FindCommitteesByUserIdErrors, type FindCommitteesByUserIdResponse, type FindCommitteesByUserIdResponses, type FindCommitteesData, type FindCommitteesError, type FindCommitteesErrors, type FindCommitteesResponse, type FindCommitteesResponses, type FindContributionPeriodsData, type FindContributionPeriodsError, type FindContributionPeriodsErrors, type FindContributionPeriodsResponse, type FindContributionPeriodsResponses, type FindContributionRemindersData, type FindContributionRemindersError, type FindContributionRemindersErrors, type FindContributionRemindersResponse, type FindContributionRemindersResponses, type FindContributionsByPeriodIdData, type FindContributionsByPeriodIdError, type FindContributionsByPeriodIdErrors, type FindContributionsByPeriodIdResponse, type FindContributionsByPeriodIdResponses, type FindContributionsData, type FindContributionsError, type FindContributionsErrors, type FindContributionsResponse, type FindContributionsResponses, type FindCurrentContributionPeriodData, type FindCurrentContributionPeriodError, type FindCurrentContributionPeriodErrors, type FindCurrentContributionPeriodResponse, type FindCurrentContributionPeriodResponses, type FindDeletedUsersData, type FindDeletedUsersError, type FindDeletedUsersErrors, type FindDeletedUsersResponse, type FindDeletedUsersResponses, type FindEventByIdData, type FindEventByIdError, type FindEventByIdErrors, type FindEventByIdResponse, type FindEventByIdResponses, type FindEventsData, type FindEventsError, type FindEventsErrors, type FindEventSignUpsByAccessTokenData, type FindEventSignUpsByAccessTokenError, type FindEventSignUpsByAccessTokenErrors, type FindEventSignUpsByAccessTokenResponse, type FindEventSignUpsByAccessTokenResponses, type FindEventSignUpsByEventIdData, type FindEventSignUpsByEventIdError, type FindEventSignUpsByEventIdErrors, type FindEventSignUpsByEventIdResponse, type FindEventSignUpsByEventIdResponses, type FindEventSignUpsData, type FindEventSignUpsError, type FindEventSignUpsErrors, type FindEventSignUpsResponse, type FindEventSignUpsResponses, type FindEventsResponse, type FindEventsResponses, type FindMemberProfileByUserIdData, type FindMemberProfileByUserIdError, type FindMemberProfileByUserIdErrors, type FindMemberProfileByUserIdResponse, type FindMemberProfileByUserIdResponses, type FindMembershipByIdData, type FindMembershipByIdError, type FindMembershipByIdErrors, type FindMembershipByIdResponse, type FindMembershipByIdResponses, type FindMembershipsData, type FindMembershipsError, type FindMembershipsErrors, type FindMembershipsResponse, type FindMembershipsResponses, type FindSponsorByIdData, type FindSponsorByIdError, type FindSponsorByIdErrors, type FindSponsorByIdResponse, type FindSponsorByIdResponses, type FindSponsorsData, type FindSponsorsError, type FindSponsorsErrors, type FindSponsorsResponse, type FindSponsorsResponses, type FindTelemetryByIdData, type FindTelemetryByIdError, type FindTelemetryByIdErrors, type FindTelemetryByIdResponse, type FindTelemetryByIdResponses, type FindUserByIdData, type FindUserByIdError, type FindUserByIdErrors, type FindUserByIdResponse, type FindUserByIdResponses, type FindUsersData, type FindUsersError, type FindUsersErrors, type FindUsersResponse, type FindUsersResponses, type ForwardAuthData, type ForwardAuthError, type ForwardAuthErrors, type ForwardAuthResponses, type GetDriftData, type GetDriftError, type GetDriftErrors, type GetDriftResponse, type GetDriftResponses, type GetStats1Data, type GetStats1Error, type GetStats1Errors, type GetStats1Response, type GetStats1Responses, type GetStatsData, type GetStatsError, type GetStatsErrors, type GetStatsResponse, type GetStatsResponses, type GuestResponse, type HealthCheckData, type HealthCheckError, type HealthCheckErrors, type HealthCheckResponse, type HealthCheckResponses, type InboundReconcileApplyRequest, type InboundReconcileApplyResponse, type InboundReconcileMatchedRow, type InboundReconcilePreview, type InboundReconcileSkippedRow, type JobExecution, JobExecutionCategory, type JobExecutionRelatedEntity, JobExecutionStatus, type JobPayloadField, JobPayloadFieldKind, type JobStatsDto, type JobTypeDescriptor, type JobTypesData, type JobTypesError, type JobTypesErrors, type JobTypesResponse, type JobTypesResponses, type JwtRequest, type LinkedUser, type LinkExistingTargetData, type LinkExistingTargetError, type LinkExistingTargetErrors, type LinkExistingTargetRequest, type LinkExistingTargetResponse, type LinkExistingTargetResponses, type LinkUserData, type LinkUserError, type LinkUserErrors, type LinkUserRequest, type LinkUserResponse, type LinkUserResponses, type List1Data, type List1Error, type List1Errors, type List1Response, type List1Responses, type ListCohortTargetSystemsData, type ListCohortTargetSystemsError, type ListCohortTargetSystemsErrors, type ListCohortTargetSystemsResponse, type ListCohortTargetSystemsResponses, type ListData, type ListError, type ListErrors, type ListResponse, type ListResponses, type LoginResponse, type LogoutData, type LogoutError, type LogoutErrors, type LogoutResponse, type LogoutResponses, type MemberActivateData, type MemberActivateError, type MemberActivateErrors, type MemberActivateResponse, type MemberActivateResponses, type MemberActivationRequest, type MemberProfileResponse, type MembershipResponse, MemberType, type MissingRow, type MyServicesData, type MyServicesError, type MyServicesErrors, type MyServicesResponse, type MyServicesResponses, type PagedModelEmail, type PagedModelEventResponse, type PagedModelJobExecution, type PagedModelUserDetailResponse, type PageMetadata, type PasswordResetRequest, PlatformType, type PreviewInboundReconcileData, type PreviewInboundReconcileError, type PreviewInboundReconcileErrors, type PreviewInboundReconcileResponse, type PreviewInboundReconcileResponses, type QuestionRequest, type QuestionResponse, QuestionType, type RedirectResponse, type RemoveMemberData, type RemoveMemberError, type RemoveMemberErrors, type RemoveMemberResponse, type RemoveMemberResponses, type RepairMissingAddsData, type RepairMissingAddsError, type RepairMissingAddsErrors, type RepairMissingAddsResponse, type RepairMissingAddsResponses, type ResendMemberActivationEmailData, type ResendMemberActivationEmailError, type ResendMemberActivationEmailErrors, type ResendMemberActivationEmailResponse, type ResendMemberActivationEmailResponses, type ResendUserActivationData, type ResendUserActivationError, type ResendUserActivationErrors, type ResendUserActivationResponse, type ResendUserActivationResponses, type ResetPasswordData, type ResetPasswordError, type ResetPasswordErrors, type ResetPasswordResponse, type ResetPasswordResponses, type RestoreDeletedUserByIdData, type RestoreDeletedUserByIdError, type RestoreDeletedUserByIdErrors, type RestoreDeletedUserByIdResponse, type RestoreDeletedUserByIdResponses, type Retry1Data, type Retry1Error, type Retry1Errors, type Retry1Response, type Retry1Responses, type RetryData, type RetryError, type RetryErrors, type RetryResponse, type RetryResponses, Role, type SearchCohortTargetsData, type SearchCohortTargetsError, type SearchCohortTargetsErrors, type SearchCohortTargetsResponse, type SearchCohortTargetsResponses, type SendContributionReminderBatchData, type SendContributionReminderBatchError, type SendContributionReminderBatchErrors, type SendContributionReminderBatchResponse, type SendContributionReminderBatchResponses, type SendContributionReminderData, type SendContributionReminderError, type SendContributionReminderErrors, type SendContributionReminderResponse, type SendContributionReminderResponses, type ServiceEntry, type SetPasswordData, type SetPasswordError, type SetPasswordErrors, type SetPasswordResponse, type SetPasswordResponses, type SponsorResponse, type SubjectFact, type SurveyRequest, type SurveyResponse, type SwitchTargetData, type SwitchTargetError, type SwitchTargetErrors, type SwitchTargetRequest, type SwitchTargetResponse, type SwitchTargetResponses, type TargetDescriptor, type TelemetryResponse, type ToggleUserRoleData, type ToggleUserRoleError, type ToggleUserRoleErrors, type ToggleUserRoleResponse, type ToggleUserRoleResponses, type UpdateAddressData, type UpdateAddressError, type UpdateAddressErrors, type UpdateAddressRequest, type UpdateAddressResponse, type UpdateAddressResponses, type UpdateBlogData, type UpdateBlogError, type UpdateBlogErrors, type UpdateBlogRequest, type UpdateBlogResponse, type UpdateBlogResponses, type UpdateBoardData, type UpdateBoardError, type UpdateBoardErrors, type UpdateBoardRequest, type UpdateBoardResponse, type UpdateBoardResponses, type UpdateCommitteeData, type UpdateCommitteeError, type UpdateCommitteeErrors, type UpdateCommitteeRequest, type UpdateCommitteeResponse, type UpdateCommitteeResponses, type UpdateContributionPeriodData, type UpdateContributionPeriodError, type UpdateContributionPeriodErrors, type UpdateContributionPeriodRequest, type UpdateContributionPeriodResponse, type UpdateContributionPeriodResponses, type UpdateEventData, type UpdateEventError, type UpdateEventErrors, type UpdateEventRequest, type UpdateEventResponse, type UpdateEventResponses, type UpdateEventSignUpData, type UpdateEventSignUpError, type UpdateEventSignUpErrors, type UpdateEventSignUpRequest, type UpdateEventSignUpResponse, type UpdateEventSignUpResponses, type UpdateMemberProfileData, type UpdateMemberProfileError, type UpdateMemberProfileErrors, type UpdateMemberProfileRequest, type UpdateMemberProfileResponse, type UpdateMemberProfileResponses, type UpdateMembershipData, type UpdateMembershipError, type UpdateMembershipErrors, type UpdateMembershipRequest, type UpdateMembershipResponse, type UpdateMembershipResponses, type UpdateSponsorData, type UpdateSponsorError, type UpdateSponsorErrors, type UpdateSponsorRequest, type UpdateSponsorResponse, type UpdateSponsorResponses, type UpdateUserData, type UpdateUserError, type UpdateUserErrors, type UpdateUserRequest, type UpdateUserResponse, type UpdateUserResponses, type UploadEventBannerData, type UploadEventBannerError, type UploadEventBannerErrors, type UploadEventBannerResponse, type UploadEventBannerResponses, type UpsertMemberProfileRequest, type UserActivateData, type UserActivateError, type UserActivateErrors, type UserActivateResponse, type UserActivateResponses, type UserActivationRequest, type UserDetailResponse, type UserSummaryResponse } from './types.gen'; diff --git a/services/frontend/src/services/api/blueshell/sdk.gen.ts b/services/frontend/src/services/api/blueshell/sdk.gen.ts index ff54c6667..fffe87c21 100644 --- a/services/frontend/src/services/api/blueshell/sdk.gen.ts +++ b/services/frontend/src/services/api/blueshell/sdk.gen.ts @@ -2,7 +2,7 @@ import { type Client, formDataBodySerializer, type Options as Options2, type TDataShape } from './client'; import { client } from './client.gen'; -import type { AddMemberData, AddMemberErrors, AddMemberResponses, ApproveEventData, ApproveEventErrors, ApproveEventResponses, AuthenticateData, AuthenticateErrors, AuthenticateResponses, BoardCreateMembershipData, BoardCreateMembershipErrors, BoardCreateMembershipResponses, CreateAddressData, CreateAddressErrors, CreateAddressResponses, CreateBlogData, CreateBlogErrors, CreateBlogResponses, CreateBoardData, CreateBoardErrors, CreateBoardResponses, CreateCommitteeData, CreateCommitteeErrors, CreateCommitteeResponses, CreateContributionData, CreateContributionErrors, CreateContributionPeriodData, CreateContributionPeriodErrors, CreateContributionPeriodResponses, CreateContributionResponses, CreateEventData, CreateEventErrors, CreateEventResponses, CreateEventSignupData, CreateEventSignupErrors, CreateEventSignupResponses, CreateMemberProfileData, CreateMemberProfileErrors, CreateMemberProfileResponses, CreateMembershipData, CreateMembershipErrors, CreateMembershipResponses, CreateSponsorData, CreateSponsorErrors, CreateSponsorResponses, CreateTargetData, CreateTargetErrors, CreateTargetResponses, CreateTelemetryData, CreateTelemetryErrors, CreateTelemetryResponses, CreateUserData, CreateUserErrors, CreateUserResponses, CsrfData, CsrfErrors, CsrfResponses, DeleteAddressByIdData, DeleteAddressByIdErrors, DeleteAddressByIdResponses, DeleteBoardData, DeleteBoardErrors, DeleteBoardResponses, DeleteByIdData, DeleteByIdErrors, DeleteByIdResponses, DeleteCommitteeByIdData, DeleteCommitteeByIdErrors, DeleteCommitteeByIdResponses, DeleteContributionData, DeleteContributionErrors, DeleteContributionPeriodByIdData, DeleteContributionPeriodByIdErrors, DeleteContributionPeriodByIdResponses, DeleteContributionResponses, DeleteEventByIdData, DeleteEventByIdErrors, DeleteEventByIdResponses, DeleteEventSignupData, DeleteEventSignupErrors, DeleteEventSignupResponses, DeleteSponsorByIdData, DeleteSponsorByIdErrors, DeleteSponsorByIdResponses, DeleteUserByIdData, DeleteUserByIdErrors, DeleteUserByIdResponses, DownloadEventBannerData, DownloadEventBannerErrors, DownloadEventBannerResponses, EnqueueData, EnqueueErrors, EnqueueResponses, FindAddressByIdData, FindAddressByIdErrors, FindAddressByIdResponses, FindAllAddressesData, FindAllAddressesErrors, FindAllAddressesResponses, FindAllBoardsData, FindAllBoardsErrors, FindAllBoardsResponses, FindBlogByIdData, FindBlogByIdErrors, FindBlogByIdResponses, FindBlogsData, FindBlogsErrors, FindBlogsResponses, FindBoardByIdData, FindBoardByIdErrors, FindBoardByIdResponses, FindCohortByIdData, FindCohortByIdErrors, FindCohortByIdResponses, FindCohortsData, FindCohortsErrors, FindCohortsResponses, FindCohortSubjectByIdData, FindCohortSubjectByIdErrors, FindCohortSubjectByIdResponses, FindCohortSubjectsData, FindCohortSubjectsErrors, FindCohortSubjectsResponses, FindCommitteeByIdData, FindCommitteeByIdErrors, FindCommitteeByIdResponses, FindCommitteesByUserIdData, FindCommitteesByUserIdErrors, FindCommitteesByUserIdResponses, FindCommitteesData, FindCommitteesErrors, FindCommitteesResponses, FindContributionPeriodsData, FindContributionPeriodsErrors, FindContributionPeriodsResponses, FindContributionRemindersData, FindContributionRemindersErrors, FindContributionRemindersResponses, FindContributionsByPeriodIdData, FindContributionsByPeriodIdErrors, FindContributionsByPeriodIdResponses, FindContributionsData, FindContributionsErrors, FindContributionsResponses, FindCurrentContributionPeriodData, FindCurrentContributionPeriodErrors, FindCurrentContributionPeriodResponses, FindDeletedUsersData, FindDeletedUsersErrors, FindDeletedUsersResponses, FindEventByIdData, FindEventByIdErrors, FindEventByIdResponses, FindEventsData, FindEventsErrors, FindEventSignUpsByAccessTokenData, FindEventSignUpsByAccessTokenErrors, FindEventSignUpsByAccessTokenResponses, FindEventSignUpsByEventIdData, FindEventSignUpsByEventIdErrors, FindEventSignUpsByEventIdResponses, FindEventSignUpsData, FindEventSignUpsErrors, FindEventSignUpsResponses, FindEventsResponses, FindMemberProfileByUserIdData, FindMemberProfileByUserIdErrors, FindMemberProfileByUserIdResponses, FindMembershipByIdData, FindMembershipByIdErrors, FindMembershipByIdResponses, FindMembershipsData, FindMembershipsErrors, FindMembershipsResponses, FindSponsorByIdData, FindSponsorByIdErrors, FindSponsorByIdResponses, FindSponsorsData, FindSponsorsErrors, FindSponsorsResponses, FindTelemetryByIdData, FindTelemetryByIdErrors, FindTelemetryByIdResponses, FindUserByIdData, FindUserByIdErrors, FindUserByIdResponses, FindUsersData, FindUsersErrors, FindUsersResponses, ForwardAuthData, ForwardAuthErrors, ForwardAuthResponses, GetDriftData, GetDriftErrors, GetDriftResponses, GetStats1Data, GetStats1Errors, GetStats1Responses, GetStatsData, GetStatsErrors, GetStatsResponses, HealthCheckData, HealthCheckErrors, HealthCheckResponses, JobTypesData, JobTypesErrors, JobTypesResponses, LinkExistingTargetData, LinkExistingTargetErrors, LinkExistingTargetResponses, LinkUserData, LinkUserErrors, LinkUserResponses, List1Data, List1Errors, List1Responses, ListCohortTargetSystemsData, ListCohortTargetSystemsErrors, ListCohortTargetSystemsResponses, ListData, ListErrors, ListResponses, LogoutData, LogoutErrors, LogoutResponses, MemberActivateData, MemberActivateErrors, MemberActivateResponses, MyServicesData, MyServicesErrors, MyServicesResponses, RemoveMemberData, RemoveMemberErrors, RemoveMemberResponses, RepairMissingAddsData, RepairMissingAddsErrors, RepairMissingAddsResponses, ResendMemberActivationEmailData, ResendMemberActivationEmailErrors, ResendMemberActivationEmailResponses, ResendUserActivationData, ResendUserActivationErrors, ResendUserActivationResponses, ResetPasswordData, ResetPasswordErrors, ResetPasswordResponses, RestoreDeletedUserByIdData, RestoreDeletedUserByIdErrors, RestoreDeletedUserByIdResponses, Retry1Data, Retry1Errors, Retry1Responses, RetryData, RetryErrors, RetryResponses, SearchCohortTargetsData, SearchCohortTargetsErrors, SearchCohortTargetsResponses, SendContributionReminderBatchData, SendContributionReminderBatchErrors, SendContributionReminderBatchResponses, SendContributionReminderData, SendContributionReminderErrors, SendContributionReminderResponses, SetPasswordData, SetPasswordErrors, SetPasswordResponses, SwitchTargetData, SwitchTargetErrors, SwitchTargetResponses, ToggleUserRoleData, ToggleUserRoleErrors, ToggleUserRoleResponses, UpdateAddressData, UpdateAddressErrors, UpdateAddressResponses, UpdateBlogData, UpdateBlogErrors, UpdateBlogResponses, UpdateBoardData, UpdateBoardErrors, UpdateBoardResponses, UpdateCommitteeData, UpdateCommitteeErrors, UpdateCommitteeResponses, UpdateContributionPeriodData, UpdateContributionPeriodErrors, UpdateContributionPeriodResponses, UpdateEventData, UpdateEventErrors, UpdateEventResponses, UpdateEventSignUpData, UpdateEventSignUpErrors, UpdateEventSignUpResponses, UpdateMemberProfileData, UpdateMemberProfileErrors, UpdateMemberProfileResponses, UpdateMembershipData, UpdateMembershipErrors, UpdateMembershipResponses, UpdateSponsorData, UpdateSponsorErrors, UpdateSponsorResponses, UpdateUserData, UpdateUserErrors, UpdateUserResponses, UploadEventBannerData, UploadEventBannerErrors, UploadEventBannerResponses, UserActivateData, UserActivateErrors, UserActivateResponses } from './types.gen'; +import type { AddMemberData, AddMemberErrors, AddMemberResponses, ApplyInboundReconcileData, ApplyInboundReconcileErrors, ApplyInboundReconcileResponses, ApproveEventData, ApproveEventErrors, ApproveEventResponses, AuthenticateData, AuthenticateErrors, AuthenticateResponses, BoardCreateMembershipData, BoardCreateMembershipErrors, BoardCreateMembershipResponses, CreateAddressData, CreateAddressErrors, CreateAddressResponses, CreateBlogData, CreateBlogErrors, CreateBlogResponses, CreateBoardData, CreateBoardErrors, CreateBoardResponses, CreateCommitteeData, CreateCommitteeErrors, CreateCommitteeResponses, CreateContributionData, CreateContributionErrors, CreateContributionPeriodData, CreateContributionPeriodErrors, CreateContributionPeriodResponses, CreateContributionResponses, CreateEventData, CreateEventErrors, CreateEventResponses, CreateEventSignupData, CreateEventSignupErrors, CreateEventSignupResponses, CreateMemberProfileData, CreateMemberProfileErrors, CreateMemberProfileResponses, CreateMembershipData, CreateMembershipErrors, CreateMembershipResponses, CreateSponsorData, CreateSponsorErrors, CreateSponsorResponses, CreateTargetData, CreateTargetErrors, CreateTargetResponses, CreateTelemetryData, CreateTelemetryErrors, CreateTelemetryResponses, CreateUserData, CreateUserErrors, CreateUserResponses, CsrfData, CsrfErrors, CsrfResponses, DeleteAddressByIdData, DeleteAddressByIdErrors, DeleteAddressByIdResponses, DeleteBoardData, DeleteBoardErrors, DeleteBoardResponses, DeleteByIdData, DeleteByIdErrors, DeleteByIdResponses, DeleteCommitteeByIdData, DeleteCommitteeByIdErrors, DeleteCommitteeByIdResponses, DeleteContributionData, DeleteContributionErrors, DeleteContributionPeriodByIdData, DeleteContributionPeriodByIdErrors, DeleteContributionPeriodByIdResponses, DeleteContributionResponses, DeleteEventByIdData, DeleteEventByIdErrors, DeleteEventByIdResponses, DeleteEventSignupData, DeleteEventSignupErrors, DeleteEventSignupResponses, DeleteSponsorByIdData, DeleteSponsorByIdErrors, DeleteSponsorByIdResponses, DeleteUserByIdData, DeleteUserByIdErrors, DeleteUserByIdResponses, DownloadEventBannerData, DownloadEventBannerErrors, DownloadEventBannerResponses, EnqueueData, EnqueueErrors, EnqueueResponses, FindAddressByIdData, FindAddressByIdErrors, FindAddressByIdResponses, FindAllAddressesData, FindAllAddressesErrors, FindAllAddressesResponses, FindAllBoardsData, FindAllBoardsErrors, FindAllBoardsResponses, FindBlogByIdData, FindBlogByIdErrors, FindBlogByIdResponses, FindBlogsData, FindBlogsErrors, FindBlogsResponses, FindBoardByIdData, FindBoardByIdErrors, FindBoardByIdResponses, FindCohortByIdData, FindCohortByIdErrors, FindCohortByIdResponses, FindCohortsData, FindCohortsErrors, FindCohortsResponses, FindCohortSubjectByIdData, FindCohortSubjectByIdErrors, FindCohortSubjectByIdResponses, FindCohortSubjectsData, FindCohortSubjectsErrors, FindCohortSubjectsResponses, FindCommitteeByIdData, FindCommitteeByIdErrors, FindCommitteeByIdResponses, FindCommitteesByUserIdData, FindCommitteesByUserIdErrors, FindCommitteesByUserIdResponses, FindCommitteesData, FindCommitteesErrors, FindCommitteesResponses, FindContributionPeriodsData, FindContributionPeriodsErrors, FindContributionPeriodsResponses, FindContributionRemindersData, FindContributionRemindersErrors, FindContributionRemindersResponses, FindContributionsByPeriodIdData, FindContributionsByPeriodIdErrors, FindContributionsByPeriodIdResponses, FindContributionsData, FindContributionsErrors, FindContributionsResponses, FindCurrentContributionPeriodData, FindCurrentContributionPeriodErrors, FindCurrentContributionPeriodResponses, FindDeletedUsersData, FindDeletedUsersErrors, FindDeletedUsersResponses, FindEventByIdData, FindEventByIdErrors, FindEventByIdResponses, FindEventsData, FindEventsErrors, FindEventSignUpsByAccessTokenData, FindEventSignUpsByAccessTokenErrors, FindEventSignUpsByAccessTokenResponses, FindEventSignUpsByEventIdData, FindEventSignUpsByEventIdErrors, FindEventSignUpsByEventIdResponses, FindEventSignUpsData, FindEventSignUpsErrors, FindEventSignUpsResponses, FindEventsResponses, FindMemberProfileByUserIdData, FindMemberProfileByUserIdErrors, FindMemberProfileByUserIdResponses, FindMembershipByIdData, FindMembershipByIdErrors, FindMembershipByIdResponses, FindMembershipsData, FindMembershipsErrors, FindMembershipsResponses, FindSponsorByIdData, FindSponsorByIdErrors, FindSponsorByIdResponses, FindSponsorsData, FindSponsorsErrors, FindSponsorsResponses, FindTelemetryByIdData, FindTelemetryByIdErrors, FindTelemetryByIdResponses, FindUserByIdData, FindUserByIdErrors, FindUserByIdResponses, FindUsersData, FindUsersErrors, FindUsersResponses, ForwardAuthData, ForwardAuthErrors, ForwardAuthResponses, GetDriftData, GetDriftErrors, GetDriftResponses, GetStats1Data, GetStats1Errors, GetStats1Responses, GetStatsData, GetStatsErrors, GetStatsResponses, HealthCheckData, HealthCheckErrors, HealthCheckResponses, JobTypesData, JobTypesErrors, JobTypesResponses, LinkExistingTargetData, LinkExistingTargetErrors, LinkExistingTargetResponses, LinkUserData, LinkUserErrors, LinkUserResponses, List1Data, List1Errors, List1Responses, ListCohortTargetSystemsData, ListCohortTargetSystemsErrors, ListCohortTargetSystemsResponses, ListData, ListErrors, ListResponses, LogoutData, LogoutErrors, LogoutResponses, MemberActivateData, MemberActivateErrors, MemberActivateResponses, MyServicesData, MyServicesErrors, MyServicesResponses, PreviewInboundReconcileData, PreviewInboundReconcileErrors, PreviewInboundReconcileResponses, RemoveMemberData, RemoveMemberErrors, RemoveMemberResponses, RepairMissingAddsData, RepairMissingAddsErrors, RepairMissingAddsResponses, ResendMemberActivationEmailData, ResendMemberActivationEmailErrors, ResendMemberActivationEmailResponses, ResendUserActivationData, ResendUserActivationErrors, ResendUserActivationResponses, ResetPasswordData, ResetPasswordErrors, ResetPasswordResponses, RestoreDeletedUserByIdData, RestoreDeletedUserByIdErrors, RestoreDeletedUserByIdResponses, Retry1Data, Retry1Errors, Retry1Responses, RetryData, RetryErrors, RetryResponses, SearchCohortTargetsData, SearchCohortTargetsErrors, SearchCohortTargetsResponses, SendContributionReminderBatchData, SendContributionReminderBatchErrors, SendContributionReminderBatchResponses, SendContributionReminderData, SendContributionReminderErrors, SendContributionReminderResponses, SetPasswordData, SetPasswordErrors, SetPasswordResponses, SwitchTargetData, SwitchTargetErrors, SwitchTargetResponses, ToggleUserRoleData, ToggleUserRoleErrors, ToggleUserRoleResponses, UpdateAddressData, UpdateAddressErrors, UpdateAddressResponses, UpdateBlogData, UpdateBlogErrors, UpdateBlogResponses, UpdateBoardData, UpdateBoardErrors, UpdateBoardResponses, UpdateCommitteeData, UpdateCommitteeErrors, UpdateCommitteeResponses, UpdateContributionPeriodData, UpdateContributionPeriodErrors, UpdateContributionPeriodResponses, UpdateEventData, UpdateEventErrors, UpdateEventResponses, UpdateEventSignUpData, UpdateEventSignUpErrors, UpdateEventSignUpResponses, UpdateMemberProfileData, UpdateMemberProfileErrors, UpdateMemberProfileResponses, UpdateMembershipData, UpdateMembershipErrors, UpdateMembershipResponses, UpdateSponsorData, UpdateSponsorErrors, UpdateSponsorResponses, UpdateUserData, UpdateUserErrors, UpdateUserResponses, UploadEventBannerData, UploadEventBannerErrors, UploadEventBannerResponses, UserActivateData, UserActivateErrors, UserActivateResponses } from './types.gen'; export type Options = Options2 & { /** @@ -435,6 +435,22 @@ export const switchTarget = (options: Opti } }); +export const applyInboundReconcile = (options: Options) => (options.client ?? client).post({ + responseType: 'json', + url: '/management/cohort-subjects/{id}/targets/{cohortId}/inbound-reconcile/apply', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options.headers + } +}); + +export const previewInboundReconcile = (options: Options) => (options.client ?? client).post({ + responseType: 'json', + url: '/management/cohort-subjects/{id}/targets/{cohortId}/inbound-reconcile/preview', + ...options +}); + export const listCohortTargetSystems = (options?: Options) => (options?.client ?? client).get({ responseType: 'json', url: '/management/cohort-targets/systems', diff --git a/services/frontend/src/services/api/blueshell/types.gen.ts b/services/frontend/src/services/api/blueshell/types.gen.ts index ae777bf11..1ada2cae5 100644 --- a/services/frontend/src/services/api/blueshell/types.gen.ts +++ b/services/frontend/src/services/api/blueshell/types.gen.ts @@ -598,6 +598,47 @@ export type GuestResponse = { version: number; }; +export type InboundReconcileApplyRequest = { + previewToken: string; + selectedExternalUserIds: Array; +}; + +export type InboundReconcileApplyResponse = { + acceptedCount: number; + jobId?: number; + skippedCount: number; +}; + +export type InboundReconcileMatchedRow = { + alreadyTrue: boolean; + externalLabel?: string; + externalUserId: string; + userEmail?: string; + userFullName?: string; + userId: number; + writable: boolean; +}; + +export type InboundReconcilePreview = { + cohortId: number; + externalTargetId: string; + fact: SubjectFact; + fetchedAt: string; + matched: Array; + previewToken: string; + remoteCount: number; + skipped: Array; + subjectId: number; + system: 'BREVO' | 'GOOGLE_CALENDAR'; + writerSupported: boolean; +}; + +export type InboundReconcileSkippedRow = { + externalLabel?: string; + externalUserId: string; + reason: 'DUPLICATE_REMOTE_ID' | 'MAPPING_CONFLICT' | 'DUPLICATE_USER_MATCH' | 'MAPPED_USER_INACTIVE' | 'UNMATCHED'; +}; + export type JobExecution = { actor?: Actor; attempts: number; @@ -859,6 +900,11 @@ export type SponsorResponse = { version: number; }; +export type SubjectFact = { + key: string; + kind: CohortFactKind; +}; + export type SurveyRequest = { questions: Array; }; @@ -3624,6 +3670,94 @@ export type SwitchTargetResponses = { export type SwitchTargetResponse = SwitchTargetResponses[keyof SwitchTargetResponses]; +export type ApplyInboundReconcileData = { + body: InboundReconcileApplyRequest; + path: { + id: number; + cohortId: number; + }; + query?: never; + url: '/management/cohort-subjects/{id}/targets/{cohortId}/inbound-reconcile/apply'; +}; + +export type ApplyInboundReconcileErrors = { + /** + * Validation error + */ + 400: ApiError; + /** + * Unauthorized + */ + 401: ApiError; + /** + * Forbidden (access denied) + */ + 403: ApiError; + /** + * Not Found + */ + 404: ApiError; + /** + * Server error + */ + 500: ApiError; +}; + +export type ApplyInboundReconcileError = ApplyInboundReconcileErrors[keyof ApplyInboundReconcileErrors]; + +export type ApplyInboundReconcileResponses = { + /** + * OK + */ + 200: InboundReconcileApplyResponse; +}; + +export type ApplyInboundReconcileResponse = ApplyInboundReconcileResponses[keyof ApplyInboundReconcileResponses]; + +export type PreviewInboundReconcileData = { + body?: never; + path: { + id: number; + cohortId: number; + }; + query?: never; + url: '/management/cohort-subjects/{id}/targets/{cohortId}/inbound-reconcile/preview'; +}; + +export type PreviewInboundReconcileErrors = { + /** + * Validation error + */ + 400: ApiError; + /** + * Unauthorized + */ + 401: ApiError; + /** + * Forbidden (access denied) + */ + 403: ApiError; + /** + * Not Found + */ + 404: ApiError; + /** + * Server error + */ + 500: ApiError; +}; + +export type PreviewInboundReconcileError = PreviewInboundReconcileErrors[keyof PreviewInboundReconcileErrors]; + +export type PreviewInboundReconcileResponses = { + /** + * OK + */ + 200: InboundReconcilePreview; +}; + +export type PreviewInboundReconcileResponse = PreviewInboundReconcileResponses[keyof PreviewInboundReconcileResponses]; + export type ListCohortTargetSystemsData = { body?: never; path?: never; diff --git a/services/frontend/tests/unit/domains/cohorts/composables/useInboundReconcile.test.ts b/services/frontend/tests/unit/domains/cohorts/composables/useInboundReconcile.test.ts new file mode 100644 index 000000000..ccd5ee628 --- /dev/null +++ b/services/frontend/tests/unit/domains/cohorts/composables/useInboundReconcile.test.ts @@ -0,0 +1,90 @@ +import { describe, expect, it, vi } from "vitest" +import { useInboundReconcile } from "@/domains/cohorts/composables/useInboundReconcile" +import { + applyInboundReconcileSelection, + fetchInboundReconcilePreview, + type InboundReconcilePreview, +} from "@/domains/cohorts/adapters/cohorts" + +vi.mock("@/domains/cohorts/adapters/cohorts", async (importOriginal) => { + const actual = await importOriginal() + return { + ...actual, + fetchInboundReconcilePreview: vi.fn(), + applyInboundReconcileSelection: vi.fn(), + } +}) + +describe("useInboundReconcile", () => { + it("loads preview and selects only writable matched rows", async () => { + vi.mocked(fetchInboundReconcilePreview).mockResolvedValue(preview()) + const reconcile = useInboundReconcile() + + await reconcile.load(10, 20) + + expect(reconcile.preview.value?.matched).toHaveLength(3) + expect(reconcile.selectedExternalUserIds.value).toEqual(["ext-writable"]) + expect(reconcile.canApply.value).toBe(true) + }) + + it("does not allow apply when the subject fact has no writer", async () => { + vi.mocked(fetchInboundReconcilePreview).mockResolvedValue(preview({ writerSupported: false })) + const reconcile = useInboundReconcile() + + await reconcile.load(10, 20) + const applied = await reconcile.apply(10, 20) + + expect(applied).toBe(false) + expect(reconcile.canApply.value).toBe(false) + expect(applyInboundReconcileSelection).not.toHaveBeenCalled() + }) + + it("applies selected rows with the preview token", async () => { + vi.mocked(fetchInboundReconcilePreview).mockResolvedValue(preview()) + vi.mocked(applyInboundReconcileSelection).mockResolvedValue({ + jobId: 55, + acceptedCount: 1, + skippedCount: 2, + }) + const reconcile = useInboundReconcile() + + await reconcile.load(10, 20) + const applied = await reconcile.apply(10, 20) + + expect(applied).toBe(true) + expect(applyInboundReconcileSelection).toHaveBeenCalledWith(10, 20, "token-1", ["ext-writable"]) + expect(reconcile.applyResult.value?.jobId).toBe(55) + }) +}) + +function preview(overrides: Partial = {}): InboundReconcilePreview { + return { + subjectId: 10, + cohortId: 20, + system: "BREVO", + externalTargetId: "list-20", + fact: { kind: "CONTRIBUTION_PAID", key: "12" }, + writerSupported: true, + previewToken: "token-1", + remoteCount: 4, + matched: [ + row("ext-writable", false, true), + row("ext-true", true, false), + row("ext-unsupported", false, false), + ], + skipped: [{ externalUserId: "ext-skip", externalLabel: null, reason: "UNMATCHED" }], + ...overrides, + } +} + +function row(externalUserId: string, alreadyTrue: boolean, writable: boolean) { + return { + externalUserId, + externalLabel: externalUserId, + userId: externalUserId.length, + userFullName: externalUserId, + userEmail: `${externalUserId}@example.org`, + alreadyTrue, + writable, + } +} From 72ccdaf219c018d9c96e24b856a4a96c23408f49 Mon Sep 17 00:00:00 2001 From: Agents Agent Date: Tue, 30 Jun 2026 12:23:26 +0000 Subject: [PATCH 7/7] refactor(api): slim cohort inbound backend --- services/api/openapi.json | 2 +- .../adapter/brevo/BrevoTargetStrategy.kt | 35 +-- .../adapter/web/CohortTargetController.kt | 37 +-- .../cohort/application/FactWriters.kt | 22 +- .../cohort/application/InboundReconcile.kt | 287 +++++++----------- .../integration/mock/MockTargetStrategy.kt | 9 - .../cohort/application/FactWritersTest.kt | 4 +- .../application/InboundReconcileTest.kt | 4 +- .../src/domains/cohorts/adapters/cohorts.ts | 2 +- .../components/InboundReconcileModal.vue | 2 +- .../api/blueshell/client/types.gen.ts | 2 +- .../src/services/api/blueshell/index.ts | 2 +- .../src/services/api/blueshell/types.gen.ts | 28 +- 13 files changed, 147 insertions(+), 289 deletions(-) diff --git a/services/api/openapi.json b/services/api/openapi.json index 14ea93405..9cec9a480 100644 --- a/services/api/openapi.json +++ b/services/api/openapi.json @@ -1 +1 @@ -{"components":{"schemas":{"Actor":{"properties":{"role":{"$ref":"#/components/schemas/Role"},"type":{"enum":["USER","SYSTEM"],"type":"string"},"userId":{"format":"int64","type":"integer"}},"required":["role","type"],"type":"object"},"AddBoardMemberRequest":{"properties":{"endDate":{"format":"date","type":"string"},"role":{"minLength":1,"type":"string"},"startDate":{"format":"date","type":"string"},"userId":{"format":"int64","type":"integer"}},"required":["role","startDate","userId"],"type":"object"},"AddressResponse":{"properties":{"city":{"type":"string"},"country":{"type":"string"},"createdAt":{"format":"date-time","type":"string"},"houseNumber":{"type":"string"},"id":{"format":"int64","type":"integer"},"street":{"type":"string"},"updatedAt":{"format":"date-time","type":"string"},"userId":{"format":"int64","type":"integer"},"version":{"format":"int64","type":"integer"},"zipCode":{"type":"string"}},"required":["createdAt","id","updatedAt","version"],"type":"object"},"AnswerRequest":{"properties":{"optionSelections":{"items":{"type":"boolean"},"type":"array"},"questionId":{"format":"int64","type":"integer"},"textResponse":{"type":"string"}},"required":["questionId"],"type":"object"},"AnswerResponse":{"properties":{"createdAt":{"format":"date-time","type":"string"},"id":{"format":"int64","type":"integer"},"optionSelections":{"items":{"type":"boolean"},"type":"array"},"questionId":{"format":"int64","type":"integer"},"textResponse":{"type":"string"},"updatedAt":{"format":"date-time","type":"string"},"version":{"format":"int64","type":"integer"}},"required":["createdAt","id","questionId","updatedAt","version"],"type":"object"},"ApiError":{"description":"Problem Details for HTTP APIs including validation errors.","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence.","example":"Validation failed for request.","type":"string"},"errors":{"description":"List of field/object validation errors (present when binding/validation fails).","items":{"$ref":"#/components/schemas/FieldValidationError"},"type":"array"},"instance":{"description":"A URI reference that identifies the specific occurrence.","example":"/api/v1/users","format":"uri","type":"string"},"status":{"description":"HTTP status code.","example":400,"format":"int32","type":"integer"},"title":{"description":"Short, human-readable summary of the problem.","example":"Bad Request","type":"string"},"traceId":{"description":"Trace or correlation id if available (Spring may add this via problem detail handlers).","example":"a8c0c4e5f1c24a7e","type":"string"},"type":{"description":"Problem type URI (RFC 7807).","example":"about:blank","type":"string"}}},"BlogResponse":{"properties":{"createdAt":{"format":"date-time","type":"string"},"html":{"type":"string"},"id":{"format":"int64","type":"integer"},"publishedAt":{"format":"date-time","type":"string"},"title":{"type":"string"},"updatedAt":{"format":"date-time","type":"string"},"url":{"type":"string"},"version":{"format":"int64","type":"integer"}},"required":["createdAt","html","id","publishedAt","title","updatedAt","url","version"],"type":"object"},"BoardCreateMembershipRequest":{"properties":{"endDate":{"format":"date","type":"string"},"incasso":{"type":"boolean"},"memberType":{"$ref":"#/components/schemas/MemberType"},"startDate":{"format":"date","type":"string"},"userId":{"format":"int64","type":"integer"}},"required":["incasso","memberType","userId"],"type":"object"},"BoardMemberResponse":{"properties":{"boardId":{"format":"int64","type":"integer"},"createdAt":{"format":"date-time","type":"string"},"endDate":{"format":"date","type":"string"},"role":{"type":"string"},"startDate":{"format":"date","type":"string"},"updatedAt":{"format":"date-time","type":"string"},"userId":{"format":"int64","type":"integer"},"version":{"format":"int64","type":"integer"}},"required":["boardId","createdAt","role","startDate","updatedAt","userId","version"],"type":"object"},"BoardResponse":{"properties":{"candidate":{"type":"string"},"createdAt":{"format":"date-time","type":"string"},"endDate":{"format":"date","type":"string"},"id":{"format":"int64","type":"integer"},"members":{"items":{"$ref":"#/components/schemas/BoardMemberResponse"},"type":"array"},"name":{"type":"string"},"pictureId":{"format":"int64","type":"integer"},"startDate":{"format":"date","type":"string"},"updatedAt":{"format":"date-time","type":"string"},"version":{"format":"int64","type":"integer"}},"required":["candidate","createdAt","id","members","name","startDate","updatedAt","version"],"type":"object"},"CohortDetail":{"properties":{"externalId":{"type":"string"},"folder":{"type":"string"},"id":{"format":"int64","type":"integer"},"kind":{"$ref":"#/components/schemas/CohortKind"},"label":{"type":"string"},"memberCount":{"format":"int32","type":"integer"},"members":{"items":{"$ref":"#/components/schemas/CohortMemberRow"},"type":"array"},"rules":{"items":{"$ref":"#/components/schemas/CohortRule"},"type":"array"},"system":{"type":"string"}},"required":["id","kind","label","memberCount","members","rules","system"],"type":"object"},"CohortFactKind":{"enum":["ROLE","COMMITTEE","CONTRIBUTION_PAID","MEMBER_IN_PERIOD","NEWSLETTER","ACTIVE_IN_PERIOD"],"type":"string"},"CohortKind":{"enum":["LIST","ROLE","GROUP"],"type":"string"},"CohortMapping":{"properties":{"cohortId":{"format":"int64","type":"integer"},"externalId":{"type":"string"},"kind":{"$ref":"#/components/schemas/CohortKind"},"label":{"type":"string"},"system":{"description":"External system this mapping targets","enum":["BREVO","GOOGLE_CALENDAR"],"type":"string"}},"required":["cohortId","kind","label","system"],"type":"object"},"CohortMemberRow":{"properties":{"cohortMemberId":{"format":"int64","type":"integer"},"isUserDeleted":{"type":"boolean"},"joinedAt":{"format":"date-time","type":"string"},"userEmail":{"type":"string"},"userFullName":{"type":"string"},"userId":{"format":"int64","type":"integer"}},"required":["cohortMemberId","isUserDeleted","joinedAt","userId"],"type":"object"},"CohortRepair":{"properties":{"cohortId":{"format":"int64","type":"integer"},"enqueuedAdds":{"format":"int32","type":"integer"}},"required":["cohortId","enqueuedAdds"],"type":"object"},"CohortRule":{"properties":{"enabled":{"type":"boolean"},"factKey":{"type":"string"},"factKind":{"$ref":"#/components/schemas/CohortFactKind"},"id":{"format":"int64","type":"integer"}},"required":["enabled","factKey","factKind","id"],"type":"object"},"CohortSubjectCategory":{"enum":["COMMITTEES","PERIODS","MEMBERS","OTHER"],"type":"string"},"CohortSubjectDetail":{"properties":{"category":{"$ref":"#/components/schemas/CohortSubjectCategory"},"description":{"type":"string"},"id":{"format":"int64","type":"integer"},"label":{"type":"string"},"mappings":{"items":{"$ref":"#/components/schemas/CohortMapping"},"type":"array"},"members":{"items":{"$ref":"#/components/schemas/CohortSubjectMember"},"type":"array"},"rules":{"items":{"$ref":"#/components/schemas/CohortSubjectRule"},"type":"array"},"type":{"$ref":"#/components/schemas/CohortSubjectType"}},"required":["category","id","label","mappings","members","rules","type"],"type":"object"},"CohortSubjectMember":{"properties":{"cohortMemberId":{"format":"int64","type":"integer"},"isUserDeleted":{"type":"boolean"},"joinedAt":{"format":"date-time","type":"string"},"userEmail":{"type":"string"},"userFullName":{"type":"string"},"userId":{"format":"int64","type":"integer"}},"required":["cohortMemberId","isUserDeleted","joinedAt","userId"],"type":"object"},"CohortSubjectRule":{"properties":{"enabled":{"type":"boolean"},"factKey":{"type":"string"},"factKind":{"$ref":"#/components/schemas/CohortFactKind"},"id":{"format":"int64","type":"integer"}},"required":["enabled","factKey","factKind","id"],"type":"object"},"CohortSubjectSummary":{"properties":{"category":{"$ref":"#/components/schemas/CohortSubjectCategory"},"id":{"format":"int64","type":"integer"},"label":{"type":"string"},"mappingCount":{"format":"int32","type":"integer"},"memberCount":{"format":"int32","type":"integer"},"type":{"$ref":"#/components/schemas/CohortSubjectType"}},"required":["category","id","label","mappingCount","memberCount","type"],"type":"object"},"CohortSubjectType":{"enum":["COMMITTEE_MEMBERS","PERIOD_PAYERS","PERIOD_MEMBERS","PERIOD_ACTIVE_MEMBERS","NEWSLETTER_SUBSCRIBERS","CUSTOM"],"type":"string"},"CohortSummary":{"properties":{"externalId":{"type":"string"},"folder":{"type":"string"},"id":{"format":"int64","type":"integer"},"kind":{"$ref":"#/components/schemas/CohortKind"},"label":{"type":"string"},"memberCount":{"format":"int32","type":"integer"},"system":{"type":"string"}},"required":["id","kind","label","memberCount","system"],"type":"object"},"CommitteeDetailResponse":{"properties":{"createdAt":{"format":"date-time","type":"string"},"description":{"maxLength":4095,"minLength":0,"type":"string"},"id":{"format":"int64","type":"integer"},"members":{"items":{"$ref":"#/components/schemas/CommitteeMemberResponse"},"minItems":1,"type":"array"},"name":{"maxLength":255,"minLength":0,"type":"string"},"updatedAt":{"format":"date-time","type":"string"},"version":{"format":"int64","type":"integer"}},"required":["createdAt","description","id","members","name","updatedAt","version"],"type":"object"},"CommitteeMemberRequest":{"properties":{"role":{"minLength":1,"type":"string"},"userId":{"format":"int64","type":"integer"}},"required":["role","userId"],"type":"object"},"CommitteeMemberResponse":{"properties":{"committeeId":{"format":"int64","type":"integer"},"createdAt":{"format":"date-time","type":"string"},"role":{"minLength":1,"type":"string"},"updatedAt":{"format":"date-time","type":"string"},"userId":{"format":"int64","type":"integer"},"version":{"format":"int64","type":"integer"}},"required":["committeeId","createdAt","role","updatedAt","userId","version"],"type":"object"},"CommitteeResponse":{},"ContributionPeriodResponse":{"properties":{"alumniFee":{"format":"double","type":"number"},"contactListId":{"format":"int64","type":"integer"},"createdAt":{"format":"date-time","type":"string"},"endDate":{"format":"date","type":"string"},"fullYearFee":{"format":"double","type":"number"},"halfYearFee":{"format":"double","type":"number"},"id":{"format":"int64","type":"integer"},"startDate":{"format":"date","type":"string"},"updatedAt":{"format":"date-time","type":"string"},"version":{"format":"int64","type":"integer"}},"required":["alumniFee","createdAt","endDate","fullYearFee","halfYearFee","id","startDate","updatedAt","version"],"type":"object"},"ContributionReminderResponse":{"properties":{"contributionPeriodId":{"format":"int64","type":"integer"},"createdAt":{"format":"date-time","type":"string"},"remindedAt":{"format":"date-time","type":"string"},"updatedAt":{"format":"date-time","type":"string"},"userId":{"format":"int64","type":"integer"},"version":{"format":"int64","type":"integer"}},"required":["contributionPeriodId","createdAt","updatedAt","userId","version"],"type":"object"},"ContributionResponse":{"properties":{"contributionPeriodId":{"format":"int64","type":"integer"},"createdAt":{"format":"date-time","type":"string"},"remindedAt":{"format":"date-time","type":"string"},"updatedAt":{"format":"date-time","type":"string"},"userId":{"format":"int64","type":"integer"},"version":{"format":"int64","type":"integer"}},"required":["contributionPeriodId","createdAt","updatedAt","userId","version"],"type":"object"},"CreateAddressRequest":{"properties":{"city":{"minLength":1,"type":"string"},"country":{"minLength":1,"type":"string"},"houseNumber":{"minLength":1,"type":"string"},"street":{"minLength":1,"type":"string"},"userId":{"format":"int64","type":"integer"},"zipCode":{"minLength":1,"type":"string"}},"required":["city","country","houseNumber","street","userId","zipCode"],"type":"object"},"CreateBlogRequest":{"properties":{"html":{"minLength":1,"type":"string"},"publishedAt":{"format":"date-time","type":"string"},"title":{"minLength":1,"type":"string"}},"required":["html","publishedAt","title"],"type":"object"},"CreateBoardRequest":{"properties":{"candidate":{"minLength":1,"type":"string"},"endDate":{"format":"date","type":"string"},"name":{"maxLength":100,"minLength":1,"type":"string"},"pictureId":{"format":"int64","type":"integer"},"startDate":{"format":"date","type":"string"}},"required":["candidate","name","startDate"],"type":"object"},"CreateCommitteeRequest":{"properties":{"description":{"maxLength":4095,"minLength":0,"type":"string"},"members":{"items":{"$ref":"#/components/schemas/CommitteeMemberRequest"},"minItems":1,"type":"array"},"name":{"maxLength":255,"minLength":0,"type":"string"}},"required":["description","members","name"],"type":"object"},"CreateContributionPeriodRequest":{"properties":{"alumniFee":{"format":"double","type":"number"},"contactListId":{"format":"int64","type":"integer"},"endDate":{"format":"date","type":"string"},"fullYearFee":{"format":"double","type":"number"},"halfYearFee":{"format":"double","type":"number"},"startDate":{"format":"date","type":"string"}},"required":["alumniFee","endDate","fullYearFee","halfYearFee","startDate"],"type":"object"},"CreateContributionReminderRequest":{"properties":{"contributionPeriodId":{"format":"int64","type":"integer"},"userId":{"format":"int64","type":"integer"}},"required":["contributionPeriodId","userId"],"type":"object"},"CreateContributionRequest":{"properties":{"contributionPeriodId":{"format":"int64","type":"integer"},"userId":{"format":"int64","type":"integer"}},"required":["contributionPeriodId","userId"],"type":"object"},"CreateEventRequest":{"properties":{"approved":{"type":"boolean"},"banner":{"$ref":"#/components/schemas/EventBannerRequest"},"committeeId":{"format":"int64","type":"integer"},"description":{"maxLength":4095,"minLength":0,"type":"string"},"endTime":{"format":"date-time","type":"string"},"location":{"type":"string"},"memberPrice":{"format":"double","type":"number"},"membersOnly":{"type":"boolean"},"publicPrice":{"format":"double","type":"number"},"signUp":{"type":"boolean"},"signUpDeadline":{"format":"date-time","type":"string"},"signUpForm":{"$ref":"#/components/schemas/SurveyRequest"},"signUpLimit":{"format":"int32","minimum":1,"type":"integer"},"startTime":{"format":"date-time","type":"string"},"title":{"maxLength":255,"minLength":0,"type":"string"}},"required":["approved","committeeId","description","endTime","membersOnly","signUp","startTime","title"],"type":"object"},"CreateEventSignUpRequest":{"properties":{"answers":{"items":{"$ref":"#/components/schemas/AnswerRequest"},"type":"array"},"guest":{"$ref":"#/components/schemas/CreateGuestRequest"},"userId":{"format":"int64","type":"integer"}},"type":"object"},"CreateGuestRequest":{"properties":{"discord":{"minLength":1,"type":"string"},"email":{"minLength":1,"type":"string"},"name":{"minLength":1,"type":"string"},"phoneNumber":{"type":"string"},"version":{"format":"int64","type":"integer"}},"required":["discord","email","name"],"type":"object"},"CreateMemberProfileRequest":{"properties":{"bhv":{"type":"boolean"},"dateOfBirth":{"format":"date","type":"string"},"ehbo":{"type":"boolean"},"gender":{"type":"string"},"nationality":{"minLength":1,"type":"string"},"studentNumber":{"type":"string"},"userId":{"format":"int64","type":"integer"}},"required":["bhv","dateOfBirth","ehbo","nationality","userId"],"type":"object"},"CreateSponsorRequest":{"properties":{"description":{"maxLength":4095,"minLength":0,"type":"string"},"name":{"maxLength":255,"minLength":0,"type":"string"}},"required":["description","name"],"type":"object"},"CreateTargetRequest":{"properties":{"folderHint":{"type":"string"},"label":{"minLength":1,"type":"string"},"system":{"enum":["BREVO","GOOGLE_CALENDAR"],"type":"string"}},"required":["label","system"],"type":"object"},"CreateTelemetryRequest":{"properties":{"platform":{"$ref":"#/components/schemas/PlatformType"},"url":{"minLength":1,"type":"string"}},"required":["platform","url"],"type":"object"},"CreateUserRequest":{"properties":{"consentPrivacy":{"type":"boolean"},"discord":{"minLength":1,"type":"string"},"email":{"minLength":1,"type":"string"},"firstName":{"minLength":1,"type":"string"},"fullName":{"type":"string"},"initials":{"minLength":1,"type":"string"},"lastName":{"minLength":1,"type":"string"},"memberProfile":{"$ref":"#/components/schemas/UpsertMemberProfileRequest"},"newsletter":{"type":"boolean"},"password":{"type":"string"},"phoneNumber":{"minLength":1,"type":"string"},"photoConsent":{"type":"boolean"},"prefix":{"type":"string"},"username":{"minLength":1,"type":"string"}},"required":["discord","email","firstName","initials","lastName","newsletter","phoneNumber","username"],"type":"object"},"CsrfToken":{"properties":{"headerName":{"type":"string"},"parameterName":{"type":"string"},"token":{"type":"string"}},"type":"object"},"DriftReport":{"properties":{"cohortId":{"format":"int64","type":"integer"},"externalCohortId":{"type":"string"},"extras":{"items":{"$ref":"#/components/schemas/ExtraRow"},"type":"array"},"lastReconciledAt":{"format":"date-time","type":"string"},"missing":{"items":{"$ref":"#/components/schemas/MissingRow"},"type":"array"},"system":{"enum":["BREVO","GOOGLE_CALENDAR"],"type":"string"}},"required":["cohortId","extras","missing","system"],"type":"object"},"Email":{"properties":{"attempts":{"format":"int32","type":"integer"},"createdAt":{"format":"date-time","type":"string"},"deliveredAt":{"format":"date-time","type":"string"},"deliveryStatus":{"enum":["PENDING","SENT","DELIVERED","OPENED","BOUNCED","FAILED"],"type":"string"},"emailType":{"type":"string"},"errorReason":{"type":"string"},"errorType":{"type":"string"},"id":{"format":"int64","type":"integer"},"jobExecutionId":{"format":"int64","type":"integer"},"messageId":{"type":"string"},"openedAt":{"format":"date-time","type":"string"},"recipientEmail":{"type":"string"},"recipientName":{"type":"string"},"sentAt":{"format":"date-time","type":"string"},"subject":{"type":"string"},"updatedAt":{"format":"date-time","type":"string"}},"type":"object"},"EmailStats":{"properties":{"bouncedCount":{"format":"int64","type":"integer"},"deliveredCount":{"format":"int64","type":"integer"},"failedCount":{"format":"int64","type":"integer"},"openedCount":{"format":"int64","type":"integer"},"pendingCount":{"format":"int64","type":"integer"},"sentCount":{"format":"int64","type":"integer"},"totalCount":{"format":"int64","type":"integer"}},"required":["bouncedCount","deliveredCount","failedCount","openedCount","pendingCount","sentCount","totalCount"],"type":"object"},"EnqueueJobRequest":{"properties":{"jobType":{"minLength":1,"type":"string"},"payload":{"additionalProperties":{},"description":"Job payload fields keyed by name; shape depends on the job type","type":"object"}},"required":["jobType"],"type":"object"},"EventBannerRequest":{"properties":{"fileId":{"format":"int64","type":"integer"},"version":{"format":"int64","type":"integer"}},"required":["fileId"],"type":"object"},"EventBannerResponse":{"properties":{"createdAt":{"format":"date-time","type":"string"},"eventId":{"format":"int64","type":"integer"},"fileId":{"format":"int64","type":"integer"},"updatedAt":{"format":"date-time","type":"string"},"version":{"format":"int64","type":"integer"}},"required":["createdAt","eventId","fileId","updatedAt","version"],"type":"object"},"EventResponse":{"properties":{"approved":{"type":"boolean"},"banner":{"$ref":"#/components/schemas/EventBannerResponse"},"committeeId":{"format":"int64","type":"integer"},"createdAt":{"format":"date-time","type":"string"},"description":{"maxLength":4095,"minLength":0,"type":"string"},"endTime":{"format":"date-time","type":"string"},"id":{"format":"int64","type":"integer"},"location":{"type":"string"},"memberPrice":{"format":"double","type":"number"},"membersOnly":{"type":"boolean"},"publicPrice":{"format":"double","type":"number"},"signUp":{"type":"boolean"},"signUpCount":{"format":"int64","type":"integer"},"signUpDeadline":{"format":"date-time","type":"string"},"signUpForm":{"$ref":"#/components/schemas/SurveyResponse"},"signUpLimit":{"format":"int32","type":"integer"},"startTime":{"format":"date-time","type":"string"},"title":{"maxLength":255,"minLength":0,"type":"string"},"updatedAt":{"format":"date-time","type":"string"},"version":{"format":"int64","type":"integer"}},"required":["approved","createdAt","description","endTime","id","membersOnly","signUp","signUpCount","startTime","title","updatedAt","version"],"type":"object"},"EventSignUpResponse":{"properties":{"answers":{"items":{"$ref":"#/components/schemas/AnswerResponse"},"type":"array"},"createdAt":{"format":"date-time","type":"string"},"eventId":{"format":"int64","type":"integer"},"guest":{"$ref":"#/components/schemas/GuestResponse"},"id":{"format":"int64","type":"integer"},"updatedAt":{"format":"date-time","type":"string"},"user":{"$ref":"#/components/schemas/UserSummaryResponse"},"version":{"format":"int64","type":"integer"}},"required":["answers","createdAt","eventId","id","updatedAt","version"],"type":"object"},"ExternalTarget":{"properties":{"externalId":{"type":"string"},"folderLabel":{"type":"string"},"kind":{"$ref":"#/components/schemas/CohortKind"},"label":{"type":"string"},"linkedCohortId":{"format":"int64","type":"integer"},"memberCount":{"format":"int64","type":"integer"},"system":{"enum":["BREVO","GOOGLE_CALENDAR"],"type":"string"}},"required":["externalId","kind","label","system"],"type":"object"},"ExtraRow":{"properties":{"email":{"type":"string"},"externalUserId":{"type":"string"},"fullName":{"type":"string"},"kind":{"enum":["KNOWN_LOCAL_USER","UNKNOWN_EXTERNAL"],"type":"string"},"label":{"type":"string"},"softDeleted":{"type":"boolean"},"userId":{"format":"int64","type":"integer"}},"required":["externalUserId","kind"],"type":"object"},"FieldValidationError":{"description":"Details about a single field/object validation error.","properties":{"code":{"description":"Validation code / constraint key.","example":"Email","type":"string"},"field":{"description":"Field that failed validation (null for global errors).","example":"email","type":"string"},"message":{"description":"Human-readable validation message.","example":"must be a well-formed email address","type":"string"},"objectName":{"description":"Object (target) name that failed validation.","example":"createUserRequest","type":"string"}}},"FileResponse":{"properties":{"createdAt":{"format":"date-time","type":"string"},"id":{"format":"int64","type":"integer"},"mediaType":{"type":"string"},"name":{"maxLength":255,"minLength":0,"type":"string"},"path":{"type":"string"},"size":{"format":"int64","type":"integer"},"type":{"$ref":"#/components/schemas/FileType"},"updatedAt":{"format":"date-time","type":"string"},"version":{"format":"int64","type":"integer"}},"required":["createdAt","id","mediaType","name","path","type","updatedAt","version"],"type":"object"},"FileType":{"enum":["DOCUMENT","PROFILE_PICTURE","EVENT_BANNER","EVENT_PICTURE","SPONSOR_PICTURE"],"type":"string"},"GuestResponse":{"properties":{"createdAt":{"format":"date-time","type":"string"},"discord":{"type":"string"},"email":{"type":"string"},"id":{"format":"int64","type":"integer"},"name":{"type":"string"},"phoneNumber":{"type":"string"},"updatedAt":{"format":"date-time","type":"string"},"version":{"format":"int64","type":"integer"}},"required":["createdAt","discord","email","id","name","updatedAt","version"],"type":"object"},"InboundReconcileApplyRequest":{"properties":{"previewToken":{"type":"string"},"selectedExternalUserIds":{"items":{"type":"string"},"type":"array"}},"required":["previewToken","selectedExternalUserIds"],"type":"object"},"InboundReconcileApplyResponse":{"properties":{"acceptedCount":{"format":"int32","type":"integer"},"jobId":{"format":"int64","type":"integer"},"skippedCount":{"format":"int32","type":"integer"}},"required":["acceptedCount","skippedCount"],"type":"object"},"InboundReconcileMatchedRow":{"properties":{"alreadyTrue":{"type":"boolean"},"externalLabel":{"type":"string"},"externalUserId":{"type":"string"},"userEmail":{"type":"string"},"userFullName":{"type":"string"},"userId":{"format":"int64","type":"integer"},"writable":{"type":"boolean"}},"required":["alreadyTrue","externalUserId","userId","writable"],"type":"object"},"InboundReconcilePreview":{"properties":{"cohortId":{"format":"int64","type":"integer"},"externalTargetId":{"type":"string"},"fact":{"$ref":"#/components/schemas/SubjectFact"},"fetchedAt":{"format":"date-time","type":"string"},"matched":{"items":{"$ref":"#/components/schemas/InboundReconcileMatchedRow"},"type":"array"},"previewToken":{"type":"string"},"remoteCount":{"format":"int32","type":"integer"},"skipped":{"items":{"$ref":"#/components/schemas/InboundReconcileSkippedRow"},"type":"array"},"subjectId":{"format":"int64","type":"integer"},"system":{"enum":["BREVO","GOOGLE_CALENDAR"],"type":"string"},"writerSupported":{"type":"boolean"}},"required":["cohortId","externalTargetId","fact","fetchedAt","matched","previewToken","remoteCount","skipped","subjectId","system","writerSupported"],"type":"object"},"InboundReconcileSkippedRow":{"properties":{"externalLabel":{"type":"string"},"externalUserId":{"type":"string"},"reason":{"enum":["DUPLICATE_REMOTE_ID","MAPPING_CONFLICT","DUPLICATE_USER_MATCH","MAPPED_USER_INACTIVE","UNMATCHED"],"type":"string"}},"required":["externalUserId","reason"],"type":"object"},"JobExecution":{"properties":{"actor":{"$ref":"#/components/schemas/Actor"},"attempts":{"format":"int32","type":"integer"},"category":{"$ref":"#/components/schemas/JobExecutionCategory"},"createdAt":{"format":"date-time","type":"string"},"dedupKey":{"type":"string"},"errorMessage":{"type":"string"},"errorReason":{"type":"string"},"errorType":{"type":"string"},"finishedAt":{"format":"date-time","type":"string"},"id":{"format":"int64","type":"integer"},"initiatedByDisplay":{"type":"string"},"initiatedByFullName":{"type":"string"},"initiatedByRole":{"$ref":"#/components/schemas/Role"},"initiatedByType":{"enum":["USER","SYSTEM"],"type":"string"},"initiatedByUserId":{"format":"int64","type":"integer"},"initiatedByUsername":{"type":"string"},"jobType":{"minLength":1,"type":"string"},"nextAttemptAt":{"format":"date-time","type":"string"},"payload":{"additionalProperties":{},"type":"object"},"queuedAt":{"format":"date-time","type":"string"},"relatedEntities":{"items":{"$ref":"#/components/schemas/JobExecutionRelatedEntity"},"type":"array"},"stackTrace":{"type":"string"},"startedAt":{"format":"date-time","type":"string"},"status":{"$ref":"#/components/schemas/JobExecutionStatus"},"targetSystem":{"enum":["BREVO"],"type":"string"},"updatedAt":{"format":"date-time","type":"string"}},"required":["attempts","jobType","relatedEntities","status"],"type":"object"},"JobExecutionCategory":{"enum":["calendar","contact","cohort","email","other"],"type":"string"},"JobExecutionRelatedEntity":{"properties":{"id":{"format":"int64","type":"integer"},"label":{"type":"string"},"type":{"type":"string"}},"required":["label","type"],"type":"object"},"JobExecutionStatus":{"enum":["QUEUED","RUNNING","SUCCESS","FAILED","DEAD"],"type":"string"},"JobPayloadField":{"properties":{"enumValues":{"items":{"type":"string"},"type":"array"},"kind":{"$ref":"#/components/schemas/JobPayloadFieldKind"},"name":{"type":"string"},"required":{"type":"boolean"},"type":{"type":"string"}},"required":["kind","name","required","type"],"type":"object"},"JobPayloadFieldKind":{"enum":["PRIMITIVE","ENUM","OBJECT"],"type":"string"},"JobStatsDTO":{"properties":{"avgSuccessDurationSeconds":{"format":"double","type":"number"},"deadCount":{"format":"int64","type":"integer"},"deadSinceStartup":{"format":"double","type":"number"},"failedCount":{"format":"int64","type":"integer"},"failedSinceStartup":{"format":"double","type":"number"},"queuedCount":{"format":"int64","type":"integer"},"recoveriesSinceStartup":{"format":"double","type":"number"},"runningCount":{"format":"int64","type":"integer"},"successCount":{"format":"int64","type":"integer"},"totalCount":{"format":"int64","type":"integer"}},"required":["avgSuccessDurationSeconds","deadCount","deadSinceStartup","failedCount","failedSinceStartup","queuedCount","recoveriesSinceStartup","runningCount","successCount","totalCount"],"type":"object"},"JobTypeDescriptor":{"properties":{"payloadFields":{"items":{"$ref":"#/components/schemas/JobPayloadField"},"type":"array"},"type":{"type":"string"}},"required":["payloadFields","type"],"type":"object"},"JwtRequest":{"properties":{"password":{"minLength":1,"type":"string"},"username":{"minLength":1,"type":"string"}},"required":["password","username"],"type":"object"},"LinkExistingTargetRequest":{"properties":{"externalId":{"minLength":1,"type":"string"},"system":{"enum":["BREVO","GOOGLE_CALENDAR"],"type":"string"}},"required":["externalId","system"],"type":"object"},"LinkUserRequest":{"properties":{"externalUserId":{"minLength":1,"type":"string"},"system":{"enum":["BREVO","GOOGLE_CALENDAR"],"type":"string"},"userId":{"format":"int64","type":"integer"}},"required":["externalUserId","system","userId"],"type":"object"},"LinkedUser":{"properties":{"externalUserId":{"type":"string"},"system":{"enum":["BREVO","GOOGLE_CALENDAR"],"type":"string"},"userId":{"format":"int64","type":"integer"}},"required":["externalUserId","system","userId"],"type":"object"},"LoginResponse":{"properties":{"addressId":{"format":"int64","type":"integer"},"expiration":{"format":"int64","type":"integer"},"roles":{"items":{"$ref":"#/components/schemas/Role"},"minItems":1,"type":"array"},"token":{"minLength":1,"type":"string"},"userId":{"format":"int64","type":"integer"},"username":{"minLength":1,"type":"string"}},"required":["expiration","roles","token","userId","username"],"type":"object"},"MemberActivationRequest":{"properties":{"password":{"maxLength":100,"minLength":8,"pattern":"^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[@$!%*?&])[A-Za-z\\d@$!%*?&]+$","type":"string"},"token":{"minLength":1,"type":"string"},"username":{"minLength":1,"type":"string"}},"required":["password","token","username"],"type":"object"},"MemberProfileResponse":{"properties":{"bhv":{"type":"boolean"},"createdAt":{"format":"date-time","type":"string"},"dateOfBirth":{"format":"date","type":"string"},"ehbo":{"type":"boolean"},"gender":{"type":"string"},"id":{"format":"int64","type":"integer"},"nationality":{"type":"string"},"studentNumber":{"type":"string"},"updatedAt":{"format":"date-time","type":"string"},"userId":{"format":"int64","type":"integer"},"version":{"format":"int64","type":"integer"}},"required":["bhv","createdAt","ehbo","id","updatedAt","userId","version"]},"MemberType":{"enum":["ALUMNI","HONORARY","REGULAR","NONE"],"type":"string"},"MembershipResponse":{"properties":{"createdAt":{"format":"date-time","type":"string"},"endDate":{"format":"date","type":"string"},"id":{"format":"int64","type":"integer"},"incasso":{"type":"boolean"},"memberType":{"$ref":"#/components/schemas/MemberType"},"startDate":{"format":"date","type":"string"},"updatedAt":{"format":"date-time","type":"string"},"userId":{"format":"int64","type":"integer"},"version":{"format":"int64","type":"integer"}},"required":["createdAt","id","incasso","memberType","startDate","updatedAt","userId","version"],"type":"object"},"MissingRow":{"properties":{"hasExternalMapping":{"type":"boolean"},"userId":{"format":"int64","type":"integer"}},"required":["hasExternalMapping","userId"],"type":"object"},"PageMetadata":{"properties":{"number":{"format":"int64","type":"integer"},"size":{"format":"int64","type":"integer"},"totalElements":{"format":"int64","type":"integer"},"totalPages":{"format":"int64","type":"integer"}},"type":"object"},"PagedModelEmail":{"properties":{"content":{"items":{"$ref":"#/components/schemas/Email"},"type":"array"},"page":{"$ref":"#/components/schemas/PageMetadata"}},"type":"object"},"PagedModelEventResponse":{"properties":{"content":{"items":{"$ref":"#/components/schemas/EventResponse"},"type":"array"},"page":{"$ref":"#/components/schemas/PageMetadata"}},"type":"object"},"PagedModelJobExecution":{"properties":{"content":{"items":{"$ref":"#/components/schemas/JobExecution"},"type":"array"},"page":{"$ref":"#/components/schemas/PageMetadata"}},"type":"object"},"PagedModelUserDetailResponse":{"properties":{"content":{"items":{"$ref":"#/components/schemas/UserDetailResponse"},"type":"array"},"page":{"$ref":"#/components/schemas/PageMetadata"}},"type":"object"},"PasswordResetRequest":{"properties":{"password":{"maxLength":100,"minLength":8,"pattern":"^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[@$!%*?&])[A-Za-z\\d@$!%*?&]+$","type":"string"},"token":{"minLength":1,"type":"string"}},"required":["password","token"],"type":"object"},"PlatformType":{"enum":["FACEBOOK","LINKEDIN","TWITTER","INSTAGRAM"],"type":"string"},"QuestionRequest":{"properties":{"choiceLabels":{"items":{"type":"string"},"type":"array"},"idx":{"format":"int64","type":"integer"},"label":{"maxLength":2055,"minLength":0,"type":"string"},"required":{"type":"boolean"},"type":{"$ref":"#/components/schemas/QuestionType"}},"required":["idx","label","type"],"type":"object"},"QuestionResponse":{"properties":{"choiceLabels":{"items":{"type":"string"},"type":"array"},"createdAt":{"format":"date-time","type":"string"},"id":{"format":"int64","type":"integer"},"idx":{"format":"int64","type":"integer"},"label":{"maxLength":2055,"minLength":0,"type":"string"},"required":{"type":"boolean"},"surveyId":{"format":"int64","type":"integer"},"type":{"$ref":"#/components/schemas/QuestionType"},"updatedAt":{"format":"date-time","type":"string"},"version":{"format":"int64","type":"integer"}},"required":["createdAt","id","idx","label","surveyId","type","updatedAt","version"],"type":"object"},"QuestionType":{"enum":["OPEN","RADIO","CHECKBOX","DESCRIPTION"],"type":"string"},"RedirectResponse":{"properties":{"path":{"type":"string"}},"required":["path"],"type":"object"},"Role":{"enum":["ANONYMOUS","VEGAN","GUEST","COMPANY","MEMBER","COMMITTEE","BOARD","TREASURER","ADMIN","SYSTEM"],"type":"string"},"ServiceEntry":{"properties":{"description":{"type":"string"},"iconUrl":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"url":{"type":"string"}},"required":["description","iconUrl","id","name","url"],"type":"object"},"SponsorResponse":{"properties":{"createdAt":{"format":"date-time","type":"string"},"description":{"type":"string"},"id":{"format":"int64","type":"integer"},"name":{"type":"string"},"updatedAt":{"format":"date-time","type":"string"},"version":{"format":"int64","type":"integer"}},"required":["createdAt","description","id","name","updatedAt","version"],"type":"object"},"SubjectFact":{"properties":{"key":{"type":"string"},"kind":{"$ref":"#/components/schemas/CohortFactKind"}},"required":["key","kind"],"type":"object"},"SurveyRequest":{"properties":{"questions":{"items":{"$ref":"#/components/schemas/QuestionRequest"},"minItems":1,"type":"array"}},"required":["questions"],"type":"object"},"SurveyResponse":{"properties":{"createdAt":{"format":"date-time","type":"string"},"id":{"format":"int64","type":"integer"},"questions":{"items":{"$ref":"#/components/schemas/QuestionResponse"},"minItems":1,"type":"array"},"responseCount":{"format":"int64","type":"integer"},"updatedAt":{"format":"date-time","type":"string"},"version":{"format":"int64","type":"integer"}},"required":["createdAt","id","questions","responseCount","updatedAt","version"],"type":"object"},"SwitchTargetRequest":{"properties":{"deletePrevious":{"type":"boolean"},"externalId":{"minLength":1,"type":"string"},"reconcileNow":{"type":"boolean"}},"required":["deletePrevious","externalId","reconcileNow"],"type":"object"},"TargetDescriptor":{"properties":{"capabilities":{"items":{"enum":["CATALOG","CREATE","READ_MEMBERS","WRITE_MEMBERS","DELETE"],"type":"string"},"type":"array","uniqueItems":true},"folderLabel":{"type":"string"},"idLabel":{"type":"string"},"kind":{"$ref":"#/components/schemas/CohortKind"},"system":{"enum":["BREVO","GOOGLE_CALENDAR"],"type":"string"},"systemLabel":{"type":"string"},"targetLabel":{"type":"string"}},"required":["capabilities","idLabel","kind","system","systemLabel","targetLabel"],"type":"object"},"TelemetryResponse":{"properties":{"createdAt":{"format":"date-time","type":"string"},"id":{"format":"int64","type":"integer"},"platform":{"$ref":"#/components/schemas/PlatformType"},"updatedAt":{"format":"date-time","type":"string"},"url":{"type":"string"},"version":{"format":"int64","type":"integer"}},"required":["createdAt","id","platform","updatedAt","url","version"],"type":"object"},"UpdateAddressRequest":{"properties":{"city":{"minLength":1,"type":"string"},"country":{"minLength":1,"type":"string"},"houseNumber":{"minLength":1,"type":"string"},"street":{"minLength":1,"type":"string"},"version":{"format":"int64","type":"integer"},"zipCode":{"minLength":1,"type":"string"}},"required":["city","country","houseNumber","street","version","zipCode"],"type":"object"},"UpdateBlogRequest":{"properties":{"html":{"minLength":1,"type":"string"},"publishedAt":{"format":"date-time","type":"string"},"title":{"minLength":1,"type":"string"},"version":{"format":"int64","type":"integer"}},"required":["html","publishedAt","title","version"],"type":"object"},"UpdateBoardRequest":{"properties":{"candidate":{"minLength":1,"type":"string"},"endDate":{"format":"date","type":"string"},"name":{"maxLength":100,"minLength":1,"type":"string"},"pictureId":{"format":"int64","type":"integer"},"startDate":{"format":"date","type":"string"},"version":{"format":"int64","type":"integer"}},"required":["candidate","name","startDate","version"],"type":"object"},"UpdateCommitteeRequest":{"properties":{"description":{"maxLength":4095,"minLength":0,"type":"string"},"members":{"items":{"$ref":"#/components/schemas/CommitteeMemberRequest"},"minItems":1,"type":"array"},"name":{"maxLength":255,"minLength":0,"type":"string"},"version":{"format":"int64","type":"integer"}},"required":["description","members","name","version"],"type":"object"},"UpdateContributionPeriodRequest":{"properties":{"alumniFee":{"format":"double","type":"number"},"contactListId":{"format":"int64","type":"integer"},"endDate":{"format":"date","type":"string"},"fullYearFee":{"format":"double","type":"number"},"halfYearFee":{"format":"double","type":"number"},"startDate":{"format":"date","type":"string"},"version":{"format":"int64","type":"integer"}},"required":["alumniFee","endDate","fullYearFee","halfYearFee","startDate","version"],"type":"object"},"UpdateEventRequest":{"properties":{"approved":{"type":"boolean"},"banner":{"$ref":"#/components/schemas/EventBannerRequest"},"committeeId":{"format":"int64","type":"integer"},"description":{"maxLength":4095,"minLength":0,"type":"string"},"endTime":{"format":"date-time","type":"string"},"location":{"type":"string"},"memberPrice":{"format":"double","type":"number"},"membersOnly":{"type":"boolean"},"publicPrice":{"format":"double","type":"number"},"removeExistingSignUps":{"type":"boolean"},"signUp":{"type":"boolean"},"signUpDeadline":{"format":"date-time","type":"string"},"signUpForm":{"$ref":"#/components/schemas/SurveyRequest"},"signUpLimit":{"format":"int32","minimum":1,"type":"integer"},"startTime":{"format":"date-time","type":"string"},"title":{"maxLength":255,"minLength":0,"type":"string"},"version":{"format":"int64","type":"integer"}},"required":["approved","committeeId","description","endTime","membersOnly","signUp","startTime","title","version"],"type":"object"},"UpdateEventSignUpRequest":{"properties":{"answers":{"items":{"$ref":"#/components/schemas/AnswerRequest"},"type":"array"},"guest":{"$ref":"#/components/schemas/CreateGuestRequest"},"userId":{"format":"int64","type":"integer"},"version":{"format":"int64","type":"integer"}},"type":"object"},"UpdateMemberProfileRequest":{"properties":{"bhv":{"type":"boolean"},"dateOfBirth":{"format":"date","type":"string"},"ehbo":{"type":"boolean"},"gender":{"type":"string"},"nationality":{"minLength":1,"type":"string"},"studentNumber":{"type":"string"},"version":{"format":"int64","type":"integer"}},"required":["bhv","dateOfBirth","ehbo","nationality","version"],"type":"object"},"UpdateMembershipRequest":{"properties":{"endDate":{"format":"date","type":"string"},"incasso":{"type":"boolean"},"memberType":{"$ref":"#/components/schemas/MemberType"},"startDate":{"format":"date","type":"string"},"userId":{"format":"int64","type":"integer"},"version":{"format":"int64","type":"integer"}},"required":["userId","version"],"type":"object"},"UpdateSponsorRequest":{"properties":{"description":{"maxLength":4095,"minLength":0,"type":"string"},"name":{"maxLength":255,"minLength":0,"type":"string"},"version":{"format":"int64","type":"integer"}},"required":["description","name","version"],"type":"object"},"UpdateUserRequest":{"properties":{"discord":{"minLength":1,"type":"string"},"memberProfile":{"$ref":"#/components/schemas/UpsertMemberProfileRequest"},"newsletter":{"type":"boolean"},"phoneNumber":{"minLength":1,"type":"string"},"photoConsent":{"type":"boolean"},"version":{"format":"int64","type":"integer"}},"required":["discord","newsletter","phoneNumber","version"],"type":"object"},"UpsertMemberProfileRequest":{"properties":{"bhv":{"type":"boolean"},"dateOfBirth":{"format":"date","type":"string"},"ehbo":{"type":"boolean"},"gender":{"type":"string"},"nationality":{"minLength":1,"type":"string"},"studentNumber":{"type":"string"},"version":{"format":"int64","type":"integer"}},"required":["bhv","dateOfBirth","ehbo","nationality"],"type":"object"},"UserActivationRequest":{"properties":{"token":{"minLength":1,"type":"string"}},"required":["token"],"type":"object"},"UserDetailResponse":{"properties":{"addressId":{"format":"int64","type":"integer"},"createdAt":{"format":"date-time","type":"string"},"discord":{"type":"string"},"email":{"type":"string"},"enabled":{"type":"boolean"},"firstName":{"type":"string"},"fullName":{"type":"string"},"id":{"format":"int64","type":"integer"},"initials":{"type":"string"},"lastName":{"type":"string"},"newsletter":{"type":"boolean"},"phoneNumber":{"type":"string"},"photoConsent":{"type":"boolean"},"prefix":{"type":"string"},"restoreUntilAt":{"format":"date-time","type":"string"},"roles":{"items":{"$ref":"#/components/schemas/Role"},"type":"array"},"updatedAt":{"format":"date-time","type":"string"},"username":{"type":"string"},"version":{"format":"int64","type":"integer"}},"required":["createdAt","email","enabled","firstName","fullName","id","initials","lastName","newsletter","photoConsent","roles","updatedAt","username","version"],"type":"object"},"UserSummaryResponse":{"properties":{"createdAt":{"format":"date-time","type":"string"},"discord":{"type":"string"},"email":{"type":"string"},"fullName":{"type":"string"},"id":{"format":"int64","type":"integer"},"phoneNumber":{"type":"string"},"updatedAt":{"format":"date-time","type":"string"},"version":{"format":"int64","type":"integer"}},"required":["createdAt","email","fullName","id","updatedAt","version"],"type":"object"}}},"info":{"title":"OpenAPI definition","version":"v0"},"openapi":"3.1.0","paths":{"/addresses":{"get":{"operationId":"findAllAddresses","responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/AddressResponse"},"type":"array"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Addresses"]},"post":{"operationId":"createAddress","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAddressRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddressResponse"}}},"description":"Created"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Addresses"]}},"/addresses/{id}":{"delete":{"operationId":"deleteAddressById","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Addresses"]},"get":{"operationId":"findAddressById","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddressResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Addresses"]},"put":{"operationId":"updateAddress","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAddressRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddressResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Addresses"]}},"/auth":{"post":{"operationId":"authenticate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JwtRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Authentication"]}},"/auth/logout":{"post":{"operationId":"logout","responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Authentication"]}},"/blogs":{"get":{"operationId":"findBlogs","responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/BlogResponse"},"type":"array"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Blogs"]},"post":{"operationId":"createBlog","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBlogRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlogResponse"}}},"description":"Created"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Blogs"]}},"/blogs/{id}":{"delete":{"operationId":"deleteById","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Blogs"]},"get":{"operationId":"findBlogById","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlogResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Blogs"]},"post":{"operationId":"updateBlog","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateBlogRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlogResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Blogs"]}},"/boards":{"get":{"operationId":"findAllBoards","responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/BoardResponse"},"type":"array"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Boards"]},"post":{"operationId":"createBoard","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBoardRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoardResponse"}}},"description":"Created"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Boards"]}},"/boards/{boardId}/members":{"post":{"operationId":"addMember","parameters":[{"in":"path","name":"boardId","required":true,"schema":{"format":"int64","type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddBoardMemberRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoardMemberResponse"}}},"description":"Created"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Boards"]}},"/boards/{boardId}/members/{userId}":{"delete":{"operationId":"removeMember","parameters":[{"in":"path","name":"boardId","required":true,"schema":{"format":"int64","type":"integer"}},{"in":"path","name":"userId","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Boards"]}},"/boards/{id}":{"delete":{"operationId":"deleteBoard","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Boards"]},"get":{"operationId":"findBoardById","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoardResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Boards"]},"put":{"operationId":"updateBoard","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateBoardRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoardResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Boards"]}},"/committeeMembers/committees":{"get":{"operationId":"findCommitteesByUserId","responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/CommitteeResponse"},"type":"array"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Committees"]}},"/committees":{"get":{"operationId":"findCommittees","responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/CommitteeResponse"},"type":"array"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Committees"]},"post":{"operationId":"createCommittee","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCommitteeRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommitteeDetailResponse"}}},"description":"Created"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Committees"]}},"/committees/{committeeId}":{"get":{"operationId":"findCommitteeById","parameters":[{"in":"path","name":"committeeId","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommitteeResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Committees"]}},"/committees/{id}":{"delete":{"operationId":"deleteCommitteeById","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Committees"]},"put":{"operationId":"updateCommittee","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCommitteeRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommitteeDetailResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Committees"]}},"/contributionPeriods":{"get":{"operationId":"findContributionPeriods","responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ContributionPeriodResponse"},"type":"array"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["ContributionPeriods"]},"post":{"operationId":"createContributionPeriod","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateContributionPeriodRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContributionPeriodResponse"}}},"description":"Created"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["ContributionPeriods"]}},"/contributionPeriods/current":{"get":{"operationId":"findCurrentContributionPeriod","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContributionPeriodResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["ContributionPeriods"]}},"/contributionPeriods/{contributionPeriodId}/users/{userId}/contributions":{"delete":{"operationId":"deleteContribution","parameters":[{"in":"path","name":"userId","required":true,"schema":{"format":"int64","type":"integer"}},{"in":"path","name":"contributionPeriodId","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Contributions"]}},"/contributionPeriods/{id}":{"delete":{"operationId":"deleteContributionPeriodById","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["ContributionPeriods"]},"put":{"operationId":"updateContributionPeriod","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateContributionPeriodRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContributionPeriodResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["ContributionPeriods"]}},"/contributionPeriods/{periodId}/contributions":{"get":{"operationId":"findContributionsByPeriodId","parameters":[{"in":"path","name":"periodId","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ContributionResponse"},"type":"array"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Contributions"]}},"/contributionReminders":{"get":{"operationId":"findContributionReminders","parameters":[{"in":"query","name":"contributionPeriodId","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ContributionReminderResponse"},"type":"array"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["ContributionReminders"]},"post":{"operationId":"sendContributionReminder","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateContributionReminderRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContributionReminderResponse"}}},"description":"Created"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["ContributionReminders"]}},"/contributionReminders/batch":{"post":{"operationId":"sendContributionReminderBatch","requestBody":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/CreateContributionReminderRequest"},"type":"array"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ContributionReminderResponse"},"type":"array"}}},"description":"Created"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["ContributionReminders"]}},"/contributions":{"get":{"operationId":"findContributions","parameters":[{"in":"query","name":"contributionPeriodId","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ContributionResponse"},"type":"array"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Contributions"]},"post":{"operationId":"createContribution","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateContributionRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContributionResponse"}}},"description":"Created"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Contributions"]}},"/csrf":{"get":{"operationId":"csrf","parameters":[{"in":"query","name":"csrfToken","required":true,"schema":{"$ref":"#/components/schemas/CsrfToken"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Security"]}},"/events":{"get":{"operationId":"findEvents","parameters":[{"description":"Zero-based page index (0..N)","in":"query","name":"page","required":false,"schema":{"default":0,"minimum":0,"type":"integer"}},{"description":"The size of the page to be returned","in":"query","name":"size","required":false,"schema":{"default":20,"minimum":1,"type":"integer"}},{"description":"Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported.","in":"query","name":"sort","required":false,"schema":{"items":{"type":"string"},"type":"array"}},{"in":"query","name":"from","required":false,"schema":{"format":"date-time","type":"string"}},{"in":"query","name":"to","required":false,"schema":{"format":"date-time","type":"string"}},{"in":"query","name":"approved","required":false,"schema":{"type":"boolean"}},{"in":"query","name":"committeeId","required":false,"schema":{"format":"int64","type":"integer"}},{"in":"query","name":"titleContains","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagedModelEventResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Events"]},"post":{"operationId":"createEvent","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateEventRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventResponse"}}},"description":"Created"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Events"]}},"/events/banners":{"post":{"operationId":"uploadEventBanner","requestBody":{"content":{"multipart/form-data":{"schema":{"properties":{"file":{"format":"binary","type":"string"}},"required":["file"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileResponse"}}},"description":"Created"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Files"]}},"/events/signups":{"get":{"operationId":"findEventSignUps","parameters":[{"in":"query","name":"from","required":false,"schema":{"format":"date-time","type":"string"}},{"in":"query","name":"to","required":false,"schema":{"format":"date-time","type":"string"}},{"in":"query","name":"userId","required":false,"schema":{"format":"int64","type":"integer"}},{"in":"query","name":"committeeId","required":false,"schema":{"format":"int64","type":"integer"}},{"in":"query","name":"approved","required":false,"schema":{"type":"boolean"}},{"in":"query","name":"eventId","required":false,"schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/EventSignUpResponse"},"type":"array"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["EventSignUps"]}},"/events/signups/byAccessToken":{"get":{"operationId":"findEventSignUpsByAccessToken","parameters":[{"in":"header","name":"X-Guest-Access-Token","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/EventSignUpResponse"},"type":"array"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["EventSignUps"]}},"/events/signups/{id}":{"delete":{"operationId":"deleteEventSignup","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}},{"in":"header","name":"X-Guest-Access-Token","required":false,"schema":{"type":"string"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["EventSignUps"]}},"/events/{eventId}":{"delete":{"operationId":"deleteEventById","parameters":[{"in":"path","name":"eventId","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Events"]}},"/events/{eventId}/banners":{"get":{"operationId":"downloadEventBanner","parameters":[{"in":"path","name":"eventId","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"format":"binary","type":"string"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Files"]}},"/events/{eventId}/signups":{"get":{"operationId":"findEventSignUpsByEventId","parameters":[{"in":"path","name":"eventId","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/EventSignUpResponse"},"type":"array"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["EventSignUps"]},"post":{"operationId":"createEventSignup","parameters":[{"in":"path","name":"eventId","required":true,"schema":{"format":"int64","type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateEventSignUpRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventSignUpResponse"}}},"description":"Created"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["EventSignUps"]},"put":{"operationId":"updateEventSignUp","parameters":[{"in":"path","name":"eventId","required":true,"schema":{"format":"int64","type":"integer"}},{"in":"header","name":"X-Guest-Access-Token","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateEventSignUpRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventSignUpResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["EventSignUps"]}},"/events/{id}":{"get":{"operationId":"findEventById","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Events"]},"put":{"operationId":"updateEvent","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateEventRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Events"]}},"/events/{id}/approve":{"put":{"operationId":"approveEvent","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}},{"in":"query","name":"approved","required":true,"schema":{"type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Events"]}},"/health":{"get":{"operationId":"healthCheck","responses":{"200":{"content":{"application/json":{"schema":{"type":"boolean"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Health"]}},"/management/cohort-subjects":{"get":{"operationId":"findCohortSubjects","responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/CohortSubjectSummary"},"type":"array"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Cohort Subjects"]}},"/management/cohort-subjects/{id}":{"get":{"operationId":"findCohortSubjectById","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CohortSubjectDetail"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Cohort Subjects"]}},"/management/cohort-subjects/{id}/drift":{"get":{"operationId":"getDrift","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}},{"in":"query","name":"system","required":true,"schema":{"enum":["BREVO","GOOGLE_CALENDAR"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DriftReport"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Cohort Subjects"]}},"/management/cohort-subjects/{id}/drift/link-user":{"post":{"operationId":"linkUser","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkUserRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedUser"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Cohort Subjects"]}},"/management/cohort-subjects/{id}/targets/existing":{"post":{"operationId":"linkExistingTarget","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkExistingTargetRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CohortMapping"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Cohort Subjects"]}},"/management/cohort-subjects/{id}/targets/new":{"post":{"operationId":"createTarget","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTargetRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CohortMapping"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Cohort Subjects"]}},"/management/cohort-subjects/{id}/targets/{cohortId}":{"put":{"operationId":"switchTarget","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}},{"in":"path","name":"cohortId","required":true,"schema":{"format":"int64","type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwitchTargetRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CohortMapping"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Cohort Subjects"]}},"/management/cohort-subjects/{id}/targets/{cohortId}/inbound-reconcile/apply":{"post":{"operationId":"applyInboundReconcile","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}},{"in":"path","name":"cohortId","required":true,"schema":{"format":"int64","type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboundReconcileApplyRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboundReconcileApplyResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Cohort Subjects"]}},"/management/cohort-subjects/{id}/targets/{cohortId}/inbound-reconcile/preview":{"post":{"operationId":"previewInboundReconcile","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}},{"in":"path","name":"cohortId","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboundReconcilePreview"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Cohort Subjects"]}},"/management/cohort-targets/systems":{"get":{"operationId":"listCohortTargetSystems","responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/TargetDescriptor"},"type":"array"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Cohort Targets"]}},"/management/cohort-targets/{system}":{"get":{"operationId":"searchCohortTargets","parameters":[{"in":"path","name":"system","required":true,"schema":{"enum":["BREVO","GOOGLE_CALENDAR"],"type":"string"}},{"in":"query","name":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ExternalTarget"},"type":"array"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Cohort Targets"]}},"/management/cohorts":{"get":{"operationId":"findCohorts","responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/CohortSummary"},"type":"array"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Cohorts"]}},"/management/cohorts/{id}":{"get":{"operationId":"findCohortById","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CohortDetail"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Cohorts"]}},"/management/cohorts/{id}/repair-missing-adds":{"post":{"operationId":"repairMissingAdds","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CohortRepair"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Cohorts"]}},"/management/emails":{"get":{"operationId":"list_1","parameters":[{"description":"Zero-based page index (0..N)","in":"query","name":"page","required":false,"schema":{"default":0,"minimum":0,"type":"integer"}},{"description":"The size of the page to be returned","in":"query","name":"size","required":false,"schema":{"default":50,"minimum":1,"type":"integer"}},{"description":"Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported.","in":"query","name":"sort","required":false,"schema":{"default":["createdAt,DESC"],"items":{"type":"string"},"type":"array"}},{"in":"query","name":"deliveryStatus","required":false,"schema":{"enum":["PENDING","SENT","DELIVERED","OPENED","BOUNCED","FAILED"],"type":"string"}},{"in":"query","name":"emailType","required":false,"schema":{"type":"string"}},{"in":"query","name":"search","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagedModelEmail"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Email Management"]}},"/management/emails/stats":{"get":{"operationId":"getStats_1","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailStats"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Email Management"]}},"/management/emails/{id}/retry":{"post":{"operationId":"retry_1","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Email"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Email Management"]}},"/management/jobs":{"get":{"operationId":"list","parameters":[{"description":"Zero-based page index (0..N)","in":"query","name":"page","required":false,"schema":{"default":0,"minimum":0,"type":"integer"}},{"description":"The size of the page to be returned","in":"query","name":"size","required":false,"schema":{"default":50,"minimum":1,"type":"integer"}},{"description":"Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported.","in":"query","name":"sort","required":false,"schema":{"default":["updatedAt,DESC"],"items":{"type":"string"},"type":"array"}},{"in":"query","name":"status","required":false,"schema":{"$ref":"#/components/schemas/JobExecutionStatus"}},{"in":"query","name":"category","required":false,"schema":{"$ref":"#/components/schemas/JobExecutionCategory"}},{"in":"query","name":"search","required":false,"schema":{"type":"string"}},{"in":"query","name":"initiatedByType","required":false,"schema":{"enum":["USER","SYSTEM"],"type":"string"}},{"in":"query","name":"jobType","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagedModelJobExecution"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Job Management"]}},"/management/jobs/enqueue":{"post":{"operationId":"enqueue","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnqueueJobRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobExecution"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Job Management"]}},"/management/jobs/stats":{"get":{"operationId":"getStats","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobStatsDTO"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Job Management"]}},"/management/jobs/types":{"get":{"operationId":"jobTypes","responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/JobTypeDescriptor"},"type":"array"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Job Management"]}},"/management/jobs/{id}/retry":{"post":{"operationId":"retry","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobExecution"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Job Management"]}},"/me/services":{"get":{"operationId":"myServices","responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ServiceEntry"},"type":"array"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["My Services"]}},"/memberProfiles":{"post":{"operationId":"createMemberProfile","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMemberProfileRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberProfileResponse"}}},"description":"Created"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Member Profiles"]}},"/memberships":{"get":{"operationId":"findMemberships","parameters":[{"in":"query","name":"from","required":false,"schema":{"format":"date","type":"string"}},{"in":"query","name":"to","required":false,"schema":{"format":"date","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/MembershipResponse"},"type":"array"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Memberships"]},"post":{"operationId":"createMembership","responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MembershipResponse"}}},"description":"Created"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Memberships"]}},"/memberships/{id}":{"get":{"operationId":"findMembershipById","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MembershipResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Memberships"]},"put":{"operationId":"updateMembership","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMembershipRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MembershipResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Memberships"]}},"/oauth2/forward-auth":{"get":{"operationId":"forwardAuth","responses":{"200":{"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Forward Auth"]}},"/recovery/member/activate":{"post":{"operationId":"memberActivate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberActivationRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedirectResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Recovery"]}},"/recovery/password":{"post":{"operationId":"setPassword","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordResetRequest"}}},"required":true},"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Recovery"]}},"/recovery/password/reset/{username}":{"post":{"operationId":"resetPassword","parameters":[{"in":"path","name":"username","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Recovery"]}},"/recovery/user/activate":{"post":{"operationId":"userActivate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserActivationRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedirectResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Recovery"]}},"/recovery/user/activate/resend/{username}":{"post":{"operationId":"resendUserActivation","parameters":[{"in":"path","name":"username","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Recovery"]}},"/recovery/users/{userId}/resend/recovery":{"post":{"operationId":"resendMemberActivationEmail","parameters":[{"in":"path","name":"userId","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Recovery"]}},"/sponsors":{"get":{"operationId":"findSponsors","responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/SponsorResponse"},"type":"array"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Sponsors"]},"post":{"operationId":"createSponsor","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSponsorRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SponsorResponse"}}},"description":"Created"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Sponsors"]}},"/sponsors/{id}":{"delete":{"operationId":"deleteSponsorById","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Sponsors"]},"get":{"operationId":"findSponsorById","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SponsorResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Sponsors"]},"put":{"operationId":"updateSponsor","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSponsorRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SponsorResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Sponsors"]}},"/telemetry":{"post":{"operationId":"createTelemetry","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTelemetryRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TelemetryResponse"}}},"description":"Created"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Telemetries"]}},"/telemetry/{id}":{"get":{"operationId":"findTelemetryById","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TelemetryResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Telemetries"]}},"/users":{"get":{"operationId":"findUsers","parameters":[{"in":"query","name":"username","required":false,"schema":{"type":"string"}},{"in":"query","name":"enabled","required":false,"schema":{"type":"boolean"}},{"description":"Zero-based page index (0..N)","in":"query","name":"page","required":false,"schema":{"default":0,"minimum":0,"type":"integer"}},{"description":"The size of the page to be returned","in":"query","name":"size","required":false,"schema":{"default":20,"minimum":1,"type":"integer"}},{"description":"Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported.","in":"query","name":"sort","required":false,"schema":{"items":{"type":"string"},"type":"array"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagedModelUserDetailResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Users"]},"post":{"operationId":"createUser","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateUserRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserDetailResponse"}}},"description":"Created"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Users"]}},"/users/deleted":{"get":{"operationId":"findDeletedUsers","parameters":[{"description":"Zero-based page index (0..N)","in":"query","name":"page","required":false,"schema":{"default":0,"minimum":0,"type":"integer"}},{"description":"The size of the page to be returned","in":"query","name":"size","required":false,"schema":{"default":20,"minimum":1,"type":"integer"}},{"description":"Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported.","in":"query","name":"sort","required":false,"schema":{"items":{"type":"string"},"type":"array"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagedModelUserDetailResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Users"]}},"/users/{id}":{"put":{"operationId":"updateUser","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateUserRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserDetailResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Users"]}},"/users/{userId}":{"delete":{"operationId":"deleteUserById","parameters":[{"in":"path","name":"userId","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Users"]},"get":{"operationId":"findUserById","parameters":[{"in":"path","name":"userId","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserDetailResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Users"]}},"/users/{userId}/memberProfiles":{"get":{"operationId":"findMemberProfileByUserId","parameters":[{"in":"path","name":"userId","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberProfileResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Member Profiles"]},"put":{"operationId":"updateMemberProfile","parameters":[{"in":"path","name":"userId","required":true,"schema":{"format":"int64","type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMemberProfileRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberProfileResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Member Profiles"]}},"/users/{userId}/memberships":{"post":{"operationId":"boardCreateMembership","parameters":[{"in":"path","name":"userId","required":true,"schema":{"format":"int64","type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoardCreateMembershipRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MembershipResponse"}}},"description":"Created"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Memberships"]}},"/users/{userId}/restore":{"put":{"operationId":"restoreDeletedUserById","parameters":[{"in":"path","name":"userId","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Users"]}},"/users/{userId}/roles":{"put":{"operationId":"toggleUserRole","parameters":[{"in":"path","name":"userId","required":true,"schema":{"format":"int64","type":"integer"}},{"in":"query","name":"role","required":true,"schema":{"$ref":"#/components/schemas/Role"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserDetailResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Users"]}}},"servers":[{"description":"Generated server url","url":"http://localhost:8080"}],"tags":[{"description":"Admin cohort listings + detail","name":"Cohorts"},{"description":"API for managing outbound emails","name":"Email Management"},{"description":"Admin: external cohort target catalog","name":"Cohort Targets"},{"description":"Admin: logical subjects + their per-system mappings","name":"Cohort Subjects"},{"description":"API for managing job executions","name":"Job Management"}]} +{"components":{"schemas":{"Actor":{"properties":{"role":{"$ref":"#/components/schemas/Role"},"type":{"enum":["USER","SYSTEM"],"type":"string"},"userId":{"format":"int64","type":"integer"}},"required":["role","type"],"type":"object"},"AddBoardMemberRequest":{"properties":{"endDate":{"format":"date","type":"string"},"role":{"minLength":1,"type":"string"},"startDate":{"format":"date","type":"string"},"userId":{"format":"int64","type":"integer"}},"required":["role","startDate","userId"],"type":"object"},"AddressResponse":{"properties":{"city":{"type":"string"},"country":{"type":"string"},"createdAt":{"format":"date-time","type":"string"},"houseNumber":{"type":"string"},"id":{"format":"int64","type":"integer"},"street":{"type":"string"},"updatedAt":{"format":"date-time","type":"string"},"userId":{"format":"int64","type":"integer"},"version":{"format":"int64","type":"integer"},"zipCode":{"type":"string"}},"required":["createdAt","id","updatedAt","version"],"type":"object"},"AnswerRequest":{"properties":{"optionSelections":{"items":{"type":"boolean"},"type":"array"},"questionId":{"format":"int64","type":"integer"},"textResponse":{"type":"string"}},"required":["questionId"],"type":"object"},"AnswerResponse":{"properties":{"createdAt":{"format":"date-time","type":"string"},"id":{"format":"int64","type":"integer"},"optionSelections":{"items":{"type":"boolean"},"type":"array"},"questionId":{"format":"int64","type":"integer"},"textResponse":{"type":"string"},"updatedAt":{"format":"date-time","type":"string"},"version":{"format":"int64","type":"integer"}},"required":["createdAt","id","questionId","updatedAt","version"],"type":"object"},"ApiError":{"description":"Problem Details for HTTP APIs including validation errors.","properties":{"detail":{"description":"Human-readable explanation specific to this occurrence.","example":"Validation failed for request.","type":"string"},"errors":{"description":"List of field/object validation errors (present when binding/validation fails).","items":{"$ref":"#/components/schemas/FieldValidationError"},"type":"array"},"instance":{"description":"A URI reference that identifies the specific occurrence.","example":"/api/v1/users","format":"uri","type":"string"},"status":{"description":"HTTP status code.","example":400,"format":"int32","type":"integer"},"title":{"description":"Short, human-readable summary of the problem.","example":"Bad Request","type":"string"},"traceId":{"description":"Trace or correlation id if available (Spring may add this via problem detail handlers).","example":"a8c0c4e5f1c24a7e","type":"string"},"type":{"description":"Problem type URI (RFC 7807).","example":"about:blank","type":"string"}}},"BlogResponse":{"properties":{"createdAt":{"format":"date-time","type":"string"},"html":{"type":"string"},"id":{"format":"int64","type":"integer"},"publishedAt":{"format":"date-time","type":"string"},"title":{"type":"string"},"updatedAt":{"format":"date-time","type":"string"},"url":{"type":"string"},"version":{"format":"int64","type":"integer"}},"required":["createdAt","html","id","publishedAt","title","updatedAt","url","version"],"type":"object"},"BoardCreateMembershipRequest":{"properties":{"endDate":{"format":"date","type":"string"},"incasso":{"type":"boolean"},"memberType":{"$ref":"#/components/schemas/MemberType"},"startDate":{"format":"date","type":"string"},"userId":{"format":"int64","type":"integer"}},"required":["incasso","memberType","userId"],"type":"object"},"BoardMemberResponse":{"properties":{"boardId":{"format":"int64","type":"integer"},"createdAt":{"format":"date-time","type":"string"},"endDate":{"format":"date","type":"string"},"role":{"type":"string"},"startDate":{"format":"date","type":"string"},"updatedAt":{"format":"date-time","type":"string"},"userId":{"format":"int64","type":"integer"},"version":{"format":"int64","type":"integer"}},"required":["boardId","createdAt","role","startDate","updatedAt","userId","version"],"type":"object"},"BoardResponse":{"properties":{"candidate":{"type":"string"},"createdAt":{"format":"date-time","type":"string"},"endDate":{"format":"date","type":"string"},"id":{"format":"int64","type":"integer"},"members":{"items":{"$ref":"#/components/schemas/BoardMemberResponse"},"type":"array"},"name":{"type":"string"},"pictureId":{"format":"int64","type":"integer"},"startDate":{"format":"date","type":"string"},"updatedAt":{"format":"date-time","type":"string"},"version":{"format":"int64","type":"integer"}},"required":["candidate","createdAt","id","members","name","startDate","updatedAt","version"],"type":"object"},"CohortDetail":{"properties":{"externalId":{"type":"string"},"folder":{"type":"string"},"id":{"format":"int64","type":"integer"},"kind":{"$ref":"#/components/schemas/CohortKind"},"label":{"type":"string"},"memberCount":{"format":"int32","type":"integer"},"members":{"items":{"$ref":"#/components/schemas/CohortMemberRow"},"type":"array"},"rules":{"items":{"$ref":"#/components/schemas/CohortRule"},"type":"array"},"system":{"type":"string"}},"required":["id","kind","label","memberCount","members","rules","system"],"type":"object"},"CohortFactKind":{"enum":["ROLE","COMMITTEE","CONTRIBUTION_PAID","MEMBER_IN_PERIOD","NEWSLETTER","ACTIVE_IN_PERIOD"],"type":"string"},"CohortKind":{"enum":["LIST","ROLE","GROUP"],"type":"string"},"CohortMapping":{"properties":{"cohortId":{"format":"int64","type":"integer"},"externalId":{"type":"string"},"kind":{"$ref":"#/components/schemas/CohortKind"},"label":{"type":"string"},"system":{"description":"External system this mapping targets","enum":["BREVO","GOOGLE_CALENDAR"],"type":"string"}},"required":["cohortId","kind","label","system"],"type":"object"},"CohortMemberRow":{"properties":{"cohortMemberId":{"format":"int64","type":"integer"},"isUserDeleted":{"type":"boolean"},"joinedAt":{"format":"date-time","type":"string"},"userEmail":{"type":"string"},"userFullName":{"type":"string"},"userId":{"format":"int64","type":"integer"}},"required":["cohortMemberId","isUserDeleted","joinedAt","userId"],"type":"object"},"CohortRepair":{"properties":{"cohortId":{"format":"int64","type":"integer"},"enqueuedAdds":{"format":"int32","type":"integer"}},"required":["cohortId","enqueuedAdds"],"type":"object"},"CohortRule":{"properties":{"enabled":{"type":"boolean"},"factKey":{"type":"string"},"factKind":{"$ref":"#/components/schemas/CohortFactKind"},"id":{"format":"int64","type":"integer"}},"required":["enabled","factKey","factKind","id"],"type":"object"},"CohortSubjectCategory":{"enum":["COMMITTEES","PERIODS","MEMBERS","OTHER"],"type":"string"},"CohortSubjectDetail":{"properties":{"category":{"$ref":"#/components/schemas/CohortSubjectCategory"},"description":{"type":"string"},"id":{"format":"int64","type":"integer"},"label":{"type":"string"},"mappings":{"items":{"$ref":"#/components/schemas/CohortMapping"},"type":"array"},"members":{"items":{"$ref":"#/components/schemas/CohortSubjectMember"},"type":"array"},"rules":{"items":{"$ref":"#/components/schemas/CohortSubjectRule"},"type":"array"},"type":{"$ref":"#/components/schemas/CohortSubjectType"}},"required":["category","id","label","mappings","members","rules","type"],"type":"object"},"CohortSubjectMember":{"properties":{"cohortMemberId":{"format":"int64","type":"integer"},"isUserDeleted":{"type":"boolean"},"joinedAt":{"format":"date-time","type":"string"},"userEmail":{"type":"string"},"userFullName":{"type":"string"},"userId":{"format":"int64","type":"integer"}},"required":["cohortMemberId","isUserDeleted","joinedAt","userId"],"type":"object"},"CohortSubjectRule":{"properties":{"enabled":{"type":"boolean"},"factKey":{"type":"string"},"factKind":{"$ref":"#/components/schemas/CohortFactKind"},"id":{"format":"int64","type":"integer"}},"required":["enabled","factKey","factKind","id"],"type":"object"},"CohortSubjectSummary":{"properties":{"category":{"$ref":"#/components/schemas/CohortSubjectCategory"},"id":{"format":"int64","type":"integer"},"label":{"type":"string"},"mappingCount":{"format":"int32","type":"integer"},"memberCount":{"format":"int32","type":"integer"},"type":{"$ref":"#/components/schemas/CohortSubjectType"}},"required":["category","id","label","mappingCount","memberCount","type"],"type":"object"},"CohortSubjectType":{"enum":["COMMITTEE_MEMBERS","PERIOD_PAYERS","PERIOD_MEMBERS","PERIOD_ACTIVE_MEMBERS","NEWSLETTER_SUBSCRIBERS","CUSTOM"],"type":"string"},"CohortSummary":{"properties":{"externalId":{"type":"string"},"folder":{"type":"string"},"id":{"format":"int64","type":"integer"},"kind":{"$ref":"#/components/schemas/CohortKind"},"label":{"type":"string"},"memberCount":{"format":"int32","type":"integer"},"system":{"type":"string"}},"required":["id","kind","label","memberCount","system"],"type":"object"},"CommitteeDetailResponse":{"properties":{"createdAt":{"format":"date-time","type":"string"},"description":{"maxLength":4095,"minLength":0,"type":"string"},"id":{"format":"int64","type":"integer"},"members":{"items":{"$ref":"#/components/schemas/CommitteeMemberResponse"},"minItems":1,"type":"array"},"name":{"maxLength":255,"minLength":0,"type":"string"},"updatedAt":{"format":"date-time","type":"string"},"version":{"format":"int64","type":"integer"}},"required":["createdAt","description","id","members","name","updatedAt","version"],"type":"object"},"CommitteeMemberRequest":{"properties":{"role":{"minLength":1,"type":"string"},"userId":{"format":"int64","type":"integer"}},"required":["role","userId"],"type":"object"},"CommitteeMemberResponse":{"properties":{"committeeId":{"format":"int64","type":"integer"},"createdAt":{"format":"date-time","type":"string"},"role":{"minLength":1,"type":"string"},"updatedAt":{"format":"date-time","type":"string"},"userId":{"format":"int64","type":"integer"},"version":{"format":"int64","type":"integer"}},"required":["committeeId","createdAt","role","updatedAt","userId","version"],"type":"object"},"CommitteeResponse":{},"ContributionPeriodResponse":{"properties":{"alumniFee":{"format":"double","type":"number"},"contactListId":{"format":"int64","type":"integer"},"createdAt":{"format":"date-time","type":"string"},"endDate":{"format":"date","type":"string"},"fullYearFee":{"format":"double","type":"number"},"halfYearFee":{"format":"double","type":"number"},"id":{"format":"int64","type":"integer"},"startDate":{"format":"date","type":"string"},"updatedAt":{"format":"date-time","type":"string"},"version":{"format":"int64","type":"integer"}},"required":["alumniFee","createdAt","endDate","fullYearFee","halfYearFee","id","startDate","updatedAt","version"],"type":"object"},"ContributionReminderResponse":{"properties":{"contributionPeriodId":{"format":"int64","type":"integer"},"createdAt":{"format":"date-time","type":"string"},"remindedAt":{"format":"date-time","type":"string"},"updatedAt":{"format":"date-time","type":"string"},"userId":{"format":"int64","type":"integer"},"version":{"format":"int64","type":"integer"}},"required":["contributionPeriodId","createdAt","updatedAt","userId","version"],"type":"object"},"ContributionResponse":{"properties":{"contributionPeriodId":{"format":"int64","type":"integer"},"createdAt":{"format":"date-time","type":"string"},"remindedAt":{"format":"date-time","type":"string"},"updatedAt":{"format":"date-time","type":"string"},"userId":{"format":"int64","type":"integer"},"version":{"format":"int64","type":"integer"}},"required":["contributionPeriodId","createdAt","updatedAt","userId","version"],"type":"object"},"CreateAddressRequest":{"properties":{"city":{"minLength":1,"type":"string"},"country":{"minLength":1,"type":"string"},"houseNumber":{"minLength":1,"type":"string"},"street":{"minLength":1,"type":"string"},"userId":{"format":"int64","type":"integer"},"zipCode":{"minLength":1,"type":"string"}},"required":["city","country","houseNumber","street","userId","zipCode"],"type":"object"},"CreateBlogRequest":{"properties":{"html":{"minLength":1,"type":"string"},"publishedAt":{"format":"date-time","type":"string"},"title":{"minLength":1,"type":"string"}},"required":["html","publishedAt","title"],"type":"object"},"CreateBoardRequest":{"properties":{"candidate":{"minLength":1,"type":"string"},"endDate":{"format":"date","type":"string"},"name":{"maxLength":100,"minLength":1,"type":"string"},"pictureId":{"format":"int64","type":"integer"},"startDate":{"format":"date","type":"string"}},"required":["candidate","name","startDate"],"type":"object"},"CreateCommitteeRequest":{"properties":{"description":{"maxLength":4095,"minLength":0,"type":"string"},"members":{"items":{"$ref":"#/components/schemas/CommitteeMemberRequest"},"minItems":1,"type":"array"},"name":{"maxLength":255,"minLength":0,"type":"string"}},"required":["description","members","name"],"type":"object"},"CreateContributionPeriodRequest":{"properties":{"alumniFee":{"format":"double","type":"number"},"contactListId":{"format":"int64","type":"integer"},"endDate":{"format":"date","type":"string"},"fullYearFee":{"format":"double","type":"number"},"halfYearFee":{"format":"double","type":"number"},"startDate":{"format":"date","type":"string"}},"required":["alumniFee","endDate","fullYearFee","halfYearFee","startDate"],"type":"object"},"CreateContributionReminderRequest":{"properties":{"contributionPeriodId":{"format":"int64","type":"integer"},"userId":{"format":"int64","type":"integer"}},"required":["contributionPeriodId","userId"],"type":"object"},"CreateContributionRequest":{"properties":{"contributionPeriodId":{"format":"int64","type":"integer"},"userId":{"format":"int64","type":"integer"}},"required":["contributionPeriodId","userId"],"type":"object"},"CreateEventRequest":{"properties":{"approved":{"type":"boolean"},"banner":{"$ref":"#/components/schemas/EventBannerRequest"},"committeeId":{"format":"int64","type":"integer"},"description":{"maxLength":4095,"minLength":0,"type":"string"},"endTime":{"format":"date-time","type":"string"},"location":{"type":"string"},"memberPrice":{"format":"double","type":"number"},"membersOnly":{"type":"boolean"},"publicPrice":{"format":"double","type":"number"},"signUp":{"type":"boolean"},"signUpDeadline":{"format":"date-time","type":"string"},"signUpForm":{"$ref":"#/components/schemas/SurveyRequest"},"signUpLimit":{"format":"int32","minimum":1,"type":"integer"},"startTime":{"format":"date-time","type":"string"},"title":{"maxLength":255,"minLength":0,"type":"string"}},"required":["approved","committeeId","description","endTime","membersOnly","signUp","startTime","title"],"type":"object"},"CreateEventSignUpRequest":{"properties":{"answers":{"items":{"$ref":"#/components/schemas/AnswerRequest"},"type":"array"},"guest":{"$ref":"#/components/schemas/CreateGuestRequest"},"userId":{"format":"int64","type":"integer"}},"type":"object"},"CreateGuestRequest":{"properties":{"discord":{"minLength":1,"type":"string"},"email":{"minLength":1,"type":"string"},"name":{"minLength":1,"type":"string"},"phoneNumber":{"type":"string"},"version":{"format":"int64","type":"integer"}},"required":["discord","email","name"],"type":"object"},"CreateMemberProfileRequest":{"properties":{"bhv":{"type":"boolean"},"dateOfBirth":{"format":"date","type":"string"},"ehbo":{"type":"boolean"},"gender":{"type":"string"},"nationality":{"minLength":1,"type":"string"},"studentNumber":{"type":"string"},"userId":{"format":"int64","type":"integer"}},"required":["bhv","dateOfBirth","ehbo","nationality","userId"],"type":"object"},"CreateSponsorRequest":{"properties":{"description":{"maxLength":4095,"minLength":0,"type":"string"},"name":{"maxLength":255,"minLength":0,"type":"string"}},"required":["description","name"],"type":"object"},"CreateTargetRequest":{"properties":{"folderHint":{"type":"string"},"label":{"minLength":1,"type":"string"},"system":{"enum":["BREVO","GOOGLE_CALENDAR"],"type":"string"}},"required":["label","system"],"type":"object"},"CreateTelemetryRequest":{"properties":{"platform":{"$ref":"#/components/schemas/PlatformType"},"url":{"minLength":1,"type":"string"}},"required":["platform","url"],"type":"object"},"CreateUserRequest":{"properties":{"consentPrivacy":{"type":"boolean"},"discord":{"minLength":1,"type":"string"},"email":{"minLength":1,"type":"string"},"firstName":{"minLength":1,"type":"string"},"fullName":{"type":"string"},"initials":{"minLength":1,"type":"string"},"lastName":{"minLength":1,"type":"string"},"memberProfile":{"$ref":"#/components/schemas/UpsertMemberProfileRequest"},"newsletter":{"type":"boolean"},"password":{"type":"string"},"phoneNumber":{"minLength":1,"type":"string"},"photoConsent":{"type":"boolean"},"prefix":{"type":"string"},"username":{"minLength":1,"type":"string"}},"required":["discord","email","firstName","initials","lastName","newsletter","phoneNumber","username"],"type":"object"},"CsrfToken":{"properties":{"headerName":{"type":"string"},"parameterName":{"type":"string"},"token":{"type":"string"}},"type":"object"},"DriftReport":{"properties":{"cohortId":{"format":"int64","type":"integer"},"externalCohortId":{"type":"string"},"extras":{"items":{"$ref":"#/components/schemas/ExtraRow"},"type":"array"},"lastReconciledAt":{"format":"date-time","type":"string"},"missing":{"items":{"$ref":"#/components/schemas/MissingRow"},"type":"array"},"system":{"enum":["BREVO","GOOGLE_CALENDAR"],"type":"string"}},"required":["cohortId","extras","missing","system"],"type":"object"},"Email":{"properties":{"attempts":{"format":"int32","type":"integer"},"createdAt":{"format":"date-time","type":"string"},"deliveredAt":{"format":"date-time","type":"string"},"deliveryStatus":{"enum":["PENDING","SENT","DELIVERED","OPENED","BOUNCED","FAILED"],"type":"string"},"emailType":{"type":"string"},"errorReason":{"type":"string"},"errorType":{"type":"string"},"id":{"format":"int64","type":"integer"},"jobExecutionId":{"format":"int64","type":"integer"},"messageId":{"type":"string"},"openedAt":{"format":"date-time","type":"string"},"recipientEmail":{"type":"string"},"recipientName":{"type":"string"},"sentAt":{"format":"date-time","type":"string"},"subject":{"type":"string"},"updatedAt":{"format":"date-time","type":"string"}},"type":"object"},"EmailStats":{"properties":{"bouncedCount":{"format":"int64","type":"integer"},"deliveredCount":{"format":"int64","type":"integer"},"failedCount":{"format":"int64","type":"integer"},"openedCount":{"format":"int64","type":"integer"},"pendingCount":{"format":"int64","type":"integer"},"sentCount":{"format":"int64","type":"integer"},"totalCount":{"format":"int64","type":"integer"}},"required":["bouncedCount","deliveredCount","failedCount","openedCount","pendingCount","sentCount","totalCount"],"type":"object"},"EnqueueJobRequest":{"properties":{"jobType":{"minLength":1,"type":"string"},"payload":{"additionalProperties":{},"description":"Job payload fields keyed by name; shape depends on the job type","type":"object"}},"required":["jobType"],"type":"object"},"EventBannerRequest":{"properties":{"fileId":{"format":"int64","type":"integer"},"version":{"format":"int64","type":"integer"}},"required":["fileId"],"type":"object"},"EventBannerResponse":{"properties":{"createdAt":{"format":"date-time","type":"string"},"eventId":{"format":"int64","type":"integer"},"fileId":{"format":"int64","type":"integer"},"updatedAt":{"format":"date-time","type":"string"},"version":{"format":"int64","type":"integer"}},"required":["createdAt","eventId","fileId","updatedAt","version"],"type":"object"},"EventResponse":{"properties":{"approved":{"type":"boolean"},"banner":{"$ref":"#/components/schemas/EventBannerResponse"},"committeeId":{"format":"int64","type":"integer"},"createdAt":{"format":"date-time","type":"string"},"description":{"maxLength":4095,"minLength":0,"type":"string"},"endTime":{"format":"date-time","type":"string"},"id":{"format":"int64","type":"integer"},"location":{"type":"string"},"memberPrice":{"format":"double","type":"number"},"membersOnly":{"type":"boolean"},"publicPrice":{"format":"double","type":"number"},"signUp":{"type":"boolean"},"signUpCount":{"format":"int64","type":"integer"},"signUpDeadline":{"format":"date-time","type":"string"},"signUpForm":{"$ref":"#/components/schemas/SurveyResponse"},"signUpLimit":{"format":"int32","type":"integer"},"startTime":{"format":"date-time","type":"string"},"title":{"maxLength":255,"minLength":0,"type":"string"},"updatedAt":{"format":"date-time","type":"string"},"version":{"format":"int64","type":"integer"}},"required":["approved","createdAt","description","endTime","id","membersOnly","signUp","signUpCount","startTime","title","updatedAt","version"],"type":"object"},"EventSignUpResponse":{"properties":{"answers":{"items":{"$ref":"#/components/schemas/AnswerResponse"},"type":"array"},"createdAt":{"format":"date-time","type":"string"},"eventId":{"format":"int64","type":"integer"},"guest":{"$ref":"#/components/schemas/GuestResponse"},"id":{"format":"int64","type":"integer"},"updatedAt":{"format":"date-time","type":"string"},"user":{"$ref":"#/components/schemas/UserSummaryResponse"},"version":{"format":"int64","type":"integer"}},"required":["answers","createdAt","eventId","id","updatedAt","version"],"type":"object"},"ExternalTarget":{"properties":{"externalId":{"type":"string"},"folderLabel":{"type":"string"},"kind":{"$ref":"#/components/schemas/CohortKind"},"label":{"type":"string"},"linkedCohortId":{"format":"int64","type":"integer"},"memberCount":{"format":"int64","type":"integer"},"system":{"enum":["BREVO","GOOGLE_CALENDAR"],"type":"string"}},"required":["externalId","kind","label","system"],"type":"object"},"ExtraRow":{"properties":{"email":{"type":"string"},"externalUserId":{"type":"string"},"fullName":{"type":"string"},"kind":{"enum":["KNOWN_LOCAL_USER","UNKNOWN_EXTERNAL"],"type":"string"},"label":{"type":"string"},"softDeleted":{"type":"boolean"},"userId":{"format":"int64","type":"integer"}},"required":["externalUserId","kind"],"type":"object"},"FieldValidationError":{"description":"Details about a single field/object validation error.","properties":{"code":{"description":"Validation code / constraint key.","example":"Email","type":"string"},"field":{"description":"Field that failed validation (null for global errors).","example":"email","type":"string"},"message":{"description":"Human-readable validation message.","example":"must be a well-formed email address","type":"string"},"objectName":{"description":"Object (target) name that failed validation.","example":"createUserRequest","type":"string"}}},"FileResponse":{"properties":{"createdAt":{"format":"date-time","type":"string"},"id":{"format":"int64","type":"integer"},"mediaType":{"type":"string"},"name":{"maxLength":255,"minLength":0,"type":"string"},"path":{"type":"string"},"size":{"format":"int64","type":"integer"},"type":{"$ref":"#/components/schemas/FileType"},"updatedAt":{"format":"date-time","type":"string"},"version":{"format":"int64","type":"integer"}},"required":["createdAt","id","mediaType","name","path","type","updatedAt","version"],"type":"object"},"FileType":{"enum":["DOCUMENT","PROFILE_PICTURE","EVENT_BANNER","EVENT_PICTURE","SPONSOR_PICTURE"],"type":"string"},"GuestResponse":{"properties":{"createdAt":{"format":"date-time","type":"string"},"discord":{"type":"string"},"email":{"type":"string"},"id":{"format":"int64","type":"integer"},"name":{"type":"string"},"phoneNumber":{"type":"string"},"updatedAt":{"format":"date-time","type":"string"},"version":{"format":"int64","type":"integer"}},"required":["createdAt","discord","email","id","name","updatedAt","version"],"type":"object"},"InboundReconcileApplyRequest":{"properties":{"previewToken":{"type":"string"},"selectedExternalUserIds":{"items":{"type":"string"},"type":"array"}},"required":["previewToken","selectedExternalUserIds"],"type":"object"},"InboundReconcileApplyResponse":{"properties":{"acceptedCount":{"format":"int32","type":"integer"},"jobId":{"format":"int64","type":"integer"},"skippedCount":{"format":"int32","type":"integer"}},"required":["acceptedCount","skippedCount"],"type":"object"},"InboundReconcilePreview":{"properties":{"fact":{"$ref":"#/components/schemas/SubjectFact"},"matched":{"items":{"$ref":"#/components/schemas/InboundReconcileRow"},"type":"array"},"previewToken":{"type":"string"},"remoteCount":{"format":"int32","type":"integer"},"skipped":{"items":{"$ref":"#/components/schemas/InboundReconcileRow"},"type":"array"},"writerSupported":{"type":"boolean"}},"required":["fact","matched","previewToken","remoteCount","skipped","writerSupported"],"type":"object"},"InboundReconcileRow":{"properties":{"alreadyTrue":{"type":"boolean"},"externalLabel":{"type":"string"},"externalUserId":{"type":"string"},"reason":{"enum":["DUPLICATE_REMOTE_ID","MAPPING_CONFLICT","DUPLICATE_USER_MATCH","MAPPED_USER_INACTIVE","UNMATCHED"],"type":"string"},"userEmail":{"type":"string"},"userFullName":{"type":"string"},"userId":{"format":"int64","type":"integer"},"writable":{"type":"boolean"}},"required":["alreadyTrue","externalUserId","writable"],"type":"object"},"JobExecution":{"properties":{"actor":{"$ref":"#/components/schemas/Actor"},"attempts":{"format":"int32","type":"integer"},"category":{"$ref":"#/components/schemas/JobExecutionCategory"},"createdAt":{"format":"date-time","type":"string"},"dedupKey":{"type":"string"},"errorMessage":{"type":"string"},"errorReason":{"type":"string"},"errorType":{"type":"string"},"finishedAt":{"format":"date-time","type":"string"},"id":{"format":"int64","type":"integer"},"initiatedByDisplay":{"type":"string"},"initiatedByFullName":{"type":"string"},"initiatedByRole":{"$ref":"#/components/schemas/Role"},"initiatedByType":{"enum":["USER","SYSTEM"],"type":"string"},"initiatedByUserId":{"format":"int64","type":"integer"},"initiatedByUsername":{"type":"string"},"jobType":{"minLength":1,"type":"string"},"nextAttemptAt":{"format":"date-time","type":"string"},"payload":{"additionalProperties":{},"type":"object"},"queuedAt":{"format":"date-time","type":"string"},"relatedEntities":{"items":{"$ref":"#/components/schemas/JobExecutionRelatedEntity"},"type":"array"},"stackTrace":{"type":"string"},"startedAt":{"format":"date-time","type":"string"},"status":{"$ref":"#/components/schemas/JobExecutionStatus"},"targetSystem":{"enum":["BREVO"],"type":"string"},"updatedAt":{"format":"date-time","type":"string"}},"required":["attempts","jobType","relatedEntities","status"],"type":"object"},"JobExecutionCategory":{"enum":["calendar","contact","cohort","email","other"],"type":"string"},"JobExecutionRelatedEntity":{"properties":{"id":{"format":"int64","type":"integer"},"label":{"type":"string"},"type":{"type":"string"}},"required":["label","type"],"type":"object"},"JobExecutionStatus":{"enum":["QUEUED","RUNNING","SUCCESS","FAILED","DEAD"],"type":"string"},"JobPayloadField":{"properties":{"enumValues":{"items":{"type":"string"},"type":"array"},"kind":{"$ref":"#/components/schemas/JobPayloadFieldKind"},"name":{"type":"string"},"required":{"type":"boolean"},"type":{"type":"string"}},"required":["kind","name","required","type"],"type":"object"},"JobPayloadFieldKind":{"enum":["PRIMITIVE","ENUM","OBJECT"],"type":"string"},"JobStatsDTO":{"properties":{"avgSuccessDurationSeconds":{"format":"double","type":"number"},"deadCount":{"format":"int64","type":"integer"},"deadSinceStartup":{"format":"double","type":"number"},"failedCount":{"format":"int64","type":"integer"},"failedSinceStartup":{"format":"double","type":"number"},"queuedCount":{"format":"int64","type":"integer"},"recoveriesSinceStartup":{"format":"double","type":"number"},"runningCount":{"format":"int64","type":"integer"},"successCount":{"format":"int64","type":"integer"},"totalCount":{"format":"int64","type":"integer"}},"required":["avgSuccessDurationSeconds","deadCount","deadSinceStartup","failedCount","failedSinceStartup","queuedCount","recoveriesSinceStartup","runningCount","successCount","totalCount"],"type":"object"},"JobTypeDescriptor":{"properties":{"payloadFields":{"items":{"$ref":"#/components/schemas/JobPayloadField"},"type":"array"},"type":{"type":"string"}},"required":["payloadFields","type"],"type":"object"},"JwtRequest":{"properties":{"password":{"minLength":1,"type":"string"},"username":{"minLength":1,"type":"string"}},"required":["password","username"],"type":"object"},"LinkExistingTargetRequest":{"properties":{"externalId":{"minLength":1,"type":"string"},"system":{"enum":["BREVO","GOOGLE_CALENDAR"],"type":"string"}},"required":["externalId","system"],"type":"object"},"LinkUserRequest":{"properties":{"externalUserId":{"minLength":1,"type":"string"},"system":{"enum":["BREVO","GOOGLE_CALENDAR"],"type":"string"},"userId":{"format":"int64","type":"integer"}},"required":["externalUserId","system","userId"],"type":"object"},"LinkedUser":{"properties":{"externalUserId":{"type":"string"},"system":{"enum":["BREVO","GOOGLE_CALENDAR"],"type":"string"},"userId":{"format":"int64","type":"integer"}},"required":["externalUserId","system","userId"],"type":"object"},"LoginResponse":{"properties":{"addressId":{"format":"int64","type":"integer"},"expiration":{"format":"int64","type":"integer"},"roles":{"items":{"$ref":"#/components/schemas/Role"},"minItems":1,"type":"array"},"token":{"minLength":1,"type":"string"},"userId":{"format":"int64","type":"integer"},"username":{"minLength":1,"type":"string"}},"required":["expiration","roles","token","userId","username"],"type":"object"},"MemberActivationRequest":{"properties":{"password":{"maxLength":100,"minLength":8,"pattern":"^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[@$!%*?&])[A-Za-z\\d@$!%*?&]+$","type":"string"},"token":{"minLength":1,"type":"string"},"username":{"minLength":1,"type":"string"}},"required":["password","token","username"],"type":"object"},"MemberProfileResponse":{"properties":{"bhv":{"type":"boolean"},"createdAt":{"format":"date-time","type":"string"},"dateOfBirth":{"format":"date","type":"string"},"ehbo":{"type":"boolean"},"gender":{"type":"string"},"id":{"format":"int64","type":"integer"},"nationality":{"type":"string"},"studentNumber":{"type":"string"},"updatedAt":{"format":"date-time","type":"string"},"userId":{"format":"int64","type":"integer"},"version":{"format":"int64","type":"integer"}},"required":["bhv","createdAt","ehbo","id","updatedAt","userId","version"]},"MemberType":{"enum":["ALUMNI","HONORARY","REGULAR","NONE"],"type":"string"},"MembershipResponse":{"properties":{"createdAt":{"format":"date-time","type":"string"},"endDate":{"format":"date","type":"string"},"id":{"format":"int64","type":"integer"},"incasso":{"type":"boolean"},"memberType":{"$ref":"#/components/schemas/MemberType"},"startDate":{"format":"date","type":"string"},"updatedAt":{"format":"date-time","type":"string"},"userId":{"format":"int64","type":"integer"},"version":{"format":"int64","type":"integer"}},"required":["createdAt","id","incasso","memberType","startDate","updatedAt","userId","version"],"type":"object"},"MissingRow":{"properties":{"hasExternalMapping":{"type":"boolean"},"userId":{"format":"int64","type":"integer"}},"required":["hasExternalMapping","userId"],"type":"object"},"PageMetadata":{"properties":{"number":{"format":"int64","type":"integer"},"size":{"format":"int64","type":"integer"},"totalElements":{"format":"int64","type":"integer"},"totalPages":{"format":"int64","type":"integer"}},"type":"object"},"PagedModelEmail":{"properties":{"content":{"items":{"$ref":"#/components/schemas/Email"},"type":"array"},"page":{"$ref":"#/components/schemas/PageMetadata"}},"type":"object"},"PagedModelEventResponse":{"properties":{"content":{"items":{"$ref":"#/components/schemas/EventResponse"},"type":"array"},"page":{"$ref":"#/components/schemas/PageMetadata"}},"type":"object"},"PagedModelJobExecution":{"properties":{"content":{"items":{"$ref":"#/components/schemas/JobExecution"},"type":"array"},"page":{"$ref":"#/components/schemas/PageMetadata"}},"type":"object"},"PagedModelUserDetailResponse":{"properties":{"content":{"items":{"$ref":"#/components/schemas/UserDetailResponse"},"type":"array"},"page":{"$ref":"#/components/schemas/PageMetadata"}},"type":"object"},"PasswordResetRequest":{"properties":{"password":{"maxLength":100,"minLength":8,"pattern":"^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[@$!%*?&])[A-Za-z\\d@$!%*?&]+$","type":"string"},"token":{"minLength":1,"type":"string"}},"required":["password","token"],"type":"object"},"PlatformType":{"enum":["FACEBOOK","LINKEDIN","TWITTER","INSTAGRAM"],"type":"string"},"QuestionRequest":{"properties":{"choiceLabels":{"items":{"type":"string"},"type":"array"},"idx":{"format":"int64","type":"integer"},"label":{"maxLength":2055,"minLength":0,"type":"string"},"required":{"type":"boolean"},"type":{"$ref":"#/components/schemas/QuestionType"}},"required":["idx","label","type"],"type":"object"},"QuestionResponse":{"properties":{"choiceLabels":{"items":{"type":"string"},"type":"array"},"createdAt":{"format":"date-time","type":"string"},"id":{"format":"int64","type":"integer"},"idx":{"format":"int64","type":"integer"},"label":{"maxLength":2055,"minLength":0,"type":"string"},"required":{"type":"boolean"},"surveyId":{"format":"int64","type":"integer"},"type":{"$ref":"#/components/schemas/QuestionType"},"updatedAt":{"format":"date-time","type":"string"},"version":{"format":"int64","type":"integer"}},"required":["createdAt","id","idx","label","surveyId","type","updatedAt","version"],"type":"object"},"QuestionType":{"enum":["OPEN","RADIO","CHECKBOX","DESCRIPTION"],"type":"string"},"RedirectResponse":{"properties":{"path":{"type":"string"}},"required":["path"],"type":"object"},"Role":{"enum":["ANONYMOUS","VEGAN","GUEST","COMPANY","MEMBER","COMMITTEE","BOARD","TREASURER","ADMIN","SYSTEM"],"type":"string"},"ServiceEntry":{"properties":{"description":{"type":"string"},"iconUrl":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"url":{"type":"string"}},"required":["description","iconUrl","id","name","url"],"type":"object"},"SponsorResponse":{"properties":{"createdAt":{"format":"date-time","type":"string"},"description":{"type":"string"},"id":{"format":"int64","type":"integer"},"name":{"type":"string"},"updatedAt":{"format":"date-time","type":"string"},"version":{"format":"int64","type":"integer"}},"required":["createdAt","description","id","name","updatedAt","version"],"type":"object"},"SubjectFact":{"properties":{"key":{"type":"string"},"kind":{"$ref":"#/components/schemas/CohortFactKind"}},"required":["key","kind"],"type":"object"},"SurveyRequest":{"properties":{"questions":{"items":{"$ref":"#/components/schemas/QuestionRequest"},"minItems":1,"type":"array"}},"required":["questions"],"type":"object"},"SurveyResponse":{"properties":{"createdAt":{"format":"date-time","type":"string"},"id":{"format":"int64","type":"integer"},"questions":{"items":{"$ref":"#/components/schemas/QuestionResponse"},"minItems":1,"type":"array"},"responseCount":{"format":"int64","type":"integer"},"updatedAt":{"format":"date-time","type":"string"},"version":{"format":"int64","type":"integer"}},"required":["createdAt","id","questions","responseCount","updatedAt","version"],"type":"object"},"SwitchTargetRequest":{"properties":{"deletePrevious":{"type":"boolean"},"externalId":{"minLength":1,"type":"string"},"reconcileNow":{"type":"boolean"}},"required":["deletePrevious","externalId","reconcileNow"],"type":"object"},"TargetDescriptor":{"properties":{"capabilities":{"items":{"enum":["CATALOG","CREATE","READ_MEMBERS","WRITE_MEMBERS","DELETE"],"type":"string"},"type":"array","uniqueItems":true},"folderLabel":{"type":"string"},"idLabel":{"type":"string"},"kind":{"$ref":"#/components/schemas/CohortKind"},"system":{"enum":["BREVO","GOOGLE_CALENDAR"],"type":"string"},"systemLabel":{"type":"string"},"targetLabel":{"type":"string"}},"required":["capabilities","idLabel","kind","system","systemLabel","targetLabel"],"type":"object"},"TelemetryResponse":{"properties":{"createdAt":{"format":"date-time","type":"string"},"id":{"format":"int64","type":"integer"},"platform":{"$ref":"#/components/schemas/PlatformType"},"updatedAt":{"format":"date-time","type":"string"},"url":{"type":"string"},"version":{"format":"int64","type":"integer"}},"required":["createdAt","id","platform","updatedAt","url","version"],"type":"object"},"UpdateAddressRequest":{"properties":{"city":{"minLength":1,"type":"string"},"country":{"minLength":1,"type":"string"},"houseNumber":{"minLength":1,"type":"string"},"street":{"minLength":1,"type":"string"},"version":{"format":"int64","type":"integer"},"zipCode":{"minLength":1,"type":"string"}},"required":["city","country","houseNumber","street","version","zipCode"],"type":"object"},"UpdateBlogRequest":{"properties":{"html":{"minLength":1,"type":"string"},"publishedAt":{"format":"date-time","type":"string"},"title":{"minLength":1,"type":"string"},"version":{"format":"int64","type":"integer"}},"required":["html","publishedAt","title","version"],"type":"object"},"UpdateBoardRequest":{"properties":{"candidate":{"minLength":1,"type":"string"},"endDate":{"format":"date","type":"string"},"name":{"maxLength":100,"minLength":1,"type":"string"},"pictureId":{"format":"int64","type":"integer"},"startDate":{"format":"date","type":"string"},"version":{"format":"int64","type":"integer"}},"required":["candidate","name","startDate","version"],"type":"object"},"UpdateCommitteeRequest":{"properties":{"description":{"maxLength":4095,"minLength":0,"type":"string"},"members":{"items":{"$ref":"#/components/schemas/CommitteeMemberRequest"},"minItems":1,"type":"array"},"name":{"maxLength":255,"minLength":0,"type":"string"},"version":{"format":"int64","type":"integer"}},"required":["description","members","name","version"],"type":"object"},"UpdateContributionPeriodRequest":{"properties":{"alumniFee":{"format":"double","type":"number"},"contactListId":{"format":"int64","type":"integer"},"endDate":{"format":"date","type":"string"},"fullYearFee":{"format":"double","type":"number"},"halfYearFee":{"format":"double","type":"number"},"startDate":{"format":"date","type":"string"},"version":{"format":"int64","type":"integer"}},"required":["alumniFee","endDate","fullYearFee","halfYearFee","startDate","version"],"type":"object"},"UpdateEventRequest":{"properties":{"approved":{"type":"boolean"},"banner":{"$ref":"#/components/schemas/EventBannerRequest"},"committeeId":{"format":"int64","type":"integer"},"description":{"maxLength":4095,"minLength":0,"type":"string"},"endTime":{"format":"date-time","type":"string"},"location":{"type":"string"},"memberPrice":{"format":"double","type":"number"},"membersOnly":{"type":"boolean"},"publicPrice":{"format":"double","type":"number"},"removeExistingSignUps":{"type":"boolean"},"signUp":{"type":"boolean"},"signUpDeadline":{"format":"date-time","type":"string"},"signUpForm":{"$ref":"#/components/schemas/SurveyRequest"},"signUpLimit":{"format":"int32","minimum":1,"type":"integer"},"startTime":{"format":"date-time","type":"string"},"title":{"maxLength":255,"minLength":0,"type":"string"},"version":{"format":"int64","type":"integer"}},"required":["approved","committeeId","description","endTime","membersOnly","signUp","startTime","title","version"],"type":"object"},"UpdateEventSignUpRequest":{"properties":{"answers":{"items":{"$ref":"#/components/schemas/AnswerRequest"},"type":"array"},"guest":{"$ref":"#/components/schemas/CreateGuestRequest"},"userId":{"format":"int64","type":"integer"},"version":{"format":"int64","type":"integer"}},"type":"object"},"UpdateMemberProfileRequest":{"properties":{"bhv":{"type":"boolean"},"dateOfBirth":{"format":"date","type":"string"},"ehbo":{"type":"boolean"},"gender":{"type":"string"},"nationality":{"minLength":1,"type":"string"},"studentNumber":{"type":"string"},"version":{"format":"int64","type":"integer"}},"required":["bhv","dateOfBirth","ehbo","nationality","version"],"type":"object"},"UpdateMembershipRequest":{"properties":{"endDate":{"format":"date","type":"string"},"incasso":{"type":"boolean"},"memberType":{"$ref":"#/components/schemas/MemberType"},"startDate":{"format":"date","type":"string"},"userId":{"format":"int64","type":"integer"},"version":{"format":"int64","type":"integer"}},"required":["userId","version"],"type":"object"},"UpdateSponsorRequest":{"properties":{"description":{"maxLength":4095,"minLength":0,"type":"string"},"name":{"maxLength":255,"minLength":0,"type":"string"},"version":{"format":"int64","type":"integer"}},"required":["description","name","version"],"type":"object"},"UpdateUserRequest":{"properties":{"discord":{"minLength":1,"type":"string"},"memberProfile":{"$ref":"#/components/schemas/UpsertMemberProfileRequest"},"newsletter":{"type":"boolean"},"phoneNumber":{"minLength":1,"type":"string"},"photoConsent":{"type":"boolean"},"version":{"format":"int64","type":"integer"}},"required":["discord","newsletter","phoneNumber","version"],"type":"object"},"UpsertMemberProfileRequest":{"properties":{"bhv":{"type":"boolean"},"dateOfBirth":{"format":"date","type":"string"},"ehbo":{"type":"boolean"},"gender":{"type":"string"},"nationality":{"minLength":1,"type":"string"},"studentNumber":{"type":"string"},"version":{"format":"int64","type":"integer"}},"required":["bhv","dateOfBirth","ehbo","nationality"],"type":"object"},"UserActivationRequest":{"properties":{"token":{"minLength":1,"type":"string"}},"required":["token"],"type":"object"},"UserDetailResponse":{"properties":{"addressId":{"format":"int64","type":"integer"},"createdAt":{"format":"date-time","type":"string"},"discord":{"type":"string"},"email":{"type":"string"},"enabled":{"type":"boolean"},"firstName":{"type":"string"},"fullName":{"type":"string"},"id":{"format":"int64","type":"integer"},"initials":{"type":"string"},"lastName":{"type":"string"},"newsletter":{"type":"boolean"},"phoneNumber":{"type":"string"},"photoConsent":{"type":"boolean"},"prefix":{"type":"string"},"restoreUntilAt":{"format":"date-time","type":"string"},"roles":{"items":{"$ref":"#/components/schemas/Role"},"type":"array"},"updatedAt":{"format":"date-time","type":"string"},"username":{"type":"string"},"version":{"format":"int64","type":"integer"}},"required":["createdAt","email","enabled","firstName","fullName","id","initials","lastName","newsletter","photoConsent","roles","updatedAt","username","version"],"type":"object"},"UserSummaryResponse":{"properties":{"createdAt":{"format":"date-time","type":"string"},"discord":{"type":"string"},"email":{"type":"string"},"fullName":{"type":"string"},"id":{"format":"int64","type":"integer"},"phoneNumber":{"type":"string"},"updatedAt":{"format":"date-time","type":"string"},"version":{"format":"int64","type":"integer"}},"required":["createdAt","email","fullName","id","updatedAt","version"],"type":"object"}}},"info":{"title":"OpenAPI definition","version":"v0"},"openapi":"3.1.0","paths":{"/addresses":{"get":{"operationId":"findAllAddresses","responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/AddressResponse"},"type":"array"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Addresses"]},"post":{"operationId":"createAddress","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAddressRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddressResponse"}}},"description":"Created"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Addresses"]}},"/addresses/{id}":{"delete":{"operationId":"deleteAddressById","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Addresses"]},"get":{"operationId":"findAddressById","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddressResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Addresses"]},"put":{"operationId":"updateAddress","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAddressRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddressResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Addresses"]}},"/auth":{"post":{"operationId":"authenticate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JwtRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Authentication"]}},"/auth/logout":{"post":{"operationId":"logout","responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Authentication"]}},"/blogs":{"get":{"operationId":"findBlogs","responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/BlogResponse"},"type":"array"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Blogs"]},"post":{"operationId":"createBlog","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBlogRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlogResponse"}}},"description":"Created"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Blogs"]}},"/blogs/{id}":{"delete":{"operationId":"deleteById","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Blogs"]},"get":{"operationId":"findBlogById","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlogResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Blogs"]},"post":{"operationId":"updateBlog","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateBlogRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlogResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Blogs"]}},"/boards":{"get":{"operationId":"findAllBoards","responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/BoardResponse"},"type":"array"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Boards"]},"post":{"operationId":"createBoard","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBoardRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoardResponse"}}},"description":"Created"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Boards"]}},"/boards/{boardId}/members":{"post":{"operationId":"addMember","parameters":[{"in":"path","name":"boardId","required":true,"schema":{"format":"int64","type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddBoardMemberRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoardMemberResponse"}}},"description":"Created"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Boards"]}},"/boards/{boardId}/members/{userId}":{"delete":{"operationId":"removeMember","parameters":[{"in":"path","name":"boardId","required":true,"schema":{"format":"int64","type":"integer"}},{"in":"path","name":"userId","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Boards"]}},"/boards/{id}":{"delete":{"operationId":"deleteBoard","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Boards"]},"get":{"operationId":"findBoardById","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoardResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Boards"]},"put":{"operationId":"updateBoard","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateBoardRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoardResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Boards"]}},"/committeeMembers/committees":{"get":{"operationId":"findCommitteesByUserId","responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/CommitteeResponse"},"type":"array"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Committees"]}},"/committees":{"get":{"operationId":"findCommittees","responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/CommitteeResponse"},"type":"array"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Committees"]},"post":{"operationId":"createCommittee","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCommitteeRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommitteeDetailResponse"}}},"description":"Created"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Committees"]}},"/committees/{committeeId}":{"get":{"operationId":"findCommitteeById","parameters":[{"in":"path","name":"committeeId","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommitteeResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Committees"]}},"/committees/{id}":{"delete":{"operationId":"deleteCommitteeById","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Committees"]},"put":{"operationId":"updateCommittee","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCommitteeRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommitteeDetailResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Committees"]}},"/contributionPeriods":{"get":{"operationId":"findContributionPeriods","responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ContributionPeriodResponse"},"type":"array"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["ContributionPeriods"]},"post":{"operationId":"createContributionPeriod","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateContributionPeriodRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContributionPeriodResponse"}}},"description":"Created"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["ContributionPeriods"]}},"/contributionPeriods/current":{"get":{"operationId":"findCurrentContributionPeriod","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContributionPeriodResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["ContributionPeriods"]}},"/contributionPeriods/{contributionPeriodId}/users/{userId}/contributions":{"delete":{"operationId":"deleteContribution","parameters":[{"in":"path","name":"userId","required":true,"schema":{"format":"int64","type":"integer"}},{"in":"path","name":"contributionPeriodId","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Contributions"]}},"/contributionPeriods/{id}":{"delete":{"operationId":"deleteContributionPeriodById","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["ContributionPeriods"]},"put":{"operationId":"updateContributionPeriod","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateContributionPeriodRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContributionPeriodResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["ContributionPeriods"]}},"/contributionPeriods/{periodId}/contributions":{"get":{"operationId":"findContributionsByPeriodId","parameters":[{"in":"path","name":"periodId","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ContributionResponse"},"type":"array"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Contributions"]}},"/contributionReminders":{"get":{"operationId":"findContributionReminders","parameters":[{"in":"query","name":"contributionPeriodId","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ContributionReminderResponse"},"type":"array"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["ContributionReminders"]},"post":{"operationId":"sendContributionReminder","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateContributionReminderRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContributionReminderResponse"}}},"description":"Created"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["ContributionReminders"]}},"/contributionReminders/batch":{"post":{"operationId":"sendContributionReminderBatch","requestBody":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/CreateContributionReminderRequest"},"type":"array"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ContributionReminderResponse"},"type":"array"}}},"description":"Created"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["ContributionReminders"]}},"/contributions":{"get":{"operationId":"findContributions","parameters":[{"in":"query","name":"contributionPeriodId","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ContributionResponse"},"type":"array"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Contributions"]},"post":{"operationId":"createContribution","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateContributionRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContributionResponse"}}},"description":"Created"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Contributions"]}},"/csrf":{"get":{"operationId":"csrf","parameters":[{"in":"query","name":"csrfToken","required":true,"schema":{"$ref":"#/components/schemas/CsrfToken"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Security"]}},"/events":{"get":{"operationId":"findEvents","parameters":[{"description":"Zero-based page index (0..N)","in":"query","name":"page","required":false,"schema":{"default":0,"minimum":0,"type":"integer"}},{"description":"The size of the page to be returned","in":"query","name":"size","required":false,"schema":{"default":20,"minimum":1,"type":"integer"}},{"description":"Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported.","in":"query","name":"sort","required":false,"schema":{"items":{"type":"string"},"type":"array"}},{"in":"query","name":"from","required":false,"schema":{"format":"date-time","type":"string"}},{"in":"query","name":"to","required":false,"schema":{"format":"date-time","type":"string"}},{"in":"query","name":"approved","required":false,"schema":{"type":"boolean"}},{"in":"query","name":"committeeId","required":false,"schema":{"format":"int64","type":"integer"}},{"in":"query","name":"titleContains","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagedModelEventResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Events"]},"post":{"operationId":"createEvent","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateEventRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventResponse"}}},"description":"Created"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Events"]}},"/events/banners":{"post":{"operationId":"uploadEventBanner","requestBody":{"content":{"multipart/form-data":{"schema":{"properties":{"file":{"format":"binary","type":"string"}},"required":["file"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileResponse"}}},"description":"Created"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Files"]}},"/events/signups":{"get":{"operationId":"findEventSignUps","parameters":[{"in":"query","name":"from","required":false,"schema":{"format":"date-time","type":"string"}},{"in":"query","name":"to","required":false,"schema":{"format":"date-time","type":"string"}},{"in":"query","name":"userId","required":false,"schema":{"format":"int64","type":"integer"}},{"in":"query","name":"committeeId","required":false,"schema":{"format":"int64","type":"integer"}},{"in":"query","name":"approved","required":false,"schema":{"type":"boolean"}},{"in":"query","name":"eventId","required":false,"schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/EventSignUpResponse"},"type":"array"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["EventSignUps"]}},"/events/signups/byAccessToken":{"get":{"operationId":"findEventSignUpsByAccessToken","parameters":[{"in":"header","name":"X-Guest-Access-Token","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/EventSignUpResponse"},"type":"array"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["EventSignUps"]}},"/events/signups/{id}":{"delete":{"operationId":"deleteEventSignup","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}},{"in":"header","name":"X-Guest-Access-Token","required":false,"schema":{"type":"string"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["EventSignUps"]}},"/events/{eventId}":{"delete":{"operationId":"deleteEventById","parameters":[{"in":"path","name":"eventId","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Events"]}},"/events/{eventId}/banners":{"get":{"operationId":"downloadEventBanner","parameters":[{"in":"path","name":"eventId","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"format":"binary","type":"string"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Files"]}},"/events/{eventId}/signups":{"get":{"operationId":"findEventSignUpsByEventId","parameters":[{"in":"path","name":"eventId","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/EventSignUpResponse"},"type":"array"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["EventSignUps"]},"post":{"operationId":"createEventSignup","parameters":[{"in":"path","name":"eventId","required":true,"schema":{"format":"int64","type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateEventSignUpRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventSignUpResponse"}}},"description":"Created"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["EventSignUps"]},"put":{"operationId":"updateEventSignUp","parameters":[{"in":"path","name":"eventId","required":true,"schema":{"format":"int64","type":"integer"}},{"in":"header","name":"X-Guest-Access-Token","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateEventSignUpRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventSignUpResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["EventSignUps"]}},"/events/{id}":{"get":{"operationId":"findEventById","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Events"]},"put":{"operationId":"updateEvent","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateEventRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Events"]}},"/events/{id}/approve":{"put":{"operationId":"approveEvent","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}},{"in":"query","name":"approved","required":true,"schema":{"type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Events"]}},"/health":{"get":{"operationId":"healthCheck","responses":{"200":{"content":{"application/json":{"schema":{"type":"boolean"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Health"]}},"/management/cohort-subjects":{"get":{"operationId":"findCohortSubjects","responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/CohortSubjectSummary"},"type":"array"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Cohort Subjects"]}},"/management/cohort-subjects/{id}":{"get":{"operationId":"findCohortSubjectById","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CohortSubjectDetail"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Cohort Subjects"]}},"/management/cohort-subjects/{id}/drift":{"get":{"operationId":"getDrift","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}},{"in":"query","name":"system","required":true,"schema":{"enum":["BREVO","GOOGLE_CALENDAR"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DriftReport"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Cohort Subjects"]}},"/management/cohort-subjects/{id}/drift/link-user":{"post":{"operationId":"linkUser","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkUserRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedUser"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Cohort Subjects"]}},"/management/cohort-subjects/{id}/targets/existing":{"post":{"operationId":"linkExistingTarget","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkExistingTargetRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CohortMapping"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Cohort Subjects"]}},"/management/cohort-subjects/{id}/targets/new":{"post":{"operationId":"createTarget","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTargetRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CohortMapping"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Cohort Subjects"]}},"/management/cohort-subjects/{id}/targets/{cohortId}":{"put":{"operationId":"switchTarget","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}},{"in":"path","name":"cohortId","required":true,"schema":{"format":"int64","type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwitchTargetRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CohortMapping"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Cohort Subjects"]}},"/management/cohort-subjects/{id}/targets/{cohortId}/inbound-reconcile/apply":{"post":{"operationId":"applyInboundReconcile","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}},{"in":"path","name":"cohortId","required":true,"schema":{"format":"int64","type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboundReconcileApplyRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboundReconcileApplyResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Cohort Subjects"]}},"/management/cohort-subjects/{id}/targets/{cohortId}/inbound-reconcile/preview":{"post":{"operationId":"previewInboundReconcile","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}},{"in":"path","name":"cohortId","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboundReconcilePreview"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Cohort Subjects"]}},"/management/cohort-targets/systems":{"get":{"operationId":"listCohortTargetSystems","responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/TargetDescriptor"},"type":"array"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Cohort Targets"]}},"/management/cohort-targets/{system}":{"get":{"operationId":"searchCohortTargets","parameters":[{"in":"path","name":"system","required":true,"schema":{"enum":["BREVO","GOOGLE_CALENDAR"],"type":"string"}},{"in":"query","name":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ExternalTarget"},"type":"array"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Cohort Targets"]}},"/management/cohorts":{"get":{"operationId":"findCohorts","responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/CohortSummary"},"type":"array"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Cohorts"]}},"/management/cohorts/{id}":{"get":{"operationId":"findCohortById","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CohortDetail"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Cohorts"]}},"/management/cohorts/{id}/repair-missing-adds":{"post":{"operationId":"repairMissingAdds","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CohortRepair"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Cohorts"]}},"/management/emails":{"get":{"operationId":"list_1","parameters":[{"description":"Zero-based page index (0..N)","in":"query","name":"page","required":false,"schema":{"default":0,"minimum":0,"type":"integer"}},{"description":"The size of the page to be returned","in":"query","name":"size","required":false,"schema":{"default":50,"minimum":1,"type":"integer"}},{"description":"Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported.","in":"query","name":"sort","required":false,"schema":{"default":["createdAt,DESC"],"items":{"type":"string"},"type":"array"}},{"in":"query","name":"deliveryStatus","required":false,"schema":{"enum":["PENDING","SENT","DELIVERED","OPENED","BOUNCED","FAILED"],"type":"string"}},{"in":"query","name":"emailType","required":false,"schema":{"type":"string"}},{"in":"query","name":"search","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagedModelEmail"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Email Management"]}},"/management/emails/stats":{"get":{"operationId":"getStats_1","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailStats"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Email Management"]}},"/management/emails/{id}/retry":{"post":{"operationId":"retry_1","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Email"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Email Management"]}},"/management/jobs":{"get":{"operationId":"list","parameters":[{"description":"Zero-based page index (0..N)","in":"query","name":"page","required":false,"schema":{"default":0,"minimum":0,"type":"integer"}},{"description":"The size of the page to be returned","in":"query","name":"size","required":false,"schema":{"default":50,"minimum":1,"type":"integer"}},{"description":"Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported.","in":"query","name":"sort","required":false,"schema":{"default":["updatedAt,DESC"],"items":{"type":"string"},"type":"array"}},{"in":"query","name":"status","required":false,"schema":{"$ref":"#/components/schemas/JobExecutionStatus"}},{"in":"query","name":"category","required":false,"schema":{"$ref":"#/components/schemas/JobExecutionCategory"}},{"in":"query","name":"search","required":false,"schema":{"type":"string"}},{"in":"query","name":"initiatedByType","required":false,"schema":{"enum":["USER","SYSTEM"],"type":"string"}},{"in":"query","name":"jobType","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagedModelJobExecution"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Job Management"]}},"/management/jobs/enqueue":{"post":{"operationId":"enqueue","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnqueueJobRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobExecution"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Job Management"]}},"/management/jobs/stats":{"get":{"operationId":"getStats","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobStatsDTO"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Job Management"]}},"/management/jobs/types":{"get":{"operationId":"jobTypes","responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/JobTypeDescriptor"},"type":"array"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Job Management"]}},"/management/jobs/{id}/retry":{"post":{"operationId":"retry","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobExecution"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Job Management"]}},"/me/services":{"get":{"operationId":"myServices","responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ServiceEntry"},"type":"array"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["My Services"]}},"/memberProfiles":{"post":{"operationId":"createMemberProfile","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMemberProfileRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberProfileResponse"}}},"description":"Created"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Member Profiles"]}},"/memberships":{"get":{"operationId":"findMemberships","parameters":[{"in":"query","name":"from","required":false,"schema":{"format":"date","type":"string"}},{"in":"query","name":"to","required":false,"schema":{"format":"date","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/MembershipResponse"},"type":"array"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Memberships"]},"post":{"operationId":"createMembership","responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MembershipResponse"}}},"description":"Created"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Memberships"]}},"/memberships/{id}":{"get":{"operationId":"findMembershipById","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MembershipResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Memberships"]},"put":{"operationId":"updateMembership","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMembershipRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MembershipResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Memberships"]}},"/oauth2/forward-auth":{"get":{"operationId":"forwardAuth","responses":{"200":{"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Forward Auth"]}},"/recovery/member/activate":{"post":{"operationId":"memberActivate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberActivationRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedirectResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Recovery"]}},"/recovery/password":{"post":{"operationId":"setPassword","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordResetRequest"}}},"required":true},"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Recovery"]}},"/recovery/password/reset/{username}":{"post":{"operationId":"resetPassword","parameters":[{"in":"path","name":"username","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Recovery"]}},"/recovery/user/activate":{"post":{"operationId":"userActivate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserActivationRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedirectResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Recovery"]}},"/recovery/user/activate/resend/{username}":{"post":{"operationId":"resendUserActivation","parameters":[{"in":"path","name":"username","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Recovery"]}},"/recovery/users/{userId}/resend/recovery":{"post":{"operationId":"resendMemberActivationEmail","parameters":[{"in":"path","name":"userId","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Recovery"]}},"/sponsors":{"get":{"operationId":"findSponsors","responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/SponsorResponse"},"type":"array"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Sponsors"]},"post":{"operationId":"createSponsor","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSponsorRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SponsorResponse"}}},"description":"Created"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Sponsors"]}},"/sponsors/{id}":{"delete":{"operationId":"deleteSponsorById","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Sponsors"]},"get":{"operationId":"findSponsorById","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SponsorResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Sponsors"]},"put":{"operationId":"updateSponsor","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSponsorRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SponsorResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Sponsors"]}},"/telemetry":{"post":{"operationId":"createTelemetry","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTelemetryRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TelemetryResponse"}}},"description":"Created"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Telemetries"]}},"/telemetry/{id}":{"get":{"operationId":"findTelemetryById","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TelemetryResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Telemetries"]}},"/users":{"get":{"operationId":"findUsers","parameters":[{"in":"query","name":"username","required":false,"schema":{"type":"string"}},{"in":"query","name":"enabled","required":false,"schema":{"type":"boolean"}},{"description":"Zero-based page index (0..N)","in":"query","name":"page","required":false,"schema":{"default":0,"minimum":0,"type":"integer"}},{"description":"The size of the page to be returned","in":"query","name":"size","required":false,"schema":{"default":20,"minimum":1,"type":"integer"}},{"description":"Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported.","in":"query","name":"sort","required":false,"schema":{"items":{"type":"string"},"type":"array"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagedModelUserDetailResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Users"]},"post":{"operationId":"createUser","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateUserRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserDetailResponse"}}},"description":"Created"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Users"]}},"/users/deleted":{"get":{"operationId":"findDeletedUsers","parameters":[{"description":"Zero-based page index (0..N)","in":"query","name":"page","required":false,"schema":{"default":0,"minimum":0,"type":"integer"}},{"description":"The size of the page to be returned","in":"query","name":"size","required":false,"schema":{"default":20,"minimum":1,"type":"integer"}},{"description":"Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported.","in":"query","name":"sort","required":false,"schema":{"items":{"type":"string"},"type":"array"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagedModelUserDetailResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Users"]}},"/users/{id}":{"put":{"operationId":"updateUser","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateUserRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserDetailResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Users"]}},"/users/{userId}":{"delete":{"operationId":"deleteUserById","parameters":[{"in":"path","name":"userId","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Users"]},"get":{"operationId":"findUserById","parameters":[{"in":"path","name":"userId","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserDetailResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Users"]}},"/users/{userId}/memberProfiles":{"get":{"operationId":"findMemberProfileByUserId","parameters":[{"in":"path","name":"userId","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberProfileResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Member Profiles"]},"put":{"operationId":"updateMemberProfile","parameters":[{"in":"path","name":"userId","required":true,"schema":{"format":"int64","type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMemberProfileRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberProfileResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Member Profiles"]}},"/users/{userId}/memberships":{"post":{"operationId":"boardCreateMembership","parameters":[{"in":"path","name":"userId","required":true,"schema":{"format":"int64","type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoardCreateMembershipRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MembershipResponse"}}},"description":"Created"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Memberships"]}},"/users/{userId}/restore":{"put":{"operationId":"restoreDeletedUserById","parameters":[{"in":"path","name":"userId","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Users"]}},"/users/{userId}/roles":{"put":{"operationId":"toggleUserRole","parameters":[{"in":"path","name":"userId","required":true,"schema":{"format":"int64","type":"integer"}},{"in":"query","name":"role","required":true,"schema":{"$ref":"#/components/schemas/Role"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserDetailResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Bad Request\",\n \"status\": 400,\n \"detail\": \"Validation failed for request.\",\n \"instance\": \"/api/users\",\n \"errors\": [\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"email\",\n \"message\": \"must be a well-formed email address\",\n \"code\": \"Email\"\n },\n {\n \"objectName\": \"createUserRequest\",\n \"field\": \"age\",\n \"message\": \"must be greater than or equal to 0\",\n \"code\": \"Min\"\n }\n ],\n \"traceId\": \"a8c0c4e5f1c24a7e\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Validation error"},"401":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Unauthorized\",\n \"status\": 401,\n \"detail\": \"Full authentication is required to access this resource\",\n \"instance\": \"/api/users\",\n \"traceId\": \"401401401401\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Forbidden\",\n \"status\": 403,\n \"detail\": \"Access is denied\",\n \"instance\": \"/api/users\",\n \"traceId\": \"403403403403\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Forbidden (access denied)"},"404":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Not Found\",\n \"status\": 404,\n \"detail\": \"User not found with id: 42\",\n \"instance\": \"/api/users/42\",\n \"traceId\": \"cdef1234abcd5678\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Not Found"},"500":{"content":{"application/json":{"example":"{\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred.\",\n \"instance\": \"/api/users\",\n \"traceId\": \"ab12cd34ef56\"\n}\n","schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"Server error"}},"tags":["Users"]}}},"servers":[{"description":"Generated server url","url":"http://localhost:8080"}],"tags":[{"description":"Admin cohort listings + detail","name":"Cohorts"},{"description":"API for managing outbound emails","name":"Email Management"},{"description":"Admin: external cohort target catalog","name":"Cohort Targets"},{"description":"Admin: logical subjects + their per-system mappings","name":"Cohort Subjects"},{"description":"API for managing job executions","name":"Job Management"}]} diff --git a/services/api/src/main/kotlin/net/blueshell/api/platform/integration/cohort/adapter/brevo/BrevoTargetStrategy.kt b/services/api/src/main/kotlin/net/blueshell/api/platform/integration/cohort/adapter/brevo/BrevoTargetStrategy.kt index 449796d75..b3d872026 100644 --- a/services/api/src/main/kotlin/net/blueshell/api/platform/integration/cohort/adapter/brevo/BrevoTargetStrategy.kt +++ b/services/api/src/main/kotlin/net/blueshell/api/platform/integration/cohort/adapter/brevo/BrevoTargetStrategy.kt @@ -43,21 +43,19 @@ class BrevoTargetStrategy( ) override fun catalog(query: String?): List { - val folderNames = folders() val q = query?.trim()?.lowercase().orEmpty() - return listTargets(folderNames) + return listTargets(folders()) .filter { it.matches(q) } .sortedWith(compareBy({ it.folderLabel.orEmpty() }, { it.label })) } - override fun create(label: String, folder: String?): ExternalTarget = - ExternalTarget( - system = system, - externalId = lists.createList(label, folder).toString(), - kind = descriptor.kind, - label = label, - folderLabel = folder, - ) + override fun create(label: String, folder: String?): ExternalTarget = ExternalTarget( + system = system, + externalId = lists.createList(label, folder).toString(), + kind = descriptor.kind, + label = label, + folderLabel = folder, + ) override fun members(target: ExternalTarget): List = lists.listMembers(target.externalId.toBrevoId("externalId", "members")) @@ -100,7 +98,12 @@ class BrevoTargetStrategy( val results = mutableListOf() var offset = 0L while (true) { - val page = fetchPage(kind) { fetch(PAGE_SIZE, offset) } + val page = try { + fetch(PAGE_SIZE, offset) + } catch (e: RestClientResponseException) { + if (e.statusCode.value() == 429) log.warn("Brevo target catalog {} fetch was rate limited", kind) + throw ContactServiceException("Failed to fetch Brevo $kind catalog", e) + } results += page.items if (page.items.size < PAGE_SIZE || page.count != null && results.size >= page.count) break offset += PAGE_SIZE @@ -108,13 +111,6 @@ class BrevoTargetStrategy( return results } - private fun fetchPage(kind: String, fetch: () -> Page): Page = try { - fetch() - } catch (e: RestClientResponseException) { - if (e.statusCode.value() == 429) log.warn("Brevo target catalog {} fetch was rate limited", kind) - throw ContactServiceException("Failed to fetch Brevo $kind catalog", e) - } - private fun ExternalTarget.matches(query: String): Boolean = query.isBlank() || externalId == query || @@ -133,13 +129,12 @@ class BrevoTargetStrategy( } private fun GetLists200ResponseListsInner.toTarget(folderNames: Map): ExternalTarget { - val folderExternalId = folderId?.toString() return ExternalTarget( system = TargetSystem.BREVO, externalId = id.toString(), kind = CohortKind.LIST, label = name, - folderLabel = folderExternalId?.let { folderNames[it] }, + folderLabel = folderNames[folderId.toString()], memberCount = uniqueSubscribers, ) } diff --git a/services/api/src/main/kotlin/net/blueshell/api/platform/integration/cohort/adapter/web/CohortTargetController.kt b/services/api/src/main/kotlin/net/blueshell/api/platform/integration/cohort/adapter/web/CohortTargetController.kt index a41c3fb6a..15712f5ac 100644 --- a/services/api/src/main/kotlin/net/blueshell/api/platform/integration/cohort/adapter/web/CohortTargetController.kt +++ b/services/api/src/main/kotlin/net/blueshell/api/platform/integration/cohort/adapter/web/CohortTargetController.kt @@ -1,12 +1,9 @@ package net.blueshell.api.platform.integration.cohort.adapter.web import io.swagger.v3.oas.annotations.Operation -import io.swagger.v3.oas.annotations.media.Schema import io.swagger.v3.oas.annotations.tags.Tag import net.blueshell.api.platform.integration.cohort.application.TargetCatalog -import net.blueshell.api.platform.integration.cohort.persistence.CohortKind import net.blueshell.api.platform.integration.cohort.port.out.ExternalTarget -import net.blueshell.api.platform.integration.cohort.port.out.TargetCapability import net.blueshell.api.platform.integration.cohort.port.out.TargetDescriptor import net.blueshell.api.shared.enums.TargetSystem import org.springframework.security.access.prepost.PreAuthorize @@ -25,42 +22,12 @@ class CohortTargetController( ) { @GetMapping("/systems") @Operation(operationId = "listCohortTargetSystems") - fun systems(): List = - catalog.descriptors().map { it.toResponse() } + fun systems(): List = catalog.descriptors() @GetMapping("/{system}") @Operation(operationId = "searchCohortTargets") fun targets( @PathVariable system: TargetSystem, @RequestParam(required = false) query: String?, - ): List = - catalog.search(system, query).map { it.toResponse() } + ): List = catalog.search(system, query) } - -@Schema(name = "TargetDescriptor") -data class TargetDescriptorResponse( - val system: TargetSystem, - val kind: CohortKind, - val systemLabel: String, - val targetLabel: String, - val idLabel: String, - val folderLabel: String?, - val capabilities: Set, -) - -@Schema(name = "ExternalTarget") -data class ExternalTargetResponse( - val system: TargetSystem, - val externalId: String, - val kind: CohortKind, - val label: String, - val folderLabel: String?, - val memberCount: Long?, - val linkedCohortId: Long?, -) - -private fun TargetDescriptor.toResponse() = - TargetDescriptorResponse(system, kind, systemLabel, targetLabel, idLabel, folderLabel, capabilities) - -private fun ExternalTarget.toResponse() = - ExternalTargetResponse(system, externalId, kind, label, folderLabel, memberCount, linkedCohortId) diff --git a/services/api/src/main/kotlin/net/blueshell/api/platform/integration/cohort/application/FactWriters.kt b/services/api/src/main/kotlin/net/blueshell/api/platform/integration/cohort/application/FactWriters.kt index 29b482f75..6322d6621 100644 --- a/services/api/src/main/kotlin/net/blueshell/api/platform/integration/cohort/application/FactWriters.kt +++ b/services/api/src/main/kotlin/net/blueshell/api/platform/integration/cohort/application/FactWriters.kt @@ -13,21 +13,12 @@ fun SubjectFact.toUserFact(): UserFact = UserFact(kind, key) data class FactPreview(val alreadyTrue: Boolean) -data class FactWriteResult(val status: FactWriteStatus, val reason: String? = null) - -enum class FactWriteStatus { - WRITTEN, - NOOP_ALREADY_TRUE, - UNSUPPORTED, - SKIPPED_UNMATCHED, - SKIPPED_MAPPING_CONFLICT, - FAILED, -} +enum class FactWriteStatus { WRITTEN, NOOP_ALREADY_TRUE, UNSUPPORTED, SKIPPED_UNMATCHED, SKIPPED_MAPPING_CONFLICT, FAILED } interface FactWriter { val kind: CohortFactKind fun preview(userId: Long, fact: SubjectFact): FactPreview - fun apply(userId: Long, fact: SubjectFact): FactWriteResult + fun apply(userId: Long, fact: SubjectFact): FactWriteStatus } @Component @@ -35,9 +26,6 @@ class FactWriters(writers: List) { private val byKind = writers.associateBy { it.kind } fun find(kind: CohortFactKind): FactWriter? = byKind[kind] - - fun require(kind: CohortFactKind): FactWriter = - find(kind) ?: throw ResponseStatusException(HttpStatus.BAD_REQUEST, "No inbound fact writer for $kind") } @Component @@ -51,15 +39,15 @@ class ContributionPaidWriter( override fun preview(userId: Long, fact: SubjectFact): FactPreview = FactPreview(facts.collect(userId).contains(fact.toUserFact())) - override fun apply(userId: Long, fact: SubjectFact): FactWriteResult { + override fun apply(userId: Long, fact: SubjectFact): FactWriteStatus { if (preview(userId, fact).alreadyTrue) { reconciliation.evaluateUserCohorts(userId) - return FactWriteResult(FactWriteStatus.NOOP_ALREADY_TRUE) + return FactWriteStatus.NOOP_ALREADY_TRUE } val periodId = fact.key.toLongOrNull() ?: throw ResponseStatusException(HttpStatus.BAD_REQUEST, "Contribution period id must be numeric") val created = contributions.ensurePaid(userId, periodId) reconciliation.evaluateUserCohorts(userId) - return FactWriteResult(if (created) FactWriteStatus.WRITTEN else FactWriteStatus.NOOP_ALREADY_TRUE) + return if (created) FactWriteStatus.WRITTEN else FactWriteStatus.NOOP_ALREADY_TRUE } } diff --git a/services/api/src/main/kotlin/net/blueshell/api/platform/integration/cohort/application/InboundReconcile.kt b/services/api/src/main/kotlin/net/blueshell/api/platform/integration/cohort/application/InboundReconcile.kt index da4aa128d..897438c77 100644 --- a/services/api/src/main/kotlin/net/blueshell/api/platform/integration/cohort/application/InboundReconcile.kt +++ b/services/api/src/main/kotlin/net/blueshell/api/platform/integration/cohort/application/InboundReconcile.kt @@ -2,9 +2,8 @@ package net.blueshell.api.platform.integration.cohort.application import net.blueshell.api.domain.user.application.UserService import net.blueshell.api.domain.user.persistence.User -import net.blueshell.api.platform.integration.cohort.persistence.Cohort +import net.blueshell.api.platform.integration.cohort.application.InboundReconcileSkipReason.* import net.blueshell.api.platform.integration.cohort.persistence.CohortFactKind -import net.blueshell.api.platform.integration.cohort.persistence.CohortSubject import net.blueshell.api.platform.integration.cohort.persistence.repository.CohortMemberRepository import net.blueshell.api.platform.integration.cohort.persistence.repository.CohortRepository import net.blueshell.api.platform.integration.cohort.persistence.repository.CohortSubjectRepository @@ -18,12 +17,10 @@ import org.springframework.http.HttpStatus import org.springframework.stereotype.Service import org.springframework.transaction.PlatformTransactionManager import org.springframework.transaction.TransactionDefinition -import org.springframework.transaction.annotation.Transactional import org.springframework.transaction.support.TransactionTemplate import org.springframework.web.server.ResponseStatusException import java.nio.charset.StandardCharsets import java.security.MessageDigest -import java.time.Instant @Service class InboundReconcile( @@ -37,238 +34,168 @@ class InboundReconcile( private val strategies: TargetStrategies, transactionManager: PlatformTransactionManager, ) { - private val noTx = TransactionTemplate(transactionManager).apply { - propagationBehavior = TransactionDefinition.PROPAGATION_NOT_SUPPORTED - } - private val itemTx = TransactionTemplate(transactionManager).apply { - propagationBehavior = TransactionDefinition.PROPAGATION_REQUIRES_NEW - } + private val noTx = transactionManager.tx(TransactionDefinition.PROPAGATION_NOT_SUPPORTED) + private val itemTx = transactionManager.tx(TransactionDefinition.PROPAGATION_REQUIRES_NEW) - fun preview(subjectId: Long, cohortId: Long): InboundReconcilePreview { - val target = loadTarget(subjectId, cohortId) + fun preview(subjectId: Long, cohortId: Long): InboundReconcilePreview = + preview(loadTarget(subjectId, cohortId)) + + private fun preview(target: InboundTarget): InboundReconcilePreview { val remote = noTx.execute { strategies.require(target.system).members(target.external) }.orEmpty() - val matched = match(target, remote) - val preview = InboundReconcilePreview( - subjectId = subjectId, - cohortId = cohortId, - system = target.system, - externalTargetId = target.external.externalId, - fact = target.fact, - writerSupported = target.writer != null, - previewToken = "", - fetchedAt = Instant.now(), - remoteCount = remote.size, - matched = matched.matched, - skipped = matched.skipped, - ) - return preview.copy(previewToken = token(preview)) + val (matched, skipped) = match(target, remote) + val preview = InboundReconcilePreview(target.fact, target.writer != null, "", remote.size, matched, skipped) + return preview.copy(previewToken = token(target, preview)) } fun apply(subjectId: Long, cohortId: Long, request: InboundReconcileApplyRequest): InboundReconcileApplyResponse { - val current = preview(subjectId, cohortId) + val target = loadTarget(subjectId, cohortId) + val current = preview(target) if (current.previewToken != request.previewToken) { - throw ResponseStatusException(HttpStatus.CONFLICT, "Inbound reconcile preview is stale") + conflict("Inbound reconcile preview is stale") } val selectedIds = request.selectedExternalUserIds.toSet() val byExternalId = current.matched.associateBy { it.externalUserId } val selected = selectedIds.map { val row = byExternalId[it] - ?: throw ResponseStatusException(HttpStatus.CONFLICT, "Selected external user $it is no longer matched") - if (!row.writable) throw ResponseStatusException(HttpStatus.BAD_REQUEST, "Selected external user $it is not writable") - CohortJobs.InboundReconcileSelectedUser(row.externalUserId, row.userId) + ?: conflict("Selected external user $it is no longer matched") + if (!row.writable) bad("Selected external user $it is not writable") + CohortJobs.InboundReconcileSelectedUser(row.externalUserId, row.userId!!) } - val job = jobs.enqueue( - CohortJobs.ApplyInboundReconcile, - CohortJobs.ApplyInboundReconcilePayload( - subjectId = current.subjectId, - cohortId = current.cohortId, - system = current.system.name, - externalTargetId = current.externalTargetId, - factKind = current.fact.kind.name, - factKey = current.fact.key, - selected = selected, - ), + val payload = CohortJobs.ApplyInboundReconcilePayload( + target.subjectId, target.cohortId, target.system.name, target.external.externalId, + target.fact.kind.name, target.fact.key, selected, ) - return InboundReconcileApplyResponse(job?.id, selected.size, current.skipped.size + current.matched.size - selected.size) + val skipped = current.skipped.size + current.matched.size - selected.size + return InboundReconcileApplyResponse(jobs.enqueue(CohortJobs.ApplyInboundReconcile, payload)?.id, selected.size, skipped) } fun applyJob(payload: CohortJobs.ApplyInboundReconcilePayload): List { val factKind = CohortFactKind.valueOf(payload.factKind) val fact = SubjectFact(factKind, payload.factKey) return payload.selected.map { selected -> - val status = itemTx.execute { - val target = loadTarget(payload.subjectId, payload.cohortId) - if (target.system.name != payload.system || - target.external.externalId != payload.externalTargetId || - target.fact != fact - ) { - return@execute FactWriteStatus.FAILED - } - val mappings = externalIds.findByExternalIds( - ExternalIdMappingService.USER_AGGREGATE, - payload.system, - listOf(selected.externalUserId), - ).filter { it.externalId == selected.externalUserId } - if (mappings.isEmpty()) return@execute FactWriteStatus.SKIPPED_UNMATCHED - if (mappings.size != 1 || mappings.single().aggregateId != selected.userId) { - return@execute FactWriteStatus.SKIPPED_MAPPING_CONFLICT - } - val writer = writers.find(factKind) ?: return@execute FactWriteStatus.UNSUPPORTED - runCatching { writer.apply(selected.userId, fact).status } - .getOrElse { FactWriteStatus.FAILED } - } + val status = itemTx.execute { applyOne(payload, fact, selected) } ApplyInboundReconcileItemResult(selected.externalUserId, selected.userId, status) } } - @Transactional(readOnly = true) - fun loadTarget(subjectId: Long, cohortId: Long): InboundReconcileTarget { + private fun loadTarget(subjectId: Long, cohortId: Long): InboundTarget { val subject = subjects.findById(subjectId) - .orElseThrow { ResponseStatusException(HttpStatus.NOT_FOUND, "Subject $subjectId not found") } + .orElseThrow { missing("Subject $subjectId not found") } val cohort = cohorts.findById(cohortId) - .orElseThrow { ResponseStatusException(HttpStatus.NOT_FOUND, "Cohort $cohortId not found") } + .orElseThrow { missing("Cohort $cohortId not found") } if (cohort.subjectId != subjectId) { - throw ResponseStatusException(HttpStatus.NOT_FOUND, "Cohort $cohortId is not a target of subject $subjectId") + missing("Cohort $cohortId is not a target of subject $subjectId") } - if (!subject.enabled) throw ResponseStatusException(HttpStatus.BAD_REQUEST, "Subject $subjectId is disabled") + if (!subject.enabled) bad("Subject $subjectId is disabled") val fact = SubjectFact( - subject.factKind ?: throw ResponseStatusException(HttpStatus.BAD_REQUEST, "Subject $subjectId has no fact kind"), - subject.factKey?.takeIf { it.isNotBlank() } - ?: throw ResponseStatusException(HttpStatus.BAD_REQUEST, "Subject $subjectId has no fact key"), + subject.factKind ?: bad("Subject $subjectId has no fact kind"), + subject.factKey.required("Subject $subjectId has no fact key"), ) val system = TargetSystem.valueOf(cohort.system) - val externalId = cohort.externalId?.takeIf { it.isNotBlank() } - ?: throw ResponseStatusException(HttpStatus.BAD_REQUEST, "Cohort $cohortId has no external target") - return InboundReconcileTarget( - subject = subject, - cohort = cohort, - system = system, - external = ExternalTarget(system, externalId, cohort.kind, cohort.label, cohort.folder), - fact = fact, - writer = writers.find(fact.kind), - ) + val externalId = cohort.externalId.required("Cohort $cohortId has no external target") + return InboundTarget(subjectId, cohortId, system, ExternalTarget(system, externalId, cohort.kind, cohort.label, cohort.folder), fact, writers.find(fact.kind)) } - private fun match(target: InboundReconcileTarget, remote: List): MatchRows { - val duplicateRemoteIds = remote.groupingBy { it.externalUserId }.eachCount().filterValues { it > 1 }.keys - val skipped = duplicateRemoteIds.map { - InboundReconcileSkippedRow(it, remote.firstOrNull { member -> member.externalUserId == it }?.label, InboundReconcileSkipReason.DUPLICATE_REMOTE_ID) - }.toMutableList() - val internalIds = members.findAllByCohortIdAndUserIdIsNotNull(target.cohort.id!!).mapNotNull { it.userId }.toSet() - val internalExternalIds = externalIds.findBatch(ExternalIdMappingService.USER_AGGREGATE, internalIds, target.system.name) - .mapNotNull { it.externalId?.takeIf(String::isNotBlank) } - .toSet() - val extras = remote - .filterNot { it.externalUserId in duplicateRemoteIds } - .filterNot { it.externalUserId in internalExternalIds } + private fun applyOne( + payload: CohortJobs.ApplyInboundReconcilePayload, + fact: SubjectFact, + selected: CohortJobs.InboundReconcileSelectedUser, + ): FactWriteStatus { + val target = loadTarget(payload.subjectId, payload.cohortId) + if (!target.matches(payload, fact)) return FactWriteStatus.FAILED val mappings = externalIds.findByExternalIds( ExternalIdMappingService.USER_AGGREGATE, - target.system.name, - extras.map { it.externalUserId }, - ).filter { !it.externalId.isNullOrBlank() } - .groupBy { it.externalId!! } - val activeUsers = users.findAllByIds(mappings.values.flatten().map { it.aggregateId }.toSet()) - .associateBy { it.id!! } - val matched = mutableListOf() + payload.system, + listOf(selected.externalUserId), + ).filter { it.externalId == selected.externalUserId } + val mappedUserId = mappings.singleOrNull()?.aggregateId + ?: return if (mappings.isEmpty()) FactWriteStatus.SKIPPED_UNMATCHED else FactWriteStatus.SKIPPED_MAPPING_CONFLICT + if (mappedUserId != selected.userId) return FactWriteStatus.SKIPPED_MAPPING_CONFLICT + val writer = writers.find(fact.kind) ?: return FactWriteStatus.UNSUPPORTED + return runCatching { writer.apply(selected.userId, fact) }.getOrElse { FactWriteStatus.FAILED } + } + + private fun match(target: InboundTarget, remote: List): Pair, List> { + val duplicateIds = remote.groupingBy { it.externalUserId }.eachCount().filterValues { it > 1 }.keys + val skipped = duplicateIds.map { remote.first { member -> member.externalUserId == it }.skip(DUPLICATE_REMOTE_ID) }.toMutableList() + val extras = remote.filterNot { it.externalUserId in duplicateIds || it.externalUserId in internalExternalIds(target) } + val mappings = mappings(target, extras) + val activeUsers = users.findAllByIds(mappings.values.flatten().map { it.aggregateId }.toSet()).associateBy { it.id!! } + val matched = mutableListOf() val seenUsers = mutableSetOf() extras.forEach { member -> val memberMappings = mappings[member.externalUserId].orEmpty() + val mappedIds = memberMappings.map { it.aggregateId }.toSet() + val user = mappedIds.singleOrNull()?.let(activeUsers::get) when { - memberMappings.isEmpty() -> skipped += member.skip(InboundReconcileSkipReason.UNMATCHED) - memberMappings.map { it.aggregateId }.toSet().size != 1 -> - skipped += member.skip(InboundReconcileSkipReason.MAPPING_CONFLICT) - activeUsers[memberMappings.single().aggregateId] == null -> - skipped += member.skip(InboundReconcileSkipReason.MAPPED_USER_INACTIVE) - !seenUsers.add(memberMappings.single().aggregateId) -> - skipped += member.skip(InboundReconcileSkipReason.DUPLICATE_USER_MATCH) - else -> matched += target.row(member, activeUsers.getValue(memberMappings.single().aggregateId)) + memberMappings.isEmpty() -> skipped += member.skip(UNMATCHED) + mappedIds.size != 1 -> skipped += member.skip(MAPPING_CONFLICT) + user == null -> skipped += member.skip(MAPPED_USER_INACTIVE) + !seenUsers.add(user.id!!) -> skipped += member.skip(DUPLICATE_USER_MATCH) + else -> matched += target.row(member, user) } } - return MatchRows(matched, skipped) + return matched to skipped + } + + private fun internalExternalIds(target: InboundTarget): Set { + val internalIds = members.findAllByCohortIdAndUserIdIsNotNull(target.cohortId).mapNotNull { it.userId }.toSet() + return externalIds.findBatch(ExternalIdMappingService.USER_AGGREGATE, internalIds, target.system.name) + .mapNotNull { it.externalId?.takeIf(String::isNotBlank) } + .toSet() } - private fun InboundReconcileTarget.row(member: ExternalMember, user: User): InboundReconcileMatchedRow { + private fun mappings(target: InboundTarget, members: List) = + externalIds.findByExternalIds( + ExternalIdMappingService.USER_AGGREGATE, + target.system.name, + members.map { it.externalUserId }, + ).filter { !it.externalId.isNullOrBlank() }.groupBy { it.externalId!! } + + private fun InboundTarget.row(member: ExternalMember, user: User): InboundReconcileRow { val alreadyTrue = writer?.preview(user.id!!, fact)?.alreadyTrue ?: false - return InboundReconcileMatchedRow( - externalUserId = member.externalUserId, - externalLabel = member.label, - userId = user.id!!, - userFullName = user.fullName, - userEmail = user.email, - alreadyTrue = alreadyTrue, - writable = writer != null && !alreadyTrue, - ) + return InboundReconcileRow(member.externalUserId, member.label, user.id!!, user.fullName, user.email, alreadyTrue, writer != null && !alreadyTrue) } - private fun token(preview: InboundReconcilePreview): String { - val input = buildString { - append(preview.subjectId).append('|').append(preview.cohortId).append('|') - append(preview.system).append('|').append(preview.externalTargetId).append('|') - append(preview.fact.kind).append('|').append(preview.fact.key).append('|') - preview.matched.sortedBy { it.externalUserId }.forEach { - append(it.externalUserId).append('=').append(it.userId).append(':').append(it.writable).append(',') - } - } - val digest = MessageDigest.getInstance("SHA-256").digest(input.toByteArray(StandardCharsets.UTF_8)) - return digest.joinToString("") { "%02x".format(it) } + private fun token(target: InboundTarget, preview: InboundReconcilePreview): String { + val rows = preview.matched.sortedBy { it.externalUserId } + .joinToString(",") { "${it.externalUserId}=${it.userId}:${it.writable}" } + val input = "${target.subjectId}|${target.cohortId}|${target.system}|${target.external.externalId}|${target.fact.kind}|${target.fact.key}|$rows" + return MessageDigest.getInstance("SHA-256").digest(input.toByteArray(StandardCharsets.UTF_8)) + .joinToString("") { "%02x".format(it) } } + private fun InboundTarget.matches(payload: CohortJobs.ApplyInboundReconcilePayload, fact: SubjectFact) = + system.name == payload.system && external.externalId == payload.externalTargetId && this.fact == fact + private fun ExternalMember.skip(reason: InboundReconcileSkipReason) = - InboundReconcileSkippedRow(externalUserId, label, reason) + InboundReconcileRow(externalUserId = externalUserId, externalLabel = label, reason = reason) + + private fun String?.required(message: String) = takeIf { !it.isNullOrBlank() } ?: bad(message) + private fun bad(message: String): Nothing = throw ResponseStatusException(HttpStatus.BAD_REQUEST, message) + private fun conflict(message: String): Nothing = throw ResponseStatusException(HttpStatus.CONFLICT, message) + private fun missing(message: String): Nothing = throw ResponseStatusException(HttpStatus.NOT_FOUND, message) + private fun PlatformTransactionManager.tx(propagation: Int) = + TransactionTemplate(this).apply { propagationBehavior = propagation } } -data class InboundReconcileTarget( - val subject: CohortSubject, - val cohort: Cohort, - val system: TargetSystem, - val external: ExternalTarget, - val fact: SubjectFact, - val writer: FactWriter?, -) - -data class InboundReconcilePreview( - val subjectId: Long, - val cohortId: Long, - val system: TargetSystem, - val externalTargetId: String, - val fact: SubjectFact, - val writerSupported: Boolean, - val previewToken: String, - val fetchedAt: Instant, - val remoteCount: Int, - val matched: List, - val skipped: List, -) +private data class InboundTarget(val subjectId: Long, val cohortId: Long, val system: TargetSystem, val external: ExternalTarget, val fact: SubjectFact, val writer: FactWriter?) -data class InboundReconcileMatchedRow( - val externalUserId: String, - val externalLabel: String?, - val userId: Long, - val userFullName: String?, - val userEmail: String?, - val alreadyTrue: Boolean, - val writable: Boolean, -) +data class InboundReconcilePreview(val fact: SubjectFact, val writerSupported: Boolean, val previewToken: String, val remoteCount: Int, val matched: List, val skipped: List) -data class InboundReconcileSkippedRow( +data class InboundReconcileRow( val externalUserId: String, - val externalLabel: String?, - val reason: InboundReconcileSkipReason, + val externalLabel: String? = null, + val userId: Long? = null, + val userFullName: String? = null, + val userEmail: String? = null, + val alreadyTrue: Boolean = false, + val writable: Boolean = false, + val reason: InboundReconcileSkipReason? = null, ) -enum class InboundReconcileSkipReason { - DUPLICATE_REMOTE_ID, - MAPPING_CONFLICT, - DUPLICATE_USER_MATCH, - MAPPED_USER_INACTIVE, - UNMATCHED, -} +enum class InboundReconcileSkipReason { DUPLICATE_REMOTE_ID, MAPPING_CONFLICT, DUPLICATE_USER_MATCH, MAPPED_USER_INACTIVE, UNMATCHED } data class InboundReconcileApplyRequest(val previewToken: String, val selectedExternalUserIds: List) data class InboundReconcileApplyResponse(val jobId: Long?, val acceptedCount: Int, val skippedCount: Int) data class ApplyInboundReconcileItemResult(val externalUserId: String, val userId: Long, val status: FactWriteStatus) - -private data class MatchRows( - val matched: List, - val skipped: List, -) diff --git a/services/api/src/main/kotlin/net/blueshell/api/platform/integration/mock/MockTargetStrategy.kt b/services/api/src/main/kotlin/net/blueshell/api/platform/integration/mock/MockTargetStrategy.kt index 52dd43530..800e328b9 100644 --- a/services/api/src/main/kotlin/net/blueshell/api/platform/integration/mock/MockTargetStrategy.kt +++ b/services/api/src/main/kotlin/net/blueshell/api/platform/integration/mock/MockTargetStrategy.kt @@ -66,15 +66,6 @@ class MockTargetStrategy : TargetStrategy { members.keys.removeIf { it.second == target.externalId } } - fun seed(target: ExternalTarget) { - targets[target.externalId] = target - } - - fun clear() { - targets.clear() - members.clear() - } - private fun ExternalTarget.matches(query: String): Boolean = query.isBlank() || externalId == query || diff --git a/services/api/src/test/kotlin/net/blueshell/api/platform/integration/cohort/application/FactWritersTest.kt b/services/api/src/test/kotlin/net/blueshell/api/platform/integration/cohort/application/FactWritersTest.kt index 242015ec2..d1fe94b38 100644 --- a/services/api/src/test/kotlin/net/blueshell/api/platform/integration/cohort/application/FactWritersTest.kt +++ b/services/api/src/test/kotlin/net/blueshell/api/platform/integration/cohort/application/FactWritersTest.kt @@ -44,8 +44,8 @@ class FactWritersTest { val first = writer.apply(5L, SubjectFact(CohortFactKind.CONTRIBUTION_PAID, "12")) val second = writer.apply(5L, SubjectFact(CohortFactKind.CONTRIBUTION_PAID, "12")) - assertThat(first.status).isEqualTo(FactWriteStatus.WRITTEN) - assertThat(second.status).isEqualTo(FactWriteStatus.NOOP_ALREADY_TRUE) + assertThat(first).isEqualTo(FactWriteStatus.WRITTEN) + assertThat(second).isEqualTo(FactWriteStatus.NOOP_ALREADY_TRUE) verify(exactly = 1) { contributions.ensurePaid(5L, 12L) } verify(exactly = 2) { reconciliation.evaluateUserCohorts(5L) } } diff --git a/services/api/src/test/kotlin/net/blueshell/api/platform/integration/cohort/application/InboundReconcileTest.kt b/services/api/src/test/kotlin/net/blueshell/api/platform/integration/cohort/application/InboundReconcileTest.kt index 94f75d731..991e861f0 100644 --- a/services/api/src/test/kotlin/net/blueshell/api/platform/integration/cohort/application/InboundReconcileTest.kt +++ b/services/api/src/test/kotlin/net/blueshell/api/platform/integration/cohort/application/InboundReconcileTest.kt @@ -91,7 +91,7 @@ class InboundReconcileTest { assertThat(strategy.listCalls).isEqualTo(1) assertThat(strategy.sawTransactionDuringMembers).isFalse() assertThat(preview.writerSupported).isTrue() - assertThat(preview.matched).extracting { it.userId }.containsExactly(1L) + assertThat(preview.matched).extracting { it.userId }.containsExactly(1L) assertThat(preview.matched.single().writable).isTrue() assertThat(preview.skipped).extracting { it.reason } .containsExactlyInAnyOrder( @@ -203,7 +203,7 @@ class InboundReconcileTest { ) every { writers.find(CohortFactKind.CONTRIBUTION_PAID) } returns contributionWriter every { contributionWriter.apply(1L, SubjectFact(CohortFactKind.CONTRIBUTION_PAID, "12")) } returns - FactWriteResult(FactWriteStatus.WRITTEN) + FactWriteStatus.WRITTEN val result = service.applyJob( CohortJobs.ApplyInboundReconcilePayload( diff --git a/services/frontend/src/domains/cohorts/adapters/cohorts.ts b/services/frontend/src/domains/cohorts/adapters/cohorts.ts index 5b57be59e..ea214c2e2 100644 --- a/services/frontend/src/domains/cohorts/adapters/cohorts.ts +++ b/services/frontend/src/domains/cohorts/adapters/cohorts.ts @@ -163,7 +163,7 @@ export type ExternalTarget = { linkedCohortId: number | null } -export type InboundReconcilePreview = Omit & { system: TargetSystem } +export type InboundReconcilePreview = ApiInboundReconcilePreview export type InboundReconcileApplyResponse = ApiInboundReconcileApplyResponse function toTargetMapping(raw: ApiCohortMapping): TargetMapping { diff --git a/services/frontend/src/domains/cohorts/components/InboundReconcileModal.vue b/services/frontend/src/domains/cohorts/components/InboundReconcileModal.vue index 74159bf26..58f153221 100644 --- a/services/frontend/src/domains/cohorts/components/InboundReconcileModal.vue +++ b/services/frontend/src/domains/cohorts/components/InboundReconcileModal.vue @@ -175,7 +175,7 @@ async function confirm() { :data-testid="`inbound-skip-${row.externalUserId}`" > {{ row.externalLabel ?? row.externalUserId }} - {{ row.reason.replace(/_/g, " ").toLowerCase() }} + {{ row.reason?.replace(/_/g, " ").toLowerCase() ?? "" }} ( diff --git a/services/frontend/src/services/api/blueshell/index.ts b/services/frontend/src/services/api/blueshell/index.ts index f81c43eb1..a5dc56f75 100644 --- a/services/frontend/src/services/api/blueshell/index.ts +++ b/services/frontend/src/services/api/blueshell/index.ts @@ -1,4 +1,4 @@ // This file is auto-generated by @hey-api/openapi-ts export { addMember, applyInboundReconcile, approveEvent, authenticate, boardCreateMembership, createAddress, createBlog, createBoard, createCommittee, createContribution, createContributionPeriod, createEvent, createEventSignup, createMemberProfile, createMembership, createSponsor, createTarget, createTelemetry, createUser, csrf, deleteAddressById, deleteBoard, deleteById, deleteCommitteeById, deleteContribution, deleteContributionPeriodById, deleteEventById, deleteEventSignup, deleteSponsorById, deleteUserById, downloadEventBanner, enqueue, findAddressById, findAllAddresses, findAllBoards, findBlogById, findBlogs, findBoardById, findCohortById, findCohorts, findCohortSubjectById, findCohortSubjects, findCommitteeById, findCommittees, findCommitteesByUserId, findContributionPeriods, findContributionReminders, findContributions, findContributionsByPeriodId, findCurrentContributionPeriod, findDeletedUsers, findEventById, findEvents, findEventSignUps, findEventSignUpsByAccessToken, findEventSignUpsByEventId, findMemberProfileByUserId, findMembershipById, findMemberships, findSponsorById, findSponsors, findTelemetryById, findUserById, findUsers, forwardAuth, getDrift, getStats, getStats1, healthCheck, jobTypes, linkExistingTarget, linkUser, list, list1, listCohortTargetSystems, logout, memberActivate, myServices, type Options, previewInboundReconcile, removeMember, repairMissingAdds, resendMemberActivationEmail, resendUserActivation, resetPassword, restoreDeletedUserById, retry, retry1, searchCohortTargets, sendContributionReminder, sendContributionReminderBatch, setPassword, switchTarget, toggleUserRole, updateAddress, updateBlog, updateBoard, updateCommittee, updateContributionPeriod, updateEvent, updateEventSignUp, updateMemberProfile, updateMembership, updateSponsor, updateUser, uploadEventBanner, userActivate } from './sdk.gen'; -export { type Actor, type AddBoardMemberRequest, type AddMemberData, type AddMemberError, type AddMemberErrors, type AddMemberResponse, type AddMemberResponses, type AddressResponse, type AnswerRequest, type AnswerResponse, type ApiError, type ApplyInboundReconcileData, type ApplyInboundReconcileError, type ApplyInboundReconcileErrors, type ApplyInboundReconcileResponse, type ApplyInboundReconcileResponses, type ApproveEventData, type ApproveEventError, type ApproveEventErrors, type ApproveEventResponse, type ApproveEventResponses, type AuthenticateData, type AuthenticateError, type AuthenticateErrors, type AuthenticateResponse, type AuthenticateResponses, type BlogResponse, type BoardCreateMembershipData, type BoardCreateMembershipError, type BoardCreateMembershipErrors, type BoardCreateMembershipRequest, type BoardCreateMembershipResponse, type BoardCreateMembershipResponses, type BoardMemberResponse, type BoardResponse, type ClientOptions, type CohortDetail, CohortFactKind, CohortKind, type CohortMapping, type CohortMemberRow, type CohortRepair, type CohortRule, CohortSubjectCategory, type CohortSubjectDetail, type CohortSubjectMember, type CohortSubjectRule, type CohortSubjectSummary, CohortSubjectType, type CohortSummary, type CommitteeDetailResponse, type CommitteeMemberRequest, type CommitteeMemberResponse, type CommitteeResponse, type ContributionPeriodResponse, type ContributionReminderResponse, type ContributionResponse, type CreateAddressData, type CreateAddressError, type CreateAddressErrors, type CreateAddressRequest, type CreateAddressResponse, type CreateAddressResponses, type CreateBlogData, type CreateBlogError, type CreateBlogErrors, type CreateBlogRequest, type CreateBlogResponse, type CreateBlogResponses, type CreateBoardData, type CreateBoardError, type CreateBoardErrors, type CreateBoardRequest, type CreateBoardResponse, type CreateBoardResponses, type CreateCommitteeData, type CreateCommitteeError, type CreateCommitteeErrors, type CreateCommitteeRequest, type CreateCommitteeResponse, type CreateCommitteeResponses, type CreateContributionData, type CreateContributionError, type CreateContributionErrors, type CreateContributionPeriodData, type CreateContributionPeriodError, type CreateContributionPeriodErrors, type CreateContributionPeriodRequest, type CreateContributionPeriodResponse, type CreateContributionPeriodResponses, type CreateContributionReminderRequest, type CreateContributionRequest, type CreateContributionResponse, type CreateContributionResponses, type CreateEventData, type CreateEventError, type CreateEventErrors, type CreateEventRequest, type CreateEventResponse, type CreateEventResponses, type CreateEventSignupData, type CreateEventSignupError, type CreateEventSignupErrors, type CreateEventSignUpRequest, type CreateEventSignupResponse, type CreateEventSignupResponses, type CreateGuestRequest, type CreateMemberProfileData, type CreateMemberProfileError, type CreateMemberProfileErrors, type CreateMemberProfileRequest, type CreateMemberProfileResponse, type CreateMemberProfileResponses, type CreateMembershipData, type CreateMembershipError, type CreateMembershipErrors, type CreateMembershipResponse, type CreateMembershipResponses, type CreateSponsorData, type CreateSponsorError, type CreateSponsorErrors, type CreateSponsorRequest, type CreateSponsorResponse, type CreateSponsorResponses, type CreateTargetData, type CreateTargetError, type CreateTargetErrors, type CreateTargetRequest, type CreateTargetResponse, type CreateTargetResponses, type CreateTelemetryData, type CreateTelemetryError, type CreateTelemetryErrors, type CreateTelemetryRequest, type CreateTelemetryResponse, type CreateTelemetryResponses, type CreateUserData, type CreateUserError, type CreateUserErrors, type CreateUserRequest, type CreateUserResponse, type CreateUserResponses, type CsrfData, type CsrfError, type CsrfErrors, type CsrfResponse, type CsrfResponses, type CsrfToken, type DeleteAddressByIdData, type DeleteAddressByIdError, type DeleteAddressByIdErrors, type DeleteAddressByIdResponse, type DeleteAddressByIdResponses, type DeleteBoardData, type DeleteBoardError, type DeleteBoardErrors, type DeleteBoardResponse, type DeleteBoardResponses, type DeleteByIdData, type DeleteByIdError, type DeleteByIdErrors, type DeleteByIdResponse, type DeleteByIdResponses, type DeleteCommitteeByIdData, type DeleteCommitteeByIdError, type DeleteCommitteeByIdErrors, type DeleteCommitteeByIdResponse, type DeleteCommitteeByIdResponses, type DeleteContributionData, type DeleteContributionError, type DeleteContributionErrors, type DeleteContributionPeriodByIdData, type DeleteContributionPeriodByIdError, type DeleteContributionPeriodByIdErrors, type DeleteContributionPeriodByIdResponse, type DeleteContributionPeriodByIdResponses, type DeleteContributionResponse, type DeleteContributionResponses, type DeleteEventByIdData, type DeleteEventByIdError, type DeleteEventByIdErrors, type DeleteEventByIdResponse, type DeleteEventByIdResponses, type DeleteEventSignupData, type DeleteEventSignupError, type DeleteEventSignupErrors, type DeleteEventSignupResponse, type DeleteEventSignupResponses, type DeleteSponsorByIdData, type DeleteSponsorByIdError, type DeleteSponsorByIdErrors, type DeleteSponsorByIdResponse, type DeleteSponsorByIdResponses, type DeleteUserByIdData, type DeleteUserByIdError, type DeleteUserByIdErrors, type DeleteUserByIdResponse, type DeleteUserByIdResponses, type DownloadEventBannerData, type DownloadEventBannerError, type DownloadEventBannerErrors, type DownloadEventBannerResponse, type DownloadEventBannerResponses, type DriftReport, type Email, type EmailStats, type EnqueueData, type EnqueueError, type EnqueueErrors, type EnqueueJobRequest, type EnqueueResponse, type EnqueueResponses, type EventBannerRequest, type EventBannerResponse, type EventResponse, type EventSignUpResponse, type ExternalTarget, type ExtraRow, type FieldValidationError, type FileResponse, FileType, type FindAddressByIdData, type FindAddressByIdError, type FindAddressByIdErrors, type FindAddressByIdResponse, type FindAddressByIdResponses, type FindAllAddressesData, type FindAllAddressesError, type FindAllAddressesErrors, type FindAllAddressesResponse, type FindAllAddressesResponses, type FindAllBoardsData, type FindAllBoardsError, type FindAllBoardsErrors, type FindAllBoardsResponse, type FindAllBoardsResponses, type FindBlogByIdData, type FindBlogByIdError, type FindBlogByIdErrors, type FindBlogByIdResponse, type FindBlogByIdResponses, type FindBlogsData, type FindBlogsError, type FindBlogsErrors, type FindBlogsResponse, type FindBlogsResponses, type FindBoardByIdData, type FindBoardByIdError, type FindBoardByIdErrors, type FindBoardByIdResponse, type FindBoardByIdResponses, type FindCohortByIdData, type FindCohortByIdError, type FindCohortByIdErrors, type FindCohortByIdResponse, type FindCohortByIdResponses, type FindCohortsData, type FindCohortsError, type FindCohortsErrors, type FindCohortsResponse, type FindCohortsResponses, type FindCohortSubjectByIdData, type FindCohortSubjectByIdError, type FindCohortSubjectByIdErrors, type FindCohortSubjectByIdResponse, type FindCohortSubjectByIdResponses, type FindCohortSubjectsData, type FindCohortSubjectsError, type FindCohortSubjectsErrors, type FindCohortSubjectsResponse, type FindCohortSubjectsResponses, type FindCommitteeByIdData, type FindCommitteeByIdError, type FindCommitteeByIdErrors, type FindCommitteeByIdResponse, type FindCommitteeByIdResponses, type FindCommitteesByUserIdData, type FindCommitteesByUserIdError, type FindCommitteesByUserIdErrors, type FindCommitteesByUserIdResponse, type FindCommitteesByUserIdResponses, type FindCommitteesData, type FindCommitteesError, type FindCommitteesErrors, type FindCommitteesResponse, type FindCommitteesResponses, type FindContributionPeriodsData, type FindContributionPeriodsError, type FindContributionPeriodsErrors, type FindContributionPeriodsResponse, type FindContributionPeriodsResponses, type FindContributionRemindersData, type FindContributionRemindersError, type FindContributionRemindersErrors, type FindContributionRemindersResponse, type FindContributionRemindersResponses, type FindContributionsByPeriodIdData, type FindContributionsByPeriodIdError, type FindContributionsByPeriodIdErrors, type FindContributionsByPeriodIdResponse, type FindContributionsByPeriodIdResponses, type FindContributionsData, type FindContributionsError, type FindContributionsErrors, type FindContributionsResponse, type FindContributionsResponses, type FindCurrentContributionPeriodData, type FindCurrentContributionPeriodError, type FindCurrentContributionPeriodErrors, type FindCurrentContributionPeriodResponse, type FindCurrentContributionPeriodResponses, type FindDeletedUsersData, type FindDeletedUsersError, type FindDeletedUsersErrors, type FindDeletedUsersResponse, type FindDeletedUsersResponses, type FindEventByIdData, type FindEventByIdError, type FindEventByIdErrors, type FindEventByIdResponse, type FindEventByIdResponses, type FindEventsData, type FindEventsError, type FindEventsErrors, type FindEventSignUpsByAccessTokenData, type FindEventSignUpsByAccessTokenError, type FindEventSignUpsByAccessTokenErrors, type FindEventSignUpsByAccessTokenResponse, type FindEventSignUpsByAccessTokenResponses, type FindEventSignUpsByEventIdData, type FindEventSignUpsByEventIdError, type FindEventSignUpsByEventIdErrors, type FindEventSignUpsByEventIdResponse, type FindEventSignUpsByEventIdResponses, type FindEventSignUpsData, type FindEventSignUpsError, type FindEventSignUpsErrors, type FindEventSignUpsResponse, type FindEventSignUpsResponses, type FindEventsResponse, type FindEventsResponses, type FindMemberProfileByUserIdData, type FindMemberProfileByUserIdError, type FindMemberProfileByUserIdErrors, type FindMemberProfileByUserIdResponse, type FindMemberProfileByUserIdResponses, type FindMembershipByIdData, type FindMembershipByIdError, type FindMembershipByIdErrors, type FindMembershipByIdResponse, type FindMembershipByIdResponses, type FindMembershipsData, type FindMembershipsError, type FindMembershipsErrors, type FindMembershipsResponse, type FindMembershipsResponses, type FindSponsorByIdData, type FindSponsorByIdError, type FindSponsorByIdErrors, type FindSponsorByIdResponse, type FindSponsorByIdResponses, type FindSponsorsData, type FindSponsorsError, type FindSponsorsErrors, type FindSponsorsResponse, type FindSponsorsResponses, type FindTelemetryByIdData, type FindTelemetryByIdError, type FindTelemetryByIdErrors, type FindTelemetryByIdResponse, type FindTelemetryByIdResponses, type FindUserByIdData, type FindUserByIdError, type FindUserByIdErrors, type FindUserByIdResponse, type FindUserByIdResponses, type FindUsersData, type FindUsersError, type FindUsersErrors, type FindUsersResponse, type FindUsersResponses, type ForwardAuthData, type ForwardAuthError, type ForwardAuthErrors, type ForwardAuthResponses, type GetDriftData, type GetDriftError, type GetDriftErrors, type GetDriftResponse, type GetDriftResponses, type GetStats1Data, type GetStats1Error, type GetStats1Errors, type GetStats1Response, type GetStats1Responses, type GetStatsData, type GetStatsError, type GetStatsErrors, type GetStatsResponse, type GetStatsResponses, type GuestResponse, type HealthCheckData, type HealthCheckError, type HealthCheckErrors, type HealthCheckResponse, type HealthCheckResponses, type InboundReconcileApplyRequest, type InboundReconcileApplyResponse, type InboundReconcileMatchedRow, type InboundReconcilePreview, type InboundReconcileSkippedRow, type JobExecution, JobExecutionCategory, type JobExecutionRelatedEntity, JobExecutionStatus, type JobPayloadField, JobPayloadFieldKind, type JobStatsDto, type JobTypeDescriptor, type JobTypesData, type JobTypesError, type JobTypesErrors, type JobTypesResponse, type JobTypesResponses, type JwtRequest, type LinkedUser, type LinkExistingTargetData, type LinkExistingTargetError, type LinkExistingTargetErrors, type LinkExistingTargetRequest, type LinkExistingTargetResponse, type LinkExistingTargetResponses, type LinkUserData, type LinkUserError, type LinkUserErrors, type LinkUserRequest, type LinkUserResponse, type LinkUserResponses, type List1Data, type List1Error, type List1Errors, type List1Response, type List1Responses, type ListCohortTargetSystemsData, type ListCohortTargetSystemsError, type ListCohortTargetSystemsErrors, type ListCohortTargetSystemsResponse, type ListCohortTargetSystemsResponses, type ListData, type ListError, type ListErrors, type ListResponse, type ListResponses, type LoginResponse, type LogoutData, type LogoutError, type LogoutErrors, type LogoutResponse, type LogoutResponses, type MemberActivateData, type MemberActivateError, type MemberActivateErrors, type MemberActivateResponse, type MemberActivateResponses, type MemberActivationRequest, type MemberProfileResponse, type MembershipResponse, MemberType, type MissingRow, type MyServicesData, type MyServicesError, type MyServicesErrors, type MyServicesResponse, type MyServicesResponses, type PagedModelEmail, type PagedModelEventResponse, type PagedModelJobExecution, type PagedModelUserDetailResponse, type PageMetadata, type PasswordResetRequest, PlatformType, type PreviewInboundReconcileData, type PreviewInboundReconcileError, type PreviewInboundReconcileErrors, type PreviewInboundReconcileResponse, type PreviewInboundReconcileResponses, type QuestionRequest, type QuestionResponse, QuestionType, type RedirectResponse, type RemoveMemberData, type RemoveMemberError, type RemoveMemberErrors, type RemoveMemberResponse, type RemoveMemberResponses, type RepairMissingAddsData, type RepairMissingAddsError, type RepairMissingAddsErrors, type RepairMissingAddsResponse, type RepairMissingAddsResponses, type ResendMemberActivationEmailData, type ResendMemberActivationEmailError, type ResendMemberActivationEmailErrors, type ResendMemberActivationEmailResponse, type ResendMemberActivationEmailResponses, type ResendUserActivationData, type ResendUserActivationError, type ResendUserActivationErrors, type ResendUserActivationResponse, type ResendUserActivationResponses, type ResetPasswordData, type ResetPasswordError, type ResetPasswordErrors, type ResetPasswordResponse, type ResetPasswordResponses, type RestoreDeletedUserByIdData, type RestoreDeletedUserByIdError, type RestoreDeletedUserByIdErrors, type RestoreDeletedUserByIdResponse, type RestoreDeletedUserByIdResponses, type Retry1Data, type Retry1Error, type Retry1Errors, type Retry1Response, type Retry1Responses, type RetryData, type RetryError, type RetryErrors, type RetryResponse, type RetryResponses, Role, type SearchCohortTargetsData, type SearchCohortTargetsError, type SearchCohortTargetsErrors, type SearchCohortTargetsResponse, type SearchCohortTargetsResponses, type SendContributionReminderBatchData, type SendContributionReminderBatchError, type SendContributionReminderBatchErrors, type SendContributionReminderBatchResponse, type SendContributionReminderBatchResponses, type SendContributionReminderData, type SendContributionReminderError, type SendContributionReminderErrors, type SendContributionReminderResponse, type SendContributionReminderResponses, type ServiceEntry, type SetPasswordData, type SetPasswordError, type SetPasswordErrors, type SetPasswordResponse, type SetPasswordResponses, type SponsorResponse, type SubjectFact, type SurveyRequest, type SurveyResponse, type SwitchTargetData, type SwitchTargetError, type SwitchTargetErrors, type SwitchTargetRequest, type SwitchTargetResponse, type SwitchTargetResponses, type TargetDescriptor, type TelemetryResponse, type ToggleUserRoleData, type ToggleUserRoleError, type ToggleUserRoleErrors, type ToggleUserRoleResponse, type ToggleUserRoleResponses, type UpdateAddressData, type UpdateAddressError, type UpdateAddressErrors, type UpdateAddressRequest, type UpdateAddressResponse, type UpdateAddressResponses, type UpdateBlogData, type UpdateBlogError, type UpdateBlogErrors, type UpdateBlogRequest, type UpdateBlogResponse, type UpdateBlogResponses, type UpdateBoardData, type UpdateBoardError, type UpdateBoardErrors, type UpdateBoardRequest, type UpdateBoardResponse, type UpdateBoardResponses, type UpdateCommitteeData, type UpdateCommitteeError, type UpdateCommitteeErrors, type UpdateCommitteeRequest, type UpdateCommitteeResponse, type UpdateCommitteeResponses, type UpdateContributionPeriodData, type UpdateContributionPeriodError, type UpdateContributionPeriodErrors, type UpdateContributionPeriodRequest, type UpdateContributionPeriodResponse, type UpdateContributionPeriodResponses, type UpdateEventData, type UpdateEventError, type UpdateEventErrors, type UpdateEventRequest, type UpdateEventResponse, type UpdateEventResponses, type UpdateEventSignUpData, type UpdateEventSignUpError, type UpdateEventSignUpErrors, type UpdateEventSignUpRequest, type UpdateEventSignUpResponse, type UpdateEventSignUpResponses, type UpdateMemberProfileData, type UpdateMemberProfileError, type UpdateMemberProfileErrors, type UpdateMemberProfileRequest, type UpdateMemberProfileResponse, type UpdateMemberProfileResponses, type UpdateMembershipData, type UpdateMembershipError, type UpdateMembershipErrors, type UpdateMembershipRequest, type UpdateMembershipResponse, type UpdateMembershipResponses, type UpdateSponsorData, type UpdateSponsorError, type UpdateSponsorErrors, type UpdateSponsorRequest, type UpdateSponsorResponse, type UpdateSponsorResponses, type UpdateUserData, type UpdateUserError, type UpdateUserErrors, type UpdateUserRequest, type UpdateUserResponse, type UpdateUserResponses, type UploadEventBannerData, type UploadEventBannerError, type UploadEventBannerErrors, type UploadEventBannerResponse, type UploadEventBannerResponses, type UpsertMemberProfileRequest, type UserActivateData, type UserActivateError, type UserActivateErrors, type UserActivateResponse, type UserActivateResponses, type UserActivationRequest, type UserDetailResponse, type UserSummaryResponse } from './types.gen'; +export { type Actor, type AddBoardMemberRequest, type AddMemberData, type AddMemberError, type AddMemberErrors, type AddMemberResponse, type AddMemberResponses, type AddressResponse, type AnswerRequest, type AnswerResponse, type ApiError, type ApplyInboundReconcileData, type ApplyInboundReconcileError, type ApplyInboundReconcileErrors, type ApplyInboundReconcileResponse, type ApplyInboundReconcileResponses, type ApproveEventData, type ApproveEventError, type ApproveEventErrors, type ApproveEventResponse, type ApproveEventResponses, type AuthenticateData, type AuthenticateError, type AuthenticateErrors, type AuthenticateResponse, type AuthenticateResponses, type BlogResponse, type BoardCreateMembershipData, type BoardCreateMembershipError, type BoardCreateMembershipErrors, type BoardCreateMembershipRequest, type BoardCreateMembershipResponse, type BoardCreateMembershipResponses, type BoardMemberResponse, type BoardResponse, type ClientOptions, type CohortDetail, CohortFactKind, CohortKind, type CohortMapping, type CohortMemberRow, type CohortRepair, type CohortRule, CohortSubjectCategory, type CohortSubjectDetail, type CohortSubjectMember, type CohortSubjectRule, type CohortSubjectSummary, CohortSubjectType, type CohortSummary, type CommitteeDetailResponse, type CommitteeMemberRequest, type CommitteeMemberResponse, type CommitteeResponse, type ContributionPeriodResponse, type ContributionReminderResponse, type ContributionResponse, type CreateAddressData, type CreateAddressError, type CreateAddressErrors, type CreateAddressRequest, type CreateAddressResponse, type CreateAddressResponses, type CreateBlogData, type CreateBlogError, type CreateBlogErrors, type CreateBlogRequest, type CreateBlogResponse, type CreateBlogResponses, type CreateBoardData, type CreateBoardError, type CreateBoardErrors, type CreateBoardRequest, type CreateBoardResponse, type CreateBoardResponses, type CreateCommitteeData, type CreateCommitteeError, type CreateCommitteeErrors, type CreateCommitteeRequest, type CreateCommitteeResponse, type CreateCommitteeResponses, type CreateContributionData, type CreateContributionError, type CreateContributionErrors, type CreateContributionPeriodData, type CreateContributionPeriodError, type CreateContributionPeriodErrors, type CreateContributionPeriodRequest, type CreateContributionPeriodResponse, type CreateContributionPeriodResponses, type CreateContributionReminderRequest, type CreateContributionRequest, type CreateContributionResponse, type CreateContributionResponses, type CreateEventData, type CreateEventError, type CreateEventErrors, type CreateEventRequest, type CreateEventResponse, type CreateEventResponses, type CreateEventSignupData, type CreateEventSignupError, type CreateEventSignupErrors, type CreateEventSignUpRequest, type CreateEventSignupResponse, type CreateEventSignupResponses, type CreateGuestRequest, type CreateMemberProfileData, type CreateMemberProfileError, type CreateMemberProfileErrors, type CreateMemberProfileRequest, type CreateMemberProfileResponse, type CreateMemberProfileResponses, type CreateMembershipData, type CreateMembershipError, type CreateMembershipErrors, type CreateMembershipResponse, type CreateMembershipResponses, type CreateSponsorData, type CreateSponsorError, type CreateSponsorErrors, type CreateSponsorRequest, type CreateSponsorResponse, type CreateSponsorResponses, type CreateTargetData, type CreateTargetError, type CreateTargetErrors, type CreateTargetRequest, type CreateTargetResponse, type CreateTargetResponses, type CreateTelemetryData, type CreateTelemetryError, type CreateTelemetryErrors, type CreateTelemetryRequest, type CreateTelemetryResponse, type CreateTelemetryResponses, type CreateUserData, type CreateUserError, type CreateUserErrors, type CreateUserRequest, type CreateUserResponse, type CreateUserResponses, type CsrfData, type CsrfError, type CsrfErrors, type CsrfResponse, type CsrfResponses, type CsrfToken, type DeleteAddressByIdData, type DeleteAddressByIdError, type DeleteAddressByIdErrors, type DeleteAddressByIdResponse, type DeleteAddressByIdResponses, type DeleteBoardData, type DeleteBoardError, type DeleteBoardErrors, type DeleteBoardResponse, type DeleteBoardResponses, type DeleteByIdData, type DeleteByIdError, type DeleteByIdErrors, type DeleteByIdResponse, type DeleteByIdResponses, type DeleteCommitteeByIdData, type DeleteCommitteeByIdError, type DeleteCommitteeByIdErrors, type DeleteCommitteeByIdResponse, type DeleteCommitteeByIdResponses, type DeleteContributionData, type DeleteContributionError, type DeleteContributionErrors, type DeleteContributionPeriodByIdData, type DeleteContributionPeriodByIdError, type DeleteContributionPeriodByIdErrors, type DeleteContributionPeriodByIdResponse, type DeleteContributionPeriodByIdResponses, type DeleteContributionResponse, type DeleteContributionResponses, type DeleteEventByIdData, type DeleteEventByIdError, type DeleteEventByIdErrors, type DeleteEventByIdResponse, type DeleteEventByIdResponses, type DeleteEventSignupData, type DeleteEventSignupError, type DeleteEventSignupErrors, type DeleteEventSignupResponse, type DeleteEventSignupResponses, type DeleteSponsorByIdData, type DeleteSponsorByIdError, type DeleteSponsorByIdErrors, type DeleteSponsorByIdResponse, type DeleteSponsorByIdResponses, type DeleteUserByIdData, type DeleteUserByIdError, type DeleteUserByIdErrors, type DeleteUserByIdResponse, type DeleteUserByIdResponses, type DownloadEventBannerData, type DownloadEventBannerError, type DownloadEventBannerErrors, type DownloadEventBannerResponse, type DownloadEventBannerResponses, type DriftReport, type Email, type EmailStats, type EnqueueData, type EnqueueError, type EnqueueErrors, type EnqueueJobRequest, type EnqueueResponse, type EnqueueResponses, type EventBannerRequest, type EventBannerResponse, type EventResponse, type EventSignUpResponse, type ExternalTarget, type ExtraRow, type FieldValidationError, type FileResponse, FileType, type FindAddressByIdData, type FindAddressByIdError, type FindAddressByIdErrors, type FindAddressByIdResponse, type FindAddressByIdResponses, type FindAllAddressesData, type FindAllAddressesError, type FindAllAddressesErrors, type FindAllAddressesResponse, type FindAllAddressesResponses, type FindAllBoardsData, type FindAllBoardsError, type FindAllBoardsErrors, type FindAllBoardsResponse, type FindAllBoardsResponses, type FindBlogByIdData, type FindBlogByIdError, type FindBlogByIdErrors, type FindBlogByIdResponse, type FindBlogByIdResponses, type FindBlogsData, type FindBlogsError, type FindBlogsErrors, type FindBlogsResponse, type FindBlogsResponses, type FindBoardByIdData, type FindBoardByIdError, type FindBoardByIdErrors, type FindBoardByIdResponse, type FindBoardByIdResponses, type FindCohortByIdData, type FindCohortByIdError, type FindCohortByIdErrors, type FindCohortByIdResponse, type FindCohortByIdResponses, type FindCohortsData, type FindCohortsError, type FindCohortsErrors, type FindCohortsResponse, type FindCohortsResponses, type FindCohortSubjectByIdData, type FindCohortSubjectByIdError, type FindCohortSubjectByIdErrors, type FindCohortSubjectByIdResponse, type FindCohortSubjectByIdResponses, type FindCohortSubjectsData, type FindCohortSubjectsError, type FindCohortSubjectsErrors, type FindCohortSubjectsResponse, type FindCohortSubjectsResponses, type FindCommitteeByIdData, type FindCommitteeByIdError, type FindCommitteeByIdErrors, type FindCommitteeByIdResponse, type FindCommitteeByIdResponses, type FindCommitteesByUserIdData, type FindCommitteesByUserIdError, type FindCommitteesByUserIdErrors, type FindCommitteesByUserIdResponse, type FindCommitteesByUserIdResponses, type FindCommitteesData, type FindCommitteesError, type FindCommitteesErrors, type FindCommitteesResponse, type FindCommitteesResponses, type FindContributionPeriodsData, type FindContributionPeriodsError, type FindContributionPeriodsErrors, type FindContributionPeriodsResponse, type FindContributionPeriodsResponses, type FindContributionRemindersData, type FindContributionRemindersError, type FindContributionRemindersErrors, type FindContributionRemindersResponse, type FindContributionRemindersResponses, type FindContributionsByPeriodIdData, type FindContributionsByPeriodIdError, type FindContributionsByPeriodIdErrors, type FindContributionsByPeriodIdResponse, type FindContributionsByPeriodIdResponses, type FindContributionsData, type FindContributionsError, type FindContributionsErrors, type FindContributionsResponse, type FindContributionsResponses, type FindCurrentContributionPeriodData, type FindCurrentContributionPeriodError, type FindCurrentContributionPeriodErrors, type FindCurrentContributionPeriodResponse, type FindCurrentContributionPeriodResponses, type FindDeletedUsersData, type FindDeletedUsersError, type FindDeletedUsersErrors, type FindDeletedUsersResponse, type FindDeletedUsersResponses, type FindEventByIdData, type FindEventByIdError, type FindEventByIdErrors, type FindEventByIdResponse, type FindEventByIdResponses, type FindEventsData, type FindEventsError, type FindEventsErrors, type FindEventSignUpsByAccessTokenData, type FindEventSignUpsByAccessTokenError, type FindEventSignUpsByAccessTokenErrors, type FindEventSignUpsByAccessTokenResponse, type FindEventSignUpsByAccessTokenResponses, type FindEventSignUpsByEventIdData, type FindEventSignUpsByEventIdError, type FindEventSignUpsByEventIdErrors, type FindEventSignUpsByEventIdResponse, type FindEventSignUpsByEventIdResponses, type FindEventSignUpsData, type FindEventSignUpsError, type FindEventSignUpsErrors, type FindEventSignUpsResponse, type FindEventSignUpsResponses, type FindEventsResponse, type FindEventsResponses, type FindMemberProfileByUserIdData, type FindMemberProfileByUserIdError, type FindMemberProfileByUserIdErrors, type FindMemberProfileByUserIdResponse, type FindMemberProfileByUserIdResponses, type FindMembershipByIdData, type FindMembershipByIdError, type FindMembershipByIdErrors, type FindMembershipByIdResponse, type FindMembershipByIdResponses, type FindMembershipsData, type FindMembershipsError, type FindMembershipsErrors, type FindMembershipsResponse, type FindMembershipsResponses, type FindSponsorByIdData, type FindSponsorByIdError, type FindSponsorByIdErrors, type FindSponsorByIdResponse, type FindSponsorByIdResponses, type FindSponsorsData, type FindSponsorsError, type FindSponsorsErrors, type FindSponsorsResponse, type FindSponsorsResponses, type FindTelemetryByIdData, type FindTelemetryByIdError, type FindTelemetryByIdErrors, type FindTelemetryByIdResponse, type FindTelemetryByIdResponses, type FindUserByIdData, type FindUserByIdError, type FindUserByIdErrors, type FindUserByIdResponse, type FindUserByIdResponses, type FindUsersData, type FindUsersError, type FindUsersErrors, type FindUsersResponse, type FindUsersResponses, type ForwardAuthData, type ForwardAuthError, type ForwardAuthErrors, type ForwardAuthResponses, type GetDriftData, type GetDriftError, type GetDriftErrors, type GetDriftResponse, type GetDriftResponses, type GetStats1Data, type GetStats1Error, type GetStats1Errors, type GetStats1Response, type GetStats1Responses, type GetStatsData, type GetStatsError, type GetStatsErrors, type GetStatsResponse, type GetStatsResponses, type GuestResponse, type HealthCheckData, type HealthCheckError, type HealthCheckErrors, type HealthCheckResponse, type HealthCheckResponses, type InboundReconcileApplyRequest, type InboundReconcileApplyResponse, type InboundReconcilePreview, type InboundReconcileRow, type JobExecution, JobExecutionCategory, type JobExecutionRelatedEntity, JobExecutionStatus, type JobPayloadField, JobPayloadFieldKind, type JobStatsDto, type JobTypeDescriptor, type JobTypesData, type JobTypesError, type JobTypesErrors, type JobTypesResponse, type JobTypesResponses, type JwtRequest, type LinkedUser, type LinkExistingTargetData, type LinkExistingTargetError, type LinkExistingTargetErrors, type LinkExistingTargetRequest, type LinkExistingTargetResponse, type LinkExistingTargetResponses, type LinkUserData, type LinkUserError, type LinkUserErrors, type LinkUserRequest, type LinkUserResponse, type LinkUserResponses, type List1Data, type List1Error, type List1Errors, type List1Response, type List1Responses, type ListCohortTargetSystemsData, type ListCohortTargetSystemsError, type ListCohortTargetSystemsErrors, type ListCohortTargetSystemsResponse, type ListCohortTargetSystemsResponses, type ListData, type ListError, type ListErrors, type ListResponse, type ListResponses, type LoginResponse, type LogoutData, type LogoutError, type LogoutErrors, type LogoutResponse, type LogoutResponses, type MemberActivateData, type MemberActivateError, type MemberActivateErrors, type MemberActivateResponse, type MemberActivateResponses, type MemberActivationRequest, type MemberProfileResponse, type MembershipResponse, MemberType, type MissingRow, type MyServicesData, type MyServicesError, type MyServicesErrors, type MyServicesResponse, type MyServicesResponses, type PagedModelEmail, type PagedModelEventResponse, type PagedModelJobExecution, type PagedModelUserDetailResponse, type PageMetadata, type PasswordResetRequest, PlatformType, type PreviewInboundReconcileData, type PreviewInboundReconcileError, type PreviewInboundReconcileErrors, type PreviewInboundReconcileResponse, type PreviewInboundReconcileResponses, type QuestionRequest, type QuestionResponse, QuestionType, type RedirectResponse, type RemoveMemberData, type RemoveMemberError, type RemoveMemberErrors, type RemoveMemberResponse, type RemoveMemberResponses, type RepairMissingAddsData, type RepairMissingAddsError, type RepairMissingAddsErrors, type RepairMissingAddsResponse, type RepairMissingAddsResponses, type ResendMemberActivationEmailData, type ResendMemberActivationEmailError, type ResendMemberActivationEmailErrors, type ResendMemberActivationEmailResponse, type ResendMemberActivationEmailResponses, type ResendUserActivationData, type ResendUserActivationError, type ResendUserActivationErrors, type ResendUserActivationResponse, type ResendUserActivationResponses, type ResetPasswordData, type ResetPasswordError, type ResetPasswordErrors, type ResetPasswordResponse, type ResetPasswordResponses, type RestoreDeletedUserByIdData, type RestoreDeletedUserByIdError, type RestoreDeletedUserByIdErrors, type RestoreDeletedUserByIdResponse, type RestoreDeletedUserByIdResponses, type Retry1Data, type Retry1Error, type Retry1Errors, type Retry1Response, type Retry1Responses, type RetryData, type RetryError, type RetryErrors, type RetryResponse, type RetryResponses, Role, type SearchCohortTargetsData, type SearchCohortTargetsError, type SearchCohortTargetsErrors, type SearchCohortTargetsResponse, type SearchCohortTargetsResponses, type SendContributionReminderBatchData, type SendContributionReminderBatchError, type SendContributionReminderBatchErrors, type SendContributionReminderBatchResponse, type SendContributionReminderBatchResponses, type SendContributionReminderData, type SendContributionReminderError, type SendContributionReminderErrors, type SendContributionReminderResponse, type SendContributionReminderResponses, type ServiceEntry, type SetPasswordData, type SetPasswordError, type SetPasswordErrors, type SetPasswordResponse, type SetPasswordResponses, type SponsorResponse, type SubjectFact, type SurveyRequest, type SurveyResponse, type SwitchTargetData, type SwitchTargetError, type SwitchTargetErrors, type SwitchTargetRequest, type SwitchTargetResponse, type SwitchTargetResponses, type TargetDescriptor, type TelemetryResponse, type ToggleUserRoleData, type ToggleUserRoleError, type ToggleUserRoleErrors, type ToggleUserRoleResponse, type ToggleUserRoleResponses, type UpdateAddressData, type UpdateAddressError, type UpdateAddressErrors, type UpdateAddressRequest, type UpdateAddressResponse, type UpdateAddressResponses, type UpdateBlogData, type UpdateBlogError, type UpdateBlogErrors, type UpdateBlogRequest, type UpdateBlogResponse, type UpdateBlogResponses, type UpdateBoardData, type UpdateBoardError, type UpdateBoardErrors, type UpdateBoardRequest, type UpdateBoardResponse, type UpdateBoardResponses, type UpdateCommitteeData, type UpdateCommitteeError, type UpdateCommitteeErrors, type UpdateCommitteeRequest, type UpdateCommitteeResponse, type UpdateCommitteeResponses, type UpdateContributionPeriodData, type UpdateContributionPeriodError, type UpdateContributionPeriodErrors, type UpdateContributionPeriodRequest, type UpdateContributionPeriodResponse, type UpdateContributionPeriodResponses, type UpdateEventData, type UpdateEventError, type UpdateEventErrors, type UpdateEventRequest, type UpdateEventResponse, type UpdateEventResponses, type UpdateEventSignUpData, type UpdateEventSignUpError, type UpdateEventSignUpErrors, type UpdateEventSignUpRequest, type UpdateEventSignUpResponse, type UpdateEventSignUpResponses, type UpdateMemberProfileData, type UpdateMemberProfileError, type UpdateMemberProfileErrors, type UpdateMemberProfileRequest, type UpdateMemberProfileResponse, type UpdateMemberProfileResponses, type UpdateMembershipData, type UpdateMembershipError, type UpdateMembershipErrors, type UpdateMembershipRequest, type UpdateMembershipResponse, type UpdateMembershipResponses, type UpdateSponsorData, type UpdateSponsorError, type UpdateSponsorErrors, type UpdateSponsorRequest, type UpdateSponsorResponse, type UpdateSponsorResponses, type UpdateUserData, type UpdateUserError, type UpdateUserErrors, type UpdateUserRequest, type UpdateUserResponse, type UpdateUserResponses, type UploadEventBannerData, type UploadEventBannerError, type UploadEventBannerErrors, type UploadEventBannerResponse, type UploadEventBannerResponses, type UpsertMemberProfileRequest, type UserActivateData, type UserActivateError, type UserActivateErrors, type UserActivateResponse, type UserActivateResponses, type UserActivationRequest, type UserDetailResponse, type UserSummaryResponse } from './types.gen'; diff --git a/services/frontend/src/services/api/blueshell/types.gen.ts b/services/frontend/src/services/api/blueshell/types.gen.ts index 1ada2cae5..b92e0ee4a 100644 --- a/services/frontend/src/services/api/blueshell/types.gen.ts +++ b/services/frontend/src/services/api/blueshell/types.gen.ts @@ -609,34 +609,24 @@ export type InboundReconcileApplyResponse = { skippedCount: number; }; -export type InboundReconcileMatchedRow = { - alreadyTrue: boolean; - externalLabel?: string; - externalUserId: string; - userEmail?: string; - userFullName?: string; - userId: number; - writable: boolean; -}; - export type InboundReconcilePreview = { - cohortId: number; - externalTargetId: string; fact: SubjectFact; - fetchedAt: string; - matched: Array; + matched: Array; previewToken: string; remoteCount: number; - skipped: Array; - subjectId: number; - system: 'BREVO' | 'GOOGLE_CALENDAR'; + skipped: Array; writerSupported: boolean; }; -export type InboundReconcileSkippedRow = { +export type InboundReconcileRow = { + alreadyTrue: boolean; externalLabel?: string; externalUserId: string; - reason: 'DUPLICATE_REMOTE_ID' | 'MAPPING_CONFLICT' | 'DUPLICATE_USER_MATCH' | 'MAPPED_USER_INACTIVE' | 'UNMATCHED'; + reason?: 'DUPLICATE_REMOTE_ID' | 'MAPPING_CONFLICT' | 'DUPLICATE_USER_MATCH' | 'MAPPED_USER_INACTIVE' | 'UNMATCHED'; + userEmail?: string; + userFullName?: string; + userId?: number; + writable: boolean; }; export type JobExecution = {