From c56b6fba91435c3b2efa6ae9ca148c2d1763749d Mon Sep 17 00:00:00 2001 From: Joris Wouter Jonkers Date: Sun, 6 Sep 2026 00:43:33 +0200 Subject: [PATCH 1/3] test(architecture): a rule that selects nothing fails instead of passing ArchitecturePackages declared 32 globs that matched no class after the ADR-003 flattening, and thirteen of them were still read by rules, on the far side where ArchUnit never looks. Repoint what still means something, delete what the flattening or a stronger sibling made redundant, and assert every constant matches at least one class. Closes #1159. --- .../api/cohort/web/CohortSubjectController.kt | 4 + .../architecture/AccessArchitectureTest.kt | 109 +++++------------- .../ApiBoundaryArchitectureTest.kt | 32 ++--- .../api/architecture/ArchitecturePackages.kt | 100 +++------------- .../DecoratorsArchitectureTest.kt | 29 ++++- .../PackageConstantsArchitectureTest.kt | 52 +++++++++ .../SpringPracticesArchitectureTest.kt | 10 +- 7 files changed, 139 insertions(+), 197 deletions(-) create mode 100644 services/api/src/test/kotlin/net/blueshell/api/architecture/PackageConstantsArchitectureTest.kt diff --git a/services/api/src/main/kotlin/net/blueshell/api/cohort/web/CohortSubjectController.kt b/services/api/src/main/kotlin/net/blueshell/api/cohort/web/CohortSubjectController.kt index 898fa47d7..7bc9fd66e 100644 --- a/services/api/src/main/kotlin/net/blueshell/api/cohort/web/CohortSubjectController.kt +++ b/services/api/src/main/kotlin/net/blueshell/api/cohort/web/CohortSubjectController.kt @@ -180,6 +180,7 @@ data class CohortSubjectMemberResponse( val joinedAt: Instant, ) +@Schema(name = "LinkUser") data class LinkUserRequest( @field:NotNull val userId: Long, @field:NotNull val system: TargetSystem, @@ -190,12 +191,14 @@ data class LinkUserRequest( data class LinkedUserResponse(val userId: Long, val system: TargetSystem, val externalUserId: String) /** Map the subject's per-system cohort to an external target that already exists. */ +@Schema(name = "LinkExistingTarget") data class LinkExistingTargetRequest( @field:NotNull val system: TargetSystem, @field:NotBlank val externalId: String, ) /** Create a fresh external target and map the subject's per-system cohort to it. */ +@Schema(name = "CreateTarget") data class CreateTargetRequest( @field:NotNull val system: TargetSystem, @field:NotBlank val label: String, @@ -203,6 +206,7 @@ data class CreateTargetRequest( ) /** Repoint an existing cohort mapping at a different external target. */ +@Schema(name = "SwitchTarget") data class SwitchTargetRequest( @field:NotBlank val externalId: String, val deletePrevious: Boolean = false, diff --git a/services/api/src/test/kotlin/net/blueshell/api/architecture/AccessArchitectureTest.kt b/services/api/src/test/kotlin/net/blueshell/api/architecture/AccessArchitectureTest.kt index 945d7a150..52ac2d024 100644 --- a/services/api/src/test/kotlin/net/blueshell/api/architecture/AccessArchitectureTest.kt +++ b/services/api/src/test/kotlin/net/blueshell/api/architecture/AccessArchitectureTest.kt @@ -28,26 +28,30 @@ import org.springframework.security.access.prepost.PreAuthorize * `net.blueshell.api.domain..web..`, a grouping level the flattening removed, and * [CrossModuleWebAccessArchitectureTest] now states the stronger rule against today's packages: * no module reaches another module's web package at all, whatever layer the reach comes from. + * + * Three more went with the stale constants they read (#1159): + * + * `dto only accessed at api boundary` selected `..web.dto..`, a folder the flattening emptied — + * input and response types sit directly in `/web` now, so there is no DTO package left to + * ring-fence. What it was defending is stated against today's packages by + * `application services do not depend on DTOs` inside a module, and by + * [CrossModuleWebAccessArchitectureTest] across modules. + * + * `controllers do not access repositories directly` named `..persistence.repository..` on its + * `should` side, a folder the flattening merged into `/persistence`. + * [DataOwnershipArchitectureTest]'s `web validators should use services not repositories` asks the + * wider question against today's packages — every class in a `web` package rather than the + * controllers alone, and `dependOnClassesThat`, which covers field, parameter and return types as + * well as the calls `accessClassesThat` sees. + * + * `persistence must not depend on application layer` carved a module's `application` package into + * query objects, which persistence could use under ADR-015, and everything else, which it could + * not. The flattening put both in `/domain`, so the line it drew is no longer a line any + * package boundary can express. `repositories do not depend on services` keeps the half that can + * still be named, and now covers all of persistence rather than repositories alone. */ class AccessArchitectureTest : ArchJUnitTestBase(ArchitecturePackages.ROOT) { - @Test - fun `dto only accessed at api boundary`(): Unit = - arch("DTOs only accessed at web layer boundary") { - classes() - .that().resideInAnyPackage(ArchitecturePackages.DTO) - .and().resideOutsideOfPackages( - "${ArchitecturePackages.DOMAIN_EVENT}web.dto..", // Event domain DTOs - known issue (80% migrated) - "${ArchitecturePackages.DOMAIN_SURVEY}web.dto.." // Survey DTOs used by Event - ) - .should().onlyBeAccessed().byAnyPackage( - ArchitecturePackages.WEB, - ArchitecturePackages.DTO, - ArchitecturePackages.PERSISTENCE // Allow for entity -> DTO mappings - ) - .because("ADR-001: DTOs should not leak into application layer; use commands instead") - } - @Test fun `repository only accessed by application and persistence layers`(): Unit = arch("Repositories only accessed from application layer") { @@ -55,12 +59,9 @@ class AccessArchitectureTest : ArchJUnitTestBase(ArchitecturePackages.ROOT) { .that().resideInAnyPackage(ArchitecturePackages.MODULE_PERSISTENCE) .and().haveSimpleNameEndingWith("Repository") .should().onlyBeAccessed().byAnyPackage( - *ArchitecturePackages.SERVICE_LAYER, + *ArchitecturePackages.SERVICE_LAYER, // job handlers included: they live here now ArchitecturePackages.MODULE_PERSISTENCE, - ArchitecturePackages.DOMAIN_SERVICE, // Domain services can access repositories - ArchitecturePackages.PERSISTENCE, - ArchitecturePackages.JOB, // Per-integration job handlers read DB state - ArchitecturePackages.PLATFORM_MOCK // Mock job handlers in test/dev profile + ArchitecturePackages.PLATFORM_MOCK // Mock job handlers in test/dev profile ) .because("ADR-016: Repositories are inner layer; only application/domain services access them") } @@ -72,36 +73,20 @@ class AccessArchitectureTest : ArchJUnitTestBase(ArchitecturePackages.ROOT) { .that().resideInAnyPackage(*ArchitecturePackages.JOB_HOMES) .and().haveSimpleNameEndingWith("Job") .should().onlyBeAccessed().byAnyPackage( - ArchitecturePackages.JOB, - ArchitecturePackages.MODULE_DOMAIN, + ArchitecturePackages.MODULE_DOMAIN, // event listeners live here too ArchitecturePackages.MODULE_API, - ArchitecturePackages.PLATFORM, - ArchitecturePackages.LISTENER // Listeners can dispatch jobs + ArchitecturePackages.PLATFORM ) .because("Jobs should be triggered by event listeners or scheduling infrastructure") } - @Test - fun `controllers do not access repositories directly`(): Unit = - arch("Controllers must not access repositories") { - noClasses() - .that().resideInAnyPackage(ArchitecturePackages.WEB) - .and().haveSimpleNameEndingWith("Controller") - .should().accessClassesThat().resideInAnyPackage(ArchitecturePackages.REPOSITORY) - .because("ADR-002: Controllers call use cases and services, never repositories") - } - @Test fun `application layer does not depend on controllers`(): Unit = arch("Inner layers must not depend on controllers") { noClasses() .that().resideInAnyPackage( - ArchitecturePackages.APPLICATION, - // DOMAIN is the module root ($ROOT..domain..), which also covers each module's - // web package; the domain layer proper is model + service. - ArchitecturePackages.DOMAIN_MODEL, - ArchitecturePackages.DOMAIN_SERVICE, - ArchitecturePackages.PERSISTENCE + *ArchitecturePackages.SERVICE_LAYER, + ArchitecturePackages.MODULE_PERSISTENCE ) .should().dependOnClassesThat(webControllers) .because("ADR-016: Inner layers must not depend on web layer") @@ -119,10 +104,9 @@ class AccessArchitectureTest : ArchJUnitTestBase(ArchitecturePackages.ROOT) { @Test fun `repositories do not depend on services`(): Unit = - arch("Repositories must not depend on services") { + arch("Persistence must not depend on services") { noClasses() .that().resideInAnyPackage(ArchitecturePackages.MODULE_PERSISTENCE) - .and().haveSimpleNameEndingWith("Repository") .should().dependOnClassesThat(applicationServices) .because("ADR-016: Dependency direction is Service -> Repository, never the reverse") } @@ -137,28 +121,6 @@ class AccessArchitectureTest : ArchJUnitTestBase(ArchitecturePackages.ROOT) { .because("ADR-016: Persistence layer must not know about web DTOs or controllers") } - @Test - fun `persistence must not depend on application layer`(): Unit = - arch("Persistence layer is inner - no application dependencies except queries") { - noClasses() - .that().resideInAnyPackage(ArchitecturePackages.PERSISTENCE) - .should().dependOnClassesThat( - JavaClass.Predicates.resideInAnyPackage( - ArchitecturePackages.APPLICATION_VALIDATION, - ArchitecturePackages.LISTENER, - ArchitecturePackages.EVENT, - ArchitecturePackages.FACTORY - ).or( - // Services are named, not packaged: a `*Service` glob matches no package. - JavaClass.Predicates.resideInAnyPackage(ArchitecturePackages.APPLICATION) - .and(JavaClass.Predicates.simpleNameEndingWith("Service")) - ).or(applicationOfADomainModuleOtherThanQueries) - .`as`("application services, validators, listeners, events, factories or any other part of a domain module's application package") - ) - // ArchitecturePackages.QUERY is exempt (ADR-015: Specs can use query objects) - .because("ADR-016: Persistence can depend on query objects (ADR-015), but not services/handlers/validators") - } - @Test fun `repositories do not depend on DTOs`(): Unit = arch("Repositories must not depend on DTOs") { @@ -201,12 +163,10 @@ class AccessArchitectureTest : ArchJUnitTestBase(ArchitecturePackages.ROOT) { .that().haveSimpleNameEndingWith("Query") .and().resideInAnyPackage("${ArchitecturePackages.ROOT}..") // Within project only .should().resideOutsideOfPackages( - ArchitecturePackages.QUERY, - ArchitecturePackages.MODULE_DOMAIN, // same layer, once the module is flattened + ArchitecturePackages.MODULE_DOMAIN, // where the flattening puts them ArchitecturePackages.WEB // Acceptable for web query params ) .because("ADR-015: Query objects are application concerns, not persistence filters") - .allowEmptyShould(true) } @Test @@ -251,17 +211,8 @@ class AccessArchitectureTest : ArchJUnitTestBase(ArchitecturePackages.ROOT) { .`as`("web controllers") val applicationServices: DescribedPredicate = - JavaClass.Predicates.resideInAnyPackage(ArchitecturePackages.APPLICATION) + JavaClass.Predicates.resideInAnyPackage(*ArchitecturePackages.SERVICE_LAYER) .and(JavaClass.Predicates.simpleNameEndingWith("Service")) .`as`("application services") - - val applicationOfADomainModuleOtherThanQueries: DescribedPredicate = - JavaClass.Predicates.resideInAnyPackage(ArchitecturePackages.DOMAIN_APPLICATION) - .and( - DescribedPredicate.not( - JavaClass.Predicates.resideInAnyPackage(ArchitecturePackages.QUERY) - ) - ) - .`as`("a domain module's application package other than its query objects") } } diff --git a/services/api/src/test/kotlin/net/blueshell/api/architecture/ApiBoundaryArchitectureTest.kt b/services/api/src/test/kotlin/net/blueshell/api/architecture/ApiBoundaryArchitectureTest.kt index 5e099cc42..f4c178356 100644 --- a/services/api/src/test/kotlin/net/blueshell/api/architecture/ApiBoundaryArchitectureTest.kt +++ b/services/api/src/test/kotlin/net/blueshell/api/architecture/ApiBoundaryArchitectureTest.kt @@ -12,6 +12,18 @@ import org.junit.jupiter.api.Test /** * ArchUnit tests enforcing API boundary best practices. * Aligned with ADR-001, ADR-012. + * + * Two rules left with the stale constants they read (#1159). + * + * `web DTOs must not be entities` was a duplicate: [DecoratorsArchitectureTest]'s + * `dtos must not be entities` is the same assertion, and repointing both at `/web` would + * have left two copies of it. + * + * `controllers must not depend on Spring Data repositories` named `..persistence.repository..`, + * a folder the flattening merged into `/persistence`. Repointing it produced a rule + * [DataOwnershipArchitectureTest]'s `web validators should use services not repositories` already + * states more strongly — that one holds every class in a `web` package to it, not just the + * controllers — so it is retired rather than duplicated. */ class ApiBoundaryArchitectureTest : ArchJUnitTestBase(ArchitecturePackages.ROOT) { @@ -44,17 +56,6 @@ class ApiBoundaryArchitectureTest : ArchJUnitTestBase(ArchitecturePackages.ROOT) .because("ADR-001: Web layer should not know about persistence technology") } - @Test - fun `controllers must not depend on Spring Data repositories`(): Unit = - arch("Controllers must not import repositories") { - noClasses() - .that().resideInAnyPackage(ArchitecturePackages.WEB) - .and().haveSimpleNameEndingWith("Controller") - .should().dependOnClassesThat() - .resideInAnyPackage(ArchitecturePackages.REPOSITORY) - .because("ADR-002: Controllers reach persistence through the application layer, never directly") - } - @Test fun `entities implement Identifiable interface`(): Unit = arch("Entities must implement Identifiable") { @@ -88,15 +89,6 @@ class ApiBoundaryArchitectureTest : ArchJUnitTestBase(ArchitecturePackages.ROOT) .because("Jackson on entities causes lazy-loading and serialization issues - use DTOs instead") } - @Test - fun `web DTOs must not be entities`(): Unit = - arch("DTOs must not be JPA entities") { - noClasses() - .that().resideInAnyPackage(ArchitecturePackages.DTO) - .should().beAnnotatedWith(Entity::class.java) - .because("DTOs and entities serve different purposes - keep them separate") - } - @Test fun `ACL adapters isolate external dependencies`(): Unit = arch("ACL adapters must be in platform integration layer") { diff --git a/services/api/src/test/kotlin/net/blueshell/api/architecture/ArchitecturePackages.kt b/services/api/src/test/kotlin/net/blueshell/api/architecture/ArchitecturePackages.kt index 1d43fa657..0e3b187c9 100644 --- a/services/api/src/test/kotlin/net/blueshell/api/architecture/ArchitecturePackages.kt +++ b/services/api/src/test/kotlin/net/blueshell/api/architecture/ArchitecturePackages.kt @@ -2,51 +2,34 @@ package net.blueshell.api.architecture /** * Central place for package definitions used by ArchUnit rules. - * Aligned with ADR-001 (Multi-Layered DDD Architecture) and ADR-016 (Layer Dependency Rules). + * + * Every constant here names a package that holds at least one class today, and + * [PackageConstantsArchitectureTest] fails if one stops doing so. A glob that matches nothing is + * silently satisfiable, so a stale constant turns its rules green rather than red. + * + * The shape is architecture ADR-003's: modules are flat under the base package and each holds + * `api`, `domain`, `persistence` and `web` directly. */ object ArchitecturePackages { const val ROOT = "net.blueshell.api" - /** Web Layer - Controllers, DTOs, Web Validators */ + /** Controllers, input types, responses and their mappers, in any module. */ const val WEB = "$ROOT..web.." - const val DTO = "$ROOT..web.dto.." - const val WEB_VALIDATION = "$ROOT..web.validation.." - const val WEB_MAPPING = "$ROOT..web.mapping.." - - /** Application Layer - Use cases, Services, Business Validators, Listeners, Factories */ - const val APPLICATION = "$ROOT..application.." /** - * The flattened equivalents of [APPLICATION], for modules that already sit directly - * under the base package. Written with a single `*` segment so they cannot also match - * the old `net.blueshell.api.domain.` grouping level, which [DOMAIN] does. + * A module's four folders. Written with a single `*` segment so they match a module's own + * folder and not a same-named package nested deeper. */ const val MODULE_DOMAIN = "$ROOT.*.domain.." const val MODULE_API = "$ROOT.*.api.." const val MODULE_WEB = "$ROOT.*.web.." const val MODULE_PERSISTENCE = "$ROOT.*.persistence.." - /** - * Where a module's services live: the published ones in `api`, the rest in `domain`. - * Replaces the old single `application` package, which the flattening removes. - */ + /** Where a module's services live: the published ones in `api`, the rest in `domain`. */ val SERVICE_LAYER = arrayOf(MODULE_API, MODULE_DOMAIN) - const val APPLICATION_VALIDATION = "$ROOT..application.validation.." - const val APPLICATION_EXCEPTION = "$ROOT..application.exception.." - const val LISTENER = "$ROOT..application.listener.." - const val EVENT = "$ROOT..application.event.." - const val FACTORY = "$ROOT..application.factory.." - const val QUERY = "$ROOT..application.query.." - /** Domain Layer - Optional rich domain models and domain services */ - const val DOMAIN = "$ROOT..domain.." - const val DOMAIN_MODEL = "$ROOT..domain.model.." - const val DOMAIN_SERVICE = "$ROOT..domain.service.." - - /** Persistence Layer - Entities, Repositories, Specifications */ + /** Entities, repositories and specifications, in any module. */ const val PERSISTENCE = "$ROOT..persistence.." - const val REPOSITORY = "$ROOT..persistence.repository.." - const val SPECIFICATION = "$ROOT..persistence.spec.." /** * Cross-cutting security. Architecture ADR-003 makes this a top-level module of its own; @@ -57,74 +40,23 @@ object ArchitecturePackages { /** ADR-007: only the base and composite evaluator stay here, never a `*Permission`. */ const val PERMISSION = "$ROOT.security.permission.." - /** Platform - Integration with external systems */ + /** Platform - global wiring and the profile-scoped doubles, not a module. */ const val PLATFORM = "$ROOT.platform.." const val PLATFORM_CONFIG = "$ROOT.platform.config.." const val PLATFORM_INTEGRATION = "$ROOT.platform.integration.." - const val JOB = "$ROOT.platform.integration..job.." - - /** - * Where a capability module's job handlers, adapters and clients sit once the module - * is flattened: the sub-packages [JOB] and [PLATFORM_ADAPTER] name do not survive the - * four-folder layout, so the same types land in the module's own domain or api folder. - */ - val JOB_HOMES = arrayOf(JOB, MODULE_DOMAIN, MODULE_API) /** Mock/test adapter implementations */ const val PLATFORM_MOCK = "$ROOT.platform.integration.mock.." - /** Adapter sub-packages: ACL adapters, low-level clients, initializers */ - const val PLATFORM_ADAPTER = "$ROOT.platform.integration..adapter.." - - /** Application sub-packages: services, schedulers, query objects */ - const val PLATFORM_APPLICATION = "$ROOT.platform.integration..application.." - - /** Web DTO sub-packages */ - const val PLATFORM_WEB_DTO = "$ROOT.platform.integration..web.dto.." - - /** Job handler sub-packages under application (legacy non-hex placement). */ - const val APPLICATION_JOB = "$ROOT.platform.integration..application.job.." - - /** - * Job handler sub-packages under adapter (hex placement). A job handler - * is a driving (inbound) adapter — it adapts the queue's "execute this - * payload" message to an inbound application port — so the hexagonal - * home is `adapter/job/`. New modules land here directly; legacy modules - * still live under [APPLICATION_JOB] and migrate as they get touched. - */ - const val ADAPTER_JOB = "$ROOT.platform.integration..adapter.job.." - - /** Job queue infrastructure */ - const val PLATFORM_QUEUE = "$ROOT.platform.integration.queue.." - /** - * ALL platform repositories — catches both standard (..persistence.repository..) - * and non-standard (..job.repository..) paths. Used for access-control rules. + * Where a capability module's job handlers sit. The flattening left them in the module's own + * `domain` or `api` folder rather than in a `job` sub-package of its own. */ - const val PLATFORM_ANY_REPOSITORY = "$ROOT.platform.integration..repository.." + val JOB_HOMES = arrayOf(MODULE_DOMAIN, MODULE_API) /** Shared - Common utilities, enums, base classes */ const val SHARED = "$ROOT.shared.." const val SHARED_MODEL = "$ROOT.shared.model.." const val SHARED_ENUM = "$ROOT.shared.enums.." const val SHARED_SECURITY = "$ROOT.shared.security.." - - /** - * A domain module's own web and application packages. The layer globs above start - * `$ROOT..`, so they also match the platform modules, whose web and application - * packages sit inside [PLATFORM]. These two name the domain half on its own. - */ - const val DOMAIN_WEB = "$ROOT.domain..web.." - const val DOMAIN_APPLICATION = "$ROOT.domain..application.." - - /** Domain Boundaries (ADR-017, ADR-018) */ - const val DOMAIN_AUTH = "$ROOT.domain.auth.." - const val DOMAIN_USER = "$ROOT.domain.user.." - const val DOMAIN_COMMITTEE = "$ROOT.domain.committee.." - const val DOMAIN_EVENT = "$ROOT.domain.event.." - const val DOMAIN_SURVEY = "$ROOT.domain.survey.." - const val DOMAIN_CONTRIBUTION = "$ROOT.domain.contribution.." - const val DOMAIN_SPONSOR = "$ROOT.domain.sponsor.." - const val DOMAIN_BOARD = "$ROOT.domain.board.." - const val DOMAIN_FILE = "$ROOT.domain.file.." } diff --git a/services/api/src/test/kotlin/net/blueshell/api/architecture/DecoratorsArchitectureTest.kt b/services/api/src/test/kotlin/net/blueshell/api/architecture/DecoratorsArchitectureTest.kt index cbd4d6e72..37f70fdce 100644 --- a/services/api/src/test/kotlin/net/blueshell/api/architecture/DecoratorsArchitectureTest.kt +++ b/services/api/src/test/kotlin/net/blueshell/api/architecture/DecoratorsArchitectureTest.kt @@ -1,5 +1,7 @@ package net.blueshell.api.architecture +import com.tngtech.archunit.base.DescribedPredicate +import com.tngtech.archunit.core.domain.JavaClass import com.tngtech.archunit.core.domain.JavaMethod import com.tngtech.archunit.core.domain.JavaModifier import com.tngtech.archunit.lang.ArchCondition @@ -22,6 +24,11 @@ import org.springframework.web.bind.annotation.* /** * ArchUnit tests enforcing proper annotation usage. * Aligned with ADR-001, ADR-009, ADR-012, ADR-014. + * + * The DTO rules below select `/web` rather than the `web/dto/request` and + * `web/dto/response` folders the architecture ADR-003 flattening emptied. An input or response + * type is named, not packaged, now — which is why the two `@Schema` rules match on the name + * suffix and no longer tolerate an empty selection. */ class DecoratorsArchitectureTest : ArchJUnitTestBase(ArchitecturePackages.ROOT) { @@ -51,26 +58,24 @@ class DecoratorsArchitectureTest : ArchJUnitTestBase(ArchitecturePackages.ROOT) fun `response DTOs are decorated with Schema`(): Unit = arch("Response DTOs must have @Schema") { classes() - .that().resideInAnyPackage("${ArchitecturePackages.DTO}response..") + .that().resideInAnyPackage(ArchitecturePackages.MODULE_WEB) .and().doNotHaveModifier(JavaModifier.ABSTRACT) .and().areTopLevelClasses() .and().haveSimpleNameEndingWith("Response") .should().beAnnotatedWith(Schema::class.java) .because("ADR-012: Response DTOs should have OpenAPI schema documentation") - .allowEmptyShould(true) } @Test fun `request DTOs are decorated with Schema`(): Unit = arch("Request DTOs must have @Schema") { classes() - .that().resideInAnyPackage("${ArchitecturePackages.DTO}request..") + .that().resideInAnyPackage(ArchitecturePackages.MODULE_WEB) .and().doNotHaveModifier(JavaModifier.ABSTRACT) .and().areTopLevelClasses() .and().haveSimpleNameEndingWith("Request") .should().beAnnotatedWith(Schema::class.java) .because("ADR-012: Request DTOs should have OpenAPI schema documentation") - .allowEmptyShould(true) } @Test @@ -90,7 +95,7 @@ class DecoratorsArchitectureTest : ArchJUnitTestBase(ArchitecturePackages.ROOT) fun `dtos must not be entities`(): Unit = arch("DTOs must not be JPA entities") { noClasses() - .that().resideInAnyPackage(ArchitecturePackages.DTO) + .that().resideInAnyPackage(ArchitecturePackages.MODULE_WEB) .should().beAnnotatedWith(Entity::class.java) .because("ADR-001: DTOs are API contracts, entities are persistence models - keep separate") } @@ -109,7 +114,7 @@ class DecoratorsArchitectureTest : ArchJUnitTestBase(ArchitecturePackages.ROOT) fun `dtos must not be Spring components`(): Unit = arch("DTOs must be passive data carriers") { noClasses() - .that().resideInAnyPackage(ArchitecturePackages.DTO) + .that(inputOrResponseTypes) .should().beAnnotatedWith(Component::class.java) .orShould().beAnnotatedWith(Service::class.java) .orShould().beAnnotatedWith(Repository::class.java) @@ -139,6 +144,18 @@ class DecoratorsArchitectureTest : ArchJUnitTestBase(ArchitecturePackages.ROOT) // ---- Helper conditions ---- + private companion object { + // A `web` package holds mappers and argument resolvers that are legitimately beans, so + // the passive-carrier rule picks its subjects by name rather than by package. + val inputOrResponseTypes: DescribedPredicate = + JavaClass.Predicates.resideInAnyPackage(ArchitecturePackages.MODULE_WEB) + .and( + JavaClass.Predicates.simpleNameEndingWith("Request") + .or(JavaClass.Predicates.simpleNameEndingWith("Response")), + ) + .`as`("controller input and response types") + } + private fun beSecuredByPreAuthorizeOrPermitAll(): ArchCondition = object : ArchCondition("be secured by @PreAuthorize or @PermitAll at method or class level") { override fun check(item: JavaMethod, events: ConditionEvents) { diff --git a/services/api/src/test/kotlin/net/blueshell/api/architecture/PackageConstantsArchitectureTest.kt b/services/api/src/test/kotlin/net/blueshell/api/architecture/PackageConstantsArchitectureTest.kt new file mode 100644 index 000000000..03899071d --- /dev/null +++ b/services/api/src/test/kotlin/net/blueshell/api/architecture/PackageConstantsArchitectureTest.kt @@ -0,0 +1,52 @@ +package net.blueshell.api.architecture + +import com.tngtech.archunit.core.domain.JavaClass +import net.blueshell.api.architecture.support.ArchJUnitTestBase +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Test + +/** + * Every glob in [ArchitecturePackages] names a package that holds at least one class. + * + * A rule built on a glob that matches nothing passes without checking anything, and it passes + * quietly: the suite reports it green, so a rule that stopped applying looks exactly like a rule + * nobody violates. That is what the architecture ADR-003 flattening did to nineteen of these. + * + * ArchUnit's own `allowEmptyShould(false)` — the default — only guards the classes a rule + * *selects*. Most of the stale constants sat on the far side instead, in `dependOnClassesThat`, + * `onlyBeAccessed().byAnyPackage` or a `resideOutsideOfPackages` exemption, where an empty match + * makes the rule permissive and ArchUnit never looks. Checking the constant itself catches both + * positions, so the two mechanisms are kept together rather than one instead of the other. + * + * A constant with no user is not exempt: it is the vocabulary the next rule gets written in, and + * inheriting a dead one is how this recurs. + */ +class PackageConstantsArchitectureTest : ArchJUnitTestBase(ArchitecturePackages.ROOT) { + + @Test + fun `every package constant matches at least one class`() { + val empty = globs() + .filter { (_, glob) -> importedClasses.none { JavaClass.Predicates.resideInAPackage(glob).test(it) } } + .map { (name, glob) -> "$name = $glob" } + .sorted() + + assertThat(empty) + .describedAs( + "these globs match no class, so every rule built on them is vacuous. Point each at " + + "the package architecture ADR-003 actually puts those types in, or delete it " + + "along with the rules that read it", + ) + .isEmpty() + } + + /** Every constant's globs as ` to `; an array constant contributes one pair per element. */ + private fun globs(): List> = + ArchitecturePackages::class.java.declaredFields.flatMap { field -> + field.isAccessible = true + when (val value = field.get(ArchitecturePackages)) { + is String -> listOf(field.name to value) + is Array<*> -> value.filterIsInstance().map { field.name to it } + else -> emptyList() + } + } +} diff --git a/services/api/src/test/kotlin/net/blueshell/api/architecture/SpringPracticesArchitectureTest.kt b/services/api/src/test/kotlin/net/blueshell/api/architecture/SpringPracticesArchitectureTest.kt index 8dc058ddb..9965260bd 100644 --- a/services/api/src/test/kotlin/net/blueshell/api/architecture/SpringPracticesArchitectureTest.kt +++ b/services/api/src/test/kotlin/net/blueshell/api/architecture/SpringPracticesArchitectureTest.kt @@ -29,10 +29,7 @@ class SpringPracticesArchitectureTest : ArchJUnitTestBase(ArchitecturePackages.R // Class-level @Transactional outside allowed layers noClasses() .that().resideOutsideOfPackages( - ArchitecturePackages.APPLICATION, - ArchitecturePackages.MODULE_DOMAIN, // same layer, once the module is flattened - ArchitecturePackages.MODULE_API, - ArchitecturePackages.DOMAIN_SERVICE, // Domain services can be transactional + *ArchitecturePackages.SERVICE_LAYER, ArchitecturePackages.PLATFORM, // Jobs can be transactional ArchitecturePackages.SHARED // BaseModelService in shared ) @@ -43,10 +40,7 @@ class SpringPracticesArchitectureTest : ArchJUnitTestBase(ArchitecturePackages.R noMethods() .that().areDeclaredInClassesThat() .resideOutsideOfPackages( - ArchitecturePackages.APPLICATION, - ArchitecturePackages.MODULE_DOMAIN, // same layer, once the module is flattened - ArchitecturePackages.MODULE_API, - ArchitecturePackages.DOMAIN_SERVICE, // Domain services can be transactional + *ArchitecturePackages.SERVICE_LAYER, ArchitecturePackages.PLATFORM, // Jobs can be transactional ArchitecturePackages.SHARED // BaseModelService in shared ) From 55b398c129d5280620cca7e5903a818678efe20f Mon Sep 17 00:00:00 2001 From: Joris Wouter Jonkers <74975850+ExtraToast@users.noreply.github.com> Date: Sun, 6 Sep 2026 01:15:51 +0200 Subject: [PATCH 2/3] chore(openapi): the spec and client carry the renamed cohort request schemas --- services/api/openapi.yaml | 16 ++++++++-------- .../services/api/blueshell/client/types.gen.ts | 2 +- .../frontend/src/services/api/blueshell/index.ts | 2 +- .../src/services/api/blueshell/types.gen.ts | 16 ++++++++-------- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/services/api/openapi.yaml b/services/api/openapi.yaml index 4bbae6c9d..69466882a 100644 --- a/services/api/openapi.yaml +++ b/services/api/openapi.yaml @@ -1694,7 +1694,7 @@ components: - description - name type: object - CreateTargetRequest: + CreateTarget: properties: folderHint: type: @@ -2876,7 +2876,7 @@ components: - integer - 'null' type: object - LinkExistingTargetRequest: + LinkExistingTarget: properties: externalId: minLength: 1 @@ -2896,7 +2896,7 @@ components: - integer - 'null' type: object - LinkUserRequest: + LinkUser: properties: externalUserId: minLength: 1 @@ -3869,7 +3869,7 @@ components: - updatedAt - version type: object - SwitchTargetRequest: + SwitchTarget: properties: deletePrevious: type: boolean @@ -14594,7 +14594,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/LinkUserRequest' + $ref: '#/components/schemas/LinkUser' required: true responses: '200': @@ -14708,7 +14708,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/LinkExistingTargetRequest' + $ref: '#/components/schemas/LinkExistingTarget' required: true responses: '200': @@ -14822,7 +14822,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/CreateTargetRequest' + $ref: '#/components/schemas/CreateTarget' required: true responses: '200': @@ -14942,7 +14942,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/SwitchTargetRequest' + $ref: '#/components/schemas/SwitchTarget' required: true responses: '200': diff --git a/services/frontend/src/services/api/blueshell/client/types.gen.ts b/services/frontend/src/services/api/blueshell/client/types.gen.ts index 50be5b9c1..9d4eeb0bb 100644 --- a/services/frontend/src/services/api/blueshell/client/types.gen.ts +++ b/services/frontend/src/services/api/blueshell/client/types.gen.ts @@ -109,7 +109,7 @@ type MethodFn = ( diff --git a/services/frontend/src/services/api/blueshell/index.ts b/services/frontend/src/services/api/blueshell/index.ts index fb43db5fd..749170497 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, addRosterEntry, apply, applyInboundReconcile, approveEvent, associationStatistics, authenticate, boardCreateMembership, clearGameAccount, correctEmail, createAddress, createBlog, createBoard, createCommittee, createContribution, createContributionPeriod, createEvent, createEventSignup, createGame, createMemberProfile, createMembership, createSeason, createSponsor, createTarget, createTeam, createTelemetry, createUser, csrf, deleteAddressById, deleteBoard, deleteById, deleteCommitteeById, deleteContribution, deleteContributionPeriodById, deleteEventById, deleteEventSignup, deleteGame, deleteMembership, deleteSeason, deleteSponsorById, deleteTeam, deleteUserById, downloadEventBanner, downloadPublicFile, endMembership, endMemberships, enqueue, enterGame, fieldTeam, findAddressById, findAllAddresses, findAllBoards, findBlogById, findBlogs, findBoardById, findCohortById, findCohorts, findCohortSubjectById, findCohortSubjects, findCommitteeById, findCommittees, findCommitteesByUserId, findContributionPeriods, findContributionReminders, findContributions, findContributionsByPeriodId, findCurrentContributionPeriod, findDeletedMemberships, findDeletedUsers, findEventById, findEvents, findEventSignUps, findEventSignUpsByAccessToken, findEventSignUpsByEventId, findGame, findGameAccounts, findGameContents, findGames, findMemberProfileByUserId, findMembershipById, findMemberships, findRoster, findSeasonContents, findSeasonGames, findSeasons, findSponsorById, findSponsors, findTeams, findTeamSeasons, findTelemetryById, findUserById, findUsers, forwardAuth, getStats, getStats1, healthCheck, jobTypes, leaveGame, linkExistingTarget, linkMember, linkRosterEntry, linkUser, list, list1, listCohortTargetFolders, listCohortTargetSystems, logout, markPaid, markUnpaid, memberActivate, moveCohortTarget, moveCohortTargets, myServices, type Options, pendingActivations, previewBulkContributionEmail, previewBulkEnd, previewBulkStart, previewInboundReconcile, previewRecoveryEmail, previewSentEmail, readContributionEmail, removeMember, removeRosterEntry, reopenMembership, repairMissingAdds, resendRecoveryEmail, resendUserActivation, resetPassword, restoreDeletedUserById, restoreMembership, resumeSignup, retry, retry1, saveAddress, searchCohortTargets, sendContributionReminder, sendContributionReminderBatch, sendPaymentEmails, setGameAccount, setPassword, signUp, startMemberships, switchTarget, toggleUserRole, unfieldTeam, updateAddress, updateBlog, updateBoard, updateCommittee, updateContributionPeriod, updateDetails, updateEvent, updateEventSignUp, updateGame, updateMember, updateMemberProfile, updateMembership, updateRosterEntry, updateSeason, updateSponsor, updateTeam, updateUser, uploadEventBanner, uploadPublicImage, userActivate } from './sdk.gen'; -export { ActionActorType, type ActivationResponse, type Actor, type AddBoardMemberRequest, type AddMemberData, type AddMemberError, type AddMemberErrors, type AddMemberResponse, type AddMemberResponses, type AddressResponse, type AddRosterEntryData, type AddRosterEntryError, type AddRosterEntryErrors, type AddRosterEntryRequest, type AddRosterEntryResponse, type AddRosterEntryResponses, type AnswerRequest, type AnswerResponse, type ApiError, type ApplyData, type ApplyError, type ApplyErrors, type ApplyInboundReconcileData, type ApplyInboundReconcileError, type ApplyInboundReconcileErrors, type ApplyInboundReconcileResponse, type ApplyInboundReconcileResponses, type ApplyResponse, type ApplyResponses, type ApproveEventData, type ApproveEventError, type ApproveEventErrors, type ApproveEventResponse, type ApproveEventResponses, type AssociationStatisticsData, type AssociationStatisticsError, type AssociationStatisticsErrors, type AssociationStatisticsResponse, type AssociationStatisticsResponse2, type AssociationStatisticsResponses, 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 BulkActionResult, type BulkContributionEmailPreviewRequest, type BulkContributionEmailPreviewResponse, type BulkContributionEmailRowResponse, BulkFeeType, type BulkMarkPaidRequest, type BulkMarkUnpaidRequest, type BulkMembershipPreview, type BulkMembershipPreviewRow, type BulkMembershipRequest, type BulkMoveTargetsRequest, BulkRowDisposition, BulkRowReason, type BulkRowVocabulary, type BulkTargetMoveResult, type ClearGameAccountData, type ClearGameAccountError, type ClearGameAccountErrors, type ClearGameAccountResponse, type ClearGameAccountResponses, type ClientOptions, type CohortDetail, CohortKind, type CohortMapping, type CohortMemberRow, type CohortRepair, CohortSubjectCategory, type CohortSubjectDetail, type CohortSubjectMember, type CohortSubjectSummary, CohortSubjectType, type CohortSummary, type CommitteeDetailResponse, type CommitteeMemberRequest, type CommitteeMemberResponse, type CommitteeResponse, ContactSystem, ContributionEmailKind, type ContributionEmailMessageResponse, type ContributionPeriodResponse, type ContributionReminderResponse, type ContributionResponse, type CorrectEmailData, type CorrectEmailError, type CorrectEmailErrors, type CorrectEmailResponse, type CorrectEmailResponses, 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 CreateGameData, type CreateGameError, type CreateGameErrors, type CreateGameRequest, type CreateGameResponse, type CreateGameResponses, 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 CreateSeasonData, type CreateSeasonError, type CreateSeasonErrors, type CreateSeasonResponse, type CreateSeasonResponses, 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 CreateTeamData, type CreateTeamError, type CreateTeamErrors, type CreateTeamRequest, type CreateTeamResponse, type CreateTeamResponses, 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 DeleteGameData, type DeleteGameError, type DeleteGameErrors, type DeleteGameResponse, type DeleteGameResponses, type DeleteMembershipData, type DeleteMembershipError, type DeleteMembershipErrors, type DeleteMembershipResponse, type DeleteMembershipResponses, type DeleteSeasonData, type DeleteSeasonError, type DeleteSeasonErrors, type DeleteSeasonResponse, type DeleteSeasonResponses, type DeleteSponsorByIdData, type DeleteSponsorByIdError, type DeleteSponsorByIdErrors, type DeleteSponsorByIdResponse, type DeleteSponsorByIdResponses, type DeleteTeamData, type DeleteTeamError, type DeleteTeamErrors, type DeleteTeamResponse, type DeleteTeamResponses, type DeleteUserByIdData, type DeleteUserByIdError, type DeleteUserByIdErrors, type DeleteUserByIdResponse, type DeleteUserByIdResponses, type DownloadEventBannerData, type DownloadEventBannerError, type DownloadEventBannerErrors, type DownloadEventBannerResponse, type DownloadEventBannerResponses, type DownloadPublicFileData, type DownloadPublicFileError, type DownloadPublicFileErrors, type DownloadPublicFileResponse, type DownloadPublicFileResponses, type Email, EmailDeliveryStatus, type EmailStats, type EndMembershipData, type EndMembershipError, type EndMembershipErrors, type EndMembershipResponse, type EndMembershipResponses, type EndMembershipsData, type EndMembershipsError, type EndMembershipsErrors, type EndMembershipsResponse, type EndMembershipsResponses, type EnqueueData, type EnqueueError, type EnqueueErrors, type EnqueueJobRequest, type EnqueueResponse, type EnqueueResponses, type EnterGameData, type EnterGameError, type EnterGameErrors, type EnterGameResponse, type EnterGameResponses, type EventBannerRequest, type EventBannerResponse, type EventResponse, type EventSignUpResponse, type ExternalTarget, type FailedTargetMove, type FieldedTeamResponse, type FieldingResponse, type FieldTeamData, type FieldTeamError, type FieldTeamErrors, type FieldTeamRequest, type FieldTeamResponse, type FieldTeamResponses, 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 FindDeletedMembershipsData, type FindDeletedMembershipsError, type FindDeletedMembershipsErrors, type FindDeletedMembershipsResponse, type FindDeletedMembershipsResponses, 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 FindGameAccountsData, type FindGameAccountsError, type FindGameAccountsErrors, type FindGameAccountsResponse, type FindGameAccountsResponses, type FindGameContentsData, type FindGameContentsError, type FindGameContentsErrors, type FindGameContentsResponse, type FindGameContentsResponses, type FindGameData, type FindGameError, type FindGameErrors, type FindGameResponse, type FindGameResponses, type FindGamesData, type FindGamesError, type FindGamesErrors, type FindGamesResponse, type FindGamesResponses, 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 FindRosterData, type FindRosterError, type FindRosterErrors, type FindRosterResponse, type FindRosterResponses, type FindSeasonContentsData, type FindSeasonContentsError, type FindSeasonContentsErrors, type FindSeasonContentsResponse, type FindSeasonContentsResponses, type FindSeasonGamesData, type FindSeasonGamesError, type FindSeasonGamesErrors, type FindSeasonGamesResponse, type FindSeasonGamesResponses, type FindSeasonsData, type FindSeasonsError, type FindSeasonsErrors, type FindSeasonsResponse, type FindSeasonsResponses, type FindSponsorByIdData, type FindSponsorByIdError, type FindSponsorByIdErrors, type FindSponsorByIdResponse, type FindSponsorByIdResponses, type FindSponsorsData, type FindSponsorsError, type FindSponsorsErrors, type FindSponsorsResponse, type FindSponsorsResponses, type FindTeamsData, type FindTeamSeasonsData, type FindTeamSeasonsError, type FindTeamSeasonsErrors, type FindTeamSeasonsResponse, type FindTeamSeasonsResponses, type FindTeamsError, type FindTeamsErrors, type FindTeamsResponse, type FindTeamsResponses, 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 GameAccountRequest, type GameAccountResponse, type GameContentsResponse, type GameResponse, type GameRostersResponse, 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 Image, type ImageRendition, 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 LeaveGameData, type LeaveGameError, type LeaveGameErrors, type LeaveGameResponse, type LeaveGameResponses, type LineupSourceRequest, type LinkBoardMemberRequest, type LinkedUser, type LinkExistingTargetData, type LinkExistingTargetError, type LinkExistingTargetErrors, type LinkExistingTargetRequest, type LinkExistingTargetResponse, type LinkExistingTargetResponses, type LinkMemberData, type LinkMemberError, type LinkMemberErrors, type LinkMemberResponse, type LinkMemberResponses, type LinkRosterEntryData, type LinkRosterEntryError, type LinkRosterEntryErrors, type LinkRosterEntryRequest, type LinkRosterEntryResponse, type LinkRosterEntryResponses, type LinkUserData, type LinkUserError, type LinkUserErrors, type LinkUserRequest, type LinkUserResponse, type LinkUserResponses, type List1Data, type List1Error, type List1Errors, type List1Response, type List1Responses, type ListCohortTargetFoldersData, type ListCohortTargetFoldersError, type ListCohortTargetFoldersErrors, type ListCohortTargetFoldersResponse, type ListCohortTargetFoldersResponses, 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 MarkPaidData, type MarkPaidError, type MarkPaidErrors, type MarkPaidResponse, type MarkPaidResponses, type MarkUnpaidData, type MarkUnpaidError, type MarkUnpaidErrors, type MarkUnpaidResponse, type MarkUnpaidResponses, type MemberActivateData, type MemberActivateError, type MemberActivateErrors, type MemberActivateResponse, type MemberActivateResponses, type MemberActivationRequest, type MemberProfileResponse, type MembershipApplicationRequest, type MembershipResponse, MemberType, type MoveCohortTargetData, type MoveCohortTargetError, type MoveCohortTargetErrors, type MoveCohortTargetResponse, type MoveCohortTargetResponses, type MoveCohortTargetsData, type MoveCohortTargetsError, type MoveCohortTargetsErrors, type MoveCohortTargetsResponse, type MoveCohortTargetsResponses, type MoveTargetRequest, type MyServicesData, type MyServicesError, type MyServicesErrors, type MyServicesResponse, type MyServicesResponses, type PagedModelEmail, type PagedModelEventResponse, type PagedModelJobExecution, type PagedModelUserDetailResponse, type PageMetadata, type PasswordResetRequest, type PaymentEmailsResultResponse, type PendingActivation, type PendingActivationsData, type PendingActivationsError, type PendingActivationsErrors, type PendingActivationsResponse, type PendingActivationsResponse2, type PendingActivationsResponses, PlatformType, type PreviewBulkContributionEmailData, type PreviewBulkContributionEmailError, type PreviewBulkContributionEmailErrors, type PreviewBulkContributionEmailResponse, type PreviewBulkContributionEmailResponses, type PreviewBulkEndData, type PreviewBulkEndError, type PreviewBulkEndErrors, type PreviewBulkEndResponse, type PreviewBulkEndResponses, type PreviewBulkStartData, type PreviewBulkStartError, type PreviewBulkStartErrors, type PreviewBulkStartResponse, type PreviewBulkStartResponses, type PreviewInboundReconcileData, type PreviewInboundReconcileError, type PreviewInboundReconcileErrors, type PreviewInboundReconcileResponse, type PreviewInboundReconcileResponses, type PreviewRecoveryEmailData, type PreviewRecoveryEmailError, type PreviewRecoveryEmailErrors, type PreviewRecoveryEmailResponse, type PreviewRecoveryEmailResponses, type PreviewSentEmailData, type PreviewSentEmailError, type PreviewSentEmailErrors, type PreviewSentEmailResponse, type PreviewSentEmailResponses, type QuestionRequest, type QuestionResponse, QuestionType, type ReadContributionEmailData, type ReadContributionEmailError, type ReadContributionEmailErrors, type ReadContributionEmailResponse, type ReadContributionEmailResponses, type RecoveryEmailPreviewResponse, type RedirectResponse, type RemoveMemberData, type RemoveMemberError, type RemoveMemberErrors, type RemoveMemberResponse, type RemoveMemberResponses, type RemoveRosterEntryData, type RemoveRosterEntryError, type RemoveRosterEntryErrors, type RemoveRosterEntryResponse, type RemoveRosterEntryResponses, type ReopenMembershipData, type ReopenMembershipError, type ReopenMembershipErrors, type ReopenMembershipResponse, type ReopenMembershipResponses, type RepairMissingAddsData, type RepairMissingAddsError, type RepairMissingAddsErrors, type RepairMissingAddsResponse, type RepairMissingAddsResponses, type ResendRecoveryEmailData, type ResendRecoveryEmailError, type ResendRecoveryEmailErrors, type ResendRecoveryEmailResponse, type ResendRecoveryEmailResponses, 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 RestoreMembershipData, type RestoreMembershipError, type RestoreMembershipErrors, type RestoreMembershipResponse, type RestoreMembershipResponses, type ResumeSignupData, type ResumeSignupError, type ResumeSignupErrors, type ResumeSignupResponse, type ResumeSignupResponses, type Retry1Data, type Retry1Error, type Retry1Errors, type Retry1Response, type Retry1Responses, type RetryData, type RetryError, type RetryErrors, type RetryResponse, type RetryResponses, Role, type RosterEntryResponse, type RosterMemberResponse, type SaveAddressData, type SaveAddressError, type SaveAddressErrors, type SaveAddressResponse, type SaveAddressResponses, type SearchCohortTargetsData, type SearchCohortTargetsError, type SearchCohortTargetsErrors, type SearchCohortTargetsResponse, type SearchCohortTargetsResponses, type SeasonContentsResponse, type SeasonGameResponse, type SeasonRequest, type SeasonResponse, type SendContributionReminderBatchData, type SendContributionReminderBatchError, type SendContributionReminderBatchErrors, type SendContributionReminderBatchResponse, type SendContributionReminderBatchResponses, type SendContributionReminderData, type SendContributionReminderError, type SendContributionReminderErrors, type SendContributionReminderResponse, type SendContributionReminderResponses, type SendPaymentEmailsData, type SendPaymentEmailsError, type SendPaymentEmailsErrors, type SendPaymentEmailsRequest, type SendPaymentEmailsResponse, type SendPaymentEmailsResponses, type SentEmailPreview, type ServiceEntry, type SetGameAccountData, type SetGameAccountError, type SetGameAccountErrors, type SetGameAccountResponse, type SetGameAccountResponses, type SetPasswordData, type SetPasswordError, type SetPasswordErrors, type SetPasswordResponse, type SetPasswordResponses, type SignupAddressRequest, type SignupApplicationRequest, type SignUpData, type SignupDetailsRequest, type SignupEmailRequest, type SignUpError, type SignUpErrors, type SignupOutcomeResponse, type SignUpResponse, type SignUpResponses, type SignupResumeAddressResponse, type SignupResumeProfileResponse, type SignupResumeResponse, type SignupSessionResponse, type SponsorResponse, type StartMembershipsData, type StartMembershipsError, type StartMembershipsErrors, type StartMembershipsResponse, type StartMembershipsResponses, type SurveyRequest, type SurveyResponse, type SwitchTargetData, type SwitchTargetError, type SwitchTargetErrors, type SwitchTargetRequest, type SwitchTargetResponse, type SwitchTargetResponses, type TargetDescriptor, TargetSystem, type TeamResponse, TeamRole, type TeamRosterResponse, type TelemetryResponse, type ToggleUserRoleData, type ToggleUserRoleError, type ToggleUserRoleErrors, type ToggleUserRoleResponse, type ToggleUserRoleResponses, TokenPurpose, type UnfieldTeamData, type UnfieldTeamError, type UnfieldTeamErrors, type UnfieldTeamResponse, type UnfieldTeamResponses, 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 UpdateBoardMemberRequest, 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 UpdateDetailsData, type UpdateDetailsError, type UpdateDetailsErrors, type UpdateDetailsResponse, type UpdateDetailsResponses, 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 UpdateGameData, type UpdateGameError, type UpdateGameErrors, type UpdateGameRequest, type UpdateGameResponse, type UpdateGameResponses, type UpdateMemberData, type UpdateMemberError, type UpdateMemberErrors, type UpdateMemberProfileData, type UpdateMemberProfileError, type UpdateMemberProfileErrors, type UpdateMemberProfileRequest, type UpdateMemberProfileResponse, type UpdateMemberProfileResponses, type UpdateMemberResponse, type UpdateMemberResponses, type UpdateMembershipData, type UpdateMembershipError, type UpdateMembershipErrors, type UpdateMembershipRequest, type UpdateMembershipResponse, type UpdateMembershipResponses, type UpdateRosterEntryData, type UpdateRosterEntryError, type UpdateRosterEntryErrors, type UpdateRosterEntryRequest, type UpdateRosterEntryResponse, type UpdateRosterEntryResponses, type UpdateSeasonData, type UpdateSeasonError, type UpdateSeasonErrors, type UpdateSeasonResponse, type UpdateSeasonResponses, type UpdateSponsorData, type UpdateSponsorError, type UpdateSponsorErrors, type UpdateSponsorRequest, type UpdateSponsorResponse, type UpdateSponsorResponses, type UpdateTeamData, type UpdateTeamError, type UpdateTeamErrors, type UpdateTeamRequest, type UpdateTeamResponse, type UpdateTeamResponses, type UpdateUserData, type UpdateUserError, type UpdateUserErrors, type UpdateUserRequest, type UpdateUserResponse, type UpdateUserResponses, type UploadEventBannerData, type UploadEventBannerError, type UploadEventBannerErrors, type UploadEventBannerResponse, type UploadEventBannerResponses, type UploadPublicImageData, type UploadPublicImageError, type UploadPublicImageErrors, type UploadPublicImageResponse, type UploadPublicImageResponses, type UpsertMemberProfileRequest, type UserActivateData, type UserActivateError, type UserActivateErrors, type UserActivateResponse, type UserActivateResponses, type UserActivationRequest, type UserDetailResponse, type UserSummaryResponse } from './types.gen'; +export { ActionActorType, type ActivationResponse, type Actor, type AddBoardMemberRequest, type AddMemberData, type AddMemberError, type AddMemberErrors, type AddMemberResponse, type AddMemberResponses, type AddressResponse, type AddRosterEntryData, type AddRosterEntryError, type AddRosterEntryErrors, type AddRosterEntryRequest, type AddRosterEntryResponse, type AddRosterEntryResponses, type AnswerRequest, type AnswerResponse, type ApiError, type ApplyData, type ApplyError, type ApplyErrors, type ApplyInboundReconcileData, type ApplyInboundReconcileError, type ApplyInboundReconcileErrors, type ApplyInboundReconcileResponse, type ApplyInboundReconcileResponses, type ApplyResponse, type ApplyResponses, type ApproveEventData, type ApproveEventError, type ApproveEventErrors, type ApproveEventResponse, type ApproveEventResponses, type AssociationStatisticsData, type AssociationStatisticsError, type AssociationStatisticsErrors, type AssociationStatisticsResponse, type AssociationStatisticsResponse2, type AssociationStatisticsResponses, 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 BulkActionResult, type BulkContributionEmailPreviewRequest, type BulkContributionEmailPreviewResponse, type BulkContributionEmailRowResponse, BulkFeeType, type BulkMarkPaidRequest, type BulkMarkUnpaidRequest, type BulkMembershipPreview, type BulkMembershipPreviewRow, type BulkMembershipRequest, type BulkMoveTargetsRequest, BulkRowDisposition, BulkRowReason, type BulkRowVocabulary, type BulkTargetMoveResult, type ClearGameAccountData, type ClearGameAccountError, type ClearGameAccountErrors, type ClearGameAccountResponse, type ClearGameAccountResponses, type ClientOptions, type CohortDetail, CohortKind, type CohortMapping, type CohortMemberRow, type CohortRepair, CohortSubjectCategory, type CohortSubjectDetail, type CohortSubjectMember, type CohortSubjectSummary, CohortSubjectType, type CohortSummary, type CommitteeDetailResponse, type CommitteeMemberRequest, type CommitteeMemberResponse, type CommitteeResponse, ContactSystem, ContributionEmailKind, type ContributionEmailMessageResponse, type ContributionPeriodResponse, type ContributionReminderResponse, type ContributionResponse, type CorrectEmailData, type CorrectEmailError, type CorrectEmailErrors, type CorrectEmailResponse, type CorrectEmailResponses, 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 CreateGameData, type CreateGameError, type CreateGameErrors, type CreateGameRequest, type CreateGameResponse, type CreateGameResponses, 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 CreateSeasonData, type CreateSeasonError, type CreateSeasonErrors, type CreateSeasonResponse, type CreateSeasonResponses, type CreateSponsorData, type CreateSponsorError, type CreateSponsorErrors, type CreateSponsorRequest, type CreateSponsorResponse, type CreateSponsorResponses, type CreateTarget, type CreateTargetData, type CreateTargetError, type CreateTargetErrors, type CreateTargetResponse, type CreateTargetResponses, type CreateTeamData, type CreateTeamError, type CreateTeamErrors, type CreateTeamRequest, type CreateTeamResponse, type CreateTeamResponses, 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 DeleteGameData, type DeleteGameError, type DeleteGameErrors, type DeleteGameResponse, type DeleteGameResponses, type DeleteMembershipData, type DeleteMembershipError, type DeleteMembershipErrors, type DeleteMembershipResponse, type DeleteMembershipResponses, type DeleteSeasonData, type DeleteSeasonError, type DeleteSeasonErrors, type DeleteSeasonResponse, type DeleteSeasonResponses, type DeleteSponsorByIdData, type DeleteSponsorByIdError, type DeleteSponsorByIdErrors, type DeleteSponsorByIdResponse, type DeleteSponsorByIdResponses, type DeleteTeamData, type DeleteTeamError, type DeleteTeamErrors, type DeleteTeamResponse, type DeleteTeamResponses, type DeleteUserByIdData, type DeleteUserByIdError, type DeleteUserByIdErrors, type DeleteUserByIdResponse, type DeleteUserByIdResponses, type DownloadEventBannerData, type DownloadEventBannerError, type DownloadEventBannerErrors, type DownloadEventBannerResponse, type DownloadEventBannerResponses, type DownloadPublicFileData, type DownloadPublicFileError, type DownloadPublicFileErrors, type DownloadPublicFileResponse, type DownloadPublicFileResponses, type Email, EmailDeliveryStatus, type EmailStats, type EndMembershipData, type EndMembershipError, type EndMembershipErrors, type EndMembershipResponse, type EndMembershipResponses, type EndMembershipsData, type EndMembershipsError, type EndMembershipsErrors, type EndMembershipsResponse, type EndMembershipsResponses, type EnqueueData, type EnqueueError, type EnqueueErrors, type EnqueueJobRequest, type EnqueueResponse, type EnqueueResponses, type EnterGameData, type EnterGameError, type EnterGameErrors, type EnterGameResponse, type EnterGameResponses, type EventBannerRequest, type EventBannerResponse, type EventResponse, type EventSignUpResponse, type ExternalTarget, type FailedTargetMove, type FieldedTeamResponse, type FieldingResponse, type FieldTeamData, type FieldTeamError, type FieldTeamErrors, type FieldTeamRequest, type FieldTeamResponse, type FieldTeamResponses, 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 FindDeletedMembershipsData, type FindDeletedMembershipsError, type FindDeletedMembershipsErrors, type FindDeletedMembershipsResponse, type FindDeletedMembershipsResponses, 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 FindGameAccountsData, type FindGameAccountsError, type FindGameAccountsErrors, type FindGameAccountsResponse, type FindGameAccountsResponses, type FindGameContentsData, type FindGameContentsError, type FindGameContentsErrors, type FindGameContentsResponse, type FindGameContentsResponses, type FindGameData, type FindGameError, type FindGameErrors, type FindGameResponse, type FindGameResponses, type FindGamesData, type FindGamesError, type FindGamesErrors, type FindGamesResponse, type FindGamesResponses, 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 FindRosterData, type FindRosterError, type FindRosterErrors, type FindRosterResponse, type FindRosterResponses, type FindSeasonContentsData, type FindSeasonContentsError, type FindSeasonContentsErrors, type FindSeasonContentsResponse, type FindSeasonContentsResponses, type FindSeasonGamesData, type FindSeasonGamesError, type FindSeasonGamesErrors, type FindSeasonGamesResponse, type FindSeasonGamesResponses, type FindSeasonsData, type FindSeasonsError, type FindSeasonsErrors, type FindSeasonsResponse, type FindSeasonsResponses, type FindSponsorByIdData, type FindSponsorByIdError, type FindSponsorByIdErrors, type FindSponsorByIdResponse, type FindSponsorByIdResponses, type FindSponsorsData, type FindSponsorsError, type FindSponsorsErrors, type FindSponsorsResponse, type FindSponsorsResponses, type FindTeamsData, type FindTeamSeasonsData, type FindTeamSeasonsError, type FindTeamSeasonsErrors, type FindTeamSeasonsResponse, type FindTeamSeasonsResponses, type FindTeamsError, type FindTeamsErrors, type FindTeamsResponse, type FindTeamsResponses, 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 GameAccountRequest, type GameAccountResponse, type GameContentsResponse, type GameResponse, type GameRostersResponse, 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 Image, type ImageRendition, 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 LeaveGameData, type LeaveGameError, type LeaveGameErrors, type LeaveGameResponse, type LeaveGameResponses, type LineupSourceRequest, type LinkBoardMemberRequest, type LinkedUser, type LinkExistingTarget, type LinkExistingTargetData, type LinkExistingTargetError, type LinkExistingTargetErrors, type LinkExistingTargetResponse, type LinkExistingTargetResponses, type LinkMemberData, type LinkMemberError, type LinkMemberErrors, type LinkMemberResponse, type LinkMemberResponses, type LinkRosterEntryData, type LinkRosterEntryError, type LinkRosterEntryErrors, type LinkRosterEntryRequest, type LinkRosterEntryResponse, type LinkRosterEntryResponses, type LinkUser, type LinkUserData, type LinkUserError, type LinkUserErrors, type LinkUserResponse, type LinkUserResponses, type List1Data, type List1Error, type List1Errors, type List1Response, type List1Responses, type ListCohortTargetFoldersData, type ListCohortTargetFoldersError, type ListCohortTargetFoldersErrors, type ListCohortTargetFoldersResponse, type ListCohortTargetFoldersResponses, 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 MarkPaidData, type MarkPaidError, type MarkPaidErrors, type MarkPaidResponse, type MarkPaidResponses, type MarkUnpaidData, type MarkUnpaidError, type MarkUnpaidErrors, type MarkUnpaidResponse, type MarkUnpaidResponses, type MemberActivateData, type MemberActivateError, type MemberActivateErrors, type MemberActivateResponse, type MemberActivateResponses, type MemberActivationRequest, type MemberProfileResponse, type MembershipApplicationRequest, type MembershipResponse, MemberType, type MoveCohortTargetData, type MoveCohortTargetError, type MoveCohortTargetErrors, type MoveCohortTargetResponse, type MoveCohortTargetResponses, type MoveCohortTargetsData, type MoveCohortTargetsError, type MoveCohortTargetsErrors, type MoveCohortTargetsResponse, type MoveCohortTargetsResponses, type MoveTargetRequest, type MyServicesData, type MyServicesError, type MyServicesErrors, type MyServicesResponse, type MyServicesResponses, type PagedModelEmail, type PagedModelEventResponse, type PagedModelJobExecution, type PagedModelUserDetailResponse, type PageMetadata, type PasswordResetRequest, type PaymentEmailsResultResponse, type PendingActivation, type PendingActivationsData, type PendingActivationsError, type PendingActivationsErrors, type PendingActivationsResponse, type PendingActivationsResponse2, type PendingActivationsResponses, PlatformType, type PreviewBulkContributionEmailData, type PreviewBulkContributionEmailError, type PreviewBulkContributionEmailErrors, type PreviewBulkContributionEmailResponse, type PreviewBulkContributionEmailResponses, type PreviewBulkEndData, type PreviewBulkEndError, type PreviewBulkEndErrors, type PreviewBulkEndResponse, type PreviewBulkEndResponses, type PreviewBulkStartData, type PreviewBulkStartError, type PreviewBulkStartErrors, type PreviewBulkStartResponse, type PreviewBulkStartResponses, type PreviewInboundReconcileData, type PreviewInboundReconcileError, type PreviewInboundReconcileErrors, type PreviewInboundReconcileResponse, type PreviewInboundReconcileResponses, type PreviewRecoveryEmailData, type PreviewRecoveryEmailError, type PreviewRecoveryEmailErrors, type PreviewRecoveryEmailResponse, type PreviewRecoveryEmailResponses, type PreviewSentEmailData, type PreviewSentEmailError, type PreviewSentEmailErrors, type PreviewSentEmailResponse, type PreviewSentEmailResponses, type QuestionRequest, type QuestionResponse, QuestionType, type ReadContributionEmailData, type ReadContributionEmailError, type ReadContributionEmailErrors, type ReadContributionEmailResponse, type ReadContributionEmailResponses, type RecoveryEmailPreviewResponse, type RedirectResponse, type RemoveMemberData, type RemoveMemberError, type RemoveMemberErrors, type RemoveMemberResponse, type RemoveMemberResponses, type RemoveRosterEntryData, type RemoveRosterEntryError, type RemoveRosterEntryErrors, type RemoveRosterEntryResponse, type RemoveRosterEntryResponses, type ReopenMembershipData, type ReopenMembershipError, type ReopenMembershipErrors, type ReopenMembershipResponse, type ReopenMembershipResponses, type RepairMissingAddsData, type RepairMissingAddsError, type RepairMissingAddsErrors, type RepairMissingAddsResponse, type RepairMissingAddsResponses, type ResendRecoveryEmailData, type ResendRecoveryEmailError, type ResendRecoveryEmailErrors, type ResendRecoveryEmailResponse, type ResendRecoveryEmailResponses, 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 RestoreMembershipData, type RestoreMembershipError, type RestoreMembershipErrors, type RestoreMembershipResponse, type RestoreMembershipResponses, type ResumeSignupData, type ResumeSignupError, type ResumeSignupErrors, type ResumeSignupResponse, type ResumeSignupResponses, type Retry1Data, type Retry1Error, type Retry1Errors, type Retry1Response, type Retry1Responses, type RetryData, type RetryError, type RetryErrors, type RetryResponse, type RetryResponses, Role, type RosterEntryResponse, type RosterMemberResponse, type SaveAddressData, type SaveAddressError, type SaveAddressErrors, type SaveAddressResponse, type SaveAddressResponses, type SearchCohortTargetsData, type SearchCohortTargetsError, type SearchCohortTargetsErrors, type SearchCohortTargetsResponse, type SearchCohortTargetsResponses, type SeasonContentsResponse, type SeasonGameResponse, type SeasonRequest, type SeasonResponse, type SendContributionReminderBatchData, type SendContributionReminderBatchError, type SendContributionReminderBatchErrors, type SendContributionReminderBatchResponse, type SendContributionReminderBatchResponses, type SendContributionReminderData, type SendContributionReminderError, type SendContributionReminderErrors, type SendContributionReminderResponse, type SendContributionReminderResponses, type SendPaymentEmailsData, type SendPaymentEmailsError, type SendPaymentEmailsErrors, type SendPaymentEmailsRequest, type SendPaymentEmailsResponse, type SendPaymentEmailsResponses, type SentEmailPreview, type ServiceEntry, type SetGameAccountData, type SetGameAccountError, type SetGameAccountErrors, type SetGameAccountResponse, type SetGameAccountResponses, type SetPasswordData, type SetPasswordError, type SetPasswordErrors, type SetPasswordResponse, type SetPasswordResponses, type SignupAddressRequest, type SignupApplicationRequest, type SignUpData, type SignupDetailsRequest, type SignupEmailRequest, type SignUpError, type SignUpErrors, type SignupOutcomeResponse, type SignUpResponse, type SignUpResponses, type SignupResumeAddressResponse, type SignupResumeProfileResponse, type SignupResumeResponse, type SignupSessionResponse, type SponsorResponse, type StartMembershipsData, type StartMembershipsError, type StartMembershipsErrors, type StartMembershipsResponse, type StartMembershipsResponses, type SurveyRequest, type SurveyResponse, type SwitchTarget, type SwitchTargetData, type SwitchTargetError, type SwitchTargetErrors, type SwitchTargetResponse, type SwitchTargetResponses, type TargetDescriptor, TargetSystem, type TeamResponse, TeamRole, type TeamRosterResponse, type TelemetryResponse, type ToggleUserRoleData, type ToggleUserRoleError, type ToggleUserRoleErrors, type ToggleUserRoleResponse, type ToggleUserRoleResponses, TokenPurpose, type UnfieldTeamData, type UnfieldTeamError, type UnfieldTeamErrors, type UnfieldTeamResponse, type UnfieldTeamResponses, 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 UpdateBoardMemberRequest, 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 UpdateDetailsData, type UpdateDetailsError, type UpdateDetailsErrors, type UpdateDetailsResponse, type UpdateDetailsResponses, 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 UpdateGameData, type UpdateGameError, type UpdateGameErrors, type UpdateGameRequest, type UpdateGameResponse, type UpdateGameResponses, type UpdateMemberData, type UpdateMemberError, type UpdateMemberErrors, type UpdateMemberProfileData, type UpdateMemberProfileError, type UpdateMemberProfileErrors, type UpdateMemberProfileRequest, type UpdateMemberProfileResponse, type UpdateMemberProfileResponses, type UpdateMemberResponse, type UpdateMemberResponses, type UpdateMembershipData, type UpdateMembershipError, type UpdateMembershipErrors, type UpdateMembershipRequest, type UpdateMembershipResponse, type UpdateMembershipResponses, type UpdateRosterEntryData, type UpdateRosterEntryError, type UpdateRosterEntryErrors, type UpdateRosterEntryRequest, type UpdateRosterEntryResponse, type UpdateRosterEntryResponses, type UpdateSeasonData, type UpdateSeasonError, type UpdateSeasonErrors, type UpdateSeasonResponse, type UpdateSeasonResponses, type UpdateSponsorData, type UpdateSponsorError, type UpdateSponsorErrors, type UpdateSponsorRequest, type UpdateSponsorResponse, type UpdateSponsorResponses, type UpdateTeamData, type UpdateTeamError, type UpdateTeamErrors, type UpdateTeamRequest, type UpdateTeamResponse, type UpdateTeamResponses, type UpdateUserData, type UpdateUserError, type UpdateUserErrors, type UpdateUserRequest, type UpdateUserResponse, type UpdateUserResponses, type UploadEventBannerData, type UploadEventBannerError, type UploadEventBannerErrors, type UploadEventBannerResponse, type UploadEventBannerResponses, type UploadPublicImageData, type UploadPublicImageError, type UploadPublicImageErrors, type UploadPublicImageResponse, type UploadPublicImageResponses, 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 67c8ad0e0..49c7d3f53 100644 --- a/services/frontend/src/services/api/blueshell/types.gen.ts +++ b/services/frontend/src/services/api/blueshell/types.gen.ts @@ -793,7 +793,7 @@ export type CreateSponsorRequest = { name: string; }; -export type CreateTargetRequest = { +export type CreateTarget = { folderHint?: string | null; label: string; system: TargetSystem; @@ -1339,7 +1339,7 @@ export type LinkBoardMemberRequest = { userId?: number | null; }; -export type LinkExistingTargetRequest = { +export type LinkExistingTarget = { externalId: string; system: TargetSystem; }; @@ -1351,7 +1351,7 @@ export type LinkRosterEntryRequest = { userId?: number | null; }; -export type LinkUserRequest = { +export type LinkUser = { externalUserId: string; system: TargetSystem; userId: number; @@ -1838,7 +1838,7 @@ export type SurveyResponse = { version: number; }; -export type SwitchTargetRequest = { +export type SwitchTarget = { deletePrevious: boolean; externalId: string; reconcileNow: boolean; @@ -6045,7 +6045,7 @@ export type FindCohortSubjectByIdResponses = { export type FindCohortSubjectByIdResponse = FindCohortSubjectByIdResponses[keyof FindCohortSubjectByIdResponses]; export type LinkUserData = { - body: LinkUserRequest; + body: LinkUser; path: { id: number; }; @@ -6088,7 +6088,7 @@ export type LinkUserResponses = { export type LinkUserResponse = LinkUserResponses[keyof LinkUserResponses]; export type LinkExistingTargetData = { - body: LinkExistingTargetRequest; + body: LinkExistingTarget; path: { id: number; }; @@ -6131,7 +6131,7 @@ export type LinkExistingTargetResponses = { export type LinkExistingTargetResponse = LinkExistingTargetResponses[keyof LinkExistingTargetResponses]; export type CreateTargetData = { - body: CreateTargetRequest; + body: CreateTarget; path: { id: number; }; @@ -6174,7 +6174,7 @@ export type CreateTargetResponses = { export type CreateTargetResponse = CreateTargetResponses[keyof CreateTargetResponses]; export type SwitchTargetData = { - body: SwitchTargetRequest; + body: SwitchTarget; path: { id: number; cohortId: number; From 5f26cf6dbb6f104dd00b5c9436fe7741458c2b19 Mon Sep 17 00:00:00 2001 From: Joris Wouter Jonkers <74975850+ExtraToast@users.noreply.github.com> Date: Sun, 6 Sep 2026 01:36:14 +0200 Subject: [PATCH 3/3] chore(openapi): the generated client keeps the shape ci generates --- .../frontend/src/services/api/blueshell/client/types.gen.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/frontend/src/services/api/blueshell/client/types.gen.ts b/services/frontend/src/services/api/blueshell/client/types.gen.ts index 9d4eeb0bb..50be5b9c1 100644 --- a/services/frontend/src/services/api/blueshell/client/types.gen.ts +++ b/services/frontend/src/services/api/blueshell/client/types.gen.ts @@ -109,7 +109,7 @@ type MethodFn = (