From 1c4184809a3b5aead2cc688f23f36c2cd83c6deb Mon Sep 17 00:00:00 2001 From: stefan Date: Wed, 24 Sep 2025 14:21:57 +0200 Subject: [PATCH] fixing web-app --- .dockerignore | 2 +- client/composeApp/build.gradle.kts | 110 --- .../drawable/compose-multiplatform.xml | 52 - .../src/commonMain/kotlin/at/mocode/App.kt | 172 ---- .../kotlin/at/mocode/ui/PingViewModel.kt | 88 -- .../kotlin/at/mocode/ComposeAppCommonTest.kt | 12 - .../src/jvmMain/kotlin/at/mocode/main.kt | 21 - .../src/webMain/kotlin/at/mocode/main.kt | 11 - .../src/webMain/resources/index.html | 12 - .../src/webMain/resources/styles.css | 7 - client/composeApp/webpack.config.d/watch.js | 21 - client/shared/build.gradle.kts | 47 - .../kotlin/at/mocode/service/PingService.kt | 65 -- clients/ping-client/build.gradle.kts | 46 + .../commonMain/kotlin/at/mocode/Constants.kt | 0 .../commonMain/kotlin/at/mocode/Greeting.kt | 0 .../commonMain/kotlin/at/mocode/Platform.kt | 0 .../kotlin/at/mocode/model/PingResponse.kt | 10 + .../at/mocode/ping/client/PingApiClient.kt | 25 + .../kotlin/at/mocode/service/PingService.kt | 43 + .../kotlin/at/mocode/SharedCommonTest.kt | 0 .../jsMain/kotlin/at/mocode/Platform.js.kt | 0 .../kotlin/at/mocode/service/Platform.js.kt | 0 .../jvmMain/kotlin/at/mocode/Platform.jvm.kt | 0 .../kotlin/at/mocode/service/Platform.jvm.kt | 0 .../kotlin/at/mocode/Platform.wasmJs.kt | 0 .../at/mocode/service/Platform.wasmJs.kt | 0 docker-compose.services.yml | 14 +- dockerfiles/services/ping-service/Dockerfile | 14 +- kotlin-js-store/yarn.lock | 909 +----------------- {events => services/events}/README-EVENTS.md | 2 +- .../events}/events-api/build.gradle.kts | 0 .../api/rest/VeranstaltungController.kt | 0 .../events-application/build.gradle.kts | 0 .../usecase/CreateVeranstaltungUseCase.kt | 0 .../usecase/DeleteVeranstaltungUseCase.kt | 0 .../usecase/GetVeranstaltungUseCase.kt | 0 .../usecase/UpdateVeranstaltungUseCase.kt | 0 .../events}/events-domain/build.gradle.kts | 0 .../at/mocode/events/EventManagement.kt | 0 .../events/domain/model/Veranstaltung.kt | 0 .../repository/VeranstaltungRepository.kt | 0 .../events-infrastructure/build.gradle.kts | 0 .../VeranstaltungRepositoryImpl.kt | 0 .../persistence/VeranstaltungTable.kt | 0 .../events}/events-service/build.gradle.kts | 0 .../service/EventsServiceApplication.kt | 0 .../config/EventsDatabaseConfiguration.kt | 0 .../src/test/resources/logback-test.xml | 0 {horses => services/horses}/README-HORSES.md | 2 +- .../horses}/horses-api/build.gradle.kts | 0 .../mocode/horses/api/rest/HorseController.kt | 0 .../horses-application/build.gradle.kts | 0 .../application/usecase/CreateHorseUseCase.kt | 0 .../application/usecase/DeleteHorseUseCase.kt | 0 .../application/usecase/GetHorseUseCase.kt | 0 .../TransactionalCreateHorseUseCase.kt | 0 .../application/usecase/UpdateHorseUseCase.kt | 0 .../horses}/horses-domain/build.gradle.kts | 0 .../at/mocode/horses/domain/model/DomPferd.kt | 0 .../domain/repository/HorseRepository.kt | 0 .../horses-infrastructure/build.gradle.kts | 0 .../persistence/HorseRepositoryImpl.kt | 0 .../infrastructure/persistence/HorseTable.kt | 0 .../horses}/horses-service/build.gradle.kts | 0 .../service/HorsesServiceApplication.kt | 0 .../config/ApplicationConfiguration.kt | 0 .../service/config/DatabaseConfiguration.kt | 0 .../HorseServiceIntegrationTest.kt | 0 .../integration/TransactionContextTest.kt | 0 .../integration/TransactionalContextTest.kt | 0 .../src/test/resources/logback-test.xml | 0 .../masterdata}/README-MASTERDATA.md | 0 .../masterdata-api/build.gradle.kts | 0 .../at/mocode/masterdata/api/StatusPages.kt | 0 .../api/rest/AltersklasseController.kt | 0 .../api/rest/BundeslandController.kt | 0 .../masterdata/api/rest/CountryController.kt | 0 .../masterdata/api/rest/PlatzController.kt | 0 .../masterdata-application/build.gradle.kts | 0 .../usecase/CreateAltersklasseUseCase.kt | 0 .../usecase/CreateBundeslandUseCase.kt | 0 .../usecase/CreateCountryUseCase.kt | 0 .../application/usecase/CreatePlatzUseCase.kt | 0 .../usecase/GetAltersklasseUseCase.kt | 0 .../usecase/GetBundeslandUseCase.kt | 0 .../application/usecase/GetCountryUseCase.kt | 0 .../application/usecase/GetPlatzUseCase.kt | 0 .../masterdata-domain/build.gradle.kts | 0 .../domain/model/AltersklasseDefinition.kt | 0 .../domain/model/BundeslandDefinition.kt | 0 .../masterdata/domain/model/LandDefinition.kt | 0 .../mocode/masterdata/domain/model/Platz.kt | 0 .../repository/AltersklasseRepository.kt | 0 .../domain/repository/BundeslandRepository.kt | 0 .../domain/repository/LandRepository.kt | 0 .../domain/repository/PlatzRepository.kt | 0 .../build.gradle.kts | 0 .../persistence/AltersklasseRepositoryImpl.kt | 0 .../persistence/AltersklasseTable.kt | 0 .../persistence/BundeslandRepositoryImpl.kt | 0 .../persistence/BundeslandTable.kt | 0 .../persistence/LandRepositoryImpl.kt | 0 .../infrastructure/persistence/LandTable.kt | 0 .../persistence/PlatzRepositoryImpl.kt | 0 .../infrastructure/persistence/PlatzTable.kt | 0 .../masterdata-service/build.gradle.kts | 0 .../service/MasterdataServiceApplication.kt | 0 .../service/config/MasterdataConfiguration.kt | 0 .../config/MasterdataDatabaseConfiguration.kt | 0 .../db/migration/V001__Create_Land_Table.sql | 0 .../V002__Create_Bundesland_Table.sql | 0 .../V003__Create_Altersklasse_Table.sql | 0 .../db/migration/V004__Create_Platz_Table.sql | 0 .../migration/V1__Create_Initial_Tables.sql | 0 .../src/test/resources/logback-test.xml | 0 .../members}/README-MEMBERS.md | 2 +- .../members}/members-api/build.gradle.kts | 0 .../members/api/rest/MemberController.kt | 0 .../members-application/build.gradle.kts | 0 .../usecase/CreateMemberUseCase.kt | 0 .../usecase/DeleteMemberUseCase.kt | 0 .../usecase/FindExpiringMembershipsUseCase.kt | 0 .../usecase/FindMembersByDateRangeUseCase.kt | 0 .../application/usecase/GetMemberUseCase.kt | 0 .../usecase/UpdateMemberUseCase.kt | 0 .../usecase/ValidateMemberDataUseCase.kt | 0 .../members}/members-domain/build.gradle.kts | 0 .../members/domain/events/MemberEvents.kt | 0 .../at/mocode/members/domain/model/Member.kt | 0 .../domain/repository/MemberRepository.kt | 0 .../members-infrastructure/build.gradle.kts | 0 .../persistence/MemberRepositoryImpl.kt | 0 .../infrastructure/persistence/MemberTable.kt | 0 .../repository/InMemoryMemberRepository.kt | 0 .../members}/members-service/build.gradle.kts | 0 .../service/MembersServiceApplication.kt | 0 .../config/MembersDatabaseConfiguration.kt | 0 .../MemberServiceIntegrationTest.kt | 0 .../src/test/resources/logback-test.xml | 0 services/ping/ping-api/build.gradle.kts | 34 + .../kotlin/at/mocode/ping/api/PingApi.kt | 7 + .../kotlin/at/mocode/ping/api/PingData.kt | 12 +- .../ping}/ping-service/build.gradle.kts | 7 +- .../ping/service/LegacyPingController.kt | 87 ++ .../at/mocode/ping/service/PingController.kt | 40 + .../ping/service}/PingServiceApplication.kt | 2 +- .../service}/PingServiceCircuitBreaker.kt | 71 +- .../src/main/resources/application.yml | 0 .../src/main/resources/logback-spring.xml | 0 .../service}/PingControllerIntegrationTest.kt | 2 +- .../ping/service}/PingControllerTest.kt | 8 +- .../service}/PingServiceCircuitBreakerTest.kt | 118 +-- .../src/test/resources/application-test.yml | 0 settings.gradle.kts | 7 +- .../mocode/temp/pingservice/PingController.kt | 66 -- 156 files changed, 440 insertions(+), 1708 deletions(-) delete mode 100644 client/composeApp/build.gradle.kts delete mode 100644 client/composeApp/src/commonMain/composeResources/drawable/compose-multiplatform.xml delete mode 100644 client/composeApp/src/commonMain/kotlin/at/mocode/App.kt delete mode 100644 client/composeApp/src/commonMain/kotlin/at/mocode/ui/PingViewModel.kt delete mode 100644 client/composeApp/src/commonTest/kotlin/at/mocode/ComposeAppCommonTest.kt delete mode 100644 client/composeApp/src/jvmMain/kotlin/at/mocode/main.kt delete mode 100644 client/composeApp/src/webMain/kotlin/at/mocode/main.kt delete mode 100644 client/composeApp/src/webMain/resources/index.html delete mode 100644 client/composeApp/src/webMain/resources/styles.css delete mode 100644 client/composeApp/webpack.config.d/watch.js delete mode 100644 client/shared/build.gradle.kts delete mode 100644 client/shared/src/commonMain/kotlin/at/mocode/service/PingService.kt create mode 100644 clients/ping-client/build.gradle.kts rename {client/shared => clients/ping-client}/src/commonMain/kotlin/at/mocode/Constants.kt (100%) rename {client/shared => clients/ping-client}/src/commonMain/kotlin/at/mocode/Greeting.kt (100%) rename {client/shared => clients/ping-client}/src/commonMain/kotlin/at/mocode/Platform.kt (100%) create mode 100644 clients/ping-client/src/commonMain/kotlin/at/mocode/model/PingResponse.kt create mode 100644 clients/ping-client/src/commonMain/kotlin/at/mocode/ping/client/PingApiClient.kt create mode 100644 clients/ping-client/src/commonMain/kotlin/at/mocode/service/PingService.kt rename {client/shared => clients/ping-client}/src/commonTest/kotlin/at/mocode/SharedCommonTest.kt (100%) rename {client/shared => clients/ping-client}/src/jsMain/kotlin/at/mocode/Platform.js.kt (100%) rename {client/shared => clients/ping-client}/src/jsMain/kotlin/at/mocode/service/Platform.js.kt (100%) rename {client/shared => clients/ping-client}/src/jvmMain/kotlin/at/mocode/Platform.jvm.kt (100%) rename {client/shared => clients/ping-client}/src/jvmMain/kotlin/at/mocode/service/Platform.jvm.kt (100%) rename {client/shared => clients/ping-client}/src/wasmJsMain/kotlin/at/mocode/Platform.wasmJs.kt (100%) rename {client/shared => clients/ping-client}/src/wasmJsMain/kotlin/at/mocode/service/Platform.wasmJs.kt (100%) rename {events => services/events}/README-EVENTS.md (99%) rename {events => services/events}/events-api/build.gradle.kts (100%) rename {events => services/events}/events-api/src/main/kotlin/at/mocode/events/api/rest/VeranstaltungController.kt (100%) rename {events => services/events}/events-application/build.gradle.kts (100%) rename {events => services/events}/events-application/src/main/kotlin/at/mocode/events/application/usecase/CreateVeranstaltungUseCase.kt (100%) rename {events => services/events}/events-application/src/main/kotlin/at/mocode/events/application/usecase/DeleteVeranstaltungUseCase.kt (100%) rename {events => services/events}/events-application/src/main/kotlin/at/mocode/events/application/usecase/GetVeranstaltungUseCase.kt (100%) rename {events => services/events}/events-application/src/main/kotlin/at/mocode/events/application/usecase/UpdateVeranstaltungUseCase.kt (100%) rename {events => services/events}/events-domain/build.gradle.kts (100%) rename {events => services/events}/events-domain/src/main/kotlin/at/mocode/events/EventManagement.kt (100%) rename {events => services/events}/events-domain/src/main/kotlin/at/mocode/events/domain/model/Veranstaltung.kt (100%) rename {events => services/events}/events-domain/src/main/kotlin/at/mocode/events/domain/repository/VeranstaltungRepository.kt (100%) rename {events => services/events}/events-infrastructure/build.gradle.kts (100%) rename {events => services/events}/events-infrastructure/src/main/kotlin/at/mocode/events/infrastructure/persistence/VeranstaltungRepositoryImpl.kt (100%) rename {events => services/events}/events-infrastructure/src/main/kotlin/at/mocode/events/infrastructure/persistence/VeranstaltungTable.kt (100%) rename {events => services/events}/events-service/build.gradle.kts (100%) rename {events => services/events}/events-service/src/main/kotlin/at/mocode/events/service/EventsServiceApplication.kt (100%) rename {events => services/events}/events-service/src/main/kotlin/at/mocode/events/service/config/EventsDatabaseConfiguration.kt (100%) rename {events => services/events}/events-service/src/test/resources/logback-test.xml (100%) rename {horses => services/horses}/README-HORSES.md (99%) rename {horses => services/horses}/horses-api/build.gradle.kts (100%) rename {horses => services/horses}/horses-api/src/main/kotlin/at/mocode/horses/api/rest/HorseController.kt (100%) rename {horses => services/horses}/horses-application/build.gradle.kts (100%) rename {horses => services/horses}/horses-application/src/main/kotlin/at/mocode/horses/application/usecase/CreateHorseUseCase.kt (100%) rename {horses => services/horses}/horses-application/src/main/kotlin/at/mocode/horses/application/usecase/DeleteHorseUseCase.kt (100%) rename {horses => services/horses}/horses-application/src/main/kotlin/at/mocode/horses/application/usecase/GetHorseUseCase.kt (100%) rename {horses => services/horses}/horses-application/src/main/kotlin/at/mocode/horses/application/usecase/TransactionalCreateHorseUseCase.kt (100%) rename {horses => services/horses}/horses-application/src/main/kotlin/at/mocode/horses/application/usecase/UpdateHorseUseCase.kt (100%) rename {horses => services/horses}/horses-domain/build.gradle.kts (100%) rename {horses => services/horses}/horses-domain/src/main/kotlin/at/mocode/horses/domain/model/DomPferd.kt (100%) rename {horses => services/horses}/horses-domain/src/main/kotlin/at/mocode/horses/domain/repository/HorseRepository.kt (100%) rename {horses => services/horses}/horses-infrastructure/build.gradle.kts (100%) rename {horses => services/horses}/horses-infrastructure/src/main/kotlin/at/mocode/horses/infrastructure/persistence/HorseRepositoryImpl.kt (100%) rename {horses => services/horses}/horses-infrastructure/src/main/kotlin/at/mocode/horses/infrastructure/persistence/HorseTable.kt (100%) rename {horses => services/horses}/horses-service/build.gradle.kts (100%) rename {horses => services/horses}/horses-service/src/main/kotlin/at/mocode/horses/service/HorsesServiceApplication.kt (100%) rename {horses => services/horses}/horses-service/src/main/kotlin/at/mocode/horses/service/config/ApplicationConfiguration.kt (100%) rename {horses => services/horses}/horses-service/src/main/kotlin/at/mocode/horses/service/config/DatabaseConfiguration.kt (100%) rename {horses => services/horses}/horses-service/src/test/kotlin/at/mocode/horses/service/integration/HorseServiceIntegrationTest.kt (100%) rename {horses => services/horses}/horses-service/src/test/kotlin/at/mocode/horses/service/integration/TransactionContextTest.kt (100%) rename {horses => services/horses}/horses-service/src/test/kotlin/at/mocode/horses/service/integration/TransactionalContextTest.kt (100%) rename {horses => services/horses}/horses-service/src/test/resources/logback-test.xml (100%) rename {masterdata => services/masterdata}/README-MASTERDATA.md (100%) rename {masterdata => services/masterdata}/masterdata-api/build.gradle.kts (100%) rename {masterdata => services/masterdata}/masterdata-api/src/main/kotlin/at/mocode/masterdata/api/StatusPages.kt (100%) rename {masterdata => services/masterdata}/masterdata-api/src/main/kotlin/at/mocode/masterdata/api/rest/AltersklasseController.kt (100%) rename {masterdata => services/masterdata}/masterdata-api/src/main/kotlin/at/mocode/masterdata/api/rest/BundeslandController.kt (100%) rename {masterdata => services/masterdata}/masterdata-api/src/main/kotlin/at/mocode/masterdata/api/rest/CountryController.kt (100%) rename {masterdata => services/masterdata}/masterdata-api/src/main/kotlin/at/mocode/masterdata/api/rest/PlatzController.kt (100%) rename {masterdata => services/masterdata}/masterdata-application/build.gradle.kts (100%) rename {masterdata => services/masterdata}/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/CreateAltersklasseUseCase.kt (100%) rename {masterdata => services/masterdata}/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/CreateBundeslandUseCase.kt (100%) rename {masterdata => services/masterdata}/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/CreateCountryUseCase.kt (100%) rename {masterdata => services/masterdata}/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/CreatePlatzUseCase.kt (100%) rename {masterdata => services/masterdata}/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/GetAltersklasseUseCase.kt (100%) rename {masterdata => services/masterdata}/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/GetBundeslandUseCase.kt (100%) rename {masterdata => services/masterdata}/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/GetCountryUseCase.kt (100%) rename {masterdata => services/masterdata}/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/GetPlatzUseCase.kt (100%) rename {masterdata => services/masterdata}/masterdata-domain/build.gradle.kts (100%) rename {masterdata => services/masterdata}/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/model/AltersklasseDefinition.kt (100%) rename {masterdata => services/masterdata}/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/model/BundeslandDefinition.kt (100%) rename {masterdata => services/masterdata}/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/model/LandDefinition.kt (100%) rename {masterdata => services/masterdata}/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/model/Platz.kt (100%) rename {masterdata => services/masterdata}/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/repository/AltersklasseRepository.kt (100%) rename {masterdata => services/masterdata}/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/repository/BundeslandRepository.kt (100%) rename {masterdata => services/masterdata}/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/repository/LandRepository.kt (100%) rename {masterdata => services/masterdata}/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/repository/PlatzRepository.kt (100%) rename {masterdata => services/masterdata}/masterdata-infrastructure/build.gradle.kts (100%) rename {masterdata => services/masterdata}/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/AltersklasseRepositoryImpl.kt (100%) rename {masterdata => services/masterdata}/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/AltersklasseTable.kt (100%) rename {masterdata => services/masterdata}/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/BundeslandRepositoryImpl.kt (100%) rename {masterdata => services/masterdata}/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/BundeslandTable.kt (100%) rename {masterdata => services/masterdata}/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/LandRepositoryImpl.kt (100%) rename {masterdata => services/masterdata}/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/LandTable.kt (100%) rename {masterdata => services/masterdata}/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/PlatzRepositoryImpl.kt (100%) rename {masterdata => services/masterdata}/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/PlatzTable.kt (100%) rename {masterdata => services/masterdata}/masterdata-service/build.gradle.kts (100%) rename {masterdata => services/masterdata}/masterdata-service/src/main/kotlin/at/mocode/masterdata/service/MasterdataServiceApplication.kt (100%) rename {masterdata => services/masterdata}/masterdata-service/src/main/kotlin/at/mocode/masterdata/service/config/MasterdataConfiguration.kt (100%) rename {masterdata => services/masterdata}/masterdata-service/src/main/kotlin/at/mocode/masterdata/service/config/MasterdataDatabaseConfiguration.kt (100%) rename {masterdata => services/masterdata}/masterdata-service/src/main/resources/db/migration/V001__Create_Land_Table.sql (100%) rename {masterdata => services/masterdata}/masterdata-service/src/main/resources/db/migration/V002__Create_Bundesland_Table.sql (100%) rename {masterdata => services/masterdata}/masterdata-service/src/main/resources/db/migration/V003__Create_Altersklasse_Table.sql (100%) rename {masterdata => services/masterdata}/masterdata-service/src/main/resources/db/migration/V004__Create_Platz_Table.sql (100%) rename {masterdata => services/masterdata}/masterdata-service/src/main/resources/db/migration/V1__Create_Initial_Tables.sql (100%) rename {masterdata => services/masterdata}/masterdata-service/src/test/resources/logback-test.xml (100%) rename {members => services/members}/README-MEMBERS.md (99%) rename {members => services/members}/members-api/build.gradle.kts (100%) rename {members => services/members}/members-api/src/main/kotlin/at/mocode/members/api/rest/MemberController.kt (100%) rename {members => services/members}/members-application/build.gradle.kts (100%) rename {members => services/members}/members-application/src/main/kotlin/at/mocode/members/application/usecase/CreateMemberUseCase.kt (100%) rename {members => services/members}/members-application/src/main/kotlin/at/mocode/members/application/usecase/DeleteMemberUseCase.kt (100%) rename {members => services/members}/members-application/src/main/kotlin/at/mocode/members/application/usecase/FindExpiringMembershipsUseCase.kt (100%) rename {members => services/members}/members-application/src/main/kotlin/at/mocode/members/application/usecase/FindMembersByDateRangeUseCase.kt (100%) rename {members => services/members}/members-application/src/main/kotlin/at/mocode/members/application/usecase/GetMemberUseCase.kt (100%) rename {members => services/members}/members-application/src/main/kotlin/at/mocode/members/application/usecase/UpdateMemberUseCase.kt (100%) rename {members => services/members}/members-application/src/main/kotlin/at/mocode/members/application/usecase/ValidateMemberDataUseCase.kt (100%) rename {members => services/members}/members-domain/build.gradle.kts (100%) rename {members => services/members}/members-domain/src/main/kotlin/at/mocode/members/domain/events/MemberEvents.kt (100%) rename {members => services/members}/members-domain/src/main/kotlin/at/mocode/members/domain/model/Member.kt (100%) rename {members => services/members}/members-domain/src/main/kotlin/at/mocode/members/domain/repository/MemberRepository.kt (100%) rename {members => services/members}/members-infrastructure/build.gradle.kts (100%) rename {members => services/members}/members-infrastructure/src/main/kotlin/at/mocode/members/infrastructure/persistence/MemberRepositoryImpl.kt (100%) rename {members => services/members}/members-infrastructure/src/main/kotlin/at/mocode/members/infrastructure/persistence/MemberTable.kt (100%) rename {members => services/members}/members-infrastructure/src/main/kotlin/at/mocode/members/infrastructure/repository/InMemoryMemberRepository.kt (100%) rename {members => services/members}/members-service/build.gradle.kts (100%) rename {members => services/members}/members-service/src/main/kotlin/at/mocode/members/service/MembersServiceApplication.kt (100%) rename {members => services/members}/members-service/src/main/kotlin/at/mocode/members/service/config/MembersDatabaseConfiguration.kt (100%) rename {members => services/members}/members-service/src/test/kotlin/at/mocode/members/service/integration/MemberServiceIntegrationTest.kt (100%) rename {members => services/members}/members-service/src/test/resources/logback-test.xml (100%) create mode 100644 services/ping/ping-api/build.gradle.kts create mode 100644 services/ping/ping-api/src/commonMain/kotlin/at/mocode/ping/api/PingApi.kt rename client/shared/src/commonMain/kotlin/at/mocode/model/PingResponse.kt => services/ping/ping-api/src/commonMain/kotlin/at/mocode/ping/api/PingData.kt (61%) rename {temp => services/ping}/ping-service/build.gradle.kts (90%) create mode 100644 services/ping/ping-service/src/main/kotlin/at/mocode/ping/service/LegacyPingController.kt create mode 100644 services/ping/ping-service/src/main/kotlin/at/mocode/ping/service/PingController.kt rename {temp/ping-service/src/main/kotlin/at/mocode/temp/pingservice => services/ping/ping-service/src/main/kotlin/at/mocode/ping/service}/PingServiceApplication.kt (97%) rename {temp/ping-service/src/main/kotlin/at/mocode/temp/pingservice => services/ping/ping-service/src/main/kotlin/at/mocode/ping/service}/PingServiceCircuitBreaker.kt (61%) rename {temp => services/ping}/ping-service/src/main/resources/application.yml (100%) rename {temp => services/ping}/ping-service/src/main/resources/logback-spring.xml (100%) rename {temp/ping-service/src/test/kotlin/at/mocode/temp/pingservice => services/ping/ping-service/src/test/kotlin/at/mocode/ping/service}/PingControllerIntegrationTest.kt (99%) rename {temp/ping-service/src/test/kotlin/at/mocode/temp/pingservice => services/ping/ping-service/src/test/kotlin/at/mocode/ping/service}/PingControllerTest.kt (83%) rename {temp/ping-service/src/test/kotlin/at/mocode/temp/pingservice => services/ping/ping-service/src/test/kotlin/at/mocode/ping/service}/PingServiceCircuitBreakerTest.kt (59%) rename {temp => services/ping}/ping-service/src/test/resources/application-test.yml (100%) delete mode 100644 temp/ping-service/src/main/kotlin/at/mocode/temp/pingservice/PingController.kt diff --git a/.dockerignore b/.dockerignore index f5b89d32..f973e99e 100644 --- a/.dockerignore +++ b/.dockerignore @@ -94,7 +94,7 @@ temp-data/ **/temp/ **/.temp/ # Exception: Allow temp/ping-service for Docker builds -!temp/ping-service/ +!services/ping/ping-service/ # =================================================================== # Gradle wrapper executable (keep gradle wrapper jar) diff --git a/client/composeApp/build.gradle.kts b/client/composeApp/build.gradle.kts deleted file mode 100644 index c40bb561..00000000 --- a/client/composeApp/build.gradle.kts +++ /dev/null @@ -1,110 +0,0 @@ -import org.jetbrains.compose.desktop.application.dsl.TargetFormat -import org.jetbrains.kotlin.gradle.ExperimentalWasmDsl - -plugins { - alias(libs.plugins.kotlinMultiplatform) - alias(libs.plugins.kotlinSerialization) - alias(libs.plugins.composeMultiplatform) - alias(libs.plugins.composeCompiler) -// alias(libs.plugins.composeHotReload) -} - -// Project version configuration -version = "1.0.0" -group = "at.mocode" - - -kotlin { - - // Configure JVM toolchain for all JVM targets - jvmToolchain(21) - - jvm() - - js { - browser() - binaries.executable() - } - - @OptIn(ExperimentalWasmDsl::class) - wasmJs { - browser() - binaries.executable() - } - - sourceSets { - commonMain.dependencies { - - implementation(projects.client.shared) - // Core Compose Dependencies - minimiert für kleinere Bundle-Größe - implementation(compose.runtime) - implementation(compose.foundation) - implementation(compose.material3) - implementation(compose.ui) - implementation(compose.components.resources) - // UiToolingPreview nur für Development, nicht für Production WASM - implementation(compose.components.uiToolingPreview) - - implementation(libs.androidx.lifecycle.viewmodelCompose) - implementation(libs.androidx.lifecycle.runtimeCompose) - - // HTTP client dependencies for ping-service - optimiert - implementation(libs.ktor.client.core) - implementation(libs.ktor.client.contentNegotiation) - implementation(libs.ktor.client.serialization.kotlinx.json) - implementation(libs.kotlinx.coroutines.core) - implementation(libs.kotlinx.serialization.json) - } - commonTest.dependencies { - implementation(libs.kotlin.test) - } - jvmMain.dependencies { - implementation(compose.desktop.currentOs) - implementation(libs.kotlinx.coroutines.swing) - implementation(libs.ktor.client.cio) - } - - } -} - -compose.desktop { - application { - mainClass = "at.mocode.MainKt" - - nativeDistributions { - targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb) - packageName = "Meldestelle" - packageVersion = "1.0.0" - - // Application metadata - description = "Pferdesport Meldestelle System - Client Application" - copyright = "© 2025 Meldestelle Project" - vendor = "at.mocode" - - // Platform-specific configurations - linux { - iconFile.set(project.file("src/commonMain/resources/icon.png")) - packageName = "meldestelle" - debMaintainer = "stefan@mocode.at" - menuGroup = "Office" - } - - windows { - iconFile.set(project.file("src/commonMain/resources/icon.ico")) - menuGroup = "Meldestelle" - upgradeUuid = "61DAB35E-17CB-43B8-8A72-39876CF0E021" - } - - macOS { - iconFile.set(project.file("src/commonMain/resources/icon.icns")) - bundleID = "at.mocode.meldestelle" - packageBuildVersion = "1.0.0" - packageVersion = "1.0.0" - } - } - - buildTypes.release.proguard { - configurationFiles.from(project.file("compose-desktop.pro")) - } - } -} diff --git a/client/composeApp/src/commonMain/composeResources/drawable/compose-multiplatform.xml b/client/composeApp/src/commonMain/composeResources/drawable/compose-multiplatform.xml deleted file mode 100644 index 52e9b0ad..00000000 --- a/client/composeApp/src/commonMain/composeResources/drawable/compose-multiplatform.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/client/composeApp/src/commonMain/kotlin/at/mocode/App.kt b/client/composeApp/src/commonMain/kotlin/at/mocode/App.kt deleted file mode 100644 index 290dc887..00000000 --- a/client/composeApp/src/commonMain/kotlin/at/mocode/App.kt +++ /dev/null @@ -1,172 +0,0 @@ -package at.mocode - -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.* -import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.verticalScroll -import androidx.compose.material3.* -import androidx.compose.runtime.* -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.unit.dp -import androidx.lifecycle.compose.collectAsStateWithLifecycle -import androidx.lifecycle.viewmodel.compose.viewModel -import at.mocode.ui.PingViewModel -import org.jetbrains.compose.ui.tooling.preview.Preview - -@Composable -@Preview -fun App() { - MaterialTheme { - val viewModel: PingViewModel = viewModel() - val uiState by viewModel.uiState.collectAsStateWithLifecycle() - - Column( - modifier = Modifier - .background(MaterialTheme.colorScheme.background) - .fillMaxSize() - .padding(16.dp) - .verticalScroll(rememberScrollState()), - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.spacedBy(16.dp) - ) { - - // Header - Card( - modifier = Modifier.fillMaxWidth() - ) { - Column( - modifier = Modifier.padding(16.dp), - horizontalAlignment = Alignment.CenterHorizontally - ) { - Text( - text = "Meldestelle - Ping Service Client", - style = MaterialTheme.typography.headlineMedium - ) - Text( - text = "Trace-Bullet Implementation", - style = MaterialTheme.typography.bodyMedium, - color = MaterialTheme.colorScheme.secondary - ) - } - } - - // Action Buttons - Card( - modifier = Modifier.fillMaxWidth() - ) { - Column( - modifier = Modifier.padding(16.dp), - verticalArrangement = Arrangement.spacedBy(8.dp) - ) { - Text( - text = "API Tests", - style = MaterialTheme.typography.titleMedium - ) - - Row( - modifier = Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.spacedBy(8.dp) - ) { - Button( - onClick = { viewModel.simplePing() }, - enabled = !uiState.isLoading, - modifier = Modifier.weight(1f) - ) { - Text("Simple Ping") - } - - Button( - onClick = { viewModel.enhancedPing() }, - enabled = !uiState.isLoading, - modifier = Modifier.weight(1f) - ) { - Text("Enhanced Ping") - } - } - - Row( - modifier = Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.spacedBy(8.dp) - ) { - Button( - onClick = { viewModel.healthCheck() }, - enabled = !uiState.isLoading, - modifier = Modifier.weight(1f) - ) { - Text("Health Check") - } - - Button( - onClick = { viewModel.enhancedPing(simulate = true) }, - enabled = !uiState.isLoading, - modifier = Modifier.weight(1f), - colors = ButtonDefaults.buttonColors( - containerColor = MaterialTheme.colorScheme.error - ) - ) { - Text("Test Failure") - } - } - } - } - - // Loading Indicator - if (uiState.isLoading) { - CircularProgressIndicator() - } - - // Error Display - uiState.error?.let { error -> - Card( - modifier = Modifier.fillMaxWidth(), - colors = CardDefaults.cardColors( - containerColor = MaterialTheme.colorScheme.errorContainer - ) - ) { - Text( - text = error, - modifier = Modifier.padding(16.dp), - color = MaterialTheme.colorScheme.onErrorContainer - ) - } - } - - // Results Display - uiState.lastPingResponse?.let { response -> - ResultCard("Simple Ping Result", response) - } - - uiState.lastEnhancedResponse?.let { response -> - ResultCard("Enhanced Ping Result", response) - } - - uiState.lastHealthResponse?.let { response -> - ResultCard("Health Check Result", response) - } - } - } -} - -@Composable -private fun ResultCard(title: String, data: Any) { - Card( - modifier = Modifier.fillMaxWidth() - ) { - Column( - modifier = Modifier.padding(16.dp) - ) { - Text( - text = title, - style = MaterialTheme.typography.titleMedium, - color = MaterialTheme.colorScheme.primary - ) - Spacer(modifier = Modifier.height(8.dp)) - Text( - text = data.toString(), - style = MaterialTheme.typography.bodySmall, - modifier = Modifier.fillMaxWidth() - ) - } - } -} diff --git a/client/composeApp/src/commonMain/kotlin/at/mocode/ui/PingViewModel.kt b/client/composeApp/src/commonMain/kotlin/at/mocode/ui/PingViewModel.kt deleted file mode 100644 index 7c4f74cf..00000000 --- a/client/composeApp/src/commonMain/kotlin/at/mocode/ui/PingViewModel.kt +++ /dev/null @@ -1,88 +0,0 @@ -package at.mocode.ui - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import at.mocode.model.EnhancedPingResponse -import at.mocode.model.HealthResponse -import at.mocode.model.PingResponse -import at.mocode.service.PingService -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.launch - -data class PingUiState( - val isLoading: Boolean = false, - val lastPingResponse: PingResponse? = null, - val lastEnhancedResponse: EnhancedPingResponse? = null, - val lastHealthResponse: HealthResponse? = null, - val error: String? = null -) - -class PingViewModel : ViewModel() { - - private val pingService = PingService() - - private val _uiState = MutableStateFlow(PingUiState()) - val uiState: StateFlow = _uiState.asStateFlow() - - fun simplePing() { - viewModelScope.launch { - _uiState.value = _uiState.value.copy(isLoading = true, error = null) - - pingService.ping() - .onSuccess { response -> - _uiState.value = _uiState.value.copy( - isLoading = false, - lastPingResponse = response - ) - } - .onFailure { exception -> - _uiState.value = _uiState.value.copy( - isLoading = false, - error = "Ping failed: ${exception.message}" - ) - } - } - } - - fun enhancedPing(simulate: Boolean = false) { - viewModelScope.launch { - _uiState.value = _uiState.value.copy(isLoading = true, error = null) - - pingService.enhancedPing(simulate) - .onSuccess { response -> - _uiState.value = _uiState.value.copy( - isLoading = false, - lastEnhancedResponse = response - ) - } - .onFailure { exception -> - _uiState.value = _uiState.value.copy( - isLoading = false, - error = "Enhanced ping failed: ${exception.message}" - ) - } - } - } - - fun healthCheck() { - viewModelScope.launch { - _uiState.value = _uiState.value.copy(isLoading = true, error = null) - - pingService.health() - .onSuccess { response -> - _uiState.value = _uiState.value.copy( - isLoading = false, - lastHealthResponse = response - ) - } - .onFailure { exception -> - _uiState.value = _uiState.value.copy( - isLoading = false, - error = "Health check failed: ${exception.message}" - ) - } - } - } -} diff --git a/client/composeApp/src/commonTest/kotlin/at/mocode/ComposeAppCommonTest.kt b/client/composeApp/src/commonTest/kotlin/at/mocode/ComposeAppCommonTest.kt deleted file mode 100644 index b8a3d13d..00000000 --- a/client/composeApp/src/commonTest/kotlin/at/mocode/ComposeAppCommonTest.kt +++ /dev/null @@ -1,12 +0,0 @@ -package at.mocode - -import kotlin.test.Test -import kotlin.test.assertEquals - -class ComposeAppCommonTest { - - @Test - fun example() { - assertEquals(3, 1 + 2) - } -} \ No newline at end of file diff --git a/client/composeApp/src/jvmMain/kotlin/at/mocode/main.kt b/client/composeApp/src/jvmMain/kotlin/at/mocode/main.kt deleted file mode 100644 index 1b5f4787..00000000 --- a/client/composeApp/src/jvmMain/kotlin/at/mocode/main.kt +++ /dev/null @@ -1,21 +0,0 @@ -package at.mocode - -import androidx.compose.desktop.ui.tooling.preview.Preview -import androidx.compose.runtime.Composable -import androidx.compose.ui.window.Window -import androidx.compose.ui.window.application - -fun main() = application { - Window( - onCloseRequest = ::exitApplication, - title = "Meldestelle", - ) { - App() - } -} - -@Preview -@Composable -fun AppDesktopPreview() { - App() -} diff --git a/client/composeApp/src/webMain/kotlin/at/mocode/main.kt b/client/composeApp/src/webMain/kotlin/at/mocode/main.kt deleted file mode 100644 index 585f9cdd..00000000 --- a/client/composeApp/src/webMain/kotlin/at/mocode/main.kt +++ /dev/null @@ -1,11 +0,0 @@ -package at.mocode - -import androidx.compose.ui.ExperimentalComposeUiApi -import androidx.compose.ui.window.ComposeViewport - -@OptIn(ExperimentalComposeUiApi::class) -fun main() { - ComposeViewport { - App() - } -} diff --git a/client/composeApp/src/webMain/resources/index.html b/client/composeApp/src/webMain/resources/index.html deleted file mode 100644 index 252c76ef..00000000 --- a/client/composeApp/src/webMain/resources/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - Meldestelle - - - - - - diff --git a/client/composeApp/src/webMain/resources/styles.css b/client/composeApp/src/webMain/resources/styles.css deleted file mode 100644 index 0549b10f..00000000 --- a/client/composeApp/src/webMain/resources/styles.css +++ /dev/null @@ -1,7 +0,0 @@ -html, body { - width: 100%; - height: 100%; - margin: 0; - padding: 0; - overflow: hidden; -} \ No newline at end of file diff --git a/client/composeApp/webpack.config.d/watch.js b/client/composeApp/webpack.config.d/watch.js deleted file mode 100644 index 04713d26..00000000 --- a/client/composeApp/webpack.config.d/watch.js +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Temporary workaround for [KT-80582](https://youtrack.jetbrains.com/issue/KT-80582) - * - * This file should be safe to be removed once the ticket is closed and the project is updated to Kotlin version which solves that issue. - */ -config.watchOptions = config.watchOptions || { - ignored: ["**/*.kt", "**/node_modules"] -} - -if (config.devServer) { - config.devServer.static = config.devServer.static.map(file => { - if (typeof file === "string") { - return { - directory: file, - watch: false, - } - } else { - return file - } - }) -} \ No newline at end of file diff --git a/client/shared/build.gradle.kts b/client/shared/build.gradle.kts deleted file mode 100644 index 6fde779d..00000000 --- a/client/shared/build.gradle.kts +++ /dev/null @@ -1,47 +0,0 @@ -import org.jetbrains.kotlin.gradle.ExperimentalWasmDsl - -plugins { - alias(libs.plugins.kotlinMultiplatform) - alias(libs.plugins.kotlinSerialization) -} - -kotlin { - - // Configure JVM toolchain for all JVM targets - jvmToolchain(21) - - jvm() - - js { - browser() - } - - @OptIn(ExperimentalWasmDsl::class) - wasmJs { - browser() - } - - sourceSets { - commonMain.dependencies { - // HTTP Client dependencies for ping-service - implementation(libs.ktor.client.core) - implementation(libs.ktor.client.contentNegotiation) - implementation(libs.ktor.client.serialization.kotlinx.json) - implementation(libs.kotlinx.serialization.json) - implementation(libs.kotlinx.coroutines.core) - } - - jvmMain.dependencies { - implementation(libs.ktor.client.cio) - } - - jsMain.dependencies { - implementation(libs.ktor.client.js) - } - - commonTest.dependencies { - implementation(libs.kotlin.test) - } - } -} - diff --git a/client/shared/src/commonMain/kotlin/at/mocode/service/PingService.kt b/client/shared/src/commonMain/kotlin/at/mocode/service/PingService.kt deleted file mode 100644 index 73160b1b..00000000 --- a/client/shared/src/commonMain/kotlin/at/mocode/service/PingService.kt +++ /dev/null @@ -1,65 +0,0 @@ -package at.mocode.service - -import at.mocode.model.EnhancedPingResponse -import at.mocode.model.HealthResponse -import at.mocode.model.PingResponse -import io.ktor.client.* -import io.ktor.client.call.* -import io.ktor.client.plugins.* -import io.ktor.client.plugins.contentnegotiation.* -import io.ktor.client.request.* -import io.ktor.serialization.kotlinx.json.* -import kotlinx.serialization.json.Json - -class PingService { - - private val client = HttpClient { - install(ContentNegotiation) { - json(Json { - ignoreUnknownKeys = true - isLenient = true - }) - } - install(HttpTimeout) { - requestTimeoutMillis = 10000 - connectTimeoutMillis = 5000 - } - } - - private val baseUrl = getBaseUrl() - - suspend fun ping(): Result = runCatching { - client.get("$baseUrl/ping").body() - } - - suspend fun enhancedPing(simulate: Boolean = false): Result = runCatching { - // Fallback: Use simple ping and enhance response locally - val response = client.get("$baseUrl/ping").body() - EnhancedPingResponse( - status = response.status, - timestamp = response.timestamp, - service = response.service, - circuitBreakerState = if (simulate) "OPEN" else "CLOSED", - responseTime = 100L - ) - } - - suspend fun health(): Result = runCatching { - // Fallback: Use simple ping to determine health - val response = client.get("$baseUrl/ping").body() - HealthResponse( - status = response.status, - timestamp = response.timestamp, - service = response.service, - healthy = response.status == "pong" - ) - } - - suspend fun testFailure(): Result = runCatching { - // Simulate failure for testing - throw RuntimeException("Simulated failure for testing") - } -} - -// Platform-specific base URL -expect fun getBaseUrl(): String diff --git a/clients/ping-client/build.gradle.kts b/clients/ping-client/build.gradle.kts new file mode 100644 index 00000000..3dac1127 --- /dev/null +++ b/clients/ping-client/build.gradle.kts @@ -0,0 +1,46 @@ +plugins { + alias(libs.plugins.kotlinMultiplatform) + alias(libs.plugins.kotlinSerialization) +} + +group = "at.mocode" +version = "1.0.0" + +kotlin { + jvm() + js { + browser() + } + // Keep WASM for dev since sources already present + @OptIn(org.jetbrains.kotlin.gradle.ExperimentalWasmDsl::class) + wasmJs { + browser() + } + + jvmToolchain(21) + + sourceSets { + val commonMain by getting { + dependencies { + implementation(projects.services.ping.pingApi) + + implementation(libs.ktor.client.core) + implementation(libs.ktor.client.contentNegotiation) + implementation(libs.ktor.client.serialization.kotlinx.json) + + implementation(libs.kotlinx.coroutines.core) + implementation(libs.kotlinx.serialization.json) + } + } + val commonTest by getting { + dependencies { + implementation(libs.kotlin.test) + } + } + val jvmMain by getting { + dependencies { + implementation(libs.ktor.client.cio) + } + } + } +} diff --git a/client/shared/src/commonMain/kotlin/at/mocode/Constants.kt b/clients/ping-client/src/commonMain/kotlin/at/mocode/Constants.kt similarity index 100% rename from client/shared/src/commonMain/kotlin/at/mocode/Constants.kt rename to clients/ping-client/src/commonMain/kotlin/at/mocode/Constants.kt diff --git a/client/shared/src/commonMain/kotlin/at/mocode/Greeting.kt b/clients/ping-client/src/commonMain/kotlin/at/mocode/Greeting.kt similarity index 100% rename from client/shared/src/commonMain/kotlin/at/mocode/Greeting.kt rename to clients/ping-client/src/commonMain/kotlin/at/mocode/Greeting.kt diff --git a/client/shared/src/commonMain/kotlin/at/mocode/Platform.kt b/clients/ping-client/src/commonMain/kotlin/at/mocode/Platform.kt similarity index 100% rename from client/shared/src/commonMain/kotlin/at/mocode/Platform.kt rename to clients/ping-client/src/commonMain/kotlin/at/mocode/Platform.kt diff --git a/clients/ping-client/src/commonMain/kotlin/at/mocode/model/PingResponse.kt b/clients/ping-client/src/commonMain/kotlin/at/mocode/model/PingResponse.kt new file mode 100644 index 00000000..23baf8b3 --- /dev/null +++ b/clients/ping-client/src/commonMain/kotlin/at/mocode/model/PingResponse.kt @@ -0,0 +1,10 @@ +package at.mocode.model + +// Deprecated local DTOs are replaced by typealiases to the shared API contract. +// This preserves binary/source compatibility for existing imports while enforcing SSoT. + +typealias PingResponse = at.mocode.ping.api.PingResponse + +typealias EnhancedPingResponse = at.mocode.ping.api.EnhancedPingResponse + +typealias HealthResponse = at.mocode.ping.api.HealthResponse diff --git a/clients/ping-client/src/commonMain/kotlin/at/mocode/ping/client/PingApiClient.kt b/clients/ping-client/src/commonMain/kotlin/at/mocode/ping/client/PingApiClient.kt new file mode 100644 index 00000000..d00c4a08 --- /dev/null +++ b/clients/ping-client/src/commonMain/kotlin/at/mocode/ping/client/PingApiClient.kt @@ -0,0 +1,25 @@ +package at.mocode.ping.client + +import at.mocode.ping.api.EnhancedPingResponse +import at.mocode.ping.api.HealthResponse +import at.mocode.ping.api.PingApi +import at.mocode.ping.api.PingResponse +import io.ktor.client.HttpClient +import io.ktor.client.call.body +import io.ktor.client.request.get +import io.ktor.client.request.parameter +import at.mocode.service.getBaseUrl + +class PingApiClient( + private val client: HttpClient, + baseUrl: String = getBaseUrl() +) : PingApi { + private val base = "$baseUrl/api/ping" + + override suspend fun simplePing(): PingResponse = client.get("$base/simple").body() + + override suspend fun enhancedPing(simulate: Boolean): EnhancedPingResponse = + client.get("$base/enhanced") { parameter("simulate", simulate) }.body() + + override suspend fun healthCheck(): HealthResponse = client.get("$base/health").body() +} diff --git a/clients/ping-client/src/commonMain/kotlin/at/mocode/service/PingService.kt b/clients/ping-client/src/commonMain/kotlin/at/mocode/service/PingService.kt new file mode 100644 index 00000000..a7933e91 --- /dev/null +++ b/clients/ping-client/src/commonMain/kotlin/at/mocode/service/PingService.kt @@ -0,0 +1,43 @@ +package at.mocode.service + +import at.mocode.model.EnhancedPingResponse +import at.mocode.model.HealthResponse +import at.mocode.model.PingResponse +import at.mocode.ping.client.PingApiClient +import io.ktor.client.* +import io.ktor.client.plugins.* +import io.ktor.client.plugins.contentnegotiation.* +import io.ktor.serialization.kotlinx.json.* +import kotlinx.serialization.json.Json + +@Deprecated("Use PingApiClient directly for new code") +class PingService( + private val client: HttpClient = HttpClient { + install(ContentNegotiation) { + json(Json { + ignoreUnknownKeys = true + isLenient = true + }) + } + install(HttpTimeout) { + requestTimeoutMillis = 10000 + connectTimeoutMillis = 5000 + } + } +) { + private val api = PingApiClient(client) + + suspend fun ping(): Result = runCatching { api.simplePing() } + + suspend fun enhancedPing(simulate: Boolean = false): Result = + runCatching { api.enhancedPing(simulate) } + + suspend fun health(): Result = runCatching { api.healthCheck() } + + suspend fun testFailure(): Result = runCatching { + throw RuntimeException("Simulated failure for testing") + } +} + +// Platform-specific base URL required by PingApiClient via getBaseUrl() +expect fun getBaseUrl(): String diff --git a/client/shared/src/commonTest/kotlin/at/mocode/SharedCommonTest.kt b/clients/ping-client/src/commonTest/kotlin/at/mocode/SharedCommonTest.kt similarity index 100% rename from client/shared/src/commonTest/kotlin/at/mocode/SharedCommonTest.kt rename to clients/ping-client/src/commonTest/kotlin/at/mocode/SharedCommonTest.kt diff --git a/client/shared/src/jsMain/kotlin/at/mocode/Platform.js.kt b/clients/ping-client/src/jsMain/kotlin/at/mocode/Platform.js.kt similarity index 100% rename from client/shared/src/jsMain/kotlin/at/mocode/Platform.js.kt rename to clients/ping-client/src/jsMain/kotlin/at/mocode/Platform.js.kt diff --git a/client/shared/src/jsMain/kotlin/at/mocode/service/Platform.js.kt b/clients/ping-client/src/jsMain/kotlin/at/mocode/service/Platform.js.kt similarity index 100% rename from client/shared/src/jsMain/kotlin/at/mocode/service/Platform.js.kt rename to clients/ping-client/src/jsMain/kotlin/at/mocode/service/Platform.js.kt diff --git a/client/shared/src/jvmMain/kotlin/at/mocode/Platform.jvm.kt b/clients/ping-client/src/jvmMain/kotlin/at/mocode/Platform.jvm.kt similarity index 100% rename from client/shared/src/jvmMain/kotlin/at/mocode/Platform.jvm.kt rename to clients/ping-client/src/jvmMain/kotlin/at/mocode/Platform.jvm.kt diff --git a/client/shared/src/jvmMain/kotlin/at/mocode/service/Platform.jvm.kt b/clients/ping-client/src/jvmMain/kotlin/at/mocode/service/Platform.jvm.kt similarity index 100% rename from client/shared/src/jvmMain/kotlin/at/mocode/service/Platform.jvm.kt rename to clients/ping-client/src/jvmMain/kotlin/at/mocode/service/Platform.jvm.kt diff --git a/client/shared/src/wasmJsMain/kotlin/at/mocode/Platform.wasmJs.kt b/clients/ping-client/src/wasmJsMain/kotlin/at/mocode/Platform.wasmJs.kt similarity index 100% rename from client/shared/src/wasmJsMain/kotlin/at/mocode/Platform.wasmJs.kt rename to clients/ping-client/src/wasmJsMain/kotlin/at/mocode/Platform.wasmJs.kt diff --git a/client/shared/src/wasmJsMain/kotlin/at/mocode/service/Platform.wasmJs.kt b/clients/ping-client/src/wasmJsMain/kotlin/at/mocode/service/Platform.wasmJs.kt similarity index 100% rename from client/shared/src/wasmJsMain/kotlin/at/mocode/service/Platform.wasmJs.kt rename to clients/ping-client/src/wasmJsMain/kotlin/at/mocode/service/Platform.wasmJs.kt diff --git a/docker-compose.services.yml b/docker-compose.services.yml index 7ceb908d..780af356 100644 --- a/docker-compose.services.yml +++ b/docker-compose.services.yml @@ -24,11 +24,12 @@ services: SPRING_PROFILES_ACTIVE: ${DOCKER_SPRING_PROFILES_DOCKER:-docker} container_name: meldestelle-ping-service environment: - SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE:-dev} + SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE:-docker} SERVER_PORT: ${PING_SERVICE_PORT:-8082} CONSUL_HOST: consul CONSUL_PORT: ${CONSUL_PORT:-8500} - CONSUL_ENABLED: true + CONSUL_ENABLED: ${CONSUL_ENABLED:-true} + SPRING_CLOUD_CONSUL_DISCOVERY_ENABLED: ${CONSUL_ENABLED:-true} DB_HOST: postgres DB_PORT: 5432 DB_NAME: ${POSTGRES_DB:-meldestelle} @@ -41,8 +42,15 @@ services: - "${PING_SERVICE_PORT:-8082}:8082" networks: - meldestelle-network + depends_on: + postgres: + condition: service_healthy + redis: + condition: service_healthy + consul: + condition: service_healthy healthcheck: - test: [ "CMD", "curl", "--fail", "http://localhost:${PING_SERVICE_PORT:-8082}/actuator/health" ] + test: [ "CMD", "curl", "--fail", "http://localhost:8082/actuator/health/readiness" ] interval: 15s timeout: 5s retries: 3 diff --git a/dockerfiles/services/ping-service/Dockerfile b/dockerfiles/services/ping-service/Dockerfile index 7811eab3..179ad5c2 100644 --- a/dockerfiles/services/ping-service/Dockerfile +++ b/dockerfiles/services/ping-service/Dockerfile @@ -50,7 +50,7 @@ COPY gradle/ gradle/ COPY platform/ platform/ # Copy client directories (required by settings.gradle.kts) -COPY client/ client/ +COPY clients/ clients/ # Copy core directories (required by settings.gradle.kts) COPY core/ core/ @@ -64,19 +64,19 @@ COPY docs/ docs/ # Copy root build configuration COPY build.gradle.kts ./ -# Copy ping-service specific files last (changes most frequently) -COPY temp/ping-service/build.gradle.kts temp/ping-service/ -COPY temp/ping-service/src/ temp/ping-service/src/ +# Copy ping modules (changes most frequently) +COPY services/ping/ping-api/ services/ping/ping-api/ +COPY services/ping/ping-service/ services/ping/ping-service/ # Download and cache dependencies in a separate layer with build cache RUN --mount=type=cache,target=/home/gradle/.gradle/caches \ --mount=type=cache,target=/home/gradle/.gradle/wrapper \ - ./gradlew :temp:ping-service:dependencies --no-daemon --info + ./gradlew :services:ping:ping-service:dependencies --no-daemon --info # Build the application with optimizations and build cache RUN --mount=type=cache,target=/home/gradle/.gradle/caches \ --mount=type=cache,target=/home/gradle/.gradle/wrapper \ - ./gradlew :temp:ping-service:bootJar --no-daemon --info \ + ./gradlew :services:ping:ping-service:bootJar --no-daemon --info \ -Pspring.profiles.active=${SPRING_PROFILES_ACTIVE} # =================================================================== @@ -133,7 +133,7 @@ RUN apk update && \ # Copy the built JAR from builder stage with proper ownership COPY --from=builder --chown=${APP_USER}:${APP_GROUP} \ - /workspace/temp/ping-service/build/libs/*.jar app.jar + /workspace/services/ping/ping-service/build/libs/*.jar app.jar # Switch to non-root user USER ${APP_USER} diff --git a/kotlin-js-store/yarn.lock b/kotlin-js-store/yarn.lock index 0e514b14..670ce136 100644 --- a/kotlin-js-store/yarn.lock +++ b/kotlin-js-store/yarn.lock @@ -63,55 +63,6 @@ resolved "https://registry.yarnpkg.com/@js-joda/core/-/core-3.2.0.tgz#3e61e21b7b2b8a6be746df1335cf91d70db2a273" integrity sha512-PMqgJ0sw5B7FKb2d5bWYIoxjri+QlW/Pys7+Rw82jSH0QN3rB05jZ/VrrsUdh1w4+i2kw9JOejXGq/KhDOX7Kg== -"@jsonjoy.com/base64@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jsonjoy.com/base64/-/base64-1.1.2.tgz#cf8ea9dcb849b81c95f14fc0aaa151c6b54d2578" - integrity sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA== - -"@jsonjoy.com/buffers@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@jsonjoy.com/buffers/-/buffers-1.0.0.tgz#ade6895b7d3883d70f87b5743efaa12c71dfef7a" - integrity sha512-NDigYR3PHqCnQLXYyoLbnEdzMMvzeiCWo1KOut7Q0CoIqg9tUAPKJ1iq/2nFhc5kZtexzutNY0LFjdwWL3Dw3Q== - -"@jsonjoy.com/codegen@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz#5c23f796c47675f166d23b948cdb889184b93207" - integrity sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g== - -"@jsonjoy.com/json-pack@^1.11.0": - version "1.14.0" - resolved "https://registry.yarnpkg.com/@jsonjoy.com/json-pack/-/json-pack-1.14.0.tgz#eda5255ccdaeafb3aa811ff1ae4814790b958b4f" - integrity sha512-LpWbYgVnKzphN5S6uss4M25jJ/9+m6q6UJoeN6zTkK4xAGhKsiBRPVeF7OYMWonn5repMQbE5vieRXcMUrKDKw== - dependencies: - "@jsonjoy.com/base64" "^1.1.2" - "@jsonjoy.com/buffers" "^1.0.0" - "@jsonjoy.com/codegen" "^1.0.0" - "@jsonjoy.com/json-pointer" "^1.0.1" - "@jsonjoy.com/util" "^1.9.0" - hyperdyperid "^1.2.0" - thingies "^2.5.0" - -"@jsonjoy.com/json-pointer@^1.0.1": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz#049cb530ac24e84cba08590c5e36b431c4843408" - integrity sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg== - dependencies: - "@jsonjoy.com/codegen" "^1.0.0" - "@jsonjoy.com/util" "^1.9.0" - -"@jsonjoy.com/util@^1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@jsonjoy.com/util/-/util-1.9.0.tgz#7ee95586aed0a766b746cd8d8363e336c3c47c46" - integrity sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ== - dependencies: - "@jsonjoy.com/buffers" "^1.0.0" - "@jsonjoy.com/codegen" "^1.0.0" - -"@leichtgewicht/ip-codec@^2.0.1": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz#4fc56c15c580b9adb7dc3c333a134e540b44bfb1" - integrity sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw== - "@pkgjs/parseargs@^0.11.0": version "0.11.0" resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" @@ -122,36 +73,6 @@ resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz#821f8442f4175d8f0467b9daf26e3a18e2d02af2" integrity sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA== -"@types/body-parser@*": - version "1.19.6" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.6.tgz#1859bebb8fd7dac9918a45d54c1971ab8b5af474" - integrity sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g== - dependencies: - "@types/connect" "*" - "@types/node" "*" - -"@types/bonjour@^3.5.13": - version "3.5.13" - resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.13.tgz#adf90ce1a105e81dd1f9c61fdc5afda1bfb92956" - integrity sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ== - dependencies: - "@types/node" "*" - -"@types/connect-history-api-fallback@^1.5.4": - version "1.5.4" - resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz#7de71645a103056b48ac3ce07b3520b819c1d5b3" - integrity sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw== - dependencies: - "@types/express-serve-static-core" "*" - "@types/node" "*" - -"@types/connect@*": - version "3.4.38" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" - integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== - dependencies: - "@types/node" "*" - "@types/cors@^2.8.12": version "2.8.19" resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.19.tgz#d93ea2673fd8c9f697367f5eeefc2bbfa94f0342" @@ -180,74 +101,11 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== -"@types/express-serve-static-core@*", "@types/express-serve-static-core@^5.0.0": - version "5.0.7" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.7.tgz#2fa94879c9d46b11a5df4c74ac75befd6b283de6" - integrity sha512-R+33OsgWw7rOhD1emjU7dzCDHucJrgJXMA5PYCzJxVil0dsyx5iBEPHqpPfiKNJQb7lZ1vxwoLR4Z87bBUpeGQ== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - "@types/send" "*" - -"@types/express-serve-static-core@^4.17.21", "@types/express-serve-static-core@^4.17.33": - version "4.19.6" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz#e01324c2a024ff367d92c66f48553ced0ab50267" - integrity sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - "@types/send" "*" - -"@types/express@*": - version "5.0.3" - resolved "https://registry.yarnpkg.com/@types/express/-/express-5.0.3.tgz#6c4bc6acddc2e2a587142e1d8be0bce20757e956" - integrity sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw== - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "^5.0.0" - "@types/serve-static" "*" - -"@types/express@^4.17.21": - version "4.17.23" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.23.tgz#35af3193c640bfd4d7fe77191cd0ed411a433bef" - integrity sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ== - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "^4.17.33" - "@types/qs" "*" - "@types/serve-static" "*" - -"@types/http-errors@*": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.5.tgz#5b749ab2b16ba113423feb1a64a95dcd30398472" - integrity sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg== - -"@types/http-proxy@^1.17.8": - version "1.17.16" - resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.16.tgz#dee360707b35b3cc85afcde89ffeebff7d7f9240" - integrity sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w== - dependencies: - "@types/node" "*" - "@types/json-schema@*", "@types/json-schema@^7.0.15", "@types/json-schema@^7.0.9": version "7.0.15" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== -"@types/mime@^1": - version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" - integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== - -"@types/node-forge@^1.3.0": - version "1.3.14" - resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-1.3.14.tgz#006c2616ccd65550560c2757d8472eb6d3ecea0b" - integrity sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw== - dependencies: - "@types/node" "*" - "@types/node@*", "@types/node@>=10.0.0": version "24.3.1" resolved "https://registry.yarnpkg.com/@types/node/-/node-24.3.1.tgz#b0a3fb2afed0ef98e8d7f06d46ef6349047709f3" @@ -255,59 +113,6 @@ dependencies: undici-types "~7.10.0" -"@types/qs@*": - version "6.14.0" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.14.0.tgz#d8b60cecf62f2db0fb68e5e006077b9178b85de5" - integrity sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ== - -"@types/range-parser@*": - version "1.2.7" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" - integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== - -"@types/retry@0.12.2": - version "0.12.2" - resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.2.tgz#ed279a64fa438bb69f2480eda44937912bb7480a" - integrity sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow== - -"@types/send@*": - version "0.17.5" - resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.5.tgz#d991d4f2b16f2b1ef497131f00a9114290791e74" - integrity sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w== - dependencies: - "@types/mime" "^1" - "@types/node" "*" - -"@types/serve-index@^1.9.4": - version "1.9.4" - resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.4.tgz#e6ae13d5053cb06ed36392110b4f9a49ac4ec898" - integrity sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug== - dependencies: - "@types/express" "*" - -"@types/serve-static@*", "@types/serve-static@^1.15.5": - version "1.15.8" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.8.tgz#8180c3fbe4a70e8f00b9f70b9ba7f08f35987877" - integrity sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg== - dependencies: - "@types/http-errors" "*" - "@types/node" "*" - "@types/send" "*" - -"@types/sockjs@^0.3.36": - version "0.3.36" - resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.36.tgz#ce322cf07bcc119d4cbf7f88954f3a3bd0f67535" - integrity sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q== - dependencies: - "@types/node" "*" - -"@types/ws@^8.5.10": - version "8.18.1" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.18.1.tgz#48464e4bf2ddfd17db13d845467f6070ffea4aa9" - integrity sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg== - dependencies: - "@types/node" "*" - "@webassemblyjs/ast@1.14.1", "@webassemblyjs/ast@^1.14.1": version "1.14.1" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.14.1.tgz#a9f6a07f2b03c95c8d38c4536a1fdfb521ff55b6" @@ -454,7 +259,7 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== -accepts@~1.3.4, accepts@~1.3.8: +accepts@~1.3.4: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== @@ -496,11 +301,6 @@ ajv@^8.0.0, ajv@^8.9.0: json-schema-traverse "^1.0.0" require-from-string "^2.0.2" -ansi-html-community@^0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" - integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== - ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" @@ -536,11 +336,6 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== - balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -551,17 +346,12 @@ base64id@2.0.0, base64id@~2.0.0: resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== -batch@0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" - integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== - binary-extensions@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== -body-parser@1.20.3, body-parser@^1.19.0: +body-parser@^1.19.0: version "1.20.3" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6" integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== @@ -579,14 +369,6 @@ body-parser@1.20.3, body-parser@^1.19.0: type-is "~1.6.18" unpipe "1.0.0" -bonjour-service@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.3.0.tgz#80d867430b5a0da64e82a8047fc1e355bdb71722" - integrity sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA== - dependencies: - fast-deep-equal "^3.1.3" - multicast-dns "^7.2.5" - brace-expansion@^1.1.7: version "1.1.12" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.12.tgz#ab9b454466e5a8cc3a187beaad580412a9c5b843" @@ -602,7 +384,7 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -braces@^3.0.2, braces@^3.0.3, braces@~3.0.2: +braces@^3.0.2, braces@~3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== @@ -629,13 +411,6 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -bundle-name@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bundle-name/-/bundle-name-4.1.0.tgz#f3b96b34160d6431a19d7688135af7cfb8797889" - integrity sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q== - dependencies: - run-applescript "^7.0.0" - bytes@3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" @@ -675,7 +450,7 @@ chalk@^4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chokidar@^3.5.1, chokidar@^3.6.0: +chokidar@^3.5.1: version "3.6.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== @@ -741,7 +516,7 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -colorette@^2.0.10, colorette@^2.0.14: +colorette@^2.0.14: version "2.0.20" resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== @@ -756,36 +531,11 @@ commander@^2.20.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -compressible@~2.0.18: - version "2.0.18" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" - integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== - dependencies: - mime-db ">= 1.43.0 < 2" - -compression@^1.7.4: - version "1.8.1" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.8.1.tgz#4a45d909ac16509195a9a28bd91094889c180d79" - integrity sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w== - dependencies: - bytes "3.1.2" - compressible "~2.0.18" - debug "2.6.9" - negotiator "~0.6.4" - on-headers "~1.1.0" - safe-buffer "5.2.1" - vary "~1.1.2" - concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== -connect-history-api-fallback@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" - integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== - connect@^3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" @@ -796,38 +546,16 @@ connect@^3.7.0: parseurl "~1.3.3" utils-merge "1.0.1" -content-disposition@0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" - integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== - dependencies: - safe-buffer "5.2.1" - -content-type@~1.0.4, content-type@~1.0.5: +content-type@~1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== - -cookie@0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.1.tgz#2f73c42142d5d5cf71310a74fc4ae61670e5dbc9" - integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w== - cookie@~0.7.2: version "0.7.2" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - cors@~2.8.5: version "2.8.5" resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" @@ -862,13 +590,6 @@ debug@2.6.9: dependencies: ms "2.0.0" -debug@^4.1.0: - version "4.4.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" - integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== - dependencies: - ms "^2.1.3" - debug@^4.3.4, debug@^4.3.5: version "4.4.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b" @@ -888,44 +609,16 @@ decamelize@^4.0.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== -default-browser-id@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-5.0.0.tgz#a1d98bf960c15082d8a3fa69e83150ccccc3af26" - integrity sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA== - -default-browser@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-5.2.1.tgz#7b7ba61204ff3e425b556869ae6d3e9d9f1712cf" - integrity sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg== - dependencies: - bundle-name "^4.1.0" - default-browser-id "^5.0.0" - -define-lazy-prop@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f" - integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== - depd@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== - destroy@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== -detect-node@^2.0.4: - version "2.1.0" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" - integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== - di@^0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" @@ -936,13 +629,6 @@ diff@^7.0.0: resolved "https://registry.yarnpkg.com/diff/-/diff-7.0.0.tgz#3fb34d387cd76d803f6eebea67b921dab0182a9a" integrity sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw== -dns-packet@^5.2.2: - version "5.6.1" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.6.1.tgz#ae888ad425a9d1478a0674256ab866de1012cf2f" - integrity sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw== - dependencies: - "@leichtgewicht/ip-codec" "^2.0.1" - dom-serialize@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" @@ -992,11 +678,6 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== -encodeurl@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" - integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== - engine.io-parser@~5.2.1: version "5.2.3" resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.2.3.tgz#00dc5b97b1f233a23c9398d0209504cf5f94d92f" @@ -1102,11 +783,6 @@ estraverse@^5.2.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== - eventemitter3@^4.0.0: version "4.0.7" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" @@ -1117,43 +793,6 @@ events@^3.2.0: resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== -express@^4.21.2: - version "4.21.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.21.2.tgz#cf250e48362174ead6cea4a566abef0162c1ec32" - integrity sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA== - dependencies: - accepts "~1.3.8" - array-flatten "1.1.1" - body-parser "1.20.3" - content-disposition "0.5.4" - content-type "~1.0.4" - cookie "0.7.1" - cookie-signature "1.0.6" - debug "2.6.9" - depd "2.0.0" - encodeurl "~2.0.0" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "1.3.1" - fresh "0.5.2" - http-errors "2.0.0" - merge-descriptors "1.0.3" - methods "~1.1.2" - on-finished "2.4.1" - parseurl "~1.3.3" - path-to-regexp "0.1.12" - proxy-addr "~2.0.7" - qs "6.13.0" - range-parser "~1.2.1" - safe-buffer "5.2.1" - send "0.19.0" - serve-static "1.16.2" - setprototypeof "1.2.0" - statuses "2.0.1" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - extend@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" @@ -1174,13 +813,6 @@ fastest-levenshtein@^1.0.12: resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== -faye-websocket@^0.11.3: - version "0.11.4" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" - integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== - dependencies: - websocket-driver ">=0.5.1" - fill-range@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" @@ -1201,19 +833,6 @@ finalhandler@1.1.2: statuses "~1.5.0" unpipe "~1.0.0" -finalhandler@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019" - integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ== - dependencies: - debug "2.6.9" - encodeurl "~2.0.0" - escape-html "~1.0.3" - on-finished "2.4.1" - parseurl "~1.3.3" - statuses "2.0.1" - unpipe "~1.0.0" - find-up@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" @@ -1258,16 +877,6 @@ format-util@^1.0.5: resolved "https://registry.yarnpkg.com/format-util/-/format-util-1.0.5.tgz#1ffb450c8a03e7bccffe40643180918cc297d271" integrity sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg== -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== - fs-extra@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" @@ -1328,11 +937,6 @@ glob-parent@~5.1.2: dependencies: is-glob "^4.0.1" -glob-to-regex.js@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/glob-to-regex.js/-/glob-to-regex.js-1.0.1.tgz#f71cc9cb8441471a9318626160bc8a35e1306b21" - integrity sha512-CG/iEvgQqfzoVsMUbxSJcwbG2JwyZ3naEqPkeltwl0BSS8Bp83k3xlGms+0QdWFUAwV+uvo80wNswKF6FWEkKg== - glob-to-regexp@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" @@ -1372,11 +976,6 @@ graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.10, resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== -handle-thing@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" - integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== - has-flag@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" @@ -1406,21 +1005,6 @@ he@^1.2.0: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== -hpack.js@^2.1.6: - version "2.1.6" - resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" - integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== - dependencies: - inherits "^2.0.1" - obuf "^1.0.0" - readable-stream "^2.0.1" - wbuf "^1.1.0" - -http-deceiver@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" - integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== - http-errors@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" @@ -1432,32 +1016,6 @@ http-errors@2.0.0: statuses "2.0.1" toidentifier "1.0.1" -http-errors@~1.6.2: - version "1.6.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" - integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" - -http-parser-js@>=0.5.1: - version "0.5.10" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.10.tgz#b3277bd6d7ed5588e20ea73bf724fcbe44609075" - integrity sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA== - -http-proxy-middleware@^2.0.9: - version "2.0.9" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz#e9e63d68afaa4eee3d147f39149ab84c0c2815ef" - integrity sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q== - dependencies: - "@types/http-proxy" "^1.17.8" - http-proxy "^1.18.1" - is-glob "^4.0.1" - is-plain-obj "^3.0.0" - micromatch "^4.0.2" - http-proxy@^1.18.1: version "1.18.1" resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" @@ -1467,11 +1025,6 @@ http-proxy@^1.18.1: follow-redirects "^1.0.0" requires-port "^1.0.0" -hyperdyperid@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/hyperdyperid/-/hyperdyperid-1.2.0.tgz#59668d323ada92228d2a869d3e474d5a33b69e6b" - integrity sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A== - iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -1502,31 +1055,16 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: +inherits@2, inherits@2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== - interpret@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/interpret/-/interpret-3.1.1.tgz#5be0ceed67ca79c6c4bc5cf0d7ee843dcea110c4" integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - -ipaddr.js@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.2.0.tgz#d33fa7bac284f4de7af949638c9d68157c6b92e8" - integrity sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA== - is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" @@ -1541,11 +1079,6 @@ is-core-module@^2.16.0: dependencies: hasown "^2.0.2" -is-docker@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" - integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== - is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -1563,18 +1096,6 @@ is-glob@^4.0.1, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" -is-inside-container@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4" - integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== - dependencies: - is-docker "^3.0.0" - -is-network-error@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/is-network-error/-/is-network-error-1.3.0.tgz#2ce62cbca444abd506f8a900f39d20b898d37512" - integrity sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw== - is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -1585,11 +1106,6 @@ is-plain-obj@^2.1.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== -is-plain-obj@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" - integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== - is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" @@ -1612,18 +1128,6 @@ is-unicode-supported@^0.1.0: resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== -is-wsl@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-3.1.0.tgz#e1c657e39c10090afcbedec61720f6b924c3cbd2" - integrity sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw== - dependencies: - is-inside-container "^1.0.0" - -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - isbinaryfile@^4.0.8: version "4.0.10" resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.10.tgz#0c5b5e30c2557a2f06febd37b7322946aaee42b3" @@ -1753,14 +1257,6 @@ kotlin-web-helpers@2.1.0: dependencies: format-util "^1.0.5" -launch-editor@^2.6.1: - version "2.11.1" - resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.11.1.tgz#61a0b7314a42fd84a6cbb564573d9e9ffcf3d72b" - integrity sha512-SEET7oNfgSaB6Ym0jufAdCeo3meJVeCaaDyzRygy0xsp2BFKCprcfHljTq4QkzTLUxEKkFK6OK4811YM2oSrRg== - dependencies: - picocolors "^1.1.1" - shell-quote "^1.8.3" - loader-runner@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" @@ -1819,80 +1315,28 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== -memfs@^4.6.0: - version "4.43.0" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-4.43.0.tgz#8aeed4d242e29acf57dfdfe93fec4f84280f8df6" - integrity sha512-XCdhMy33sgxCwJ4JgjSasLGgOjFm9/i+IEhO03gPHroJeTBhM7ZQ1+v3j7di9nNKtcLGjVvKjHVOkTbVop/R/Q== - dependencies: - "@jsonjoy.com/json-pack" "^1.11.0" - "@jsonjoy.com/util" "^1.9.0" - glob-to-regex.js "^1.0.1" - thingies "^2.5.0" - tree-dump "^1.0.3" - tslib "^2.0.0" - -merge-descriptors@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" - integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== - merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== - -micromatch@^4.0.2: - version "4.0.8" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" - integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== - dependencies: - braces "^3.0.3" - picomatch "^2.3.1" - mime-db@1.52.0: version "1.52.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -"mime-db@>= 1.43.0 < 2", mime-db@^1.54.0: - version "1.54.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.54.0.tgz#cddb3ee4f9c64530dff640236661d42cb6a314f5" - integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== - -mime-types@^2.1.27, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: +mime-types@^2.1.27, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" -mime-types@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-3.0.1.tgz#b1d94d6997a9b32fd69ebaed0db73de8acb519ce" - integrity sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA== - dependencies: - mime-db "^1.54.0" - -mime@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - mime@^2.5.2: version "2.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== -minimalistic-assert@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - minimatch@^3.0.4, minimatch@^3.1.1: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -1955,39 +1399,21 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== -ms@2.1.3, ms@^2.1.3: +ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -multicast-dns@^7.2.5: - version "7.2.5" - resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-7.2.5.tgz#77eb46057f4d7adbd16d9290fa7299f6fa64cced" - integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== - dependencies: - dns-packet "^5.2.2" - thunky "^1.0.2" - negotiator@0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== -negotiator@~0.6.4: - version "0.6.4" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.4.tgz#777948e2452651c570b712dd01c23e262713fff7" - integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== - neo-async@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== -node-forge@^1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" - integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== - node-releases@^2.0.19: version "2.0.20" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.20.tgz#e26bb79dbdd1e64a146df389c699014c611cbc27" @@ -2008,12 +1434,7 @@ object-inspect@^1.13.3: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== -obuf@^1.0.0, obuf@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" - integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== - -on-finished@2.4.1, on-finished@^2.4.1: +on-finished@2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== @@ -2027,11 +1448,6 @@ on-finished@~2.3.0: dependencies: ee-first "1.1.1" -on-headers@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.1.0.tgz#59da4f91c45f5f989c6e4bcedc5a3b0aed70ff65" - integrity sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A== - once@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -2039,16 +1455,6 @@ once@^1.3.0: dependencies: wrappy "1" -open@^10.0.3: - version "10.2.0" - resolved "https://registry.yarnpkg.com/open/-/open-10.2.0.tgz#b9d855be007620e80b6fb05fac98141fe62db73c" - integrity sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA== - dependencies: - default-browser "^5.2.1" - define-lazy-prop "^3.0.0" - is-inside-container "^1.0.0" - wsl-utils "^0.1.0" - p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -2077,15 +1483,6 @@ p-locate@^5.0.0: dependencies: p-limit "^3.0.2" -p-retry@^6.2.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-6.2.1.tgz#81828f8dc61c6ef5a800585491572cc9892703af" - integrity sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ== - dependencies: - "@types/retry" "0.12.2" - is-network-error "^1.0.0" - retry "^0.13.1" - p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" @@ -2096,7 +1493,7 @@ package-json-from-dist@^1.0.0: resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== -parseurl@~1.3.2, parseurl@~1.3.3: +parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== @@ -2129,17 +1526,12 @@ path-scurry@^1.11.1: lru-cache "^10.2.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" -path-to-regexp@0.1.12: - version "0.1.12" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz#d5e1a12e478a976d432ef3c58d534b9923164bb7" - integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ== - picocolors@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: +picomatch@^2.0.4, picomatch@^2.2.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== @@ -2151,19 +1543,6 @@ pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -proxy-addr@~2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" @@ -2188,7 +1567,7 @@ randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" -range-parser@^1.2.1, range-parser@~1.2.1: +range-parser@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== @@ -2203,28 +1582,6 @@ raw-body@2.5.2: iconv-lite "0.4.24" unpipe "1.0.0" -readable-stream@^2.0.1: - version "2.3.8" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" - integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@^3.0.6: - version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - readdirp@^4.0.1: version "4.1.2" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.2.tgz#eb85801435fbf2a7ee58f19e0921b068fc69948d" @@ -2280,11 +1637,6 @@ resolve@^1.20.0: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -retry@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" - integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== - rfdc@^1.3.0: version "1.4.1" resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" @@ -2297,21 +1649,11 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" -run-applescript@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-7.1.0.tgz#2e9e54c4664ec3106c5b5630e249d3d6595c4911" - integrity sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q== - -safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0: +safe-buffer@^5.1.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - safe-regex-test@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz#7f87dfb67a3150782eaaf18583ff5d1711ac10c1" @@ -2326,7 +1668,7 @@ safe-regex-test@^1.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -schema-utils@^4.0.0, schema-utils@^4.2.0, schema-utils@^4.3.0, schema-utils@^4.3.2: +schema-utils@^4.3.0, schema-utils@^4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.3.2.tgz#0c10878bf4a73fd2b1dfd14b9462b26788c806ae" integrity sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ== @@ -2336,38 +1678,6 @@ schema-utils@^4.0.0, schema-utils@^4.2.0, schema-utils@^4.3.0, schema-utils@^4.3 ajv-formats "^2.1.1" ajv-keywords "^5.1.0" -select-hose@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" - integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== - -selfsigned@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.4.1.tgz#560d90565442a3ed35b674034cec4e95dceb4ae0" - integrity sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q== - dependencies: - "@types/node-forge" "^1.3.0" - node-forge "^1" - -send@0.19.0: - version "0.19.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8" - integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== - dependencies: - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "2.0.0" - mime "1.6.0" - ms "2.1.3" - on-finished "2.4.1" - range-parser "~1.2.1" - statuses "2.0.1" - serialize-javascript@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" @@ -2375,34 +1685,6 @@ serialize-javascript@^6.0.2: dependencies: randombytes "^2.1.0" -serve-index@^1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" - integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== - dependencies: - accepts "~1.3.4" - batch "0.6.1" - debug "2.6.9" - escape-html "~1.0.3" - http-errors "~1.6.2" - mime-types "~2.1.17" - parseurl "~1.3.2" - -serve-static@1.16.2: - version "1.16.2" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296" - integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== - dependencies: - encodeurl "~2.0.0" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.19.0" - -setprototypeof@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" - integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== - setprototypeof@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" @@ -2427,11 +1709,6 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shell-quote@^1.8.3: - version "1.8.3" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.3.tgz#55e40ef33cf5c689902353a3d8cd1a6725f08b4b" - integrity sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw== - side-channel-list@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" @@ -2506,15 +1783,6 @@ socket.io@^4.7.2: socket.io-adapter "~2.5.2" socket.io-parser "~4.2.4" -sockjs@^0.3.24: - version "0.3.24" - resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" - integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== - dependencies: - faye-websocket "^0.11.3" - uuid "^8.3.2" - websocket-driver "^0.7.4" - source-map-js@^1.0.2: version "1.2.1" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" @@ -2541,35 +1809,12 @@ source-map@^0.6.0, source-map@^0.6.1: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -spdy-transport@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" - integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== - dependencies: - debug "^4.1.0" - detect-node "^2.0.4" - hpack.js "^2.1.6" - obuf "^1.1.2" - readable-stream "^3.0.6" - wbuf "^1.7.3" - -spdy@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" - integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== - dependencies: - debug "^4.1.0" - handle-thing "^2.0.0" - http-deceiver "^1.2.7" - select-hose "^2.0.0" - spdy-transport "^3.0.0" - statuses@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== -"statuses@>= 1.4.0 < 2", statuses@~1.5.0: +statuses@~1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== @@ -2601,20 +1846,6 @@ string-width@^5.0.1, string-width@^5.1.2: emoji-regex "^9.2.2" strip-ansi "^7.0.1" -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - "strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" @@ -2679,16 +1910,6 @@ terser@^5.31.1: commander "^2.20.0" source-map-support "~0.5.20" -thingies@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/thingies/-/thingies-2.5.0.tgz#5f7b882c933b85989f8466b528a6247a6881e04f" - integrity sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw== - -thunky@^1.0.2: - version "1.1.0" - resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" - integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== - tmp@^0.2.1: version "0.2.5" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.5.tgz#b06bcd23f0f3c8357b426891726d16015abfd8f8" @@ -2706,16 +1927,6 @@ toidentifier@1.0.1: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== -tree-dump@^1.0.3: - version "1.1.0" - resolved "https://registry.yarnpkg.com/tree-dump/-/tree-dump-1.1.0.tgz#ab29129169dc46004414f5a9d4a3c6e89f13e8a4" - integrity sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA== - -tslib@^2.0.0: - version "2.8.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" - integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== - type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -2752,22 +1963,12 @@ update-browserslist-db@^1.1.3: escalade "^3.2.0" picocolors "^1.1.1" -util-deprecate@^1.0.1, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -vary@^1, vary@~1.1.2: +vary@^1: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== @@ -2785,13 +1986,6 @@ watchpack@^2.4.1: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" -wbuf@^1.1.0, wbuf@^1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" - integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== - dependencies: - minimalistic-assert "^1.0.0" - webpack-cli@6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-6.0.1.tgz#a1ce25da5ba077151afd73adfa12e208e5089207" @@ -2811,52 +2005,6 @@ webpack-cli@6.0.1: rechoir "^0.8.0" webpack-merge "^6.0.1" -webpack-dev-middleware@^7.4.2: - version "7.4.3" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-7.4.3.tgz#4e23b479a574549334641faa4e00670720f01839" - integrity sha512-5kA/PzpZzDz5mNOkcNLmU1UdjGeSSxd7rt1akWpI70jMNHLASiBPRaQZn0hgyhvhawfIwSnnLfDABIxL3ueyFg== - dependencies: - colorette "^2.0.10" - memfs "^4.6.0" - mime-types "^3.0.1" - on-finished "^2.4.1" - range-parser "^1.2.1" - schema-utils "^4.0.0" - -webpack-dev-server@5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-5.2.2.tgz#96a143d50c58fef0c79107e61df911728d7ceb39" - integrity sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg== - dependencies: - "@types/bonjour" "^3.5.13" - "@types/connect-history-api-fallback" "^1.5.4" - "@types/express" "^4.17.21" - "@types/express-serve-static-core" "^4.17.21" - "@types/serve-index" "^1.9.4" - "@types/serve-static" "^1.15.5" - "@types/sockjs" "^0.3.36" - "@types/ws" "^8.5.10" - ansi-html-community "^0.0.8" - bonjour-service "^1.2.1" - chokidar "^3.6.0" - colorette "^2.0.10" - compression "^1.7.4" - connect-history-api-fallback "^2.0.0" - express "^4.21.2" - graceful-fs "^4.2.6" - http-proxy-middleware "^2.0.9" - ipaddr.js "^2.1.0" - launch-editor "^2.6.1" - open "^10.0.3" - p-retry "^6.2.0" - schema-utils "^4.2.0" - selfsigned "^2.4.1" - serve-index "^1.9.1" - sockjs "^0.3.24" - spdy "^4.0.2" - webpack-dev-middleware "^7.4.2" - ws "^8.18.0" - webpack-merge@^4.1.5: version "4.2.2" resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.2.tgz#a27c52ea783d1398afd2087f547d7b9d2f43634d" @@ -2909,20 +2057,6 @@ webpack@5.100.2: watchpack "^2.4.1" webpack-sources "^3.3.3" -websocket-driver@>=0.5.1, websocket-driver@^0.7.4: - version "0.7.4" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" - integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== - dependencies: - http-parser-js ">=0.5.1" - safe-buffer ">=5.1.0" - websocket-extensions ">=0.1.1" - -websocket-extensions@>=0.1.1: - version "0.1.4" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" - integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== - which@^1.2.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" @@ -2970,7 +2104,7 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -ws@8.18.3, ws@^8.18.0: +ws@8.18.3: version "8.18.3" resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.3.tgz#b56b88abffde62791c639170400c93dcb0c95472" integrity sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg== @@ -2980,13 +2114,6 @@ ws@~8.17.1: resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== -wsl-utils@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/wsl-utils/-/wsl-utils-0.1.0.tgz#8783d4df671d4d50365be2ee4c71917a0557baab" - integrity sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw== - dependencies: - is-wsl "^3.1.0" - y18n@^5.0.5: version "5.0.8" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" diff --git a/events/README-EVENTS.md b/services/events/README-EVENTS.md similarity index 99% rename from events/README-EVENTS.md rename to services/events/README-EVENTS.md index 555354c1..ed4a27ac 100644 --- a/events/README-EVENTS.md +++ b/services/events/README-EVENTS.md @@ -454,4 +454,4 @@ spec: **Letzte Aktualisierung**: 25. Juli 2025 -Für weitere Informationen zur Gesamtarchitektur siehe [README.md](../README.md). +Für weitere Informationen zur Gesamtarchitektur siehe [README.md](../../README.md). diff --git a/events/events-api/build.gradle.kts b/services/events/events-api/build.gradle.kts similarity index 100% rename from events/events-api/build.gradle.kts rename to services/events/events-api/build.gradle.kts diff --git a/events/events-api/src/main/kotlin/at/mocode/events/api/rest/VeranstaltungController.kt b/services/events/events-api/src/main/kotlin/at/mocode/events/api/rest/VeranstaltungController.kt similarity index 100% rename from events/events-api/src/main/kotlin/at/mocode/events/api/rest/VeranstaltungController.kt rename to services/events/events-api/src/main/kotlin/at/mocode/events/api/rest/VeranstaltungController.kt diff --git a/events/events-application/build.gradle.kts b/services/events/events-application/build.gradle.kts similarity index 100% rename from events/events-application/build.gradle.kts rename to services/events/events-application/build.gradle.kts diff --git a/events/events-application/src/main/kotlin/at/mocode/events/application/usecase/CreateVeranstaltungUseCase.kt b/services/events/events-application/src/main/kotlin/at/mocode/events/application/usecase/CreateVeranstaltungUseCase.kt similarity index 100% rename from events/events-application/src/main/kotlin/at/mocode/events/application/usecase/CreateVeranstaltungUseCase.kt rename to services/events/events-application/src/main/kotlin/at/mocode/events/application/usecase/CreateVeranstaltungUseCase.kt diff --git a/events/events-application/src/main/kotlin/at/mocode/events/application/usecase/DeleteVeranstaltungUseCase.kt b/services/events/events-application/src/main/kotlin/at/mocode/events/application/usecase/DeleteVeranstaltungUseCase.kt similarity index 100% rename from events/events-application/src/main/kotlin/at/mocode/events/application/usecase/DeleteVeranstaltungUseCase.kt rename to services/events/events-application/src/main/kotlin/at/mocode/events/application/usecase/DeleteVeranstaltungUseCase.kt diff --git a/events/events-application/src/main/kotlin/at/mocode/events/application/usecase/GetVeranstaltungUseCase.kt b/services/events/events-application/src/main/kotlin/at/mocode/events/application/usecase/GetVeranstaltungUseCase.kt similarity index 100% rename from events/events-application/src/main/kotlin/at/mocode/events/application/usecase/GetVeranstaltungUseCase.kt rename to services/events/events-application/src/main/kotlin/at/mocode/events/application/usecase/GetVeranstaltungUseCase.kt diff --git a/events/events-application/src/main/kotlin/at/mocode/events/application/usecase/UpdateVeranstaltungUseCase.kt b/services/events/events-application/src/main/kotlin/at/mocode/events/application/usecase/UpdateVeranstaltungUseCase.kt similarity index 100% rename from events/events-application/src/main/kotlin/at/mocode/events/application/usecase/UpdateVeranstaltungUseCase.kt rename to services/events/events-application/src/main/kotlin/at/mocode/events/application/usecase/UpdateVeranstaltungUseCase.kt diff --git a/events/events-domain/build.gradle.kts b/services/events/events-domain/build.gradle.kts similarity index 100% rename from events/events-domain/build.gradle.kts rename to services/events/events-domain/build.gradle.kts diff --git a/events/events-domain/src/main/kotlin/at/mocode/events/EventManagement.kt b/services/events/events-domain/src/main/kotlin/at/mocode/events/EventManagement.kt similarity index 100% rename from events/events-domain/src/main/kotlin/at/mocode/events/EventManagement.kt rename to services/events/events-domain/src/main/kotlin/at/mocode/events/EventManagement.kt diff --git a/events/events-domain/src/main/kotlin/at/mocode/events/domain/model/Veranstaltung.kt b/services/events/events-domain/src/main/kotlin/at/mocode/events/domain/model/Veranstaltung.kt similarity index 100% rename from events/events-domain/src/main/kotlin/at/mocode/events/domain/model/Veranstaltung.kt rename to services/events/events-domain/src/main/kotlin/at/mocode/events/domain/model/Veranstaltung.kt diff --git a/events/events-domain/src/main/kotlin/at/mocode/events/domain/repository/VeranstaltungRepository.kt b/services/events/events-domain/src/main/kotlin/at/mocode/events/domain/repository/VeranstaltungRepository.kt similarity index 100% rename from events/events-domain/src/main/kotlin/at/mocode/events/domain/repository/VeranstaltungRepository.kt rename to services/events/events-domain/src/main/kotlin/at/mocode/events/domain/repository/VeranstaltungRepository.kt diff --git a/events/events-infrastructure/build.gradle.kts b/services/events/events-infrastructure/build.gradle.kts similarity index 100% rename from events/events-infrastructure/build.gradle.kts rename to services/events/events-infrastructure/build.gradle.kts diff --git a/events/events-infrastructure/src/main/kotlin/at/mocode/events/infrastructure/persistence/VeranstaltungRepositoryImpl.kt b/services/events/events-infrastructure/src/main/kotlin/at/mocode/events/infrastructure/persistence/VeranstaltungRepositoryImpl.kt similarity index 100% rename from events/events-infrastructure/src/main/kotlin/at/mocode/events/infrastructure/persistence/VeranstaltungRepositoryImpl.kt rename to services/events/events-infrastructure/src/main/kotlin/at/mocode/events/infrastructure/persistence/VeranstaltungRepositoryImpl.kt diff --git a/events/events-infrastructure/src/main/kotlin/at/mocode/events/infrastructure/persistence/VeranstaltungTable.kt b/services/events/events-infrastructure/src/main/kotlin/at/mocode/events/infrastructure/persistence/VeranstaltungTable.kt similarity index 100% rename from events/events-infrastructure/src/main/kotlin/at/mocode/events/infrastructure/persistence/VeranstaltungTable.kt rename to services/events/events-infrastructure/src/main/kotlin/at/mocode/events/infrastructure/persistence/VeranstaltungTable.kt diff --git a/events/events-service/build.gradle.kts b/services/events/events-service/build.gradle.kts similarity index 100% rename from events/events-service/build.gradle.kts rename to services/events/events-service/build.gradle.kts diff --git a/events/events-service/src/main/kotlin/at/mocode/events/service/EventsServiceApplication.kt b/services/events/events-service/src/main/kotlin/at/mocode/events/service/EventsServiceApplication.kt similarity index 100% rename from events/events-service/src/main/kotlin/at/mocode/events/service/EventsServiceApplication.kt rename to services/events/events-service/src/main/kotlin/at/mocode/events/service/EventsServiceApplication.kt diff --git a/events/events-service/src/main/kotlin/at/mocode/events/service/config/EventsDatabaseConfiguration.kt b/services/events/events-service/src/main/kotlin/at/mocode/events/service/config/EventsDatabaseConfiguration.kt similarity index 100% rename from events/events-service/src/main/kotlin/at/mocode/events/service/config/EventsDatabaseConfiguration.kt rename to services/events/events-service/src/main/kotlin/at/mocode/events/service/config/EventsDatabaseConfiguration.kt diff --git a/events/events-service/src/test/resources/logback-test.xml b/services/events/events-service/src/test/resources/logback-test.xml similarity index 100% rename from events/events-service/src/test/resources/logback-test.xml rename to services/events/events-service/src/test/resources/logback-test.xml diff --git a/horses/README-HORSES.md b/services/horses/README-HORSES.md similarity index 99% rename from horses/README-HORSES.md rename to services/horses/README-HORSES.md index 9380939b..897e1eea 100644 --- a/horses/README-HORSES.md +++ b/services/horses/README-HORSES.md @@ -530,4 +530,4 @@ spec: **Letzte Aktualisierung**: 25. Juli 2025 -Für weitere Informationen zur Gesamtarchitektur siehe [README.md](../README.md). +Für weitere Informationen zur Gesamtarchitektur siehe [README.md](../../README.md). diff --git a/horses/horses-api/build.gradle.kts b/services/horses/horses-api/build.gradle.kts similarity index 100% rename from horses/horses-api/build.gradle.kts rename to services/horses/horses-api/build.gradle.kts diff --git a/horses/horses-api/src/main/kotlin/at/mocode/horses/api/rest/HorseController.kt b/services/horses/horses-api/src/main/kotlin/at/mocode/horses/api/rest/HorseController.kt similarity index 100% rename from horses/horses-api/src/main/kotlin/at/mocode/horses/api/rest/HorseController.kt rename to services/horses/horses-api/src/main/kotlin/at/mocode/horses/api/rest/HorseController.kt diff --git a/horses/horses-application/build.gradle.kts b/services/horses/horses-application/build.gradle.kts similarity index 100% rename from horses/horses-application/build.gradle.kts rename to services/horses/horses-application/build.gradle.kts diff --git a/horses/horses-application/src/main/kotlin/at/mocode/horses/application/usecase/CreateHorseUseCase.kt b/services/horses/horses-application/src/main/kotlin/at/mocode/horses/application/usecase/CreateHorseUseCase.kt similarity index 100% rename from horses/horses-application/src/main/kotlin/at/mocode/horses/application/usecase/CreateHorseUseCase.kt rename to services/horses/horses-application/src/main/kotlin/at/mocode/horses/application/usecase/CreateHorseUseCase.kt diff --git a/horses/horses-application/src/main/kotlin/at/mocode/horses/application/usecase/DeleteHorseUseCase.kt b/services/horses/horses-application/src/main/kotlin/at/mocode/horses/application/usecase/DeleteHorseUseCase.kt similarity index 100% rename from horses/horses-application/src/main/kotlin/at/mocode/horses/application/usecase/DeleteHorseUseCase.kt rename to services/horses/horses-application/src/main/kotlin/at/mocode/horses/application/usecase/DeleteHorseUseCase.kt diff --git a/horses/horses-application/src/main/kotlin/at/mocode/horses/application/usecase/GetHorseUseCase.kt b/services/horses/horses-application/src/main/kotlin/at/mocode/horses/application/usecase/GetHorseUseCase.kt similarity index 100% rename from horses/horses-application/src/main/kotlin/at/mocode/horses/application/usecase/GetHorseUseCase.kt rename to services/horses/horses-application/src/main/kotlin/at/mocode/horses/application/usecase/GetHorseUseCase.kt diff --git a/horses/horses-application/src/main/kotlin/at/mocode/horses/application/usecase/TransactionalCreateHorseUseCase.kt b/services/horses/horses-application/src/main/kotlin/at/mocode/horses/application/usecase/TransactionalCreateHorseUseCase.kt similarity index 100% rename from horses/horses-application/src/main/kotlin/at/mocode/horses/application/usecase/TransactionalCreateHorseUseCase.kt rename to services/horses/horses-application/src/main/kotlin/at/mocode/horses/application/usecase/TransactionalCreateHorseUseCase.kt diff --git a/horses/horses-application/src/main/kotlin/at/mocode/horses/application/usecase/UpdateHorseUseCase.kt b/services/horses/horses-application/src/main/kotlin/at/mocode/horses/application/usecase/UpdateHorseUseCase.kt similarity index 100% rename from horses/horses-application/src/main/kotlin/at/mocode/horses/application/usecase/UpdateHorseUseCase.kt rename to services/horses/horses-application/src/main/kotlin/at/mocode/horses/application/usecase/UpdateHorseUseCase.kt diff --git a/horses/horses-domain/build.gradle.kts b/services/horses/horses-domain/build.gradle.kts similarity index 100% rename from horses/horses-domain/build.gradle.kts rename to services/horses/horses-domain/build.gradle.kts diff --git a/horses/horses-domain/src/main/kotlin/at/mocode/horses/domain/model/DomPferd.kt b/services/horses/horses-domain/src/main/kotlin/at/mocode/horses/domain/model/DomPferd.kt similarity index 100% rename from horses/horses-domain/src/main/kotlin/at/mocode/horses/domain/model/DomPferd.kt rename to services/horses/horses-domain/src/main/kotlin/at/mocode/horses/domain/model/DomPferd.kt diff --git a/horses/horses-domain/src/main/kotlin/at/mocode/horses/domain/repository/HorseRepository.kt b/services/horses/horses-domain/src/main/kotlin/at/mocode/horses/domain/repository/HorseRepository.kt similarity index 100% rename from horses/horses-domain/src/main/kotlin/at/mocode/horses/domain/repository/HorseRepository.kt rename to services/horses/horses-domain/src/main/kotlin/at/mocode/horses/domain/repository/HorseRepository.kt diff --git a/horses/horses-infrastructure/build.gradle.kts b/services/horses/horses-infrastructure/build.gradle.kts similarity index 100% rename from horses/horses-infrastructure/build.gradle.kts rename to services/horses/horses-infrastructure/build.gradle.kts diff --git a/horses/horses-infrastructure/src/main/kotlin/at/mocode/horses/infrastructure/persistence/HorseRepositoryImpl.kt b/services/horses/horses-infrastructure/src/main/kotlin/at/mocode/horses/infrastructure/persistence/HorseRepositoryImpl.kt similarity index 100% rename from horses/horses-infrastructure/src/main/kotlin/at/mocode/horses/infrastructure/persistence/HorseRepositoryImpl.kt rename to services/horses/horses-infrastructure/src/main/kotlin/at/mocode/horses/infrastructure/persistence/HorseRepositoryImpl.kt diff --git a/horses/horses-infrastructure/src/main/kotlin/at/mocode/horses/infrastructure/persistence/HorseTable.kt b/services/horses/horses-infrastructure/src/main/kotlin/at/mocode/horses/infrastructure/persistence/HorseTable.kt similarity index 100% rename from horses/horses-infrastructure/src/main/kotlin/at/mocode/horses/infrastructure/persistence/HorseTable.kt rename to services/horses/horses-infrastructure/src/main/kotlin/at/mocode/horses/infrastructure/persistence/HorseTable.kt diff --git a/horses/horses-service/build.gradle.kts b/services/horses/horses-service/build.gradle.kts similarity index 100% rename from horses/horses-service/build.gradle.kts rename to services/horses/horses-service/build.gradle.kts diff --git a/horses/horses-service/src/main/kotlin/at/mocode/horses/service/HorsesServiceApplication.kt b/services/horses/horses-service/src/main/kotlin/at/mocode/horses/service/HorsesServiceApplication.kt similarity index 100% rename from horses/horses-service/src/main/kotlin/at/mocode/horses/service/HorsesServiceApplication.kt rename to services/horses/horses-service/src/main/kotlin/at/mocode/horses/service/HorsesServiceApplication.kt diff --git a/horses/horses-service/src/main/kotlin/at/mocode/horses/service/config/ApplicationConfiguration.kt b/services/horses/horses-service/src/main/kotlin/at/mocode/horses/service/config/ApplicationConfiguration.kt similarity index 100% rename from horses/horses-service/src/main/kotlin/at/mocode/horses/service/config/ApplicationConfiguration.kt rename to services/horses/horses-service/src/main/kotlin/at/mocode/horses/service/config/ApplicationConfiguration.kt diff --git a/horses/horses-service/src/main/kotlin/at/mocode/horses/service/config/DatabaseConfiguration.kt b/services/horses/horses-service/src/main/kotlin/at/mocode/horses/service/config/DatabaseConfiguration.kt similarity index 100% rename from horses/horses-service/src/main/kotlin/at/mocode/horses/service/config/DatabaseConfiguration.kt rename to services/horses/horses-service/src/main/kotlin/at/mocode/horses/service/config/DatabaseConfiguration.kt diff --git a/horses/horses-service/src/test/kotlin/at/mocode/horses/service/integration/HorseServiceIntegrationTest.kt b/services/horses/horses-service/src/test/kotlin/at/mocode/horses/service/integration/HorseServiceIntegrationTest.kt similarity index 100% rename from horses/horses-service/src/test/kotlin/at/mocode/horses/service/integration/HorseServiceIntegrationTest.kt rename to services/horses/horses-service/src/test/kotlin/at/mocode/horses/service/integration/HorseServiceIntegrationTest.kt diff --git a/horses/horses-service/src/test/kotlin/at/mocode/horses/service/integration/TransactionContextTest.kt b/services/horses/horses-service/src/test/kotlin/at/mocode/horses/service/integration/TransactionContextTest.kt similarity index 100% rename from horses/horses-service/src/test/kotlin/at/mocode/horses/service/integration/TransactionContextTest.kt rename to services/horses/horses-service/src/test/kotlin/at/mocode/horses/service/integration/TransactionContextTest.kt diff --git a/horses/horses-service/src/test/kotlin/at/mocode/horses/service/integration/TransactionalContextTest.kt b/services/horses/horses-service/src/test/kotlin/at/mocode/horses/service/integration/TransactionalContextTest.kt similarity index 100% rename from horses/horses-service/src/test/kotlin/at/mocode/horses/service/integration/TransactionalContextTest.kt rename to services/horses/horses-service/src/test/kotlin/at/mocode/horses/service/integration/TransactionalContextTest.kt diff --git a/horses/horses-service/src/test/resources/logback-test.xml b/services/horses/horses-service/src/test/resources/logback-test.xml similarity index 100% rename from horses/horses-service/src/test/resources/logback-test.xml rename to services/horses/horses-service/src/test/resources/logback-test.xml diff --git a/masterdata/README-MASTERDATA.md b/services/masterdata/README-MASTERDATA.md similarity index 100% rename from masterdata/README-MASTERDATA.md rename to services/masterdata/README-MASTERDATA.md diff --git a/masterdata/masterdata-api/build.gradle.kts b/services/masterdata/masterdata-api/build.gradle.kts similarity index 100% rename from masterdata/masterdata-api/build.gradle.kts rename to services/masterdata/masterdata-api/build.gradle.kts diff --git a/masterdata/masterdata-api/src/main/kotlin/at/mocode/masterdata/api/StatusPages.kt b/services/masterdata/masterdata-api/src/main/kotlin/at/mocode/masterdata/api/StatusPages.kt similarity index 100% rename from masterdata/masterdata-api/src/main/kotlin/at/mocode/masterdata/api/StatusPages.kt rename to services/masterdata/masterdata-api/src/main/kotlin/at/mocode/masterdata/api/StatusPages.kt diff --git a/masterdata/masterdata-api/src/main/kotlin/at/mocode/masterdata/api/rest/AltersklasseController.kt b/services/masterdata/masterdata-api/src/main/kotlin/at/mocode/masterdata/api/rest/AltersklasseController.kt similarity index 100% rename from masterdata/masterdata-api/src/main/kotlin/at/mocode/masterdata/api/rest/AltersklasseController.kt rename to services/masterdata/masterdata-api/src/main/kotlin/at/mocode/masterdata/api/rest/AltersklasseController.kt diff --git a/masterdata/masterdata-api/src/main/kotlin/at/mocode/masterdata/api/rest/BundeslandController.kt b/services/masterdata/masterdata-api/src/main/kotlin/at/mocode/masterdata/api/rest/BundeslandController.kt similarity index 100% rename from masterdata/masterdata-api/src/main/kotlin/at/mocode/masterdata/api/rest/BundeslandController.kt rename to services/masterdata/masterdata-api/src/main/kotlin/at/mocode/masterdata/api/rest/BundeslandController.kt diff --git a/masterdata/masterdata-api/src/main/kotlin/at/mocode/masterdata/api/rest/CountryController.kt b/services/masterdata/masterdata-api/src/main/kotlin/at/mocode/masterdata/api/rest/CountryController.kt similarity index 100% rename from masterdata/masterdata-api/src/main/kotlin/at/mocode/masterdata/api/rest/CountryController.kt rename to services/masterdata/masterdata-api/src/main/kotlin/at/mocode/masterdata/api/rest/CountryController.kt diff --git a/masterdata/masterdata-api/src/main/kotlin/at/mocode/masterdata/api/rest/PlatzController.kt b/services/masterdata/masterdata-api/src/main/kotlin/at/mocode/masterdata/api/rest/PlatzController.kt similarity index 100% rename from masterdata/masterdata-api/src/main/kotlin/at/mocode/masterdata/api/rest/PlatzController.kt rename to services/masterdata/masterdata-api/src/main/kotlin/at/mocode/masterdata/api/rest/PlatzController.kt diff --git a/masterdata/masterdata-application/build.gradle.kts b/services/masterdata/masterdata-application/build.gradle.kts similarity index 100% rename from masterdata/masterdata-application/build.gradle.kts rename to services/masterdata/masterdata-application/build.gradle.kts diff --git a/masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/CreateAltersklasseUseCase.kt b/services/masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/CreateAltersklasseUseCase.kt similarity index 100% rename from masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/CreateAltersklasseUseCase.kt rename to services/masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/CreateAltersklasseUseCase.kt diff --git a/masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/CreateBundeslandUseCase.kt b/services/masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/CreateBundeslandUseCase.kt similarity index 100% rename from masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/CreateBundeslandUseCase.kt rename to services/masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/CreateBundeslandUseCase.kt diff --git a/masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/CreateCountryUseCase.kt b/services/masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/CreateCountryUseCase.kt similarity index 100% rename from masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/CreateCountryUseCase.kt rename to services/masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/CreateCountryUseCase.kt diff --git a/masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/CreatePlatzUseCase.kt b/services/masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/CreatePlatzUseCase.kt similarity index 100% rename from masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/CreatePlatzUseCase.kt rename to services/masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/CreatePlatzUseCase.kt diff --git a/masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/GetAltersklasseUseCase.kt b/services/masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/GetAltersklasseUseCase.kt similarity index 100% rename from masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/GetAltersklasseUseCase.kt rename to services/masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/GetAltersklasseUseCase.kt diff --git a/masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/GetBundeslandUseCase.kt b/services/masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/GetBundeslandUseCase.kt similarity index 100% rename from masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/GetBundeslandUseCase.kt rename to services/masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/GetBundeslandUseCase.kt diff --git a/masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/GetCountryUseCase.kt b/services/masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/GetCountryUseCase.kt similarity index 100% rename from masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/GetCountryUseCase.kt rename to services/masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/GetCountryUseCase.kt diff --git a/masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/GetPlatzUseCase.kt b/services/masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/GetPlatzUseCase.kt similarity index 100% rename from masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/GetPlatzUseCase.kt rename to services/masterdata/masterdata-application/src/main/kotlin/at/mocode/masterdata/application/usecase/GetPlatzUseCase.kt diff --git a/masterdata/masterdata-domain/build.gradle.kts b/services/masterdata/masterdata-domain/build.gradle.kts similarity index 100% rename from masterdata/masterdata-domain/build.gradle.kts rename to services/masterdata/masterdata-domain/build.gradle.kts diff --git a/masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/model/AltersklasseDefinition.kt b/services/masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/model/AltersklasseDefinition.kt similarity index 100% rename from masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/model/AltersklasseDefinition.kt rename to services/masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/model/AltersklasseDefinition.kt diff --git a/masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/model/BundeslandDefinition.kt b/services/masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/model/BundeslandDefinition.kt similarity index 100% rename from masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/model/BundeslandDefinition.kt rename to services/masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/model/BundeslandDefinition.kt diff --git a/masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/model/LandDefinition.kt b/services/masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/model/LandDefinition.kt similarity index 100% rename from masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/model/LandDefinition.kt rename to services/masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/model/LandDefinition.kt diff --git a/masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/model/Platz.kt b/services/masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/model/Platz.kt similarity index 100% rename from masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/model/Platz.kt rename to services/masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/model/Platz.kt diff --git a/masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/repository/AltersklasseRepository.kt b/services/masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/repository/AltersklasseRepository.kt similarity index 100% rename from masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/repository/AltersklasseRepository.kt rename to services/masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/repository/AltersklasseRepository.kt diff --git a/masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/repository/BundeslandRepository.kt b/services/masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/repository/BundeslandRepository.kt similarity index 100% rename from masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/repository/BundeslandRepository.kt rename to services/masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/repository/BundeslandRepository.kt diff --git a/masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/repository/LandRepository.kt b/services/masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/repository/LandRepository.kt similarity index 100% rename from masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/repository/LandRepository.kt rename to services/masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/repository/LandRepository.kt diff --git a/masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/repository/PlatzRepository.kt b/services/masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/repository/PlatzRepository.kt similarity index 100% rename from masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/repository/PlatzRepository.kt rename to services/masterdata/masterdata-domain/src/main/kotlin/at/mocode/masterdata/domain/repository/PlatzRepository.kt diff --git a/masterdata/masterdata-infrastructure/build.gradle.kts b/services/masterdata/masterdata-infrastructure/build.gradle.kts similarity index 100% rename from masterdata/masterdata-infrastructure/build.gradle.kts rename to services/masterdata/masterdata-infrastructure/build.gradle.kts diff --git a/masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/AltersklasseRepositoryImpl.kt b/services/masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/AltersklasseRepositoryImpl.kt similarity index 100% rename from masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/AltersklasseRepositoryImpl.kt rename to services/masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/AltersklasseRepositoryImpl.kt diff --git a/masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/AltersklasseTable.kt b/services/masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/AltersklasseTable.kt similarity index 100% rename from masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/AltersklasseTable.kt rename to services/masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/AltersklasseTable.kt diff --git a/masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/BundeslandRepositoryImpl.kt b/services/masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/BundeslandRepositoryImpl.kt similarity index 100% rename from masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/BundeslandRepositoryImpl.kt rename to services/masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/BundeslandRepositoryImpl.kt diff --git a/masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/BundeslandTable.kt b/services/masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/BundeslandTable.kt similarity index 100% rename from masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/BundeslandTable.kt rename to services/masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/BundeslandTable.kt diff --git a/masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/LandRepositoryImpl.kt b/services/masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/LandRepositoryImpl.kt similarity index 100% rename from masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/LandRepositoryImpl.kt rename to services/masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/LandRepositoryImpl.kt diff --git a/masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/LandTable.kt b/services/masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/LandTable.kt similarity index 100% rename from masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/LandTable.kt rename to services/masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/LandTable.kt diff --git a/masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/PlatzRepositoryImpl.kt b/services/masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/PlatzRepositoryImpl.kt similarity index 100% rename from masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/PlatzRepositoryImpl.kt rename to services/masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/PlatzRepositoryImpl.kt diff --git a/masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/PlatzTable.kt b/services/masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/PlatzTable.kt similarity index 100% rename from masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/PlatzTable.kt rename to services/masterdata/masterdata-infrastructure/src/main/kotlin/at/mocode/masterdata/infrastructure/persistence/PlatzTable.kt diff --git a/masterdata/masterdata-service/build.gradle.kts b/services/masterdata/masterdata-service/build.gradle.kts similarity index 100% rename from masterdata/masterdata-service/build.gradle.kts rename to services/masterdata/masterdata-service/build.gradle.kts diff --git a/masterdata/masterdata-service/src/main/kotlin/at/mocode/masterdata/service/MasterdataServiceApplication.kt b/services/masterdata/masterdata-service/src/main/kotlin/at/mocode/masterdata/service/MasterdataServiceApplication.kt similarity index 100% rename from masterdata/masterdata-service/src/main/kotlin/at/mocode/masterdata/service/MasterdataServiceApplication.kt rename to services/masterdata/masterdata-service/src/main/kotlin/at/mocode/masterdata/service/MasterdataServiceApplication.kt diff --git a/masterdata/masterdata-service/src/main/kotlin/at/mocode/masterdata/service/config/MasterdataConfiguration.kt b/services/masterdata/masterdata-service/src/main/kotlin/at/mocode/masterdata/service/config/MasterdataConfiguration.kt similarity index 100% rename from masterdata/masterdata-service/src/main/kotlin/at/mocode/masterdata/service/config/MasterdataConfiguration.kt rename to services/masterdata/masterdata-service/src/main/kotlin/at/mocode/masterdata/service/config/MasterdataConfiguration.kt diff --git a/masterdata/masterdata-service/src/main/kotlin/at/mocode/masterdata/service/config/MasterdataDatabaseConfiguration.kt b/services/masterdata/masterdata-service/src/main/kotlin/at/mocode/masterdata/service/config/MasterdataDatabaseConfiguration.kt similarity index 100% rename from masterdata/masterdata-service/src/main/kotlin/at/mocode/masterdata/service/config/MasterdataDatabaseConfiguration.kt rename to services/masterdata/masterdata-service/src/main/kotlin/at/mocode/masterdata/service/config/MasterdataDatabaseConfiguration.kt diff --git a/masterdata/masterdata-service/src/main/resources/db/migration/V001__Create_Land_Table.sql b/services/masterdata/masterdata-service/src/main/resources/db/migration/V001__Create_Land_Table.sql similarity index 100% rename from masterdata/masterdata-service/src/main/resources/db/migration/V001__Create_Land_Table.sql rename to services/masterdata/masterdata-service/src/main/resources/db/migration/V001__Create_Land_Table.sql diff --git a/masterdata/masterdata-service/src/main/resources/db/migration/V002__Create_Bundesland_Table.sql b/services/masterdata/masterdata-service/src/main/resources/db/migration/V002__Create_Bundesland_Table.sql similarity index 100% rename from masterdata/masterdata-service/src/main/resources/db/migration/V002__Create_Bundesland_Table.sql rename to services/masterdata/masterdata-service/src/main/resources/db/migration/V002__Create_Bundesland_Table.sql diff --git a/masterdata/masterdata-service/src/main/resources/db/migration/V003__Create_Altersklasse_Table.sql b/services/masterdata/masterdata-service/src/main/resources/db/migration/V003__Create_Altersklasse_Table.sql similarity index 100% rename from masterdata/masterdata-service/src/main/resources/db/migration/V003__Create_Altersklasse_Table.sql rename to services/masterdata/masterdata-service/src/main/resources/db/migration/V003__Create_Altersklasse_Table.sql diff --git a/masterdata/masterdata-service/src/main/resources/db/migration/V004__Create_Platz_Table.sql b/services/masterdata/masterdata-service/src/main/resources/db/migration/V004__Create_Platz_Table.sql similarity index 100% rename from masterdata/masterdata-service/src/main/resources/db/migration/V004__Create_Platz_Table.sql rename to services/masterdata/masterdata-service/src/main/resources/db/migration/V004__Create_Platz_Table.sql diff --git a/masterdata/masterdata-service/src/main/resources/db/migration/V1__Create_Initial_Tables.sql b/services/masterdata/masterdata-service/src/main/resources/db/migration/V1__Create_Initial_Tables.sql similarity index 100% rename from masterdata/masterdata-service/src/main/resources/db/migration/V1__Create_Initial_Tables.sql rename to services/masterdata/masterdata-service/src/main/resources/db/migration/V1__Create_Initial_Tables.sql diff --git a/masterdata/masterdata-service/src/test/resources/logback-test.xml b/services/masterdata/masterdata-service/src/test/resources/logback-test.xml similarity index 100% rename from masterdata/masterdata-service/src/test/resources/logback-test.xml rename to services/masterdata/masterdata-service/src/test/resources/logback-test.xml diff --git a/members/README-MEMBERS.md b/services/members/README-MEMBERS.md similarity index 99% rename from members/README-MEMBERS.md rename to services/members/README-MEMBERS.md index bcfe304a..9cff1622 100644 --- a/members/README-MEMBERS.md +++ b/services/members/README-MEMBERS.md @@ -330,4 +330,4 @@ spec: **Letzte Aktualisierung**: 25. Juli 2025 -Für weitere Informationen zur Gesamtarchitektur siehe [README.md](../README.md). +Für weitere Informationen zur Gesamtarchitektur siehe [README.md](../../README.md). diff --git a/members/members-api/build.gradle.kts b/services/members/members-api/build.gradle.kts similarity index 100% rename from members/members-api/build.gradle.kts rename to services/members/members-api/build.gradle.kts diff --git a/members/members-api/src/main/kotlin/at/mocode/members/api/rest/MemberController.kt b/services/members/members-api/src/main/kotlin/at/mocode/members/api/rest/MemberController.kt similarity index 100% rename from members/members-api/src/main/kotlin/at/mocode/members/api/rest/MemberController.kt rename to services/members/members-api/src/main/kotlin/at/mocode/members/api/rest/MemberController.kt diff --git a/members/members-application/build.gradle.kts b/services/members/members-application/build.gradle.kts similarity index 100% rename from members/members-application/build.gradle.kts rename to services/members/members-application/build.gradle.kts diff --git a/members/members-application/src/main/kotlin/at/mocode/members/application/usecase/CreateMemberUseCase.kt b/services/members/members-application/src/main/kotlin/at/mocode/members/application/usecase/CreateMemberUseCase.kt similarity index 100% rename from members/members-application/src/main/kotlin/at/mocode/members/application/usecase/CreateMemberUseCase.kt rename to services/members/members-application/src/main/kotlin/at/mocode/members/application/usecase/CreateMemberUseCase.kt diff --git a/members/members-application/src/main/kotlin/at/mocode/members/application/usecase/DeleteMemberUseCase.kt b/services/members/members-application/src/main/kotlin/at/mocode/members/application/usecase/DeleteMemberUseCase.kt similarity index 100% rename from members/members-application/src/main/kotlin/at/mocode/members/application/usecase/DeleteMemberUseCase.kt rename to services/members/members-application/src/main/kotlin/at/mocode/members/application/usecase/DeleteMemberUseCase.kt diff --git a/members/members-application/src/main/kotlin/at/mocode/members/application/usecase/FindExpiringMembershipsUseCase.kt b/services/members/members-application/src/main/kotlin/at/mocode/members/application/usecase/FindExpiringMembershipsUseCase.kt similarity index 100% rename from members/members-application/src/main/kotlin/at/mocode/members/application/usecase/FindExpiringMembershipsUseCase.kt rename to services/members/members-application/src/main/kotlin/at/mocode/members/application/usecase/FindExpiringMembershipsUseCase.kt diff --git a/members/members-application/src/main/kotlin/at/mocode/members/application/usecase/FindMembersByDateRangeUseCase.kt b/services/members/members-application/src/main/kotlin/at/mocode/members/application/usecase/FindMembersByDateRangeUseCase.kt similarity index 100% rename from members/members-application/src/main/kotlin/at/mocode/members/application/usecase/FindMembersByDateRangeUseCase.kt rename to services/members/members-application/src/main/kotlin/at/mocode/members/application/usecase/FindMembersByDateRangeUseCase.kt diff --git a/members/members-application/src/main/kotlin/at/mocode/members/application/usecase/GetMemberUseCase.kt b/services/members/members-application/src/main/kotlin/at/mocode/members/application/usecase/GetMemberUseCase.kt similarity index 100% rename from members/members-application/src/main/kotlin/at/mocode/members/application/usecase/GetMemberUseCase.kt rename to services/members/members-application/src/main/kotlin/at/mocode/members/application/usecase/GetMemberUseCase.kt diff --git a/members/members-application/src/main/kotlin/at/mocode/members/application/usecase/UpdateMemberUseCase.kt b/services/members/members-application/src/main/kotlin/at/mocode/members/application/usecase/UpdateMemberUseCase.kt similarity index 100% rename from members/members-application/src/main/kotlin/at/mocode/members/application/usecase/UpdateMemberUseCase.kt rename to services/members/members-application/src/main/kotlin/at/mocode/members/application/usecase/UpdateMemberUseCase.kt diff --git a/members/members-application/src/main/kotlin/at/mocode/members/application/usecase/ValidateMemberDataUseCase.kt b/services/members/members-application/src/main/kotlin/at/mocode/members/application/usecase/ValidateMemberDataUseCase.kt similarity index 100% rename from members/members-application/src/main/kotlin/at/mocode/members/application/usecase/ValidateMemberDataUseCase.kt rename to services/members/members-application/src/main/kotlin/at/mocode/members/application/usecase/ValidateMemberDataUseCase.kt diff --git a/members/members-domain/build.gradle.kts b/services/members/members-domain/build.gradle.kts similarity index 100% rename from members/members-domain/build.gradle.kts rename to services/members/members-domain/build.gradle.kts diff --git a/members/members-domain/src/main/kotlin/at/mocode/members/domain/events/MemberEvents.kt b/services/members/members-domain/src/main/kotlin/at/mocode/members/domain/events/MemberEvents.kt similarity index 100% rename from members/members-domain/src/main/kotlin/at/mocode/members/domain/events/MemberEvents.kt rename to services/members/members-domain/src/main/kotlin/at/mocode/members/domain/events/MemberEvents.kt diff --git a/members/members-domain/src/main/kotlin/at/mocode/members/domain/model/Member.kt b/services/members/members-domain/src/main/kotlin/at/mocode/members/domain/model/Member.kt similarity index 100% rename from members/members-domain/src/main/kotlin/at/mocode/members/domain/model/Member.kt rename to services/members/members-domain/src/main/kotlin/at/mocode/members/domain/model/Member.kt diff --git a/members/members-domain/src/main/kotlin/at/mocode/members/domain/repository/MemberRepository.kt b/services/members/members-domain/src/main/kotlin/at/mocode/members/domain/repository/MemberRepository.kt similarity index 100% rename from members/members-domain/src/main/kotlin/at/mocode/members/domain/repository/MemberRepository.kt rename to services/members/members-domain/src/main/kotlin/at/mocode/members/domain/repository/MemberRepository.kt diff --git a/members/members-infrastructure/build.gradle.kts b/services/members/members-infrastructure/build.gradle.kts similarity index 100% rename from members/members-infrastructure/build.gradle.kts rename to services/members/members-infrastructure/build.gradle.kts diff --git a/members/members-infrastructure/src/main/kotlin/at/mocode/members/infrastructure/persistence/MemberRepositoryImpl.kt b/services/members/members-infrastructure/src/main/kotlin/at/mocode/members/infrastructure/persistence/MemberRepositoryImpl.kt similarity index 100% rename from members/members-infrastructure/src/main/kotlin/at/mocode/members/infrastructure/persistence/MemberRepositoryImpl.kt rename to services/members/members-infrastructure/src/main/kotlin/at/mocode/members/infrastructure/persistence/MemberRepositoryImpl.kt diff --git a/members/members-infrastructure/src/main/kotlin/at/mocode/members/infrastructure/persistence/MemberTable.kt b/services/members/members-infrastructure/src/main/kotlin/at/mocode/members/infrastructure/persistence/MemberTable.kt similarity index 100% rename from members/members-infrastructure/src/main/kotlin/at/mocode/members/infrastructure/persistence/MemberTable.kt rename to services/members/members-infrastructure/src/main/kotlin/at/mocode/members/infrastructure/persistence/MemberTable.kt diff --git a/members/members-infrastructure/src/main/kotlin/at/mocode/members/infrastructure/repository/InMemoryMemberRepository.kt b/services/members/members-infrastructure/src/main/kotlin/at/mocode/members/infrastructure/repository/InMemoryMemberRepository.kt similarity index 100% rename from members/members-infrastructure/src/main/kotlin/at/mocode/members/infrastructure/repository/InMemoryMemberRepository.kt rename to services/members/members-infrastructure/src/main/kotlin/at/mocode/members/infrastructure/repository/InMemoryMemberRepository.kt diff --git a/members/members-service/build.gradle.kts b/services/members/members-service/build.gradle.kts similarity index 100% rename from members/members-service/build.gradle.kts rename to services/members/members-service/build.gradle.kts diff --git a/members/members-service/src/main/kotlin/at/mocode/members/service/MembersServiceApplication.kt b/services/members/members-service/src/main/kotlin/at/mocode/members/service/MembersServiceApplication.kt similarity index 100% rename from members/members-service/src/main/kotlin/at/mocode/members/service/MembersServiceApplication.kt rename to services/members/members-service/src/main/kotlin/at/mocode/members/service/MembersServiceApplication.kt diff --git a/members/members-service/src/main/kotlin/at/mocode/members/service/config/MembersDatabaseConfiguration.kt b/services/members/members-service/src/main/kotlin/at/mocode/members/service/config/MembersDatabaseConfiguration.kt similarity index 100% rename from members/members-service/src/main/kotlin/at/mocode/members/service/config/MembersDatabaseConfiguration.kt rename to services/members/members-service/src/main/kotlin/at/mocode/members/service/config/MembersDatabaseConfiguration.kt diff --git a/members/members-service/src/test/kotlin/at/mocode/members/service/integration/MemberServiceIntegrationTest.kt b/services/members/members-service/src/test/kotlin/at/mocode/members/service/integration/MemberServiceIntegrationTest.kt similarity index 100% rename from members/members-service/src/test/kotlin/at/mocode/members/service/integration/MemberServiceIntegrationTest.kt rename to services/members/members-service/src/test/kotlin/at/mocode/members/service/integration/MemberServiceIntegrationTest.kt diff --git a/members/members-service/src/test/resources/logback-test.xml b/services/members/members-service/src/test/resources/logback-test.xml similarity index 100% rename from members/members-service/src/test/resources/logback-test.xml rename to services/members/members-service/src/test/resources/logback-test.xml diff --git a/services/ping/ping-api/build.gradle.kts b/services/ping/ping-api/build.gradle.kts new file mode 100644 index 00000000..1286d67a --- /dev/null +++ b/services/ping/ping-api/build.gradle.kts @@ -0,0 +1,34 @@ +plugins { + alias(libs.plugins.kotlinMultiplatform) + alias(libs.plugins.kotlinSerialization) +} + +group = "at.mocode" +version = "1.0.0" + +kotlin { + // JVM target for backend usage + jvm() + + // JS target for frontend usage (Compose/Browser) + js { + browser() + // no need for binaries.executable() in a library + } + + // Align toolchain with project (see composeApp uses 21) + jvmToolchain(21) + + sourceSets { + val commonMain by getting { + dependencies { + implementation(libs.kotlinx.serialization.json) + } + } + val commonTest by getting { + dependencies { + implementation(libs.kotlin.test) + } + } + } +} diff --git a/services/ping/ping-api/src/commonMain/kotlin/at/mocode/ping/api/PingApi.kt b/services/ping/ping-api/src/commonMain/kotlin/at/mocode/ping/api/PingApi.kt new file mode 100644 index 00000000..56c0a256 --- /dev/null +++ b/services/ping/ping-api/src/commonMain/kotlin/at/mocode/ping/api/PingApi.kt @@ -0,0 +1,7 @@ +package at.mocode.ping.api + +interface PingApi { + suspend fun simplePing(): PingResponse + suspend fun enhancedPing(simulate: Boolean = false): EnhancedPingResponse + suspend fun healthCheck(): HealthResponse +} diff --git a/client/shared/src/commonMain/kotlin/at/mocode/model/PingResponse.kt b/services/ping/ping-api/src/commonMain/kotlin/at/mocode/ping/api/PingData.kt similarity index 61% rename from client/shared/src/commonMain/kotlin/at/mocode/model/PingResponse.kt rename to services/ping/ping-api/src/commonMain/kotlin/at/mocode/ping/api/PingData.kt index c81001bc..b2101614 100644 --- a/client/shared/src/commonMain/kotlin/at/mocode/model/PingResponse.kt +++ b/services/ping/ping-api/src/commonMain/kotlin/at/mocode/ping/api/PingData.kt @@ -1,21 +1,17 @@ -package at.mocode.model +package at.mocode.ping.api import kotlinx.serialization.Serializable @Serializable -data class PingResponse( - val status: String, - val timestamp: String, - val service: String -) +data class PingResponse(val status: String, val timestamp: String, val service: String) @Serializable data class EnhancedPingResponse( val status: String, val timestamp: String, val service: String, - val circuitBreakerState: String? = null, - val responseTime: Long? = null + val circuitBreakerState: String, + val responseTime: Long ) @Serializable diff --git a/temp/ping-service/build.gradle.kts b/services/ping/ping-service/build.gradle.kts similarity index 90% rename from temp/ping-service/build.gradle.kts rename to services/ping/ping-service/build.gradle.kts index 5e55377e..10161ec6 100644 --- a/temp/ping-service/build.gradle.kts +++ b/services/ping/ping-service/build.gradle.kts @@ -23,7 +23,7 @@ tasks.withType { // Configure the main class for the executable JAR springBoot { - mainClass.set("at.mocode.temp.pingservice.PingServiceApplicationKt") + mainClass.set("at.mocode.ping.service.PingServiceApplicationKt") buildInfo() } @@ -34,12 +34,17 @@ dependencies { // Provide common Kotlin dependencies (coroutines, serialization, logging) implementation(projects.platform.platformDependencies) + // Contract module for type-safe DTOs and API interface + implementation(projects.services.ping.pingApi) + // Monitoring client: tracing + zipkin + defaults implementation(projects.infrastructure.monitoring.monitoringClient) // === Core Spring Boot Dependencies === // Web starter for REST endpoints implementation(libs.spring.boot.starter.web) + // Jackson Kotlin module for data classes and Kotlin features + implementation(libs.jackson.module.kotlin) // Kotlin reflection for Spring Boot Kotlin serialization implementation("org.jetbrains.kotlin:kotlin-reflect") diff --git a/services/ping/ping-service/src/main/kotlin/at/mocode/ping/service/LegacyPingController.kt b/services/ping/ping-service/src/main/kotlin/at/mocode/ping/service/LegacyPingController.kt new file mode 100644 index 00000000..81a161d4 --- /dev/null +++ b/services/ping/ping-service/src/main/kotlin/at/mocode/ping/service/LegacyPingController.kt @@ -0,0 +1,87 @@ +package at.mocode.ping.service + +import at.mocode.ping.api.PingResponse +import io.github.resilience4j.circuitbreaker.CircuitBreakerRegistry +import org.springframework.http.MediaType +import org.springframework.http.ResponseEntity +import org.springframework.web.bind.annotation.* +import java.time.OffsetDateTime +import java.time.format.DateTimeFormatter +import java.util.UUID + +@RestController +@CrossOrigin( + origins = ["http://localhost:8080", "http://localhost:8083", "http://localhost:4000"], + methods = [RequestMethod.GET, RequestMethod.POST, RequestMethod.PUT, RequestMethod.DELETE, RequestMethod.OPTIONS], + allowedHeaders = ["*"], + allowCredentials = "true" +) +class LegacyPingController( + private val pingService: PingServiceCircuitBreaker, + private val circuitBreakerRegistry: CircuitBreakerRegistry +) { + + @GetMapping("/ping", produces = [MediaType.APPLICATION_JSON_VALUE]) + fun legacySimplePing(): ResponseEntity { + val now = OffsetDateTime.now().format(DateTimeFormatter.ISO_OFFSET_DATE_TIME) + val resp = PingResponse( + status = "pong", + timestamp = now, + service = "ping-service" + ) + return ResponseEntity + .ok() + .contentType(MediaType.APPLICATION_JSON) + .body(resp) + } + + @GetMapping("/ping/enhanced") + fun legacyEnhanced(@RequestParam(required = false, defaultValue = "false") simulate: Boolean): Map { + val dto = pingService.ping(simulate) + val map = mutableMapOf( + "status" to dto.status, + "timestamp" to dto.timestamp, + "service" to dto.service, + "circuitBreaker" to dto.circuitBreakerState + ) + if (dto.status.equals("fallback", ignoreCase = true) || dto.service.contains("fallback")) { + map["message"] = "Service temporarily unavailable" + map["error"] = UUID.randomUUID().toString() + } + return map + } + + @GetMapping("/ping/health") + fun legacyHealth(): Map { + val dto = pingService.healthCheck() + val state = circuitBreakerRegistry + .circuitBreaker(PingServiceCircuitBreaker.PING_CIRCUIT_BREAKER) + .state + val cb = if (state.name == "OPEN") "OPEN" else "CLOSED" + val map = mutableMapOf( + "status" to if (dto.healthy) "UP" else "DOWN", + "timestamp" to dto.timestamp, + "circuitBreaker" to cb + ) + if (!dto.healthy) { + map["message"] = "Health check temporarily unavailable" + } + return map + } + + @GetMapping("/ping/test-failure") + fun legacyTestFailure(): Map { + val dto = pingService.ping(simulateFailure = true) + val map = mutableMapOf( + "status" to dto.status, + "timestamp" to dto.timestamp, + "service" to dto.service, + "circuitBreaker" to dto.circuitBreakerState + ) + if (dto.status.equals("fallback", ignoreCase = true) || dto.service.contains("fallback")) { + map["message"] = "Service temporarily unavailable" + map["error"] = UUID.randomUUID().toString() + } + return map + } +} diff --git a/services/ping/ping-service/src/main/kotlin/at/mocode/ping/service/PingController.kt b/services/ping/ping-service/src/main/kotlin/at/mocode/ping/service/PingController.kt new file mode 100644 index 00000000..a73f0837 --- /dev/null +++ b/services/ping/ping-service/src/main/kotlin/at/mocode/ping/service/PingController.kt @@ -0,0 +1,40 @@ +package at.mocode.ping.service + +import at.mocode.ping.api.EnhancedPingResponse +import at.mocode.ping.api.HealthResponse +import at.mocode.ping.api.PingApi +import at.mocode.ping.api.PingResponse +import org.springframework.web.bind.annotation.* +import java.time.OffsetDateTime +import java.time.format.DateTimeFormatter + +@RestController +@CrossOrigin( + origins = ["http://localhost:8080", "http://localhost:8083", "http://localhost:4000"], + methods = [RequestMethod.GET, RequestMethod.POST, RequestMethod.PUT, RequestMethod.DELETE, RequestMethod.OPTIONS], + allowedHeaders = ["*"], + allowCredentials = "true" +) +class PingController( + private val pingService: PingServiceCircuitBreaker +) : PingApi { + + // Contract endpoints + @GetMapping("/api/ping/simple") + override suspend fun simplePing(): PingResponse { + val now = OffsetDateTime.now().format(DateTimeFormatter.ISO_OFFSET_DATE_TIME) + return PingResponse( + status = "pong", + timestamp = now, + service = "ping-service" + ) + } + + @GetMapping("/api/ping/enhanced") + override suspend fun enhancedPing( + @RequestParam(required = false, defaultValue = "false") simulate: Boolean + ): EnhancedPingResponse = pingService.ping(simulate) + + @GetMapping("/api/ping/health") + override suspend fun healthCheck(): HealthResponse = pingService.healthCheck() +} diff --git a/temp/ping-service/src/main/kotlin/at/mocode/temp/pingservice/PingServiceApplication.kt b/services/ping/ping-service/src/main/kotlin/at/mocode/ping/service/PingServiceApplication.kt similarity index 97% rename from temp/ping-service/src/main/kotlin/at/mocode/temp/pingservice/PingServiceApplication.kt rename to services/ping/ping-service/src/main/kotlin/at/mocode/ping/service/PingServiceApplication.kt index 99c9264b..04b78dc2 100644 --- a/temp/ping-service/src/main/kotlin/at/mocode/temp/pingservice/PingServiceApplication.kt +++ b/services/ping/ping-service/src/main/kotlin/at/mocode/ping/service/PingServiceApplication.kt @@ -1,4 +1,4 @@ -package at.mocode.temp.pingservice +package at.mocode.ping.service import org.springframework.boot.autoconfigure.SpringBootApplication import org.springframework.boot.runApplication diff --git a/temp/ping-service/src/main/kotlin/at/mocode/temp/pingservice/PingServiceCircuitBreaker.kt b/services/ping/ping-service/src/main/kotlin/at/mocode/ping/service/PingServiceCircuitBreaker.kt similarity index 61% rename from temp/ping-service/src/main/kotlin/at/mocode/temp/pingservice/PingServiceCircuitBreaker.kt rename to services/ping/ping-service/src/main/kotlin/at/mocode/ping/service/PingServiceCircuitBreaker.kt index 3ecfbc25..f257998e 100644 --- a/temp/ping-service/src/main/kotlin/at/mocode/temp/pingservice/PingServiceCircuitBreaker.kt +++ b/services/ping/ping-service/src/main/kotlin/at/mocode/ping/service/PingServiceCircuitBreaker.kt @@ -1,5 +1,7 @@ -package at.mocode.temp.pingservice +package at.mocode.ping.service +import at.mocode.ping.api.EnhancedPingResponse +import at.mocode.ping.api.HealthResponse import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker import org.slf4j.LoggerFactory import org.springframework.stereotype.Service @@ -24,13 +26,13 @@ class PingServiceCircuitBreaker { } /** - * Primary ping method with circuit breaker protection + * Primary ping method with circuit breaker protection returning DTO directly * * @param simulateFailure - if true, randomly throws exceptions to test circuit breaker - * @return Map containing ping response with timestamp and status */ @CircuitBreaker(name = PING_CIRCUIT_BREAKER, fallbackMethod = "fallbackPing") - fun ping(simulateFailure: Boolean = false): Map { + fun ping(simulateFailure: Boolean = false): EnhancedPingResponse { + val start = System.nanoTime() logger.info("Executing ping service call...") if (simulateFailure && Random.nextDouble() < 0.6) { @@ -39,13 +41,15 @@ class PingServiceCircuitBreaker { } val currentTime = LocalDateTime.now().atOffset(java.time.ZoneOffset.UTC).format(formatter) + val elapsedMs = (System.nanoTime() - start) / 1_000_000 logger.info("Ping service call successful") - return mapOf( - "status" to "pong", - "timestamp" to currentTime, - "service" to "ping-service", - "circuitBreaker" to "CLOSED" + return EnhancedPingResponse( + status = "pong", + timestamp = currentTime, + service = "ping-service", + circuitBreakerState = "CLOSED", + responseTime = elapsedMs ) } @@ -54,55 +58,52 @@ class PingServiceCircuitBreaker { * * @param simulateFailure - original parameter (ignored in fallback) * @param exception - the exception that triggered the fallback - * @return Map containing fallback response */ - fun fallbackPing(simulateFailure: Boolean = false, exception: Exception): Map { + fun fallbackPing(simulateFailure: Boolean = false, exception: Exception): EnhancedPingResponse { + val start = System.nanoTime() // Die volle Exception nur loggen, nicht an den Client weitergeben. logger.warn("Circuit breaker fallback triggered due to: {}", exception.toString()) val currentTime = LocalDateTime.now().atOffset(java.time.ZoneOffset.UTC).format(formatter) - val correlatedId = java.util.UUID.randomUUID().toString() + val elapsedMs = (System.nanoTime() - start) / 1_000_000 - return mapOf( - "status" to "fallback", - "message" to "Service temporarily unavailable", - "timestamp" to currentTime, - "service" to "ping-service-fallback", - "circuitBreaker" to "OPEN", - "error" to correlatedId // Diese ID kann für Support-Anfragen genutzt werden. + return EnhancedPingResponse( + status = "fallback", + timestamp = currentTime, + service = "ping-service-fallback", + circuitBreakerState = "OPEN", + responseTime = elapsedMs ) } /** - * Health check method with circuit breaker protection + * Health check method with circuit breaker protection returning DTO directly */ @CircuitBreaker(name = PING_CIRCUIT_BREAKER, fallbackMethod = "fallbackHealth") - fun healthCheck(): Map { + fun healthCheck(): HealthResponse { logger.info("Executing health check...") - // Health check is now deterministic for reliable integration testing - // Random failures were causing intermittent test failures - val currentTime = LocalDateTime.now().atOffset(java.time.ZoneOffset.UTC).format(formatter) - return mapOf( - "status" to "UP", - "timestamp" to currentTime, - "circuitBreaker" to "CLOSED" + return HealthResponse( + status = "pong", + timestamp = currentTime, + service = "ping-service", + healthy = true ) } /** - * Fallback for health check + * Fallback for health check returning DTO */ - fun fallbackHealth(exception: Exception): Map { + fun fallbackHealth(exception: Exception): HealthResponse { logger.warn("Health check fallback triggered: {}", exception.message) val currentTime = LocalDateTime.now().atOffset(java.time.ZoneOffset.UTC).format(formatter) - return mapOf( - "status" to "DOWN", - "message" to "Health check temporarily unavailable", - "timestamp" to currentTime, - "circuitBreaker" to "OPEN" + return HealthResponse( + status = "down", + timestamp = currentTime, + service = "ping-service", + healthy = false ) } } diff --git a/temp/ping-service/src/main/resources/application.yml b/services/ping/ping-service/src/main/resources/application.yml similarity index 100% rename from temp/ping-service/src/main/resources/application.yml rename to services/ping/ping-service/src/main/resources/application.yml diff --git a/temp/ping-service/src/main/resources/logback-spring.xml b/services/ping/ping-service/src/main/resources/logback-spring.xml similarity index 100% rename from temp/ping-service/src/main/resources/logback-spring.xml rename to services/ping/ping-service/src/main/resources/logback-spring.xml diff --git a/temp/ping-service/src/test/kotlin/at/mocode/temp/pingservice/PingControllerIntegrationTest.kt b/services/ping/ping-service/src/test/kotlin/at/mocode/ping/service/PingControllerIntegrationTest.kt similarity index 99% rename from temp/ping-service/src/test/kotlin/at/mocode/temp/pingservice/PingControllerIntegrationTest.kt rename to services/ping/ping-service/src/test/kotlin/at/mocode/ping/service/PingControllerIntegrationTest.kt index 823f8940..aa5aa18b 100644 --- a/temp/ping-service/src/test/kotlin/at/mocode/temp/pingservice/PingControllerIntegrationTest.kt +++ b/services/ping/ping-service/src/test/kotlin/at/mocode/ping/service/PingControllerIntegrationTest.kt @@ -1,4 +1,4 @@ -package at.mocode.temp.pingservice +package at.mocode.ping.service import io.github.resilience4j.circuitbreaker.CircuitBreaker import io.github.resilience4j.circuitbreaker.CircuitBreakerRegistry diff --git a/temp/ping-service/src/test/kotlin/at/mocode/temp/pingservice/PingControllerTest.kt b/services/ping/ping-service/src/test/kotlin/at/mocode/ping/service/PingControllerTest.kt similarity index 83% rename from temp/ping-service/src/test/kotlin/at/mocode/temp/pingservice/PingControllerTest.kt rename to services/ping/ping-service/src/test/kotlin/at/mocode/ping/service/PingControllerTest.kt index 540708fd..075dccd9 100644 --- a/temp/ping-service/src/test/kotlin/at/mocode/temp/pingservice/PingControllerTest.kt +++ b/services/ping/ping-service/src/test/kotlin/at/mocode/ping/service/PingControllerTest.kt @@ -1,6 +1,7 @@ -package at.mocode.temp.pingservice +package at.mocode.ping.service import io.mockk.mockk +import io.github.resilience4j.circuitbreaker.CircuitBreakerRegistry import org.junit.jupiter.api.Test import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest @@ -11,7 +12,7 @@ import org.springframework.test.web.servlet.MockMvc import org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get import org.springframework.test.web.servlet.result.MockMvcResultMatchers.* -@WebMvcTest(PingController::class) +@WebMvcTest(LegacyPingController::class) @Import(PingControllerTest.TestConfig::class) class PingControllerTest { @@ -22,6 +23,9 @@ class PingControllerTest { class TestConfig { @Bean fun pingServiceCircuitBreaker(): PingServiceCircuitBreaker = mockk() + + @Bean + fun circuitBreakerRegistry(): CircuitBreakerRegistry = mockk() } @Test diff --git a/temp/ping-service/src/test/kotlin/at/mocode/temp/pingservice/PingServiceCircuitBreakerTest.kt b/services/ping/ping-service/src/test/kotlin/at/mocode/ping/service/PingServiceCircuitBreakerTest.kt similarity index 59% rename from temp/ping-service/src/test/kotlin/at/mocode/temp/pingservice/PingServiceCircuitBreakerTest.kt rename to services/ping/ping-service/src/test/kotlin/at/mocode/ping/service/PingServiceCircuitBreakerTest.kt index 2e308adb..04a57125 100644 --- a/temp/ping-service/src/test/kotlin/at/mocode/temp/pingservice/PingServiceCircuitBreakerTest.kt +++ b/services/ping/ping-service/src/test/kotlin/at/mocode/ping/service/PingServiceCircuitBreakerTest.kt @@ -1,4 +1,4 @@ -package at.mocode.temp.pingservice +package at.mocode.ping.service import io.github.resilience4j.circuitbreaker.CircuitBreaker import io.github.resilience4j.circuitbreaker.CircuitBreakerRegistry @@ -12,7 +12,7 @@ import kotlin.math.ceil /** * Comprehensive test suite for PingServiceCircuitBreaker - * Tests circuit breaker behavior, fallback methods, and state transitions + * Updated to assert DTOs instead of Maps. */ @SpringBootTest class PingServiceCircuitBreakerTest { @@ -43,10 +43,11 @@ class PingServiceCircuitBreakerTest { val result = pingServiceCircuitBreaker.ping(simulateFailure = false) // Then - assertThat(result["status"]).isEqualTo("pong") - assertThat(result["service"]).isEqualTo("ping-service") - assertThat(result["circuitBreaker"]).isEqualTo("CLOSED") - assertThat(result).containsKeys("timestamp") + assertThat(result.status).isEqualTo("pong") + assertThat(result.service).isEqualTo("ping-service") + assertThat(result.circuitBreakerState).isEqualTo("CLOSED") + assertThat(result.timestamp).isNotBlank() + assertThat(result.responseTime).isGreaterThanOrEqualTo(0) assertThat(circuitBreaker.state).isEqualTo(CircuitBreaker.State.CLOSED) } @@ -55,20 +56,18 @@ class PingServiceCircuitBreakerTest { // Given assertThat(circuitBreaker.state).isEqualTo(CircuitBreaker.State.CLOSED) - // When - single failure should not open circuit breaker (needs 4 failures minimum) - // Try multiple times since failure simulation is probabilistic (60% chance) - var result: Map - var attempts = 0 - do { + // When - try until we hit a simulated failure (60% chance) + var result = pingServiceCircuitBreaker.ping(simulateFailure = true) + var attempts = 1 + while (result.status == "pong" && attempts < 10) { result = pingServiceCircuitBreaker.ping(simulateFailure = true) attempts++ - } while (result["status"] == "pong" && attempts < 10) + } - // Then - should get fallback response eventually, but circuit breaker might still be closed after just one failure - assertThat(result["status"]).isEqualTo("fallback") - assertThat(result["service"]).isEqualTo("ping-service-fallback") - assertThat(result["circuitBreaker"]).isEqualTo("OPEN") - assertThat(result).containsKeys("timestamp", "message", "error") + // Then - should get fallback response eventually + assertThat(result.status).isEqualTo("fallback") + assertThat(result.service).isEqualTo("ping-service-fallback") + assertThat(result.circuitBreakerState).isEqualTo("OPEN") logger.info("Circuit breaker state after single failure (after {} attempts): {}", attempts, circuitBreaker.state) } @@ -78,7 +77,6 @@ class PingServiceCircuitBreakerTest { assertThat(circuitBreaker.state).isEqualTo(CircuitBreaker.State.CLOSED) // When - trigger multiple failures to reach minimum-number-of-calls (4) and failure threshold (60%) - // Keep calling until we get enough failures to trigger the circuit breaker var failureCount = 0 var totalCalls = 0 val maxAttempts = 20 // Prevent infinite loop @@ -86,22 +84,18 @@ class PingServiceCircuitBreakerTest { while (circuitBreaker.state == CircuitBreaker.State.CLOSED && totalCalls < maxAttempts) { val result = pingServiceCircuitBreaker.ping(simulateFailure = true) totalCalls++ - - if (result["status"] == "fallback") { - failureCount++ - } - - logger.info("Attempt {}: Circuit breaker state = {}, Response status = {}, Failures so far = {}", - totalCalls, circuitBreaker.state, result["status"], failureCount) + if (result.status == "fallback") failureCount++ + logger.info( + "Attempt {}: Circuit breaker state = {}, Response status = {}, Failures so far = {}", + totalCalls, circuitBreaker.state, result.status, failureCount + ) } // Then - circuit breaker should be open after sufficient failures - logger.info("Final circuit breaker state: {} after {} total calls with {} failures", - circuitBreaker.state, totalCalls, failureCount) - - // The circuit breaker should eventually open due to failure rate threshold - // Note: Due to the minimum calls requirement (4) and failure rate threshold (60%), - // it might take several attempts depending on random simulation + logger.info( + "Final circuit breaker state: {} after {} total calls with {} failures", + circuitBreaker.state, totalCalls, failureCount + ) if (totalCalls >= 4 && failureCount >= ceil(totalCalls * 0.6)) { assertThat(circuitBreaker.state).isEqualTo(CircuitBreaker.State.OPEN) } @@ -117,10 +111,9 @@ class PingServiceCircuitBreakerTest { val result = pingServiceCircuitBreaker.ping(simulateFailure = false) // Then - assertThat(result["status"]).isEqualTo("fallback") - assertThat(result["service"]).isEqualTo("ping-service-fallback") - assertThat(result["circuitBreaker"]).isEqualTo("OPEN") - assertThat(result["message"]).isEqualTo("Service temporarily unavailable") + assertThat(result.status).isEqualTo("fallback") + assertThat(result.service).isEqualTo("ping-service-fallback") + assertThat(result.circuitBreakerState).isEqualTo("OPEN") } @Test @@ -128,19 +121,13 @@ class PingServiceCircuitBreakerTest { // Given assertThat(circuitBreaker.state).isEqualTo(CircuitBreaker.State.CLOSED) - // When - retry if we get random failure (10% chance in health check method) - var result: Map - var attempts = 0 - do { - result = pingServiceCircuitBreaker.healthCheck() - attempts++ - } while (result["status"] == "DOWN" && attempts < 15) // 15 attempts should be enough to get a success + // When + val result = pingServiceCircuitBreaker.healthCheck() // Then - assertThat(result["status"]).isEqualTo("UP") - assertThat(result["circuitBreaker"]).isEqualTo("CLOSED") - assertThat(result).containsKeys("timestamp") - logger.info("Health check succeeded after {} attempts", attempts) + assertThat(result.healthy).isTrue() + assertThat(result.status).isEqualTo("pong") + assertThat(result.timestamp).isNotBlank() } @Test @@ -153,9 +140,8 @@ class PingServiceCircuitBreakerTest { val result = pingServiceCircuitBreaker.healthCheck() // Then - assertThat(result["status"]).isEqualTo("DOWN") - assertThat(result["circuitBreaker"]).isEqualTo("OPEN") - assertThat(result["message"]).isEqualTo("Health check temporarily unavailable") + assertThat(result.healthy).isFalse() + assertThat(result.status).isEqualTo("down") } @Test @@ -179,7 +165,7 @@ class PingServiceCircuitBreakerTest { val result = pingServiceCircuitBreaker.ping(simulateFailure = false) // Then - assertThat(result["status"]).isEqualTo("pong") + assertThat(result.status).isEqualTo("pong") logger.info("Circuit breaker state after successful call in HALF_OPEN: {}", circuitBreaker.state) } @@ -187,12 +173,9 @@ class PingServiceCircuitBreakerTest { fun `should track circuit breaker metrics`() { // Given val metrics = circuitBreaker.metrics - - // When - val initialFailureRate = metrics.failureRate val initialNumberOfCalls = metrics.numberOfBufferedCalls - // Execute some successful calls + // When - execute some successful calls repeat(3) { pingServiceCircuitBreaker.ping(simulateFailure = false) } @@ -200,11 +183,13 @@ class PingServiceCircuitBreakerTest { // Then val newMetrics = circuitBreaker.metrics assertThat(newMetrics.numberOfBufferedCalls).isGreaterThan(initialNumberOfCalls) - logger.info("Circuit breaker metrics - Calls: {}, Failure rate: {}%, Successful calls: {}, Failed calls: {}", - newMetrics.numberOfBufferedCalls, - newMetrics.failureRate, - newMetrics.numberOfSuccessfulCalls, - newMetrics.numberOfFailedCalls) + logger.info( + "Circuit breaker metrics - Calls: {}, Failure rate: {}%, Successful calls: {}, Failed calls: {}", + newMetrics.numberOfBufferedCalls, + newMetrics.failureRate, + newMetrics.numberOfSuccessfulCalls, + newMetrics.numberOfFailedCalls + ) } @Test @@ -213,20 +198,19 @@ class PingServiceCircuitBreakerTest { assertThat(circuitBreaker.state).isEqualTo(CircuitBreaker.State.CLOSED) // When - execute concurrent calls - val futures = (1..10).map { index -> + val threads = (1..10).map { index -> Thread { val result = pingServiceCircuitBreaker.ping(simulateFailure = false) - logger.info("Concurrent call {}: status = {}", index, result["status"]) + logger.info("Concurrent call {}: status = {}", index, result.status) } } - futures.forEach { it.start() } - futures.forEach { it.join() } + threads.forEach { it.start() } + threads.forEach { it.join() } - // Then + // Then - verify circuit breaker recorded calls val metrics = circuitBreaker.metrics - assertThat(metrics.numberOfBufferedCalls).isEqualTo(10) - assertThat(metrics.numberOfSuccessfulCalls).isEqualTo(10) - assertThat(metrics.numberOfFailedCalls).isEqualTo(0) + assertThat(metrics.numberOfBufferedCalls).isGreaterThanOrEqualTo(10) + assertThat(metrics.numberOfSuccessfulCalls).isGreaterThanOrEqualTo(10) } } diff --git a/temp/ping-service/src/test/resources/application-test.yml b/services/ping/ping-service/src/test/resources/application-test.yml similarity index 100% rename from temp/ping-service/src/test/resources/application-test.yml rename to services/ping/ping-service/src/test/resources/application-test.yml diff --git a/settings.gradle.kts b/settings.gradle.kts index 04119964..8faa9f9e 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -55,12 +55,11 @@ include(":infrastructure:monitoring:monitoring-client") include(":infrastructure:monitoring:monitoring-server") // Temporary modules -include(":temp:ping-service") +include(":services:ping:ping-api") +include(":services:ping:ping-service") // Client modules -include(":client") -include(":client:composeApp") -include(":client:shared") +include(":clients:ping-client") // Documentation module include(":docs") diff --git a/temp/ping-service/src/main/kotlin/at/mocode/temp/pingservice/PingController.kt b/temp/ping-service/src/main/kotlin/at/mocode/temp/pingservice/PingController.kt deleted file mode 100644 index 5cd837cb..00000000 --- a/temp/ping-service/src/main/kotlin/at/mocode/temp/pingservice/PingController.kt +++ /dev/null @@ -1,66 +0,0 @@ -package at.mocode.temp.pingservice - -import org.springframework.web.bind.annotation.CrossOrigin -import org.springframework.web.bind.annotation.GetMapping -import org.springframework.web.bind.annotation.RequestMethod -import org.springframework.web.bind.annotation.RequestParam -import org.springframework.web.bind.annotation.RestController -import java.time.OffsetDateTime -import java.time.format.DateTimeFormatter - -@RestController -@CrossOrigin( - origins = ["http://localhost:8080", "http://localhost:8083", "http://localhost:4000"], - methods = [RequestMethod.GET, RequestMethod.POST, RequestMethod.PUT, RequestMethod.DELETE, RequestMethod.OPTIONS], - allowedHeaders = ["*"], - allowCredentials = "true" -) -class PingController( - private val pingService: PingServiceCircuitBreaker -) { - - /** - * Standard ping endpoint - maintains backward compatibility - * NOW HANDLES BOTH /ping AND /ping/ping paths for Gateway compatibility - */ - @GetMapping("/ping", "/ping/ping") - fun ping(): Map { - val now = OffsetDateTime.now().format(DateTimeFormatter.ISO_OFFSET_DATE_TIME) - return mapOf( - "status" to "pong", - "timestamp" to now, - "service" to "ping-service" - ) - } - - /** - * Enhanced ping endpoint with circuit breaker protection - */ - @GetMapping("/ping/enhanced") - fun enhancedPing(@RequestParam(defaultValue = "false") simulate: Boolean): Map { - // Delegate to service with circuit breaker - return pingService.ping(simulateFailure = simulate) - } - - /** - * Health check endpoint with circuit breaker protection - */ - @GetMapping("/ping/health") - fun health(): Map { - return pingService.healthCheck() - } - - /** - * Endpoint to test circuit breaker behavior by forcing failures - * Uses simulate=true to increase chance of fallback - */ - @GetMapping("/ping/test-failure") - fun testFailure(): Map { - return try { - pingService.ping(simulateFailure = true) - } catch (ex: Exception) { - // Although CircuitBreaker should handle it, ensure safe fallback - pingService.fallbackPing(simulateFailure = true, exception = ex) - } - } -}