From fe76e34291094a974ec6d964c4d2421d182f6916 Mon Sep 17 00:00:00 2001 From: Joseph PACHOD Date: Tue, 30 Jan 2024 16:29:28 +0100 Subject: [PATCH] Task -> Mission --- FUNCTIONAL_REQUIREMENTS.md | 24 +- README.md | 2 +- heroesdesk-inmemory-adapters/README.md | 6 +- .../inmemory/InMemoryMissionRepository.kt | 340 ++++++++++++++ .../kotlin/ports/inmemory/InMemorySquad.kt | 2 +- .../ports/inmemory/InMemoryTaskRepository.kt | 340 -------------- .../ports/inmemory/InMemoryUserRepository.kt | 2 +- .../InstrumentedInMemoryUserRepository.kt | 4 +- .../ports/inmemory/HeroesDeskImplTest.kt | 6 +- .../build.gradle.kts | 0 .../kotlin/ports/pgjooq/DefaultCatalog.java | 0 .../kotlin/ports/pgjooq/Heroesdeskschema.java | 26 +- .../heroesdesk/kotlin/ports/pgjooq/Keys.java | 18 +- .../kotlin/ports/pgjooq/Tables.java | 20 +- .../ports/pgjooq/enums/Missionstatus.java | 10 +- .../kotlin/ports/pgjooq/tables/Mission.java | 213 +++++++++ .../ports/pgjooq/tables/MissionUser.java | 92 ++-- .../kotlin/ports/pgjooq/tables/Squad.java | 0 .../kotlin/ports/pgjooq/tables/SquadUser.java | 0 .../pgjooq/tables/records/MissionRecord.java | 76 ++-- .../tables/records/MissionUserRecord.java | 46 +- .../pgjooq/tables/records/SquadRecord.java | 0 .../tables/records/SquadUserRecord.java | 0 .../ports/pgjooq/PgJooqMissionRepository.kt | 250 +++++----- .../src/test/kotlin/DbAccess.kt | 0 .../test/kotlin/GenerateJooqModelFromDb.kt | 91 ++-- .../pgjooq/PgJooqMissionRepositoryTest.kt | 8 +- .../kotlin/ports/pgjooq/tables/Task.java | 213 --------- .../kotlin/test/AbstractHeroesDeskTest.kt | 428 +++++++++--------- .../kotlin/test/HeroesDeskTestUtils.kt | 14 +- .../kotlin/test/InstrumentedUserRepository.kt | 4 +- heroesdesk/README.md | 2 +- .../heroesdesk/kotlin/HeroesDesk.kt | 34 +- .../heroesdesk/kotlin/errors/Errors.kt | 52 +-- .../heroesdesk/kotlin/impl/HeroesDeskImpl.kt | 185 -------- .../heroesdesk/kotlin/impl/ValidationError.kt | 3 - .../heroesdesk/kotlin/impl/task/DoneTask.kt | 11 - .../kotlin/impl/task/InProgressTask.kt | 10 - .../kotlin/impl/task/PendingTask.kt | 10 - .../heroesdesk/kotlin/impl/task/Task.kt | 31 -- .../heroesdesk/kotlin/impl/task/TaskId.kt | 25 - .../{impl => misc}/AbstractStringValue.kt | 2 +- .../kotlin/{impl => misc}/ErrorMessage.kt | 2 +- .../heroesdesk/kotlin/misc/HeroesDeskImpl.kt | 185 ++++++++ .../kotlin/{impl => misc}/StringValue.kt | 2 +- .../heroesdesk/kotlin/misc/ValidationError.kt | 3 + .../AbstractMissionId.kt} | 6 +- .../{impl/task => mission}/Description.kt | 6 +- .../heroesdesk/kotlin/mission/DoneMission.kt | 11 + .../DoneMissionId.kt} | 14 +- .../kotlin/mission/InProgressMission.kt | 10 + .../InProgressMissionId.kt} | 16 +- .../heroesdesk/kotlin/mission/Mission.kt | 31 ++ .../heroesdesk/kotlin/mission/MissionId.kt | 25 + .../kotlin/mission/PendingMission.kt | 10 + .../PendingMissionId.kt} | 16 +- .../kotlin/{impl/task => mission}/Title.kt | 11 +- .../kotlin/ports/MissionRepository.kt | 64 +++ .../heroesdesk/kotlin/ports/TaskRepository.kt | 64 --- .../heroesdesk/kotlin/ports/UserRepository.kt | 2 +- .../heroesdesk/kotlin/squad/Name.kt | 4 +- .../heroesdesk/kotlin/squad/SquadKey.kt | 4 +- .../heroesdesk/kotlin/squad/SquadMembers.kt | 2 +- .../kotlin/{impl => }/user/AbstractUser.kt | 2 +- .../kotlin/{impl => }/user/Admin.kt | 2 +- .../kotlin/{impl => }/user/AdminId.kt | 6 +- .../heroesdesk/kotlin/{impl => }/user/Hero.kt | 2 +- .../kotlin/{impl => }/user/HeroId.kt | 10 +- .../kotlin/{impl => }/user/HeroIds.kt | 2 +- .../kotlin/{impl => }/user/Heroes.kt | 2 +- .../heroesdesk/kotlin/{impl => }/user/User.kt | 2 +- .../kotlin/{impl => }/user/UserId.kt | 4 +- .../kotlin/{impl => }/user/UserName.kt | 6 +- .../kotlin/impl/task/AbstractTaskIdTest.kt | 114 ----- .../kotlin/impl/task/AbstractTaskTest.kt | 46 -- .../kotlin/impl/task/DoneTaskIdTest.kt | 11 - .../kotlin/impl/task/DoneTaskTest.kt | 20 - .../kotlin/impl/task/InProgressTaskIdTest.kt | 10 - .../kotlin/impl/task/InProgressTaskTest.kt | 19 - .../kotlin/impl/task/PendingTaskIdTest.kt | 10 - .../kotlin/impl/task/PendingTaskTest.kt | 19 - .../{impl => misc}/AbstractStringValueTest.kt | 2 +- .../kotlin/{impl => misc}/TestUtils.kt | 12 +- .../misc/mission/AbstractMissionIdTest.kt | 115 +++++ .../misc/mission/AbstractMissionTest.kt | 50 ++ .../task => misc/mission}/DescriptionTest.kt | 7 +- .../kotlin/misc/mission/DoneMissionIdTest.kt | 12 + .../kotlin/misc/mission/DoneMissionTest.kt | 24 + .../misc/mission/InProgressMissionIdTest.kt | 12 + .../misc/mission/InProgressMissionTest.kt | 23 + .../misc/mission/PendingMissionIdTest.kt | 12 + .../kotlin/misc/mission/PendingMissionTest.kt | 23 + .../{impl/task => misc/mission}/TitleTest.kt | 7 +- .../kotlin/{impl => misc}/squad/NameTest.kt | 4 +- .../{impl => misc}/squad/SquadMembersTest.kt | 8 +- .../kotlin/{impl => misc}/squad/SquadTest.kt | 4 +- .../kotlin/{impl => misc}/user/AdminIdTest.kt | 7 +- .../kotlin/{impl => misc}/user/HeroIdTest.kt | 8 +- .../kotlin/{impl => misc}/user/HeroIdsTest.kt | 6 +- .../kotlin/{impl => misc}/user/HeroTest.kt | 5 +- .../kotlin/{impl => misc}/user/HeroesTest.kt | 13 +- .../{impl => misc}/user/UserNameTest.kt | 7 +- settings.gradle.kts | 2 +- 103 files changed, 1885 insertions(+), 1853 deletions(-) create mode 100644 heroesdesk-inmemory-adapters/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/ports/inmemory/InMemoryMissionRepository.kt delete mode 100644 heroesdesk-inmemory-adapters/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/ports/inmemory/InMemoryTaskRepository.kt rename {heroesdesk-taskrepo-jooq-pg-adapter => heroesdesk-missionrepo-jooq-pg-adapter}/build.gradle.kts (100%) rename {heroesdesk-taskrepo-jooq-pg-adapter => heroesdesk-missionrepo-jooq-pg-adapter}/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/DefaultCatalog.java (100%) rename {heroesdesk-taskrepo-jooq-pg-adapter => heroesdesk-missionrepo-jooq-pg-adapter}/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/Heroesdeskschema.java (74%) rename {heroesdesk-taskrepo-jooq-pg-adapter => heroesdesk-missionrepo-jooq-pg-adapter}/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/Keys.java (62%) rename {heroesdesk-taskrepo-jooq-pg-adapter => heroesdesk-missionrepo-jooq-pg-adapter}/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/Tables.java (63%) rename heroesdesk-taskrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/enums/Taskstatus.java => heroesdesk-missionrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/enums/Missionstatus.java (77%) create mode 100644 heroesdesk-missionrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/tables/Mission.java rename heroesdesk-taskrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/tables/TaskUser.java => heroesdesk-missionrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/tables/MissionUser.java (50%) rename {heroesdesk-taskrepo-jooq-pg-adapter => heroesdesk-missionrepo-jooq-pg-adapter}/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/tables/Squad.java (100%) rename {heroesdesk-taskrepo-jooq-pg-adapter => heroesdesk-missionrepo-jooq-pg-adapter}/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/tables/SquadUser.java (100%) rename heroesdesk-taskrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/tables/records/TaskRecord.java => heroesdesk-missionrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/tables/records/MissionRecord.java (62%) rename heroesdesk-taskrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/tables/records/TaskUserRecord.java => heroesdesk-missionrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/tables/records/MissionUserRecord.java (64%) rename {heroesdesk-taskrepo-jooq-pg-adapter => heroesdesk-missionrepo-jooq-pg-adapter}/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/tables/records/SquadRecord.java (100%) rename {heroesdesk-taskrepo-jooq-pg-adapter => heroesdesk-missionrepo-jooq-pg-adapter}/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/tables/records/SquadUserRecord.java (100%) rename heroesdesk-taskrepo-jooq-pg-adapter/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/PgJooqTaskRepository.kt => heroesdesk-missionrepo-jooq-pg-adapter/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/PgJooqMissionRepository.kt (55%) rename {heroesdesk-taskrepo-jooq-pg-adapter => heroesdesk-missionrepo-jooq-pg-adapter}/src/test/kotlin/DbAccess.kt (100%) rename {heroesdesk-taskrepo-jooq-pg-adapter => heroesdesk-missionrepo-jooq-pg-adapter}/src/test/kotlin/GenerateJooqModelFromDb.kt (58%) rename heroesdesk-taskrepo-jooq-pg-adapter/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/PgJooqTaskRepositoryTest.kt => heroesdesk-missionrepo-jooq-pg-adapter/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/PgJooqMissionRepositoryTest.kt (83%) delete mode 100644 heroesdesk-taskrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/tables/Task.java delete mode 100644 heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/HeroesDeskImpl.kt delete mode 100644 heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/ValidationError.kt delete mode 100644 heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/DoneTask.kt delete mode 100644 heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/InProgressTask.kt delete mode 100644 heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/PendingTask.kt delete mode 100644 heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/Task.kt delete mode 100644 heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/TaskId.kt rename heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/{impl => misc}/AbstractStringValue.kt (91%) rename heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/{impl => misc}/ErrorMessage.kt (53%) create mode 100644 heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/misc/HeroesDeskImpl.kt rename heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/{impl => misc}/StringValue.kt (51%) create mode 100644 heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/misc/ValidationError.kt rename heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/{impl/task/AbstractTaskId.kt => mission/AbstractMissionId.kt} (76%) rename heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/{impl/task => mission}/Description.kt (87%) create mode 100644 heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/mission/DoneMission.kt rename heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/{impl/task/DoneTaskId.kt => mission/DoneMissionId.kt} (66%) create mode 100644 heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/mission/InProgressMission.kt rename heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/{impl/task/PendingTaskId.kt => mission/InProgressMissionId.kt} (65%) create mode 100644 heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/mission/Mission.kt create mode 100644 heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/mission/MissionId.kt create mode 100644 heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/mission/PendingMission.kt rename heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/{impl/task/InProgressTaskId.kt => mission/PendingMissionId.kt} (66%) rename heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/{impl/task => mission}/Title.kt (78%) create mode 100644 heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/ports/MissionRepository.kt delete mode 100644 heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/ports/TaskRepository.kt rename heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/{impl => }/user/AbstractUser.kt (87%) rename heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/{impl => }/user/Admin.kt (66%) rename heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/{impl => }/user/AdminId.kt (90%) rename heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/{impl => }/user/Hero.kt (66%) rename heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/{impl => }/user/HeroId.kt (82%) rename heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/{impl => }/user/HeroIds.kt (95%) rename heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/{impl => }/user/Heroes.kt (96%) rename heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/{impl => }/user/User.kt (80%) rename heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/{impl => }/user/UserId.kt (56%) rename heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/{impl => }/user/UserName.kt (90%) delete mode 100644 heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/AbstractTaskIdTest.kt delete mode 100644 heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/AbstractTaskTest.kt delete mode 100644 heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/DoneTaskIdTest.kt delete mode 100644 heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/DoneTaskTest.kt delete mode 100644 heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/InProgressTaskIdTest.kt delete mode 100644 heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/InProgressTaskTest.kt delete mode 100644 heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/PendingTaskIdTest.kt delete mode 100644 heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/PendingTaskTest.kt rename heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/{impl => misc}/AbstractStringValueTest.kt (98%) rename heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/{impl => misc}/TestUtils.kt (75%) create mode 100644 heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/mission/AbstractMissionIdTest.kt create mode 100644 heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/mission/AbstractMissionTest.kt rename heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/{impl/task => misc/mission}/DescriptionTest.kt (51%) create mode 100644 heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/mission/DoneMissionIdTest.kt create mode 100644 heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/mission/DoneMissionTest.kt create mode 100644 heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/mission/InProgressMissionIdTest.kt create mode 100644 heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/mission/InProgressMissionTest.kt create mode 100644 heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/mission/PendingMissionIdTest.kt create mode 100644 heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/mission/PendingMissionTest.kt rename heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/{impl/task => misc/mission}/TitleTest.kt (55%) rename heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/{impl => misc}/squad/NameTest.kt (77%) rename heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/{impl => misc}/squad/SquadMembersTest.kt (86%) rename heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/{impl => misc}/squad/SquadTest.kt (93%) rename heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/{impl => misc}/user/AdminIdTest.kt (57%) rename heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/{impl => misc}/user/HeroIdTest.kt (52%) rename heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/{impl => misc}/user/HeroIdsTest.kt (96%) rename heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/{impl => misc}/user/HeroTest.kt (86%) rename heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/{impl => misc}/user/HeroesTest.kt (95%) rename heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/{impl => misc}/user/UserNameTest.kt (57%) diff --git a/FUNCTIONAL_REQUIREMENTS.md b/FUNCTIONAL_REQUIREMENTS.md index ecc84ed..e25d0a8 100644 --- a/FUNCTIONAL_REQUIREMENTS.md +++ b/FUNCTIONAL_REQUIREMENTS.md @@ -1,27 +1,27 @@ -## HeroesDesk: task tracker for heroes :) +## HeroesDesk: mission tracker for heroes :) -No time tracking, no endless workflow customizing, only tasks that need to be done. Or not: let the heroes decide :) +No time tracking, no endless workflow customizing, only missions that need to be done. Or not: let the heroes decide :) There are the following user types: -- users: able to see all and create tasks (title and description) -- heroes: as users plus ability to modify all in tasks in their squads -- admin: define squads, used for tasks, as well as heroes allowed to work on each squad +- users: able to see all and create missions (title and description) +- heroes: as users plus ability to modify all in missions in their squads +- admin: define squads, used for missions, as well as heroes allowed to work on each squad -A task is made of: +A mission is made of: - squad: one among the squads defined by the admin - title: mandatory, updatable, single line, 1 up to 255 chars - description: optional, updatable, multi line, up to 1024 chars - creator: mandatory, fixed at creation -- id: unique among all tasks, fixed at creation, made of the squad key, a dash and a unique number, 2 to 73 chars -- assignees: can be empty, updatable. Always empty for done task. -- a task can be pending, in progress or done: default to pending +- id: unique among all missions, fixed at creation, made of the squad key, a dash and a unique number, 2 to 73 chars +- assignees: can be empty, updatable. Always empty for done mission. +- a mission can be pending, in progress or done: default to pending - each state can be moved to any of the 2 others - - if a task without assigned is set to in progress, the hero doing the action is automatically added as assignee - - when a task is done, then all its assignees are removed + - if a mission without assigned is set to in progress, the hero doing the action is automatically added as assignee + - when a mission is done, then all its assignees are removed -Multiple tasks with same title or description can be created. +Multiple missions with same title or description can be created. A squad has: - a name, 1 up to 255 chars, unique among all squads, updatable, must be unique diff --git a/README.md b/README.md index 9dfda9d..4301c29 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,7 @@ It's even better when most of the bugs can't happen by design. When doing a tech showcase, which business model to use is often tricky. -A made up application, called HeroesDesk, is the functional target. It's a task tracker for heroes: familiar to +A made up application, called HeroesDesk, is the functional target. It's a mission tracker for heroes: familiar to developers, yet allowing some complexity and with a clear mission statement. Read more about the requirements in [Functional requirement](FUNCTIONAL_REQUIREMENTS.md). diff --git a/heroesdesk-inmemory-adapters/README.md b/heroesdesk-inmemory-adapters/README.md index 340b5f7..1af2229 100644 --- a/heroesdesk-inmemory-adapters/README.md +++ b/heroesdesk-inmemory-adapters/README.md @@ -1,7 +1,7 @@ Provide the following in memory adapters for the HeroesDesk application: ``` -org.hexastacks.heroesdesk.kotlin.adapters.inmemory.TaskRepositoryInMemory -org.hexastacks.heroesdesk.kotlin.adapters.inmemory.UserRepositoryInMemory +org.hexastacks.heroesdesk.kotlin.ports.inmemory.MissionRepositoryInMemory +org.hexastacks.heroesdesk.kotlin.ports.inmemory.UserRepositoryInMemory ``` -Correspondingly, the default HeroesDesk test class is `org.hexastacks.heroesdesk.kotlin.HeroesDeskImplTest` and uses the above in memory adapters. \ No newline at end of file +Correspondingly, the default HeroesDesk test class is `org.hexastacks.heroesdesk.kotlin.test.AbstractHeroesDeskTest` and uses the above in memory adapters. \ No newline at end of file diff --git a/heroesdesk-inmemory-adapters/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/ports/inmemory/InMemoryMissionRepository.kt b/heroesdesk-inmemory-adapters/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/ports/inmemory/InMemoryMissionRepository.kt new file mode 100644 index 0000000..ef96950 --- /dev/null +++ b/heroesdesk-inmemory-adapters/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/ports/inmemory/InMemoryMissionRepository.kt @@ -0,0 +1,340 @@ +package org.hexastacks.heroesdesk.kotlin.ports.inmemory + +import arrow.core.* +import arrow.core.Either.Left +import arrow.core.Either.Right +import org.hexastacks.heroesdesk.kotlin.errors.* +import org.hexastacks.heroesdesk.kotlin.misc.AbstractStringValue +import org.hexastacks.heroesdesk.kotlin.squad.Name +import org.hexastacks.heroesdesk.kotlin.squad.Squad +import org.hexastacks.heroesdesk.kotlin.squad.SquadKey +import org.hexastacks.heroesdesk.kotlin.squad.SquadMembers +import org.hexastacks.heroesdesk.kotlin.user.HeroIds +import org.hexastacks.heroesdesk.kotlin.user.Heroes +import org.hexastacks.heroesdesk.kotlin.mission.* +import org.hexastacks.heroesdesk.kotlin.ports.MissionRepository +import java.util.* +import java.util.concurrent.ConcurrentHashMap +import java.util.concurrent.atomic.AtomicReference + +class InMemoryMissionRepository : MissionRepository { + + private val database = ConcurrentHashMap>>() + + override fun createMission( + squadKey: SquadKey, + title: Title + ): Either, PendingMission> { + val createdMission = AtomicReference() + return database.computeIfPresent(squadKey) { _, squadAndMissionIdsToMission -> + val inMemorySquad = squadAndMissionIdsToMission.first + val uuid = UUID.randomUUID().toString() + val retrievedSquad = inMemorySquad.toSquad() + val missionId = PendingMissionId(squadKey, uuid).getOrElse { + throw RuntimeException("missionId $uuid should be valid") + } + val mission = PendingMission(missionId, title) + createdMission.set(mission) + Pair(inMemorySquad, squadAndMissionIdsToMission.second.plus(RawMissionId(missionId) to RawMission(mission))) + } + ?.let { Right(createdMission.get()) } + ?: Left(nonEmptyListOf(SquadNotExistingError(squadKey))) + } + + override fun getMission(missionId: MissionId): Either, Mission<*>> = + database[missionId.squadKey] + ?.let { squadAndMissionIdsToMission -> + val rawMissionId = RawMissionId(missionId) + val mission = squadAndMissionIdsToMission.second[rawMissionId] + mission?.let { buildMission(rawMissionId, it, squadAndMissionIdsToMission.first.key) } + } + ?.let { Right(it) } + ?: Left(nonEmptyListOf(MissionNotExistingError(missionId))) + + private fun buildMission( + rawMissionId: RawMissionId, + mission: RawMission, + squad: SquadKey + ): Mission<*> = + when (mission.type) { + MissionType.PENDING -> PendingMission( + PendingMissionId( + squad, + rawMissionId.value + ).getOrElse { throw RuntimeException("missionId ${rawMissionId.value} should be valid") }, + mission.title, + mission.description, + mission.assignees + ) + + MissionType.DONE -> DoneMission( + DoneMissionId( + squad, + rawMissionId.value + ).getOrElse { throw RuntimeException("missionId ${rawMissionId.value} should be valid") }, + mission.title, + mission.description + ) + + MissionType.IN_PROGRESS -> InProgressMission( + InProgressMissionId( + squad, + rawMissionId.value + ).getOrElse { throw RuntimeException("missionId ${rawMissionId.value} should be valid") }, + mission.title, + mission.description, + mission.assignees + ) + } + + override fun updateTitle( + missionId: MissionId, + title: Title + ): EitherNel> = + database + .computeIfPresent(missionId.squadKey) { _, squadAndMissionIdsToMission -> + val squad = squadAndMissionIdsToMission.first + val rawMissionId = RawMissionId(missionId) + squadAndMissionIdsToMission + .second[rawMissionId] + ?.copy(title = title) + ?.let { Pair(squad, squadAndMissionIdsToMission.second.plus(rawMissionId to it)) } + } + ?.let { + Right(buildMission(it, missionId)) + } + ?: Left(nonEmptyListOf(MissionNotExistingError(missionId))) + + private fun buildMission( + it: Pair>, + missionId: MissionId + ): Mission<*> { + val rawMission: RawMission = it.second[RawMissionId(missionId)]!! + val mission = buildMission(RawMissionId(missionId), rawMission, missionId.squadKey) + return mission + } + + override fun updateDescription( + missionId: MissionId, + description: Description + ): Either, Mission<*>> = + database + .computeIfPresent(missionId.squadKey) { _, squadAndMissionIdsToMission -> + val squad = squadAndMissionIdsToMission.first + val rawMissionId = RawMissionId(missionId) + squadAndMissionIdsToMission + .second[rawMissionId] + ?.copy(description = description) + ?.let { Pair(squad, squadAndMissionIdsToMission.second.plus(rawMissionId to it)) } + } + ?.let { Right(buildMission(it, missionId)) } + ?: Left(nonEmptyListOf(MissionNotExistingError(missionId))) + + override fun assignMission( + missionId: MissionId, + assignees: HeroIds + ): EitherNel> = + database + .computeIfPresent(missionId.squadKey) { _, squadAndMissionIdsToMission -> + val squad = squadAndMissionIdsToMission.first + val rawMissionId = RawMissionId(missionId) + val mission: RawMission? = squadAndMissionIdsToMission.second[rawMissionId] + val updatedMission = mission?.copy(assignees = assignees) + updatedMission?.let { Pair(squad, squadAndMissionIdsToMission.second.plus(rawMissionId to updatedMission)) } + } + ?.let { Right(buildMission(it, missionId)) } + ?: Left(nonEmptyListOf(MissionNotExistingError(missionId))) + + override fun startWork( + pendingMissionId: PendingMissionId + ): EitherNel = + database + .computeIfPresent(pendingMissionId.squadKey) { _, squadAndMissionIdsToMission -> + val inMemorySquad = squadAndMissionIdsToMission.first + val rawMissionId = RawMissionId(pendingMissionId) + val mission = squadAndMissionIdsToMission.second[rawMissionId] + if (mission?.type == MissionType.PENDING) { + val retrievedSquad = inMemorySquad.toSquad() + InProgressMissionId(retrievedSquad.key, rawMissionId.value) + .map { inProgressMissionId -> + val inProgressMission = + InProgressMission( + inProgressMissionId, + mission.title, + mission.description, + mission.assignees + ) + Pair( + inMemorySquad, + squadAndMissionIdsToMission.second.plus(rawMissionId to RawMission(inProgressMission)) + ) + } + .getOrNull() + } else + null + } + ?.let { Right(buildMission(it, pendingMissionId) as InProgressMission) } + ?: Left(nonEmptyListOf(MissionNotExistingError(pendingMissionId))) + + override fun createSquad(squadKey: SquadKey, name: Name): EitherNel { + return if (database.any { it.value.first.name == name }) { + Left(nonEmptyListOf(SquadNameAlreadyExistingError(name))) + } else if (database.containsKey(squadKey)) { + Left(nonEmptyListOf(SquadKeyAlreadyExistingError(squadKey))) + } else + Right( + database + .computeIfAbsent(squadKey) { _ -> + Pair(InMemorySquad(name, squadKey), ConcurrentHashMap()) + }.first.toSquad() + ) + } + + override fun assignSquad( + squadKey: SquadKey, + assignees: Heroes + ): EitherNel = + database.computeIfPresent(squadKey) { _, squadAndMissionIdsToMission -> + val retrievedInMemorySquad = squadAndMissionIdsToMission.first + val updatedInMemorySquad = retrievedInMemorySquad.copy(members = assignees.toHeroIds()) + Pair(updatedInMemorySquad, squadAndMissionIdsToMission.second) + } + ?.let { Right(it.first.toSquadMembers()) } + ?: Left(nonEmptyListOf(SquadNotExistingError(squadKey))) + + override fun areHeroesInSquad( + heroIds: HeroIds, + squadKey: SquadKey + ): EitherNel = + database[squadKey] + ?.let { + val squadMembers = it.first.toSquadMembers() + return if (squadMembers.containsAll(heroIds)) + Right(squadMembers) + else + Left(nonEmptyListOf(HeroesNotInSquadError(heroIds, squadKey))) + } + ?: Left(nonEmptyListOf(SquadNotExistingError(squadKey))) + + override fun updateSquadName( + squadKey: SquadKey, + name: Name + ): EitherNel = + database.computeIfPresent(squadKey) { _, squadAndMissionIdsToMission -> + val inMemorySquad = squadAndMissionIdsToMission.first + val updatedInMemorySquad = inMemorySquad.copy(name = name) + Pair(updatedInMemorySquad, squadAndMissionIdsToMission.second) + } + ?.let { Right(it.first.toSquad()) } + ?: Left(nonEmptyListOf(SquadNotExistingError(squadKey))) + + + override fun getSquad(squadKey: SquadKey): EitherNel = + database[squadKey] + ?.let { Right(it.first.toSquad()) } + ?: Left(nonEmptyListOf(SquadNotExistingError(squadKey))) + + override fun getSquadMembers(squadKey: SquadKey): EitherNel = + database[squadKey] + ?.let { Right(it.first.toSquadMembers()) } + ?: Left(nonEmptyListOf(SquadNotExistingError(squadKey))) + + override fun pauseWork(inProgressMissionId: InProgressMissionId): EitherNel = + database + .computeIfPresent(inProgressMissionId.squadKey) { _, squadAndMissionIdsToMission -> + val inMemorySquad = squadAndMissionIdsToMission.first + val rawMissionId = RawMissionId(inProgressMissionId) + val mission = squadAndMissionIdsToMission.second[rawMissionId] + if (mission?.type == MissionType.IN_PROGRESS) { + PendingMissionId(inProgressMissionId.squadKey, rawMissionId.value) + .map { inProgressMissionId -> + val pendingMission = + PendingMission( + inProgressMissionId, + mission.title, + mission.description, + mission.assignees + ) + Pair( + inMemorySquad, + squadAndMissionIdsToMission.second.plus(rawMissionId to RawMission(pendingMission)) + ) + } + .getOrNull() + } else + null + } + ?.let { Right(buildMission(it, inProgressMissionId) as PendingMission) } + ?: Left(nonEmptyListOf(MissionNotExistingError(inProgressMissionId))) + + override fun endWork(inProgressMissionId: InProgressMissionId): EitherNel = + database + .computeIfPresent(inProgressMissionId.squadKey) { _, squadAndMissionIdsToMission -> + val inMemorySquad = squadAndMissionIdsToMission.first + val rawMissionId = RawMissionId(inProgressMissionId) + val mission = squadAndMissionIdsToMission.second[rawMissionId] + if (mission?.type == MissionType.IN_PROGRESS) { + val squad = inMemorySquad.toSquad() + DoneMissionId(inProgressMissionId.squadKey, rawMissionId.value) + .map { doneMissionId -> + val doneMission = + DoneMission( + doneMissionId, + mission.title, + mission.description + ) + Pair( + inMemorySquad, + squadAndMissionIdsToMission.second.plus(rawMissionId to RawMission(doneMission)) + ) + } + .getOrNull() + } else + null + } + ?.let { Right(buildMission(it, inProgressMissionId) as DoneMission) } + ?: Left(nonEmptyListOf(MissionNotExistingError(inProgressMissionId))) + + companion object { + const val NON_EXISTING_MISSION_ID: String = "nonExistingMission" + } + +} + +data class RawMission( + val type: MissionType, + val title: Title, + val description: Description, + val assignees: HeroIds, +) { + constructor(pendingMission: PendingMission) : this( + MissionType.PENDING, + pendingMission.title, + pendingMission.description, + pendingMission.assignees + ) + + constructor(inProgressMission: InProgressMission) : this( + MissionType.IN_PROGRESS, + inProgressMission.title, + inProgressMission.description, + inProgressMission.assignees + ) + + constructor(doneMission: DoneMission) : this( + MissionType.DONE, + doneMission.title, + doneMission.description, + doneMission.assignees + ) +} + +enum class MissionType { + PENDING, + IN_PROGRESS, + DONE +} + +class RawMissionId(value: String) : AbstractStringValue(value) { + constructor(missionId: MissionId) : this(missionId.value) +} diff --git a/heroesdesk-inmemory-adapters/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/ports/inmemory/InMemorySquad.kt b/heroesdesk-inmemory-adapters/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/ports/inmemory/InMemorySquad.kt index 0208217..3cd10a3 100644 --- a/heroesdesk-inmemory-adapters/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/ports/inmemory/InMemorySquad.kt +++ b/heroesdesk-inmemory-adapters/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/ports/inmemory/InMemorySquad.kt @@ -4,7 +4,7 @@ import org.hexastacks.heroesdesk.kotlin.squad.Name import org.hexastacks.heroesdesk.kotlin.squad.Squad import org.hexastacks.heroesdesk.kotlin.squad.SquadKey import org.hexastacks.heroesdesk.kotlin.squad.SquadMembers -import org.hexastacks.heroesdesk.kotlin.impl.user.HeroIds +import org.hexastacks.heroesdesk.kotlin.user.HeroIds data class InMemorySquad(val name: Name, val key: SquadKey, val members: HeroIds = HeroIds.empty) { fun toSquad(): Squad = Squad(name, key) diff --git a/heroesdesk-inmemory-adapters/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/ports/inmemory/InMemoryTaskRepository.kt b/heroesdesk-inmemory-adapters/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/ports/inmemory/InMemoryTaskRepository.kt deleted file mode 100644 index 40d890e..0000000 --- a/heroesdesk-inmemory-adapters/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/ports/inmemory/InMemoryTaskRepository.kt +++ /dev/null @@ -1,340 +0,0 @@ -package org.hexastacks.heroesdesk.kotlin.ports.inmemory - -import arrow.core.* -import arrow.core.Either.Left -import arrow.core.Either.Right -import org.hexastacks.heroesdesk.kotlin.errors.* -import org.hexastacks.heroesdesk.kotlin.impl.AbstractStringValue -import org.hexastacks.heroesdesk.kotlin.squad.Name -import org.hexastacks.heroesdesk.kotlin.squad.Squad -import org.hexastacks.heroesdesk.kotlin.squad.SquadKey -import org.hexastacks.heroesdesk.kotlin.squad.SquadMembers -import org.hexastacks.heroesdesk.kotlin.impl.task.* -import org.hexastacks.heroesdesk.kotlin.impl.user.HeroIds -import org.hexastacks.heroesdesk.kotlin.impl.user.Heroes -import org.hexastacks.heroesdesk.kotlin.ports.TaskRepository -import java.util.* -import java.util.concurrent.ConcurrentHashMap -import java.util.concurrent.atomic.AtomicReference - -class InMemoryTaskRepository : TaskRepository { - - private val database = ConcurrentHashMap>>() - - override fun createTask( - squadKey: SquadKey, - title: Title - ): Either, PendingTask> { - val createdTask = AtomicReference() - return database.computeIfPresent(squadKey) { _, squadAndTaskIdsToTask -> - val inMemorySquad = squadAndTaskIdsToTask.first - val uuid = UUID.randomUUID().toString() - val retrievedSquad = inMemorySquad.toSquad() - val taskId = PendingTaskId(squadKey, uuid).getOrElse { - throw RuntimeException("taskId $uuid should be valid") - } - val task = PendingTask(taskId, title) - createdTask.set(task) - Pair(inMemorySquad, squadAndTaskIdsToTask.second.plus(RawTaskId(taskId) to RawTask(task))) - } - ?.let { Right(createdTask.get()) } - ?: Left(nonEmptyListOf(SquadNotExistingError(squadKey))) - } - - override fun getTask(taskId: TaskId): Either, Task<*>> = - database[taskId.squadKey] - ?.let { squadAndTaskIdsToTask -> - val rawTaskId = RawTaskId(taskId) - val task = squadAndTaskIdsToTask.second[rawTaskId] - task?.let { buildTask(rawTaskId, it, squadAndTaskIdsToTask.first.key) } - } - ?.let { Right(it) } - ?: Left(nonEmptyListOf(TaskNotExistingError(taskId))) - - private fun buildTask( - rawTaskId: RawTaskId, - task: RawTask, - squad: SquadKey - ): Task<*> = - when (task.type) { - TaskType.PENDING -> PendingTask( - PendingTaskId( - squad, - rawTaskId.value - ).getOrElse { throw RuntimeException("taskId ${rawTaskId.value} should be valid") }, - task.title, - task.description, - task.assignees - ) - - TaskType.DONE -> DoneTask( - DoneTaskId( - squad, - rawTaskId.value - ).getOrElse { throw RuntimeException("taskId ${rawTaskId.value} should be valid") }, - task.title, - task.description - ) - - TaskType.IN_PROGRESS -> InProgressTask( - InProgressTaskId( - squad, - rawTaskId.value - ).getOrElse { throw RuntimeException("taskId ${rawTaskId.value} should be valid") }, - task.title, - task.description, - task.assignees - ) - } - - override fun updateTitle( - taskId: TaskId, - title: Title - ): EitherNel> = - database - .computeIfPresent(taskId.squadKey) { _, squadAndTaskIdsToTask -> - val squad = squadAndTaskIdsToTask.first - val rawTaskId = RawTaskId(taskId) - squadAndTaskIdsToTask - .second[rawTaskId] - ?.copy(title = title) - ?.let { Pair(squad, squadAndTaskIdsToTask.second.plus(rawTaskId to it)) } - } - ?.let { - Right(buildTask(it, taskId)) - } - ?: Left(nonEmptyListOf(TaskNotExistingError(taskId))) - - private fun buildTask( - it: Pair>, - taskId: TaskId - ): Task<*> { - val rawTask: RawTask = it.second[RawTaskId(taskId)]!! - val task = buildTask(RawTaskId(taskId), rawTask, taskId.squadKey) - return task - } - - override fun updateDescription( - taskId: TaskId, - description: Description - ): Either, Task<*>> = - database - .computeIfPresent(taskId.squadKey) { _, squadAndTaskIdsToTask -> - val squad = squadAndTaskIdsToTask.first - val rawTaskId = RawTaskId(taskId) - squadAndTaskIdsToTask - .second[rawTaskId] - ?.copy(description = description) - ?.let { Pair(squad, squadAndTaskIdsToTask.second.plus(rawTaskId to it)) } - } - ?.let { Right(buildTask(it, taskId)) } - ?: Left(nonEmptyListOf(TaskNotExistingError(taskId))) - - override fun assignTask( - taskId: TaskId, - assignees: HeroIds - ): EitherNel> = - database - .computeIfPresent(taskId.squadKey) { _, squadAndTaskIdsToTask -> - val squad = squadAndTaskIdsToTask.first - val rawTaskId = RawTaskId(taskId) - val task: RawTask? = squadAndTaskIdsToTask.second[rawTaskId] - val updatedTask = task?.copy(assignees = assignees) - updatedTask?.let { Pair(squad, squadAndTaskIdsToTask.second.plus(rawTaskId to updatedTask)) } - } - ?.let { Right(buildTask(it, taskId)) } - ?: Left(nonEmptyListOf(TaskNotExistingError(taskId))) - - override fun startWork( - pendingTaskId: PendingTaskId - ): EitherNel = - database - .computeIfPresent(pendingTaskId.squadKey) { _, squadAndTaskIdsToTask -> - val inMemorySquad = squadAndTaskIdsToTask.first - val rawTaskId = RawTaskId(pendingTaskId) - val task = squadAndTaskIdsToTask.second[rawTaskId] - if (task?.type == TaskType.PENDING) { - val retrievedSquad = inMemorySquad.toSquad() - InProgressTaskId(retrievedSquad.key, rawTaskId.value) - .map { inProgressTaskId -> - val inProgressTask = - InProgressTask( - inProgressTaskId, - task.title, - task.description, - task.assignees - ) - Pair( - inMemorySquad, - squadAndTaskIdsToTask.second.plus(rawTaskId to RawTask(inProgressTask)) - ) - } - .getOrNull() - } else - null - } - ?.let { Right(buildTask(it, pendingTaskId) as InProgressTask) } - ?: Left(nonEmptyListOf(TaskNotExistingError(pendingTaskId))) - - override fun createSquad(squadKey: SquadKey, name: Name): EitherNel { - return if (database.any { it.value.first.name == name }) { - Left(nonEmptyListOf(SquadNameAlreadyExistingError(name))) - } else if (database.containsKey(squadKey)) { - Left(nonEmptyListOf(SquadKeyAlreadyExistingError(squadKey))) - } else - Right( - database - .computeIfAbsent(squadKey) { _ -> - Pair(InMemorySquad(name, squadKey), ConcurrentHashMap()) - }.first.toSquad() - ) - } - - override fun assignSquad( - squadKey: SquadKey, - assignees: Heroes - ): EitherNel = - database.computeIfPresent(squadKey) { _, squadAndTaskIdsToTask -> - val retrievedInMemorySquad = squadAndTaskIdsToTask.first - val updatedInMemorySquad = retrievedInMemorySquad.copy(members = assignees.toHeroIds()) - Pair(updatedInMemorySquad, squadAndTaskIdsToTask.second) - } - ?.let { Right(it.first.toSquadMembers()) } - ?: Left(nonEmptyListOf(SquadNotExistingError(squadKey))) - - override fun areHeroesInSquad( - heroIds: HeroIds, - squadKey: SquadKey - ): EitherNel = - database[squadKey] - ?.let { - val squadMembers = it.first.toSquadMembers() - return if (squadMembers.containsAll(heroIds)) - Right(squadMembers) - else - Left(nonEmptyListOf(HeroesNotInSquadError(heroIds, squadKey))) - } - ?: Left(nonEmptyListOf(SquadNotExistingError(squadKey))) - - override fun updateSquadName( - squadKey: SquadKey, - name: Name - ): EitherNel = - database.computeIfPresent(squadKey) { _, squadAndTaskIdsToTask -> - val inMemorySquad = squadAndTaskIdsToTask.first - val updatedInMemorySquad = inMemorySquad.copy(name = name) - Pair(updatedInMemorySquad, squadAndTaskIdsToTask.second) - } - ?.let { Right(it.first.toSquad()) } - ?: Left(nonEmptyListOf(SquadNotExistingError(squadKey))) - - - override fun getSquad(squadKey: SquadKey): EitherNel = - database[squadKey] - ?.let { Right(it.first.toSquad()) } - ?: Left(nonEmptyListOf(SquadNotExistingError(squadKey))) - - override fun getSquadMembers(squadKey: SquadKey): EitherNel = - database[squadKey] - ?.let { Right(it.first.toSquadMembers()) } - ?: Left(nonEmptyListOf(SquadNotExistingError(squadKey))) - - override fun pauseWork(inProgressTaskId: InProgressTaskId): EitherNel = - database - .computeIfPresent(inProgressTaskId.squadKey) { _, squadAndTaskIdsToTask -> - val inMemorySquad = squadAndTaskIdsToTask.first - val rawTaskId = RawTaskId(inProgressTaskId) - val task = squadAndTaskIdsToTask.second[rawTaskId] - if (task?.type == TaskType.IN_PROGRESS) { - PendingTaskId(inProgressTaskId.squadKey, rawTaskId.value) - .map { inProgressTaskId -> - val pendingTask = - PendingTask( - inProgressTaskId, - task.title, - task.description, - task.assignees - ) - Pair( - inMemorySquad, - squadAndTaskIdsToTask.second.plus(rawTaskId to RawTask(pendingTask)) - ) - } - .getOrNull() - } else - null - } - ?.let { Right(buildTask(it, inProgressTaskId) as PendingTask) } - ?: Left(nonEmptyListOf(TaskNotExistingError(inProgressTaskId))) - - override fun endWork(inProgressTaskId: InProgressTaskId): EitherNel = - database - .computeIfPresent(inProgressTaskId.squadKey) { _, squadAndTaskIdsToTask -> - val inMemorySquad = squadAndTaskIdsToTask.first - val rawTaskId = RawTaskId(inProgressTaskId) - val task = squadAndTaskIdsToTask.second[rawTaskId] - if (task?.type == TaskType.IN_PROGRESS) { - val squad = inMemorySquad.toSquad() - DoneTaskId(inProgressTaskId.squadKey, rawTaskId.value) - .map { doneTaskId -> - val doneTask = - DoneTask( - doneTaskId, - task.title, - task.description - ) - Pair( - inMemorySquad, - squadAndTaskIdsToTask.second.plus(rawTaskId to RawTask(doneTask)) - ) - } - .getOrNull() - } else - null - } - ?.let { Right(buildTask(it, inProgressTaskId) as DoneTask) } - ?: Left(nonEmptyListOf(TaskNotExistingError(inProgressTaskId))) - - companion object { - const val NON_EXISTING_TASK_ID: String = "nonExistingTask" - } - -} - -data class RawTask( - val type: TaskType, - val title: Title, - val description: Description, - val assignees: HeroIds, -) { - constructor(pendingTask: PendingTask) : this( - TaskType.PENDING, - pendingTask.title, - pendingTask.description, - pendingTask.assignees - ) - - constructor(inProgressTask: InProgressTask) : this( - TaskType.IN_PROGRESS, - inProgressTask.title, - inProgressTask.description, - inProgressTask.assignees - ) - - constructor(doneTask: DoneTask) : this( - TaskType.DONE, - doneTask.title, - doneTask.description, - doneTask.assignees - ) -} - -enum class TaskType { - PENDING, - IN_PROGRESS, - DONE -} - -class RawTaskId(value: String) : AbstractStringValue(value) { - constructor(taskId: TaskId) : this(taskId.value) -} diff --git a/heroesdesk-inmemory-adapters/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/ports/inmemory/InMemoryUserRepository.kt b/heroesdesk-inmemory-adapters/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/ports/inmemory/InMemoryUserRepository.kt index 0544988..3013330 100644 --- a/heroesdesk-inmemory-adapters/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/ports/inmemory/InMemoryUserRepository.kt +++ b/heroesdesk-inmemory-adapters/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/ports/inmemory/InMemoryUserRepository.kt @@ -4,10 +4,10 @@ import arrow.core.Either.Left import arrow.core.Either.Right import arrow.core.EitherNel import arrow.core.nonEmptyListOf -import org.hexastacks.heroesdesk.kotlin.impl.user.* import java.util.concurrent.ConcurrentHashMap import org.hexastacks.heroesdesk.kotlin.errors.* import org.hexastacks.heroesdesk.kotlin.ports.UserRepository +import org.hexastacks.heroesdesk.kotlin.user.* open class InMemoryUserRepository : UserRepository { diff --git a/heroesdesk-inmemory-adapters/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/ports/inmemory/InstrumentedInMemoryUserRepository.kt b/heroesdesk-inmemory-adapters/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/ports/inmemory/InstrumentedInMemoryUserRepository.kt index 95c0be3..d1fe135 100644 --- a/heroesdesk-inmemory-adapters/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/ports/inmemory/InstrumentedInMemoryUserRepository.kt +++ b/heroesdesk-inmemory-adapters/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/ports/inmemory/InstrumentedInMemoryUserRepository.kt @@ -1,7 +1,7 @@ package org.hexastacks.heroesdesk.kotlin.ports.inmemory -import org.hexastacks.heroesdesk.kotlin.impl.user.Admin -import org.hexastacks.heroesdesk.kotlin.impl.user.Hero +import org.hexastacks.heroesdesk.kotlin.user.Admin +import org.hexastacks.heroesdesk.kotlin.user.Hero import org.hexastacks.heroesdesk.kotlin.test.InstrumentedUserRepository class InstrumentedInMemoryUserRepository : InMemoryUserRepository(), InstrumentedUserRepository { diff --git a/heroesdesk-inmemory-adapters/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/ports/inmemory/HeroesDeskImplTest.kt b/heroesdesk-inmemory-adapters/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/ports/inmemory/HeroesDeskImplTest.kt index eb29a76..0d80f52 100644 --- a/heroesdesk-inmemory-adapters/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/ports/inmemory/HeroesDeskImplTest.kt +++ b/heroesdesk-inmemory-adapters/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/ports/inmemory/HeroesDeskImplTest.kt @@ -1,17 +1,17 @@ package org.hexastacks.heroesdesk.kotlin.ports.inmemory import org.hexastacks.heroesdesk.kotlin.HeroesDesk -import org.hexastacks.heroesdesk.kotlin.impl.HeroesDeskImpl +import org.hexastacks.heroesdesk.kotlin.misc.HeroesDeskImpl import org.hexastacks.heroesdesk.kotlin.test.AbstractHeroesDeskTest import org.hexastacks.heroesdesk.kotlin.test.InstrumentedUserRepository class HeroesDeskImplTest : AbstractHeroesDeskTest() { override fun createHeroesDesk(userRepo: InstrumentedUserRepository): HeroesDesk = - HeroesDeskImpl(userRepo, InMemoryTaskRepository()) + HeroesDeskImpl(userRepo, InMemoryMissionRepository()) override fun instrumentedUserRepository(): InstrumentedUserRepository = InstrumentedInMemoryUserRepository() - override fun nonExistingRawTaskId(): String = InMemoryTaskRepository.NON_EXISTING_TASK_ID + override fun nonExistingRawMissionId(): String = InMemoryMissionRepository.NON_EXISTING_MISSION_ID } \ No newline at end of file diff --git a/heroesdesk-taskrepo-jooq-pg-adapter/build.gradle.kts b/heroesdesk-missionrepo-jooq-pg-adapter/build.gradle.kts similarity index 100% rename from heroesdesk-taskrepo-jooq-pg-adapter/build.gradle.kts rename to heroesdesk-missionrepo-jooq-pg-adapter/build.gradle.kts diff --git a/heroesdesk-taskrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/DefaultCatalog.java b/heroesdesk-missionrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/DefaultCatalog.java similarity index 100% rename from heroesdesk-taskrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/DefaultCatalog.java rename to heroesdesk-missionrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/DefaultCatalog.java diff --git a/heroesdesk-taskrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/Heroesdeskschema.java b/heroesdesk-missionrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/Heroesdeskschema.java similarity index 74% rename from heroesdesk-taskrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/Heroesdeskschema.java rename to heroesdesk-missionrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/Heroesdeskschema.java index 6d159ed..c85c2a4 100644 --- a/heroesdesk-taskrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/Heroesdeskschema.java +++ b/heroesdesk-missionrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/Heroesdeskschema.java @@ -7,10 +7,10 @@ import java.util.Arrays; import java.util.List; +import org.hexastacks.heroesdesk.kotlin.ports.pgjooq.tables.Mission; +import org.hexastacks.heroesdesk.kotlin.ports.pgjooq.tables.MissionUser; import org.hexastacks.heroesdesk.kotlin.ports.pgjooq.tables.Squad; import org.hexastacks.heroesdesk.kotlin.ports.pgjooq.tables.SquadUser; -import org.hexastacks.heroesdesk.kotlin.ports.pgjooq.tables.Task; -import org.hexastacks.heroesdesk.kotlin.ports.pgjooq.tables.TaskUser; import org.jooq.Catalog; import org.jooq.Table; import org.jooq.impl.SchemaImpl; @@ -30,24 +30,24 @@ public class Heroesdeskschema extends SchemaImpl { public static final Heroesdeskschema HEROESDESKSCHEMA = new Heroesdeskschema(); /** - * The table heroesdeskschema.Squad. + * The table heroesdeskschema.Mission. */ - public final Squad SQUAD = Squad.SQUAD; + public final Mission MISSION = Mission.MISSION; /** - * The table heroesdeskschema.Squad_User. + * The table heroesdeskschema.Mission_User. */ - public final SquadUser SQUAD_USER = SquadUser.SQUAD_USER; + public final MissionUser MISSION_USER = MissionUser.MISSION_USER; /** - * The table heroesdeskschema.Task. + * The table heroesdeskschema.Squad. */ - public final Task TASK = Task.TASK; + public final Squad SQUAD = Squad.SQUAD; /** - * The table heroesdeskschema.Task_User. + * The table heroesdeskschema.Squad_User. */ - public final TaskUser TASK_USER = TaskUser.TASK_USER; + public final SquadUser SQUAD_USER = SquadUser.SQUAD_USER; /** * No further instances allowed @@ -65,10 +65,10 @@ public Catalog getCatalog() { @Override public final List> getTables() { return Arrays.asList( + Mission.MISSION, + MissionUser.MISSION_USER, Squad.SQUAD, - SquadUser.SQUAD_USER, - Task.TASK, - TaskUser.TASK_USER + SquadUser.SQUAD_USER ); } } diff --git a/heroesdesk-taskrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/Keys.java b/heroesdesk-missionrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/Keys.java similarity index 62% rename from heroesdesk-taskrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/Keys.java rename to heroesdesk-missionrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/Keys.java index 941c10e..ca46dc5 100644 --- a/heroesdesk-taskrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/Keys.java +++ b/heroesdesk-missionrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/Keys.java @@ -4,14 +4,14 @@ package org.hexastacks.heroesdesk.kotlin.ports.pgjooq; +import org.hexastacks.heroesdesk.kotlin.ports.pgjooq.tables.Mission; +import org.hexastacks.heroesdesk.kotlin.ports.pgjooq.tables.MissionUser; import org.hexastacks.heroesdesk.kotlin.ports.pgjooq.tables.Squad; import org.hexastacks.heroesdesk.kotlin.ports.pgjooq.tables.SquadUser; -import org.hexastacks.heroesdesk.kotlin.ports.pgjooq.tables.Task; -import org.hexastacks.heroesdesk.kotlin.ports.pgjooq.tables.TaskUser; +import org.hexastacks.heroesdesk.kotlin.ports.pgjooq.tables.records.MissionRecord; +import org.hexastacks.heroesdesk.kotlin.ports.pgjooq.tables.records.MissionUserRecord; import org.hexastacks.heroesdesk.kotlin.ports.pgjooq.tables.records.SquadRecord; import org.hexastacks.heroesdesk.kotlin.ports.pgjooq.tables.records.SquadUserRecord; -import org.hexastacks.heroesdesk.kotlin.ports.pgjooq.tables.records.TaskRecord; -import org.hexastacks.heroesdesk.kotlin.ports.pgjooq.tables.records.TaskUserRecord; import org.jooq.ForeignKey; import org.jooq.TableField; import org.jooq.UniqueKey; @@ -30,17 +30,17 @@ public class Keys { // UNIQUE and PRIMARY KEY definitions // ------------------------------------------------------------------------- + public static final UniqueKey PK_MISSION = Internal.createUniqueKey(Mission.MISSION, DSL.name("PK_Mission"), new TableField[] { Mission.MISSION.ID }, true); + public static final UniqueKey PK_MISSION_USER = Internal.createUniqueKey(MissionUser.MISSION_USER, DSL.name("PK_Mission_User"), new TableField[] { MissionUser.MISSION_USER.MISSION_ID, MissionUser.MISSION_USER.USER_ID }, true); public static final UniqueKey CHK_NAME_UNIQUE = Internal.createUniqueKey(Squad.SQUAD, DSL.name("CHK_name_UNIQUE"), new TableField[] { Squad.SQUAD.NAME }, true); - public static final UniqueKey PK_SQUAD = Internal.createUniqueKey(Squad.SQUAD, DSL.name("PK_SQUAD"), new TableField[] { Squad.SQUAD.KEY }, true); + public static final UniqueKey PK_SQUAD = Internal.createUniqueKey(Squad.SQUAD, DSL.name("PK_Squad"), new TableField[] { Squad.SQUAD.KEY }, true); public static final UniqueKey PK_SQUAD_USER = Internal.createUniqueKey(SquadUser.SQUAD_USER, DSL.name("PK_Squad_User"), new TableField[] { SquadUser.SQUAD_USER.SQUAD_KEY, SquadUser.SQUAD_USER.USER_ID }, true); - public static final UniqueKey PK_TASK = Internal.createUniqueKey(Task.TASK, DSL.name("PK_Task"), new TableField[] { Task.TASK.ID }, true); - public static final UniqueKey PK_TASK_USER = Internal.createUniqueKey(TaskUser.TASK_USER, DSL.name("PK_Task_User"), new TableField[] { TaskUser.TASK_USER.TASK_ID, TaskUser.TASK_USER.USER_ID }, true); // ------------------------------------------------------------------------- // FOREIGN KEY definitions // ------------------------------------------------------------------------- + public static final ForeignKey MISSION__FK_SQUAD_KEY = Internal.createForeignKey(Mission.MISSION, DSL.name("FK_squad_key"), new TableField[] { Mission.MISSION.SQUAD_KEY }, Keys.PK_SQUAD, new TableField[] { Squad.SQUAD.KEY }, true); + public static final ForeignKey MISSION_USER__FK_MISSION = Internal.createForeignKey(MissionUser.MISSION_USER, DSL.name("FK_Mission"), new TableField[] { MissionUser.MISSION_USER.MISSION_ID }, Keys.PK_MISSION, new TableField[] { Mission.MISSION.ID }, true); public static final ForeignKey SQUAD_USER__FK_SQUAD = Internal.createForeignKey(SquadUser.SQUAD_USER, DSL.name("FK_Squad"), new TableField[] { SquadUser.SQUAD_USER.SQUAD_KEY }, Keys.PK_SQUAD, new TableField[] { Squad.SQUAD.KEY }, true); - public static final ForeignKey TASK__FK_SQUAD_KEY = Internal.createForeignKey(Task.TASK, DSL.name("FK_squad_key"), new TableField[] { Task.TASK.SQUAD_KEY }, Keys.PK_SQUAD, new TableField[] { Squad.SQUAD.KEY }, true); - public static final ForeignKey TASK_USER__FK_TASK = Internal.createForeignKey(TaskUser.TASK_USER, DSL.name("FK_Task"), new TableField[] { TaskUser.TASK_USER.TASK_ID }, Keys.PK_TASK, new TableField[] { Task.TASK.ID }, true); } diff --git a/heroesdesk-taskrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/Tables.java b/heroesdesk-missionrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/Tables.java similarity index 63% rename from heroesdesk-taskrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/Tables.java rename to heroesdesk-missionrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/Tables.java index 07c6924..6699371 100644 --- a/heroesdesk-taskrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/Tables.java +++ b/heroesdesk-missionrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/Tables.java @@ -4,10 +4,10 @@ package org.hexastacks.heroesdesk.kotlin.ports.pgjooq; +import org.hexastacks.heroesdesk.kotlin.ports.pgjooq.tables.Mission; +import org.hexastacks.heroesdesk.kotlin.ports.pgjooq.tables.MissionUser; import org.hexastacks.heroesdesk.kotlin.ports.pgjooq.tables.Squad; import org.hexastacks.heroesdesk.kotlin.ports.pgjooq.tables.SquadUser; -import org.hexastacks.heroesdesk.kotlin.ports.pgjooq.tables.Task; -import org.hexastacks.heroesdesk.kotlin.ports.pgjooq.tables.TaskUser; /** @@ -17,22 +17,22 @@ public class Tables { /** - * The table heroesdeskschema.Squad. + * The table heroesdeskschema.Mission. */ - public static final Squad SQUAD = Squad.SQUAD; + public static final Mission MISSION = Mission.MISSION; /** - * The table heroesdeskschema.Squad_User. + * The table heroesdeskschema.Mission_User. */ - public static final SquadUser SQUAD_USER = SquadUser.SQUAD_USER; + public static final MissionUser MISSION_USER = MissionUser.MISSION_USER; /** - * The table heroesdeskschema.Task. + * The table heroesdeskschema.Squad. */ - public static final Task TASK = Task.TASK; + public static final Squad SQUAD = Squad.SQUAD; /** - * The table heroesdeskschema.Task_User. + * The table heroesdeskschema.Squad_User. */ - public static final TaskUser TASK_USER = TaskUser.TASK_USER; + public static final SquadUser SQUAD_USER = SquadUser.SQUAD_USER; } diff --git a/heroesdesk-taskrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/enums/Taskstatus.java b/heroesdesk-missionrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/enums/Missionstatus.java similarity index 77% rename from heroesdesk-taskrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/enums/Taskstatus.java rename to heroesdesk-missionrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/enums/Missionstatus.java index cc2b3a3..ad3d841 100644 --- a/heroesdesk-taskrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/enums/Taskstatus.java +++ b/heroesdesk-missionrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/enums/Missionstatus.java @@ -14,7 +14,7 @@ * This class is generated by jOOQ. */ @SuppressWarnings({ "all", "unchecked", "rawtypes" }) -public enum Taskstatus implements EnumType { +public enum Missionstatus implements EnumType { Pending("Pending"), @@ -24,7 +24,7 @@ public enum Taskstatus implements EnumType { private final String literal; - private Taskstatus(String literal) { + private Missionstatus(String literal) { this.literal = literal; } @@ -40,7 +40,7 @@ public Schema getSchema() { @Override public String getName() { - return "taskstatus"; + return "missionstatus"; } @Override @@ -51,7 +51,7 @@ public String getLiteral() { /** * Lookup a value of this EnumType by its literal */ - public static Taskstatus lookupLiteral(String literal) { - return EnumType.lookupLiteral(Taskstatus.class, literal); + public static Missionstatus lookupLiteral(String literal) { + return EnumType.lookupLiteral(Missionstatus.class, literal); } } diff --git a/heroesdesk-missionrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/tables/Mission.java b/heroesdesk-missionrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/tables/Mission.java new file mode 100644 index 0000000..dec9cb5 --- /dev/null +++ b/heroesdesk-missionrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/tables/Mission.java @@ -0,0 +1,213 @@ +/* + * This file is generated by jOOQ. + */ +package org.hexastacks.heroesdesk.kotlin.ports.pgjooq.tables; + + +import java.util.Arrays; +import java.util.List; +import java.util.function.Function; + +import org.hexastacks.heroesdesk.kotlin.ports.pgjooq.Heroesdeskschema; +import org.hexastacks.heroesdesk.kotlin.ports.pgjooq.Keys; +import org.hexastacks.heroesdesk.kotlin.ports.pgjooq.enums.Missionstatus; +import org.hexastacks.heroesdesk.kotlin.ports.pgjooq.tables.records.MissionRecord; +import org.jooq.Check; +import org.jooq.Field; +import org.jooq.ForeignKey; +import org.jooq.Function5; +import org.jooq.Name; +import org.jooq.Record; +import org.jooq.Records; +import org.jooq.Row5; +import org.jooq.Schema; +import org.jooq.SelectField; +import org.jooq.Table; +import org.jooq.TableField; +import org.jooq.TableOptions; +import org.jooq.UniqueKey; +import org.jooq.impl.DSL; +import org.jooq.impl.Internal; +import org.jooq.impl.SQLDataType; +import org.jooq.impl.TableImpl; + + +/** + * This class is generated by jOOQ. + */ +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class Mission extends TableImpl { + + private static final long serialVersionUID = 1L; + + /** + * The reference instance of heroesdeskschema.Mission + */ + public static final Mission MISSION = new Mission(); + + /** + * The class holding records for this type + */ + @Override + public Class getRecordType() { + return MissionRecord.class; + } + + /** + * The column heroesdeskschema.Mission.id. + */ + public final TableField ID = createField(DSL.name("id"), SQLDataType.VARCHAR(36).nullable(false), this, ""); + + /** + * The column heroesdeskschema.Mission.squad_key. + */ + public final TableField SQUAD_KEY = createField(DSL.name("squad_key"), SQLDataType.VARCHAR(36).nullable(false), this, ""); + + /** + * The column heroesdeskschema.Mission.title. + */ + public final TableField TITLE = createField(DSL.name("title"), SQLDataType.VARCHAR(255).nullable(false), this, ""); + + /** + * The column heroesdeskschema.Mission.description. + */ + public final TableField DESCRIPTION = createField(DSL.name("description"), SQLDataType.VARCHAR(1024).nullable(false).defaultValue(DSL.field(DSL.raw("''::character varying"), SQLDataType.VARCHAR)), this, ""); + + /** + * The column heroesdeskschema.Mission.status. + */ + public final TableField STATUS = createField(DSL.name("status"), SQLDataType.VARCHAR.nullable(false).defaultValue(DSL.field(DSL.raw("'Pending'::heroesdeskschema.missionstatus"), SQLDataType.VARCHAR)).asEnumDataType(org.hexastacks.heroesdesk.kotlin.ports.pgjooq.enums.Missionstatus.class), this, ""); + + private Mission(Name alias, Table aliased) { + this(alias, aliased, null); + } + + private Mission(Name alias, Table aliased, Field[] parameters) { + super(alias, null, aliased, parameters, DSL.comment(""), TableOptions.table()); + } + + /** + * Create an aliased heroesdeskschema.Mission table reference + */ + public Mission(String alias) { + this(DSL.name(alias), MISSION); + } + + /** + * Create an aliased heroesdeskschema.Mission table reference + */ + public Mission(Name alias) { + this(alias, MISSION); + } + + /** + * Create a heroesdeskschema.Mission table reference + */ + public Mission() { + this(DSL.name("Mission"), null); + } + + public Mission(Table child, ForeignKey key) { + super(child, key, MISSION); + } + + @Override + public Schema getSchema() { + return aliased() ? null : Heroesdeskschema.HEROESDESKSCHEMA; + } + + @Override + public UniqueKey getPrimaryKey() { + return Keys.PK_MISSION; + } + + @Override + public List> getReferences() { + return Arrays.asList(Keys.MISSION__FK_SQUAD_KEY); + } + + private transient Squad _squad; + + /** + * Get the implicit join path to the heroesdeskschema.Squad + * table. + */ + public Squad squad() { + if (_squad == null) + _squad = new Squad(this, Keys.MISSION__FK_SQUAD_KEY); + + return _squad; + } + + @Override + public List> getChecks() { + return Arrays.asList( + Internal.createCheck(this, DSL.name("CHK_description_MIN_LENGTH"), "((char_length('title'::text) >= 0))", true), + Internal.createCheck(this, DSL.name("CHK_id_MIN_LENGTH"), "((char_length('id'::text) >= 1))", true), + Internal.createCheck(this, DSL.name("CHK_title_MIN_LENGTH"), "((char_length('title'::text) >= 1))", true) + ); + } + + @Override + public Mission as(String alias) { + return new Mission(DSL.name(alias), this); + } + + @Override + public Mission as(Name alias) { + return new Mission(alias, this); + } + + @Override + public Mission as(Table alias) { + return new Mission(alias.getQualifiedName(), this); + } + + /** + * Rename this table + */ + @Override + public Mission rename(String name) { + return new Mission(DSL.name(name), null); + } + + /** + * Rename this table + */ + @Override + public Mission rename(Name name) { + return new Mission(name, null); + } + + /** + * Rename this table + */ + @Override + public Mission rename(Table name) { + return new Mission(name.getQualifiedName(), null); + } + + // ------------------------------------------------------------------------- + // Row5 type methods + // ------------------------------------------------------------------------- + + @Override + public Row5 fieldsRow() { + return (Row5) super.fieldsRow(); + } + + /** + * Convenience mapping calling {@link SelectField#convertFrom(Function)}. + */ + public SelectField mapping(Function5 from) { + return convertFrom(Records.mapping(from)); + } + + /** + * Convenience mapping calling {@link SelectField#convertFrom(Class, + * Function)}. + */ + public SelectField mapping(Class toType, Function5 from) { + return convertFrom(toType, Records.mapping(from)); + } +} diff --git a/heroesdesk-taskrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/tables/TaskUser.java b/heroesdesk-missionrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/tables/MissionUser.java similarity index 50% rename from heroesdesk-taskrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/tables/TaskUser.java rename to heroesdesk-missionrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/tables/MissionUser.java index bc28aed..f145b8b 100644 --- a/heroesdesk-taskrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/tables/TaskUser.java +++ b/heroesdesk-missionrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/tables/MissionUser.java @@ -10,7 +10,7 @@ import org.hexastacks.heroesdesk.kotlin.ports.pgjooq.Heroesdeskschema; import org.hexastacks.heroesdesk.kotlin.ports.pgjooq.Keys; -import org.hexastacks.heroesdesk.kotlin.ports.pgjooq.tables.records.TaskUserRecord; +import org.hexastacks.heroesdesk.kotlin.ports.pgjooq.tables.records.MissionUserRecord; import org.jooq.Field; import org.jooq.ForeignKey; import org.jooq.Function2; @@ -33,64 +33,66 @@ * This class is generated by jOOQ. */ @SuppressWarnings({ "all", "unchecked", "rawtypes" }) -public class TaskUser extends TableImpl { +public class MissionUser extends TableImpl { private static final long serialVersionUID = 1L; /** - * The reference instance of heroesdeskschema.Task_User + * The reference instance of heroesdeskschema.Mission_User */ - public static final TaskUser TASK_USER = new TaskUser(); + public static final MissionUser MISSION_USER = new MissionUser(); /** * The class holding records for this type */ @Override - public Class getRecordType() { - return TaskUserRecord.class; + public Class getRecordType() { + return MissionUserRecord.class; } /** - * The column heroesdeskschema.Task_User.task_id. + * The column heroesdeskschema.Mission_User.mission_id. */ - public final TableField TASK_ID = createField(DSL.name("task_id"), SQLDataType.VARCHAR(36).nullable(false), this, ""); + public final TableField MISSION_ID = createField(DSL.name("mission_id"), SQLDataType.VARCHAR(36).nullable(false), this, ""); /** - * The column heroesdeskschema.Task_User.user_id. + * The column heroesdeskschema.Mission_User.user_id. */ - public final TableField USER_ID = createField(DSL.name("user_id"), SQLDataType.VARCHAR(36).nullable(false), this, ""); + public final TableField USER_ID = createField(DSL.name("user_id"), SQLDataType.VARCHAR(36).nullable(false), this, ""); - private TaskUser(Name alias, Table aliased) { + private MissionUser(Name alias, Table aliased) { this(alias, aliased, null); } - private TaskUser(Name alias, Table aliased, Field[] parameters) { + private MissionUser(Name alias, Table aliased, Field[] parameters) { super(alias, null, aliased, parameters, DSL.comment(""), TableOptions.table()); } /** - * Create an aliased heroesdeskschema.Task_User table reference + * Create an aliased heroesdeskschema.Mission_User table + * reference */ - public TaskUser(String alias) { - this(DSL.name(alias), TASK_USER); + public MissionUser(String alias) { + this(DSL.name(alias), MISSION_USER); } /** - * Create an aliased heroesdeskschema.Task_User table reference + * Create an aliased heroesdeskschema.Mission_User table + * reference */ - public TaskUser(Name alias) { - this(alias, TASK_USER); + public MissionUser(Name alias) { + this(alias, MISSION_USER); } /** - * Create a heroesdeskschema.Task_User table reference + * Create a heroesdeskschema.Mission_User table reference */ - public TaskUser() { - this(DSL.name("Task_User"), null); + public MissionUser() { + this(DSL.name("Mission_User"), null); } - public TaskUser(Table child, ForeignKey key) { - super(child, key, TASK_USER); + public MissionUser(Table child, ForeignKey key) { + super(child, key, MISSION_USER); } @Override @@ -99,65 +101,65 @@ public Schema getSchema() { } @Override - public UniqueKey getPrimaryKey() { - return Keys.PK_TASK_USER; + public UniqueKey getPrimaryKey() { + return Keys.PK_MISSION_USER; } @Override - public List> getReferences() { - return Arrays.asList(Keys.TASK_USER__FK_TASK); + public List> getReferences() { + return Arrays.asList(Keys.MISSION_USER__FK_MISSION); } - private transient Task _task; + private transient Mission _mission; /** - * Get the implicit join path to the heroesdeskschema.Task + * Get the implicit join path to the heroesdeskschema.Mission * table. */ - public Task task() { - if (_task == null) - _task = new Task(this, Keys.TASK_USER__FK_TASK); + public Mission mission() { + if (_mission == null) + _mission = new Mission(this, Keys.MISSION_USER__FK_MISSION); - return _task; + return _mission; } @Override - public TaskUser as(String alias) { - return new TaskUser(DSL.name(alias), this); + public MissionUser as(String alias) { + return new MissionUser(DSL.name(alias), this); } @Override - public TaskUser as(Name alias) { - return new TaskUser(alias, this); + public MissionUser as(Name alias) { + return new MissionUser(alias, this); } @Override - public TaskUser as(Table alias) { - return new TaskUser(alias.getQualifiedName(), this); + public MissionUser as(Table alias) { + return new MissionUser(alias.getQualifiedName(), this); } /** * Rename this table */ @Override - public TaskUser rename(String name) { - return new TaskUser(DSL.name(name), null); + public MissionUser rename(String name) { + return new MissionUser(DSL.name(name), null); } /** * Rename this table */ @Override - public TaskUser rename(Name name) { - return new TaskUser(name, null); + public MissionUser rename(Name name) { + return new MissionUser(name, null); } /** * Rename this table */ @Override - public TaskUser rename(Table name) { - return new TaskUser(name.getQualifiedName(), null); + public MissionUser rename(Table name) { + return new MissionUser(name.getQualifiedName(), null); } // ------------------------------------------------------------------------- diff --git a/heroesdesk-taskrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/tables/Squad.java b/heroesdesk-missionrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/tables/Squad.java similarity index 100% rename from heroesdesk-taskrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/tables/Squad.java rename to heroesdesk-missionrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/tables/Squad.java diff --git a/heroesdesk-taskrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/tables/SquadUser.java b/heroesdesk-missionrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/tables/SquadUser.java similarity index 100% rename from heroesdesk-taskrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/tables/SquadUser.java rename to heroesdesk-missionrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/tables/SquadUser.java diff --git a/heroesdesk-taskrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/tables/records/TaskRecord.java b/heroesdesk-missionrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/tables/records/MissionRecord.java similarity index 62% rename from heroesdesk-taskrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/tables/records/TaskRecord.java rename to heroesdesk-missionrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/tables/records/MissionRecord.java index e0a231b..27a906e 100644 --- a/heroesdesk-taskrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/tables/records/TaskRecord.java +++ b/heroesdesk-missionrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/tables/records/MissionRecord.java @@ -4,8 +4,8 @@ package org.hexastacks.heroesdesk.kotlin.ports.pgjooq.tables.records; -import org.hexastacks.heroesdesk.kotlin.ports.pgjooq.enums.Taskstatus; -import org.hexastacks.heroesdesk.kotlin.ports.pgjooq.tables.Task; +import org.hexastacks.heroesdesk.kotlin.ports.pgjooq.enums.Missionstatus; +import org.hexastacks.heroesdesk.kotlin.ports.pgjooq.tables.Mission; import org.jooq.Field; import org.jooq.Record1; import org.jooq.Record5; @@ -17,78 +17,78 @@ * This class is generated by jOOQ. */ @SuppressWarnings({ "all", "unchecked", "rawtypes" }) -public class TaskRecord extends UpdatableRecordImpl implements Record5 { +public class MissionRecord extends UpdatableRecordImpl implements Record5 { private static final long serialVersionUID = 1L; /** - * Setter for heroesdeskschema.Task.id. + * Setter for heroesdeskschema.Mission.id. */ public void setId(String value) { set(0, value); } /** - * Getter for heroesdeskschema.Task.id. + * Getter for heroesdeskschema.Mission.id. */ public String getId() { return (String) get(0); } /** - * Setter for heroesdeskschema.Task.squad_key. + * Setter for heroesdeskschema.Mission.squad_key. */ public void setSquadKey(String value) { set(1, value); } /** - * Getter for heroesdeskschema.Task.squad_key. + * Getter for heroesdeskschema.Mission.squad_key. */ public String getSquadKey() { return (String) get(1); } /** - * Setter for heroesdeskschema.Task.title. + * Setter for heroesdeskschema.Mission.title. */ public void setTitle(String value) { set(2, value); } /** - * Getter for heroesdeskschema.Task.title. + * Getter for heroesdeskschema.Mission.title. */ public String getTitle() { return (String) get(2); } /** - * Setter for heroesdeskschema.Task.description. + * Setter for heroesdeskschema.Mission.description. */ public void setDescription(String value) { set(3, value); } /** - * Getter for heroesdeskschema.Task.description. + * Getter for heroesdeskschema.Mission.description. */ public String getDescription() { return (String) get(3); } /** - * Setter for heroesdeskschema.Task.status. + * Setter for heroesdeskschema.Mission.status. */ - public void setStatus(Taskstatus value) { + public void setStatus(Missionstatus value) { set(4, value); } /** - * Getter for heroesdeskschema.Task.status. + * Getter for heroesdeskschema.Mission.status. */ - public Taskstatus getStatus() { - return (Taskstatus) get(4); + public Missionstatus getStatus() { + return (Missionstatus) get(4); } // ------------------------------------------------------------------------- @@ -105,38 +105,38 @@ public Record1 key() { // ------------------------------------------------------------------------- @Override - public Row5 fieldsRow() { + public Row5 fieldsRow() { return (Row5) super.fieldsRow(); } @Override - public Row5 valuesRow() { + public Row5 valuesRow() { return (Row5) super.valuesRow(); } @Override public Field field1() { - return Task.TASK.ID; + return Mission.MISSION.ID; } @Override public Field field2() { - return Task.TASK.SQUAD_KEY; + return Mission.MISSION.SQUAD_KEY; } @Override public Field field3() { - return Task.TASK.TITLE; + return Mission.MISSION.TITLE; } @Override public Field field4() { - return Task.TASK.DESCRIPTION; + return Mission.MISSION.DESCRIPTION; } @Override - public Field field5() { - return Task.TASK.STATUS; + public Field field5() { + return Mission.MISSION.STATUS; } @Override @@ -160,7 +160,7 @@ public String component4() { } @Override - public Taskstatus component5() { + public Missionstatus component5() { return getStatus(); } @@ -185,42 +185,42 @@ public String value4() { } @Override - public Taskstatus value5() { + public Missionstatus value5() { return getStatus(); } @Override - public TaskRecord value1(String value) { + public MissionRecord value1(String value) { setId(value); return this; } @Override - public TaskRecord value2(String value) { + public MissionRecord value2(String value) { setSquadKey(value); return this; } @Override - public TaskRecord value3(String value) { + public MissionRecord value3(String value) { setTitle(value); return this; } @Override - public TaskRecord value4(String value) { + public MissionRecord value4(String value) { setDescription(value); return this; } @Override - public TaskRecord value5(Taskstatus value) { + public MissionRecord value5(Missionstatus value) { setStatus(value); return this; } @Override - public TaskRecord values(String value1, String value2, String value3, String value4, Taskstatus value5) { + public MissionRecord values(String value1, String value2, String value3, String value4, Missionstatus value5) { value1(value1); value2(value2); value3(value3); @@ -234,17 +234,17 @@ public TaskRecord values(String value1, String value2, String value3, String val // ------------------------------------------------------------------------- /** - * Create a detached TaskRecord + * Create a detached MissionRecord */ - public TaskRecord() { - super(Task.TASK); + public MissionRecord() { + super(Mission.MISSION); } /** - * Create a detached, initialised TaskRecord + * Create a detached, initialised MissionRecord */ - public TaskRecord(String id, String squadKey, String title, String description, Taskstatus status) { - super(Task.TASK); + public MissionRecord(String id, String squadKey, String title, String description, Missionstatus status) { + super(Mission.MISSION); setId(id); setSquadKey(squadKey); diff --git a/heroesdesk-taskrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/tables/records/TaskUserRecord.java b/heroesdesk-missionrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/tables/records/MissionUserRecord.java similarity index 64% rename from heroesdesk-taskrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/tables/records/TaskUserRecord.java rename to heroesdesk-missionrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/tables/records/MissionUserRecord.java index aae3813..9639242 100644 --- a/heroesdesk-taskrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/tables/records/TaskUserRecord.java +++ b/heroesdesk-missionrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/tables/records/MissionUserRecord.java @@ -4,7 +4,7 @@ package org.hexastacks.heroesdesk.kotlin.ports.pgjooq.tables.records; -import org.hexastacks.heroesdesk.kotlin.ports.pgjooq.tables.TaskUser; +import org.hexastacks.heroesdesk.kotlin.ports.pgjooq.tables.MissionUser; import org.jooq.Field; import org.jooq.Record2; import org.jooq.Row2; @@ -15,33 +15,33 @@ * This class is generated by jOOQ. */ @SuppressWarnings({ "all", "unchecked", "rawtypes" }) -public class TaskUserRecord extends UpdatableRecordImpl implements Record2 { +public class MissionUserRecord extends UpdatableRecordImpl implements Record2 { private static final long serialVersionUID = 1L; /** - * Setter for heroesdeskschema.Task_User.task_id. + * Setter for heroesdeskschema.Mission_User.mission_id. */ - public void setTaskId(String value) { + public void setMissionId(String value) { set(0, value); } /** - * Getter for heroesdeskschema.Task_User.task_id. + * Getter for heroesdeskschema.Mission_User.mission_id. */ - public String getTaskId() { + public String getMissionId() { return (String) get(0); } /** - * Setter for heroesdeskschema.Task_User.user_id. + * Setter for heroesdeskschema.Mission_User.user_id. */ public void setUserId(String value) { set(1, value); } /** - * Getter for heroesdeskschema.Task_User.user_id. + * Getter for heroesdeskschema.Mission_User.user_id. */ public String getUserId() { return (String) get(1); @@ -72,17 +72,17 @@ public Row2 valuesRow() { @Override public Field field1() { - return TaskUser.TASK_USER.TASK_ID; + return MissionUser.MISSION_USER.MISSION_ID; } @Override public Field field2() { - return TaskUser.TASK_USER.USER_ID; + return MissionUser.MISSION_USER.USER_ID; } @Override public String component1() { - return getTaskId(); + return getMissionId(); } @Override @@ -92,7 +92,7 @@ public String component2() { @Override public String value1() { - return getTaskId(); + return getMissionId(); } @Override @@ -101,19 +101,19 @@ public String value2() { } @Override - public TaskUserRecord value1(String value) { - setTaskId(value); + public MissionUserRecord value1(String value) { + setMissionId(value); return this; } @Override - public TaskUserRecord value2(String value) { + public MissionUserRecord value2(String value) { setUserId(value); return this; } @Override - public TaskUserRecord values(String value1, String value2) { + public MissionUserRecord values(String value1, String value2) { value1(value1); value2(value2); return this; @@ -124,19 +124,19 @@ public TaskUserRecord values(String value1, String value2) { // ------------------------------------------------------------------------- /** - * Create a detached TaskUserRecord + * Create a detached MissionUserRecord */ - public TaskUserRecord() { - super(TaskUser.TASK_USER); + public MissionUserRecord() { + super(MissionUser.MISSION_USER); } /** - * Create a detached, initialised TaskUserRecord + * Create a detached, initialised MissionUserRecord */ - public TaskUserRecord(String taskId, String userId) { - super(TaskUser.TASK_USER); + public MissionUserRecord(String missionId, String userId) { + super(MissionUser.MISSION_USER); - setTaskId(taskId); + setMissionId(missionId); setUserId(userId); resetChangedOnNotNull(); } diff --git a/heroesdesk-taskrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/tables/records/SquadRecord.java b/heroesdesk-missionrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/tables/records/SquadRecord.java similarity index 100% rename from heroesdesk-taskrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/tables/records/SquadRecord.java rename to heroesdesk-missionrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/tables/records/SquadRecord.java diff --git a/heroesdesk-taskrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/tables/records/SquadUserRecord.java b/heroesdesk-missionrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/tables/records/SquadUserRecord.java similarity index 100% rename from heroesdesk-taskrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/tables/records/SquadUserRecord.java rename to heroesdesk-missionrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/tables/records/SquadUserRecord.java diff --git a/heroesdesk-taskrepo-jooq-pg-adapter/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/PgJooqTaskRepository.kt b/heroesdesk-missionrepo-jooq-pg-adapter/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/PgJooqMissionRepository.kt similarity index 55% rename from heroesdesk-taskrepo-jooq-pg-adapter/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/PgJooqTaskRepository.kt rename to heroesdesk-missionrepo-jooq-pg-adapter/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/PgJooqMissionRepository.kt index 6e8bd24..a030e8d 100644 --- a/heroesdesk-taskrepo-jooq-pg-adapter/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/PgJooqTaskRepository.kt +++ b/heroesdesk-missionrepo-jooq-pg-adapter/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/PgJooqMissionRepository.kt @@ -9,13 +9,13 @@ import org.hexastacks.heroesdesk.kotlin.squad.Name import org.hexastacks.heroesdesk.kotlin.squad.Squad import org.hexastacks.heroesdesk.kotlin.squad.SquadKey import org.hexastacks.heroesdesk.kotlin.squad.SquadMembers -import org.hexastacks.heroesdesk.kotlin.impl.task.* -import org.hexastacks.heroesdesk.kotlin.impl.user.HeroId -import org.hexastacks.heroesdesk.kotlin.impl.user.HeroIds -import org.hexastacks.heroesdesk.kotlin.impl.user.Heroes -import org.hexastacks.heroesdesk.kotlin.ports.TaskRepository +import org.hexastacks.heroesdesk.kotlin.user.HeroId +import org.hexastacks.heroesdesk.kotlin.user.HeroIds +import org.hexastacks.heroesdesk.kotlin.user.Heroes +import org.hexastacks.heroesdesk.kotlin.mission.* +import org.hexastacks.heroesdesk.kotlin.ports.MissionRepository import org.hexastacks.heroesdesk.kotlin.ports.pgjooq.Tables.* -import org.hexastacks.heroesdesk.kotlin.ports.pgjooq.enums.Taskstatus +import org.hexastacks.heroesdesk.kotlin.ports.pgjooq.enums.Missionstatus import org.hexastacks.heroesdesk.kotlin.ports.pgjooq.tables.records.SquadRecord import org.jooq.DSLContext import org.jooq.Record6 @@ -24,7 +24,7 @@ import org.jooq.exception.DataAccessException import org.jooq.exception.IntegrityConstraintViolationException import java.util.* -class PgJooqTaskRepository(private val dslContext: DSLContext) : TaskRepository { +class PgJooqMissionRepository(private val dslContext: DSLContext) : MissionRepository { override fun createSquad(squadKey: SquadKey, name: Name): EitherNel = try { val execute = dslContext.insertInto(SQUAD) @@ -32,7 +32,7 @@ class PgJooqTaskRepository(private val dslContext: DSLContext) : TaskRepository .set(SQUAD.NAME, name.value) .execute() if (execute != 1) - Left(nonEmptyListOf(TaskRepositoryError("Insert failed"))) + Left(nonEmptyListOf(MissionRepositoryError("Insert failed"))) else Right(Squad(name, squadKey)) } catch (e: DataAccessException) { @@ -41,7 +41,7 @@ class PgJooqTaskRepository(private val dslContext: DSLContext) : TaskRepository else if (e is IntegrityConstraintViolationException && e.message?.contains("""ERROR: duplicate key value violates unique constraint "${Keys.PK_SQUAD.name}"""") ?: false) Left(nonEmptyListOf(SquadKeyAlreadyExistingError(squadKey))) else - Left(nonEmptyListOf(TaskRepositoryError(e))) + Left(nonEmptyListOf(MissionRepositoryError(e))) } override fun getSquad(squadKey: SquadKey): EitherNel = @@ -52,13 +52,13 @@ class PgJooqTaskRepository(private val dslContext: DSLContext) : TaskRepository ?.let { Name(it.name) .mapLeft { errors -> - errors.map { error -> TaskRepositoryError(error) } + errors.map { error -> MissionRepositoryError(error) } } .map { name -> Squad(name, squadKey) } } ?: Left(nonEmptyListOf(SquadNotExistingError(squadKey))) } catch (e: DataAccessException) { - Left(nonEmptyListOf(TaskRepositoryError(e))) + Left(nonEmptyListOf(MissionRepositoryError(e))) } override fun getSquadMembers(squadKey: SquadKey): EitherNel = @@ -72,10 +72,10 @@ class PgJooqTaskRepository(private val dslContext: DSLContext) : TaskRepository .toList() .let { either { it.bindAll() } } .mapLeft { errors -> - errors.map { error -> TaskRepositoryError(error) } + errors.map { error -> MissionRepositoryError(error) } }.map { heroIds -> SquadMembers(squadKey, HeroIds(heroIds)) }) } catch (e: DataAccessException) { - Left(nonEmptyListOf(TaskRepositoryError(e))) + Left(nonEmptyListOf(MissionRepositoryError(e))) } override fun updateSquadName(squadKey: SquadKey, name: Name): EitherNel = @@ -88,7 +88,7 @@ class PgJooqTaskRepository(private val dslContext: DSLContext) : TaskRepository ?.let { Right(it) } ?: Left(nonEmptyListOf(SquadNotExistingError(squadKey))) } catch (e: DataAccessException) { - Left(nonEmptyListOf(TaskRepositoryError(e))) + Left(nonEmptyListOf(MissionRepositoryError(e))) } override fun assignSquad( @@ -111,12 +111,12 @@ class PgJooqTaskRepository(private val dslContext: DSLContext) : TaskRepository } .execute() if (nbUpdate != assignees.size) - Left(nonEmptyListOf(TaskRepositoryError("Only $nbUpdate updated on ${assignees.size}"))) + Left(nonEmptyListOf(MissionRepositoryError("Only $nbUpdate updated on ${assignees.size}"))) else Right(SquadMembers(squadKey, HeroIds(assignees.map { it.id }))) } } catch (e: DataAccessException) { - Left(nonEmptyListOf(TaskRepositoryError(e))) + Left(nonEmptyListOf(MissionRepositoryError(e))) } private fun isSquadNotExisting(squadKey: SquadKey) = !dslContext.fetchExists( @@ -143,7 +143,7 @@ class PgJooqTaskRepository(private val dslContext: DSLContext) : TaskRepository .toList() .let { either { it.bindAll() } } .mapLeft { errors -> - errors.map { error -> TaskRepositoryError(error) } + errors.map { error -> MissionRepositoryError(error) } } .flatMap { fetchedHeroIds: List -> if (fetchedHeroIds.size == heroIds.size) @@ -161,64 +161,64 @@ class PgJooqTaskRepository(private val dslContext: DSLContext) : TaskRepository } } } catch (e: DataAccessException) { - if (e is IntegrityConstraintViolationException && e.message?.contains("ERROR: insert or update on table \"$TASK_USER.name\" violates foreign key constraint \"${Keys.TASK_USER__FK_TASK}\"") ?: false) + if (e is IntegrityConstraintViolationException && e.message?.contains("ERROR: insert or update on table \"$MISSION_USER.name\" violates foreign key constraint \"${Keys.MISSION_USER__FK_MISSION}\"") ?: false) Left(nonEmptyListOf(HeroesNotInSquadError(heroIds, squadKey))) else - Left(nonEmptyListOf(TaskRepositoryError(e))) + Left(nonEmptyListOf(MissionRepositoryError(e))) } - override fun createTask( + override fun createMission( squadKey: SquadKey, title: Title - ): EitherNel = + ): EitherNel = try { val id = UUID.randomUUID().toString() - dslContext.insertInto(TASK) - .set(TASK.ID, id) - .set(TASK.SQUAD_KEY, squadKey.value) - .set(TASK.TITLE, title.value) - .set(TASK.STATUS, Taskstatus.Pending) + dslContext.insertInto(MISSION) + .set(MISSION.ID, id) + .set(MISSION.SQUAD_KEY, squadKey.value) + .set(MISSION.TITLE, title.value) + .set(MISSION.STATUS, Missionstatus.Pending) .returning() - .fetchOneInto(TASK) - ?.let { task -> - SquadKey(task.squadKey) - .flatMap { dbSquadKey -> PendingTaskId(dbSquadKey, task.id) } + .fetchOneInto(MISSION) + ?.let { mission -> + SquadKey(mission.squadKey) + .flatMap { dbSquadKey -> PendingMissionId(dbSquadKey, mission.id) } .mapLeft { errors -> - errors.map { error -> TaskRepositoryError(error) } + errors.map { error -> MissionRepositoryError(error) } } .map { id -> - PendingTask(id, title) + PendingMission(id, title) } } - ?: Left(nonEmptyListOf(TaskRepositoryError("Insert failed"))) + ?: Left(nonEmptyListOf(MissionRepositoryError("Insert failed"))) } catch (e: DataAccessException) { - Left(nonEmptyListOf(TaskRepositoryError(e))) + Left(nonEmptyListOf(MissionRepositoryError(e))) } - override fun getTask(taskId: TaskId): EitherNel> = + override fun getMission(missionId: MissionId): EitherNel> = try { - dslContext.select(TASK.ID, TASK.SQUAD_KEY, TASK.TITLE, TASK.DESCRIPTION, TASK.STATUS, TASK_USER.USER_ID) - .from(TASK) - .leftJoin(TASK_USER).on(TASK.ID.eq(TASK_USER.TASK_ID)) - .where(TASK.ID.eq(taskId.value)) + dslContext.select(MISSION.ID, MISSION.SQUAD_KEY, MISSION.TITLE, MISSION.DESCRIPTION, MISSION.STATUS, MISSION_USER.USER_ID) + .from(MISSION) + .leftJoin(MISSION_USER).on(MISSION.ID.eq(MISSION_USER.MISSION_ID)) + .where(MISSION.ID.eq(missionId.value)) .fetch() .takeIf { it.isNotEmpty } - ?.let { rawTaskAndUsers -> - buildTask(rawTaskAndUsers) + ?.let { rawMissionAndUsers -> + buildMission(rawMissionAndUsers) } - ?: Left(nonEmptyListOf(TaskNotExistingError(taskId))) + ?: Left(nonEmptyListOf(MissionNotExistingError(missionId))) } catch (e: DataAccessException) { - Left(nonEmptyListOf(TaskRepositoryError(e))) + Left(nonEmptyListOf(MissionRepositoryError(e))) } - private fun buildTask(rawTaskAndUsers: Result>): Either, Task> { - val task = rawTaskAndUsers.first() - val rawSquadKey = task[TASK.SQUAD_KEY] - val rawTaskId = task[TASK.ID] - val rawTitle = task[TASK.TITLE] - val rawDescription = task[TASK.DESCRIPTION] - val taskStatus = task.value5() - val rawAssignees = rawTaskAndUsers + private fun buildMission(rawMissionAndUsers: Result>): Either, Mission> { + val mission = rawMissionAndUsers.first() + val rawSquadKey = mission[MISSION.SQUAD_KEY] + val rawMissionId = mission[MISSION.ID] + val rawTitle = mission[MISSION.TITLE] + val rawDescription = mission[MISSION.DESCRIPTION] + val missionStatus = mission.value5() + val rawAssignees = rawMissionAndUsers .filter { it.value6() != null } .map { HeroId(it.value6()) } .let { @@ -227,177 +227,177 @@ class PgJooqTaskRepository(private val dslContext: DSLContext) : TaskRepository } } - return when (taskStatus) { - Taskstatus.Pending -> either { + return when (missionStatus) { + Missionstatus.Pending -> either { val key = SquadKey(rawSquadKey).bind() - val id = PendingTaskId(key, rawTaskId).bind() + val id = PendingMissionId(key, rawMissionId).bind() val title = Title(rawTitle).bind() val description = Description(rawDescription).bind() val assignees = rawAssignees.bind() - PendingTask(id, title, description, assignees) + PendingMission(id, title, description, assignees) }.mapLeft { errors -> - errors.map { error -> TaskRepositoryError(error) } + errors.map { error -> MissionRepositoryError(error) } } - Taskstatus.InProgress -> either { + Missionstatus.InProgress -> either { val key = SquadKey(rawSquadKey).bind() - val id = InProgressTaskId(key, rawTaskId).bind() + val id = InProgressMissionId(key, rawMissionId).bind() val title = Title(rawTitle).bind() val description = Description(rawDescription).bind() val assignees = rawAssignees.bind() - InProgressTask(id, title, description, assignees) + InProgressMission(id, title, description, assignees) }.mapLeft { errors -> - errors.map { error -> TaskRepositoryError(error) } + errors.map { error -> MissionRepositoryError(error) } } - Taskstatus.Done -> either { + Missionstatus.Done -> either { val key = SquadKey(rawSquadKey).bind() - val id = DoneTaskId(key, rawTaskId).bind() + val id = DoneMissionId(key, rawMissionId).bind() val title = Title(rawTitle).bind() val description = Description(rawDescription).bind() - DoneTask(id, title, description) + DoneMission(id, title, description) }.mapLeft { errors -> - errors.map { error -> TaskRepositoryError(error) } + errors.map { error -> MissionRepositoryError(error) } } } } override fun updateTitle( - taskId: TaskId, + missionId: MissionId, title: Title - ): EitherNel> = + ): EitherNel> = try { - val nbUpdated = dslContext.update(TASK) - .set(TASK.TITLE, title.value) - .where(TASK.ID.eq(taskId.value)) + val nbUpdated = dslContext.update(MISSION) + .set(MISSION.TITLE, title.value) + .where(MISSION.ID.eq(missionId.value)) .execute() if (nbUpdated != 1) - Left(nonEmptyListOf(TaskNotExistingError(taskId))) + Left(nonEmptyListOf(MissionNotExistingError(missionId))) else - getTask(taskId) + getMission(missionId) } catch (e: DataAccessException) { - Left(nonEmptyListOf(TaskRepositoryError(e))) + Left(nonEmptyListOf(MissionRepositoryError(e))) } override fun updateDescription( - taskId: TaskId, + missionId: MissionId, description: Description - ): EitherNel> = + ): EitherNel> = try { - val nbUpdated = dslContext.update(TASK) - .set(TASK.DESCRIPTION, description.value) - .where(TASK.ID.eq(taskId.value)) + val nbUpdated = dslContext.update(MISSION) + .set(MISSION.DESCRIPTION, description.value) + .where(MISSION.ID.eq(missionId.value)) .execute() if (nbUpdated != 1) - Left(nonEmptyListOf(TaskNotExistingError(taskId))) + Left(nonEmptyListOf(MissionNotExistingError(missionId))) else - getTask(taskId) + getMission(missionId) } catch (e: DataAccessException) { - Left(nonEmptyListOf(TaskRepositoryError(e))) + Left(nonEmptyListOf(MissionRepositoryError(e))) } - override fun assignTask(taskId: TaskId, assignees: HeroIds): EitherNel> = + override fun assignMission(missionId: MissionId, assignees: HeroIds): EitherNel> = try { - dslContext.deleteFrom(TASK_USER) - .where(TASK_USER.TASK_ID.eq(taskId.value)) + dslContext.deleteFrom(MISSION_USER) + .where(MISSION_USER.MISSION_ID.eq(missionId.value)) .execute() - val nbUpdate = dslContext.insertInto(TASK_USER) - .columns(TASK_USER.TASK_ID, TASK_USER.USER_ID) + val nbUpdate = dslContext.insertInto(MISSION_USER) + .columns(MISSION_USER.MISSION_ID, MISSION_USER.USER_ID) .apply { assignees.forEach { hero: HeroId -> - values(taskId.value, hero.value) + values(missionId.value, hero.value) } } .execute() if (nbUpdate != assignees.size) - Left(nonEmptyListOf(TaskRepositoryError("Only $nbUpdate updated on ${assignees.size}"))) + Left(nonEmptyListOf(MissionRepositoryError("Only $nbUpdate updated on ${assignees.size}"))) else - getTask(taskId) + getMission(missionId) } catch (e: DataAccessException) { - Left(nonEmptyListOf(TaskRepositoryError(e))) + Left(nonEmptyListOf(MissionRepositoryError(e))) } - override fun startWork(pendingTaskId: PendingTaskId): EitherNel = + override fun startWork(pendingMissionId: PendingMissionId): EitherNel = try { - val nbUpdated = dslContext.update(TASK) - .set(TASK.STATUS, Taskstatus.InProgress) - .where(TASK.ID.eq(pendingTaskId.value)) + val nbUpdated = dslContext.update(MISSION) + .set(MISSION.STATUS, Missionstatus.InProgress) + .where(MISSION.ID.eq(pendingMissionId.value)) .execute() if (nbUpdated != 1) - Left(nonEmptyListOf(TaskNotExistingError(pendingTaskId))) + Left(nonEmptyListOf(MissionNotExistingError(pendingMissionId))) else { either { - val task = getTask(pendingTaskId).bind() - if (task is InProgressTask) - Right(task).bind() + val mission = getMission(pendingMissionId).bind() + if (mission is InProgressMission) + Right(mission).bind() else Left( nonEmptyListOf( - TaskNotPendingError( - task, - pendingTaskId + MissionNotPendingError( + mission, + pendingMissionId ) ) ).bind() } } } catch (e: DataAccessException) { - Left(nonEmptyListOf(TaskRepositoryError(e))) + Left(nonEmptyListOf(MissionRepositoryError(e))) } - override fun pauseWork(inProgressTaskId: InProgressTaskId): EitherNel = + override fun pauseWork(inProgressMissionId: InProgressMissionId): EitherNel = try { - val nbUpdated = dslContext.update(TASK) - .set(TASK.STATUS, Taskstatus.Pending) - .where(TASK.ID.eq(inProgressTaskId.value)) + val nbUpdated = dslContext.update(MISSION) + .set(MISSION.STATUS, Missionstatus.Pending) + .where(MISSION.ID.eq(inProgressMissionId.value)) .execute() if (nbUpdated != 1) - Left(nonEmptyListOf(TaskNotExistingError(inProgressTaskId))) + Left(nonEmptyListOf(MissionNotExistingError(inProgressMissionId))) else { either { - val task = getTask(inProgressTaskId).bind() - if (task is PendingTask) - Right(task).bind() + val mission = getMission(inProgressMissionId).bind() + if (mission is PendingMission) + Right(mission).bind() else Left( nonEmptyListOf( - TaskNotInProgressError( - task, - inProgressTaskId + MissionNotInProgressError( + mission, + inProgressMissionId ) ) ).bind() } } } catch (e: DataAccessException) { - Left(nonEmptyListOf(TaskRepositoryError(e))) + Left(nonEmptyListOf(MissionRepositoryError(e))) } - override fun endWork(inProgressTaskId: InProgressTaskId): EitherNel = + override fun endWork(inProgressMissionId: InProgressMissionId): EitherNel = try { - val nbUpdated = dslContext.update(TASK) - .set(TASK.STATUS, Taskstatus.Done) - .where(TASK.ID.eq(inProgressTaskId.value)) + val nbUpdated = dslContext.update(MISSION) + .set(MISSION.STATUS, Missionstatus.Done) + .where(MISSION.ID.eq(inProgressMissionId.value)) .execute() if (nbUpdated != 1) - Left(nonEmptyListOf(TaskNotExistingError(inProgressTaskId))) + Left(nonEmptyListOf(MissionNotExistingError(inProgressMissionId))) else { either { - val task = getTask(inProgressTaskId).bind() - if (task is DoneTask) - Right(task).bind() + val mission = getMission(inProgressMissionId).bind() + if (mission is DoneMission) + Right(mission).bind() else Left( nonEmptyListOf( - TaskNotInProgressError( - task, - inProgressTaskId + MissionNotInProgressError( + mission, + inProgressMissionId ) ) ).bind() } } } catch (e: DataAccessException) { - Left(nonEmptyListOf(TaskRepositoryError(e))) + Left(nonEmptyListOf(MissionRepositoryError(e))) } } \ No newline at end of file diff --git a/heroesdesk-taskrepo-jooq-pg-adapter/src/test/kotlin/DbAccess.kt b/heroesdesk-missionrepo-jooq-pg-adapter/src/test/kotlin/DbAccess.kt similarity index 100% rename from heroesdesk-taskrepo-jooq-pg-adapter/src/test/kotlin/DbAccess.kt rename to heroesdesk-missionrepo-jooq-pg-adapter/src/test/kotlin/DbAccess.kt diff --git a/heroesdesk-taskrepo-jooq-pg-adapter/src/test/kotlin/GenerateJooqModelFromDb.kt b/heroesdesk-missionrepo-jooq-pg-adapter/src/test/kotlin/GenerateJooqModelFromDb.kt similarity index 58% rename from heroesdesk-taskrepo-jooq-pg-adapter/src/test/kotlin/GenerateJooqModelFromDb.kt rename to heroesdesk-missionrepo-jooq-pg-adapter/src/test/kotlin/GenerateJooqModelFromDb.kt index 11af0ab..9c0219c 100644 --- a/heroesdesk-taskrepo-jooq-pg-adapter/src/test/kotlin/GenerateJooqModelFromDb.kt +++ b/heroesdesk-missionrepo-jooq-pg-adapter/src/test/kotlin/GenerateJooqModelFromDb.kt @@ -2,10 +2,10 @@ import DbAccess.createDslContext import DbAccess.dbSchema import org.hexastacks.heroesdesk.kotlin.squad.Name import org.hexastacks.heroesdesk.kotlin.squad.SquadKey -import org.hexastacks.heroesdesk.kotlin.impl.task.Description -import org.hexastacks.heroesdesk.kotlin.impl.task.TaskId -import org.hexastacks.heroesdesk.kotlin.impl.task.Title -import org.hexastacks.heroesdesk.kotlin.impl.user.UserId +import org.hexastacks.heroesdesk.kotlin.mission.Description +import org.hexastacks.heroesdesk.kotlin.mission.MissionId +import org.hexastacks.heroesdesk.kotlin.mission.Title +import org.hexastacks.heroesdesk.kotlin.user.UserId import org.jooq.DSLContext import org.jooq.codegen.GenerationTool import org.jooq.impl.DSL @@ -16,9 +16,6 @@ import org.jooq.meta.jaxb.Target fun main() { - fun prefixRule(context: String) = MatcherRule() - .withExpression("\$0$context") - DbAccess.postgreSQLContainer() .use { container -> println("Starting container...") @@ -48,7 +45,7 @@ fun main() { .withTarget( Target() .withPackageName("org.hexastacks.heroesdesk.kotlin.ports.pgjooq") - .withDirectory("heroesdesk-taskrepo-jooq-pg-adapter/src/main/generated/") + .withDirectory("heroesdesk-missionrepo-jooq-pg-adapter/src/main/generated/") ) .withGenerate( Generate() @@ -70,25 +67,25 @@ fun dbDropAndInit(dslContext: DSLContext) { val SQUAD_TO_USER_SQUAD_KEY_COLUMN = "squad_key" val SQUAD_TO_USER_USER_ID_COLUMN = "user_id" - val TASK_TABLE = "Task" - val TASK_ID_COLUMN = "id" - val TASK_SQUAD_COLUMN = "squad_key" - val TASK_TITLE_COLUMN = "title" - val TASK_DESCRIPTION_COLUMN = "description" - val TASK_STATUS_COLUMN = "status" + val MISSION_TABLE = "Mission" + val MISSION_ID_COLUMN = "id" + val MISSION_SQUAD_COLUMN = "squad_key" + val MISSION_TITLE_COLUMN = "title" + val MISSION_DESCRIPTION_COLUMN = "description" + val MISSION_STATUS_COLUMN = "status" - val TASK_STATUS_ENUM_TYPE = "taskstatus" - val TASK_STATUS_PENDING = "Pending" + val MISSION_STATUS_ENUM_TYPE = "missionstatus" + val MISSION_STATUS_PENDING = "Pending" - val TASK_TO_USER_TABLE = "${TASK_TABLE}_User" - val TASK_TO_USER_TASK_ID_COLUMN = "task_id" - val TASK_TO_USER_USER_ID_COLUMN = "user_id" + val MISSION_TO_USER_TABLE = "${MISSION_TABLE}_User" + val MISSION_TO_USER_MISSION_ID_COLUMN = "mission_id" + val MISSION_TO_USER_USER_ID_COLUMN = "user_id" dslContext.dropTableIfExists(SQUAD_TO_USER_TABLE).execute() - dslContext.dropTableIfExists(TASK_TO_USER_TABLE).execute() - dslContext.dropTableIfExists(TASK_TABLE).execute() - dslContext.dropTypeIfExists(TASK_STATUS_ENUM_TYPE).execute() + dslContext.dropTableIfExists(MISSION_TO_USER_TABLE).execute() + dslContext.dropTableIfExists(MISSION_TABLE).execute() + dslContext.dropTypeIfExists(MISSION_STATUS_ENUM_TYPE).execute() dslContext.dropTableIfExists(SQUAD_TABLE).execute() dslContext.dropSchemaIfExists(dbSchema).execute() dslContext.createSchema(dbSchema).execute() @@ -98,7 +95,7 @@ fun dbDropAndInit(dslContext: DSLContext) { .column(SQUAD_KEY_COLUMN, squadKeyColumnDefinition) .column(SQUAD_NAME_COLUMN, SQLDataType.VARCHAR(Name.MAX_LENGTH).nullable(false)) .constraints( - DSL.constraint("PK_SQUAD").primaryKey(SQUAD_KEY_COLUMN), + DSL.constraint("PK_$SQUAD_TABLE").primaryKey(SQUAD_KEY_COLUMN), DSL.constraint("CHK_${SQUAD_KEY_COLUMN}_LENGTH").check( DSL.length(SQUAD_KEY_COLUMN).ge(SquadKey.MIN_LENGTH) ), @@ -122,43 +119,43 @@ fun dbDropAndInit(dslContext: DSLContext) { .execute() - dslContext.createType(TASK_STATUS_ENUM_TYPE) - .asEnum(TASK_STATUS_PENDING, "InProgress", "Done") + dslContext.createType(MISSION_STATUS_ENUM_TYPE) + .asEnum(MISSION_STATUS_PENDING, "InProgress", "Done") .execute() - val taskIdColumnDefinition = SQLDataType.VARCHAR(TaskId.MAX_LENGTH).nullable(false) - dslContext.createTable(TASK_TABLE) - .column(TASK_ID_COLUMN, taskIdColumnDefinition) - .column(TASK_SQUAD_COLUMN, SQLDataType.VARCHAR(SquadKey.MAX_LENGTH).nullable(false)) - .column(TASK_TITLE_COLUMN, SQLDataType.VARCHAR(Title.MAX_LENGTH).nullable(false)) - .column(TASK_DESCRIPTION_COLUMN, SQLDataType.VARCHAR(Description.MAX_LENGTH).nullable(false).defaultValue("")) + val missionIdColumnDefinition = SQLDataType.VARCHAR(MissionId.MAX_LENGTH).nullable(false) + dslContext.createTable(MISSION_TABLE) + .column(MISSION_ID_COLUMN, missionIdColumnDefinition) + .column(MISSION_SQUAD_COLUMN, SQLDataType.VARCHAR(SquadKey.MAX_LENGTH).nullable(false)) + .column(MISSION_TITLE_COLUMN, SQLDataType.VARCHAR(Title.MAX_LENGTH).nullable(false)) + .column(MISSION_DESCRIPTION_COLUMN, SQLDataType.VARCHAR(Description.MAX_LENGTH).nullable(false).defaultValue("")) .constraints( - DSL.constraint("PK_$TASK_TABLE").primaryKey(TASK_ID_COLUMN), - DSL.constraint("CHK_${TASK_ID_COLUMN}_MIN_LENGTH").check( - DSL.length(TASK_ID_COLUMN).ge(TaskId.MIN_LENGTH) + DSL.constraint("PK_$MISSION_TABLE").primaryKey(MISSION_ID_COLUMN), + DSL.constraint("CHK_${MISSION_ID_COLUMN}_MIN_LENGTH").check( + DSL.length(MISSION_ID_COLUMN).ge(MissionId.MIN_LENGTH) ), - DSL.constraint("CHK_${TASK_TITLE_COLUMN}_MIN_LENGTH").check( - DSL.length(TASK_TITLE_COLUMN).ge(Title.MIN_LENGTH) + DSL.constraint("CHK_${MISSION_TITLE_COLUMN}_MIN_LENGTH").check( + DSL.length(MISSION_TITLE_COLUMN).ge(Title.MIN_LENGTH) ), - DSL.constraint("FK_$TASK_SQUAD_COLUMN").foreignKey(TASK_SQUAD_COLUMN) + DSL.constraint("FK_$MISSION_SQUAD_COLUMN").foreignKey(MISSION_SQUAD_COLUMN) .references(SQUAD_TABLE, SQUAD_KEY_COLUMN), - DSL.constraint("CHK_${TASK_DESCRIPTION_COLUMN}_MIN_LENGTH").check( - DSL.length(TASK_TITLE_COLUMN).ge(Description.MIN_LENGTH) + DSL.constraint("CHK_${MISSION_DESCRIPTION_COLUMN}_MIN_LENGTH").check( + DSL.length(MISSION_TITLE_COLUMN).ge(Description.MIN_LENGTH) ), ) .execute() // jooq doesn't support user defined types in DDL, cf https://github.com/jOOQ/jOOQ/issues/15300 - dslContext.execute("""ALTER TABLE $dbSchema."$TASK_TABLE" ADD $TASK_STATUS_COLUMN $TASK_STATUS_ENUM_TYPE DEFAULT '$TASK_STATUS_PENDING' NOT NULL;""") + dslContext.execute("""ALTER TABLE $dbSchema."$MISSION_TABLE" ADD $MISSION_STATUS_COLUMN $MISSION_STATUS_ENUM_TYPE DEFAULT '$MISSION_STATUS_PENDING' NOT NULL;""") - dslContext.createTable(TASK_TO_USER_TABLE) - .column(TASK_TO_USER_TASK_ID_COLUMN, taskIdColumnDefinition) - .column(TASK_TO_USER_USER_ID_COLUMN, userIdColumnDefinition) + dslContext.createTable(MISSION_TO_USER_TABLE) + .column(MISSION_TO_USER_MISSION_ID_COLUMN, missionIdColumnDefinition) + .column(MISSION_TO_USER_USER_ID_COLUMN, userIdColumnDefinition) .constraints( - DSL.constraint("PK_$TASK_TO_USER_TABLE") - .primaryKey(TASK_TO_USER_TASK_ID_COLUMN, TASK_TO_USER_USER_ID_COLUMN), - DSL.constraint("FK_$TASK_TABLE").foreignKey(TASK_TO_USER_TASK_ID_COLUMN) - .references(TASK_TABLE, TASK_ID_COLUMN), + DSL.constraint("PK_$MISSION_TO_USER_TABLE") + .primaryKey(MISSION_TO_USER_MISSION_ID_COLUMN, MISSION_TO_USER_USER_ID_COLUMN), + DSL.constraint("FK_$MISSION_TABLE").foreignKey(MISSION_TO_USER_MISSION_ID_COLUMN) + .references(MISSION_TABLE, MISSION_ID_COLUMN), ) .execute() } diff --git a/heroesdesk-taskrepo-jooq-pg-adapter/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/PgJooqTaskRepositoryTest.kt b/heroesdesk-missionrepo-jooq-pg-adapter/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/PgJooqMissionRepositoryTest.kt similarity index 83% rename from heroesdesk-taskrepo-jooq-pg-adapter/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/PgJooqTaskRepositoryTest.kt rename to heroesdesk-missionrepo-jooq-pg-adapter/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/PgJooqMissionRepositoryTest.kt index 55b5cd9..5f3d91f 100644 --- a/heroesdesk-taskrepo-jooq-pg-adapter/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/PgJooqTaskRepositoryTest.kt +++ b/heroesdesk-missionrepo-jooq-pg-adapter/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/PgJooqMissionRepositoryTest.kt @@ -4,7 +4,7 @@ import DbAccess import DbAccess.createDslContext import dbDropAndInit import org.hexastacks.heroesdesk.kotlin.HeroesDesk -import org.hexastacks.heroesdesk.kotlin.impl.HeroesDeskImpl +import org.hexastacks.heroesdesk.kotlin.misc.HeroesDeskImpl import org.hexastacks.heroesdesk.kotlin.ports.inmemory.InstrumentedInMemoryUserRepository import org.hexastacks.heroesdesk.kotlin.test.AbstractHeroesDeskTest import org.hexastacks.heroesdesk.kotlin.test.InstrumentedUserRepository @@ -15,7 +15,7 @@ import org.testcontainers.junit.jupiter.Testcontainers @Testcontainers -class PgJooqTaskRepositoryTest : AbstractHeroesDeskTest() { +class PgJooqMissionRepositoryTest : AbstractHeroesDeskTest() { companion object { @Container @@ -38,8 +38,8 @@ class PgJooqTaskRepositoryTest : AbstractHeroesDeskTest() { println("Db init running") dbDropAndInit(dslContext) println("Db init done") - return HeroesDeskImpl(userRepo, PgJooqTaskRepository(dslContext)) + return HeroesDeskImpl(userRepo, PgJooqMissionRepository(dslContext)) } - override fun nonExistingRawTaskId(): String = Int.MAX_VALUE.toString() + override fun nonExistingRawMissionId(): String = Int.MAX_VALUE.toString() } \ No newline at end of file diff --git a/heroesdesk-taskrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/tables/Task.java b/heroesdesk-taskrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/tables/Task.java deleted file mode 100644 index 94a550a..0000000 --- a/heroesdesk-taskrepo-jooq-pg-adapter/src/main/generated/org/hexastacks/heroesdesk/kotlin/ports/pgjooq/tables/Task.java +++ /dev/null @@ -1,213 +0,0 @@ -/* - * This file is generated by jOOQ. - */ -package org.hexastacks.heroesdesk.kotlin.ports.pgjooq.tables; - - -import java.util.Arrays; -import java.util.List; -import java.util.function.Function; - -import org.hexastacks.heroesdesk.kotlin.ports.pgjooq.Heroesdeskschema; -import org.hexastacks.heroesdesk.kotlin.ports.pgjooq.Keys; -import org.hexastacks.heroesdesk.kotlin.ports.pgjooq.enums.Taskstatus; -import org.hexastacks.heroesdesk.kotlin.ports.pgjooq.tables.records.TaskRecord; -import org.jooq.Check; -import org.jooq.Field; -import org.jooq.ForeignKey; -import org.jooq.Function5; -import org.jooq.Name; -import org.jooq.Record; -import org.jooq.Records; -import org.jooq.Row5; -import org.jooq.Schema; -import org.jooq.SelectField; -import org.jooq.Table; -import org.jooq.TableField; -import org.jooq.TableOptions; -import org.jooq.UniqueKey; -import org.jooq.impl.DSL; -import org.jooq.impl.Internal; -import org.jooq.impl.SQLDataType; -import org.jooq.impl.TableImpl; - - -/** - * This class is generated by jOOQ. - */ -@SuppressWarnings({ "all", "unchecked", "rawtypes" }) -public class Task extends TableImpl { - - private static final long serialVersionUID = 1L; - - /** - * The reference instance of heroesdeskschema.Task - */ - public static final Task TASK = new Task(); - - /** - * The class holding records for this type - */ - @Override - public Class getRecordType() { - return TaskRecord.class; - } - - /** - * The column heroesdeskschema.Task.id. - */ - public final TableField ID = createField(DSL.name("id"), SQLDataType.VARCHAR(36).nullable(false), this, ""); - - /** - * The column heroesdeskschema.Task.squad_key. - */ - public final TableField SQUAD_KEY = createField(DSL.name("squad_key"), SQLDataType.VARCHAR(36).nullable(false), this, ""); - - /** - * The column heroesdeskschema.Task.title. - */ - public final TableField TITLE = createField(DSL.name("title"), SQLDataType.VARCHAR(255).nullable(false), this, ""); - - /** - * The column heroesdeskschema.Task.description. - */ - public final TableField DESCRIPTION = createField(DSL.name("description"), SQLDataType.VARCHAR(1024).nullable(false).defaultValue(DSL.field(DSL.raw("''::character varying"), SQLDataType.VARCHAR)), this, ""); - - /** - * The column heroesdeskschema.Task.status. - */ - public final TableField STATUS = createField(DSL.name("status"), SQLDataType.VARCHAR.nullable(false).defaultValue(DSL.field(DSL.raw("'Pending'::heroesdeskschema.taskstatus"), SQLDataType.VARCHAR)).asEnumDataType(org.hexastacks.heroesdesk.kotlin.ports.pgjooq.enums.Taskstatus.class), this, ""); - - private Task(Name alias, Table aliased) { - this(alias, aliased, null); - } - - private Task(Name alias, Table aliased, Field[] parameters) { - super(alias, null, aliased, parameters, DSL.comment(""), TableOptions.table()); - } - - /** - * Create an aliased heroesdeskschema.Task table reference - */ - public Task(String alias) { - this(DSL.name(alias), TASK); - } - - /** - * Create an aliased heroesdeskschema.Task table reference - */ - public Task(Name alias) { - this(alias, TASK); - } - - /** - * Create a heroesdeskschema.Task table reference - */ - public Task() { - this(DSL.name("Task"), null); - } - - public Task(Table child, ForeignKey key) { - super(child, key, TASK); - } - - @Override - public Schema getSchema() { - return aliased() ? null : Heroesdeskschema.HEROESDESKSCHEMA; - } - - @Override - public UniqueKey getPrimaryKey() { - return Keys.PK_TASK; - } - - @Override - public List> getReferences() { - return Arrays.asList(Keys.TASK__FK_SQUAD_KEY); - } - - private transient Squad _squad; - - /** - * Get the implicit join path to the heroesdeskschema.Squad - * table. - */ - public Squad squad() { - if (_squad == null) - _squad = new Squad(this, Keys.TASK__FK_SQUAD_KEY); - - return _squad; - } - - @Override - public List> getChecks() { - return Arrays.asList( - Internal.createCheck(this, DSL.name("CHK_description_MIN_LENGTH"), "((char_length('title'::text) >= 0))", true), - Internal.createCheck(this, DSL.name("CHK_id_MIN_LENGTH"), "((char_length('id'::text) >= 1))", true), - Internal.createCheck(this, DSL.name("CHK_title_MIN_LENGTH"), "((char_length('title'::text) >= 1))", true) - ); - } - - @Override - public Task as(String alias) { - return new Task(DSL.name(alias), this); - } - - @Override - public Task as(Name alias) { - return new Task(alias, this); - } - - @Override - public Task as(Table alias) { - return new Task(alias.getQualifiedName(), this); - } - - /** - * Rename this table - */ - @Override - public Task rename(String name) { - return new Task(DSL.name(name), null); - } - - /** - * Rename this table - */ - @Override - public Task rename(Name name) { - return new Task(name, null); - } - - /** - * Rename this table - */ - @Override - public Task rename(Table name) { - return new Task(name.getQualifiedName(), null); - } - - // ------------------------------------------------------------------------- - // Row5 type methods - // ------------------------------------------------------------------------- - - @Override - public Row5 fieldsRow() { - return (Row5) super.fieldsRow(); - } - - /** - * Convenience mapping calling {@link SelectField#convertFrom(Function)}. - */ - public SelectField mapping(Function5 from) { - return convertFrom(Records.mapping(from)); - } - - /** - * Convenience mapping calling {@link SelectField#convertFrom(Class, - * Function)}. - */ - public SelectField mapping(Class toType, Function5 from) { - return convertFrom(toType, Records.mapping(from)); - } -} diff --git a/heroesdesk-test/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/test/AbstractHeroesDeskTest.kt b/heroesdesk-test/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/test/AbstractHeroesDeskTest.kt index e7b279e..c0b76ac 100644 --- a/heroesdesk-test/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/test/AbstractHeroesDeskTest.kt +++ b/heroesdesk-test/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/test/AbstractHeroesDeskTest.kt @@ -12,21 +12,21 @@ import org.hexastacks.heroesdesk.kotlin.errors.* import org.hexastacks.heroesdesk.kotlin.squad.Squad import org.hexastacks.heroesdesk.kotlin.squad.SquadKey import org.hexastacks.heroesdesk.kotlin.squad.SquadMembers -import org.hexastacks.heroesdesk.kotlin.impl.task.* -import org.hexastacks.heroesdesk.kotlin.impl.user.Hero -import org.hexastacks.heroesdesk.kotlin.impl.user.HeroIds -import org.hexastacks.heroesdesk.kotlin.impl.user.Heroes -import org.hexastacks.heroesdesk.kotlin.impl.user.Heroes.Companion.empty +import org.hexastacks.heroesdesk.kotlin.user.Hero +import org.hexastacks.heroesdesk.kotlin.user.HeroIds +import org.hexastacks.heroesdesk.kotlin.user.Heroes +import org.hexastacks.heroesdesk.kotlin.user.Heroes.Companion.empty +import org.hexastacks.heroesdesk.kotlin.mission.* import org.hexastacks.heroesdesk.kotlin.test.HeroesDeskTestUtils.createAdminIdOrThrow import org.hexastacks.heroesdesk.kotlin.test.HeroesDeskTestUtils.createDescriptionOrThrow import org.hexastacks.heroesdesk.kotlin.test.HeroesDeskTestUtils.createHeroIdOrThrow import org.hexastacks.heroesdesk.kotlin.test.HeroesDeskTestUtils.createHeroOrThrow -import org.hexastacks.heroesdesk.kotlin.test.HeroesDeskTestUtils.createInProgressTaskIdOrThrow +import org.hexastacks.heroesdesk.kotlin.test.HeroesDeskTestUtils.createInProgressMissionIdOrThrow import org.hexastacks.heroesdesk.kotlin.test.HeroesDeskTestUtils.createNameOrThrow -import org.hexastacks.heroesdesk.kotlin.test.HeroesDeskTestUtils.createPendingTaskIdOrThrow +import org.hexastacks.heroesdesk.kotlin.test.HeroesDeskTestUtils.createPendingMissionIdOrThrow import org.hexastacks.heroesdesk.kotlin.test.HeroesDeskTestUtils.createSquadKeyOrThrow import org.hexastacks.heroesdesk.kotlin.test.HeroesDeskTestUtils.createTitleOrThrow -import org.hexastacks.heroesdesk.kotlin.test.HeroesDeskTestUtils.getTaskOrThrow +import org.hexastacks.heroesdesk.kotlin.test.HeroesDeskTestUtils.getMissionOrThrow import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Assertions.assertTrue import org.junit.jupiter.api.BeforeEach @@ -123,13 +123,13 @@ abstract class AbstractHeroesDeskTest { val executor = Executors.newFixedThreadPool(10) val dispatcher = executor.asCoroutineDispatcher() val runNb = 1000 - val createdTaskTarget = 250 + val createdMissionTarget = 250 val admin = userRepo.ensureAdminExistingOrThrow("adminId") runBlocking { val jobs = List(runNb) { launch(dispatcher) { - val suffix = it % createdTaskTarget + val suffix = it % createdMissionTarget results[it] = heroesDesk .createSquad( createSquadKeyOrThrow("id$suffix"), @@ -150,7 +150,7 @@ abstract class AbstractHeroesDeskTest { it.value } .count() - assertEquals(runNb - createdTaskTarget, failureNb) + assertEquals(runNb - createdMissionTarget, failureNb) } @Test @@ -300,398 +300,398 @@ abstract class AbstractHeroesDeskTest { } @Test - fun `createTask returns a task`() { + fun `createMission returns a mission`() { val currentHero = ensureHeroExisting("heroId") val squad = ensureSquadExisting("squadKey") val title = createTitleOrThrow("title") assignSquad(squad.key, Heroes(currentHero)) - val task = heroesDesk.createTask(squad.key, title, currentHero.id).getOrElse { throw AssertionError("$it") } + val mission = heroesDesk.createMission(squad.key, title, currentHero.id).getOrElse { throw AssertionError("$it") } - assertEquals(title, task.title) - assertEquals(squad.key, task.squadKey()) + assertEquals(title, mission.title) + assertEquals(squad.key, mission.squadKey()) } @Test - fun `2 tasks creation with same title and creator returns 2 distinct tasks`() { + fun `2 missions creation with same title and creator returns 2 distinct missions`() { val currentHero = ensureHeroExisting("heroId") val squad = ensureSquadExisting("squadKey") val rawTitle = "title" assignSquad(squad.key, Heroes(currentHero)) - val task1 = heroesDesk.createTask(squad.key, createTitleOrThrow(rawTitle), currentHero.id) - val task2 = heroesDesk.createTask(squad.key, createTitleOrThrow(rawTitle), currentHero.id) + val mission1 = heroesDesk.createMission(squad.key, createTitleOrThrow(rawTitle), currentHero.id) + val mission2 = heroesDesk.createMission(squad.key, createTitleOrThrow(rawTitle), currentHero.id) - assertTrue(task1.isRight(), "$task1") - assertTrue(task2.isRight(), "$task2") - task1.flatMap { right1 -> - task2.map { right2 -> + assertTrue(mission1.isRight(), "$mission1") + assertTrue(mission2.isRight(), "$mission2") + mission1.flatMap { right1 -> + mission2.map { right2 -> assertTrue(right1 != right2, "$right1 and $right2 are the same") } } } @Test - fun `createTask with a non existing user fails`() { + fun `createMission with a non existing user fails`() { val currentHero = createHeroOrThrow("heroId") val rawTitle = "title" - val task = - heroesDesk.createTask(ensureSquadExisting("squadKey").key, createTitleOrThrow(rawTitle), currentHero.id) + val mission = + heroesDesk.createMission(ensureSquadExisting("squadKey").key, createTitleOrThrow(rawTitle), currentHero.id) - assertTrue(task.isLeft()) - task.onLeft { + assertTrue(mission.isLeft()) + mission.onLeft { assertTrue(it.head is HeroesNotInSquadError, "$it") } } @Test - fun `createTask with a non existing squad fails`() { + fun `createMission with a non existing squad fails`() { val currentHero = ensureHeroExisting("heroId") val rawTitle = "title" - val task = - heroesDesk.createTask(createSquadKeyOrThrow("squadKey"), createTitleOrThrow(rawTitle), currentHero.id) + val mission = + heroesDesk.createMission(createSquadKeyOrThrow("squadKey"), createTitleOrThrow(rawTitle), currentHero.id) - assertTrue(task.isLeft()) - task.onLeft { + assertTrue(mission.isLeft()) + mission.onLeft { assertTrue(it.head is SquadNotExistingError, "$it") } } @Test - fun `createTask with a creator not assigned to squad fails`() { + fun `createMission with a creator not assigned to squad fails`() { val currentHero = ensureHeroExisting("heroId") val rawTitle = "title" - val task = - heroesDesk.createTask(ensureSquadExisting("squadKey").key, createTitleOrThrow(rawTitle), currentHero.id) + val mission = + heroesDesk.createMission(ensureSquadExisting("squadKey").key, createTitleOrThrow(rawTitle), currentHero.id) - assertTrue(task.isLeft()) - task.onLeft { + assertTrue(mission.isLeft()) + mission.onLeft { assertTrue(it.head is HeroesNotInSquadError, "$it") } } @Test - fun `get task works on existing TaskId`() { - val createdTask = ensureTaskExisting("title", "heroId") + fun `get mission works on existing MissionId`() { + val createdMission = ensureMissionExisting("title", "heroId") - val retrievedTask = heroesDesk.getTask(createdTask.taskId).getOrElse { throw AssertionError("$it") } + val retrievedMission = heroesDesk.getMission(createdMission.missionId).getOrElse { throw AssertionError("$it") } - assertEquals(retrievedTask, createdTask) + assertEquals(retrievedMission, createdMission) } @Test - fun `get task fails on non existing TaskId`() { - val task = heroesDesk.getTask(nonExistingPendingTaskId()) + fun `get mission fails on non existing MissionId`() { + val mission = heroesDesk.getMission(nonExistingPendingMissionId()) - assertTrue(task.isLeft()) - task.onLeft { - assertTrue(it.head is TaskNotExistingError) + assertTrue(mission.isLeft()) + mission.onLeft { + assertTrue(it.head is MissionNotExistingError) } } @Test - fun `update title works on existing TaskId`() { + fun `update title works on existing MissionId`() { val hero = ensureHeroExisting("heroId") - val createdTask = ensureTaskExisting("title", hero) + val createdMission = ensureMissionExisting("title", hero) val newTitle = createTitleOrThrow("new title") - val updatedTask = - heroesDesk.updateTitle(createdTask.taskId, newTitle, hero.id).getOrElse { throw AssertionError("$it") } + val updatedMission = + heroesDesk.updateTitle(createdMission.missionId, newTitle, hero.id).getOrElse { throw AssertionError("$it") } - assertEquals(updatedTask.taskId, createdTask.taskId) - assert(heroesDesk.getTaskOrThrow(updatedTask.taskId).title == newTitle) + assertEquals(updatedMission.missionId, createdMission.missionId) + assert(heroesDesk.getMissionOrThrow(updatedMission.missionId).title == newTitle) } @Test - fun `update title fails with non existing TaskId`() { + fun `update title fails with non existing MissionId`() { val heroId = ensureHeroExisting("heroId") val newTitle = createTitleOrThrow("new title") - val updatedTaskId = - heroesDesk.updateTitle(nonExistingPendingTaskId(), newTitle, heroId.id) + val updatedMissionId = + heroesDesk.updateTitle(nonExistingPendingMissionId(), newTitle, heroId.id) - assertTrue(updatedTaskId.isLeft()) - updatedTaskId.onLeft { - assertTrue(it.head is TaskNotExistingError) + assertTrue(updatedMissionId.isLeft()) + updatedMissionId.onLeft { + assertTrue(it.head is MissionNotExistingError) } } @Test fun `update title fails with non existing hero`() { - val createdTask = ensureTaskExisting("title", "heroId") + val createdMission = ensureMissionExisting("title", "heroId") val newTitle = createTitleOrThrow("new title") - val updatedTaskId = - heroesDesk.updateTitle(createdTask.taskId, newTitle, createHeroOrThrow("nonExistingHero").id) + val updatedMissionId = + heroesDesk.updateTitle(createdMission.missionId, newTitle, createHeroOrThrow("nonExistingHero").id) - assertTrue(updatedTaskId.isLeft()) - updatedTaskId.onLeft { + assertTrue(updatedMissionId.isLeft()) + updatedMissionId.onLeft { assertTrue(it.head is HeroesNotInSquadError, "$it") } } @Test - fun `update description works on existing TaskId`() { + fun `update description works on existing MissionId`() { val hero = ensureHeroExisting("heroId") - val createdTask = ensureTaskExisting("title", hero) + val createdMission = ensureMissionExisting("title", hero) val newDescription = createDescriptionOrThrow("new description") - val updatedTask = - heroesDesk.updateDescription(createdTask.taskId, newDescription, hero.id) + val updatedMission = + heroesDesk.updateDescription(createdMission.missionId, newDescription, hero.id) .getOrElse { throw AssertionError("$it") } - assertEquals(createdTask.taskId, updatedTask.taskId) - assert(heroesDesk.getTaskOrThrow(updatedTask.taskId).description == newDescription) + assertEquals(createdMission.missionId, updatedMission.missionId) + assert(heroesDesk.getMissionOrThrow(updatedMission.missionId).description == newDescription) } @Test - fun `update description fails with non existing TaskId`() { + fun `update description fails with non existing MissionId`() { val newDescription = createDescriptionOrThrow("new description") val hero = ensureHeroExisting("heroId") - val updatedTaskId = heroesDesk.updateDescription(nonExistingPendingTaskId(), newDescription, hero.id) + val updatedMissionId = heroesDesk.updateDescription(nonExistingPendingMissionId(), newDescription, hero.id) - assertTrue(updatedTaskId.isLeft()) - updatedTaskId.onLeft { - assertTrue(it.head is TaskNotExistingError) + assertTrue(updatedMissionId.isLeft()) + updatedMissionId.onLeft { + assertTrue(it.head is MissionNotExistingError) } } @Test fun `update description fails with non existing hero`() { - val createdTask = ensureTaskExisting("title", "heroId") + val createdMission = ensureMissionExisting("title", "heroId") val newDescription = createDescriptionOrThrow("new description") - val updatedTaskId = - heroesDesk.updateDescription(createdTask.taskId, newDescription, createHeroOrThrow("nonExistingHero").id) + val updatedMissionId = + heroesDesk.updateDescription(createdMission.missionId, newDescription, createHeroOrThrow("nonExistingHero").id) - assertTrue(updatedTaskId.isLeft()) - updatedTaskId.onLeft { + assertTrue(updatedMissionId.isLeft()) + updatedMissionId.onLeft { assertTrue(it.head is HeroesNotExistingError, "$it") } } @Test - fun `assign task on pending task id works`() { - val (pendingTaskId, hero) = createAssignedPendingTask() + fun `assign mission on pending mission id works`() { + val (pendingMissionId, hero) = createAssignedPendingMission() - assertAssignTaskWorks(pendingTaskId, hero) + assertAssignMissionWorks(pendingMissionId, hero) } @Test - fun `assign task on in progress task id works`() { - val (inProgressTaskId, hero) = createAssignedInProgressTask() + fun `assign mission on in progress mission id works`() { + val (inProgressMissionId, hero) = createAssignedInProgressMission() - assertAssignTaskWorks(inProgressTaskId, hero) + assertAssignMissionWorks(inProgressMissionId, hero) } - private fun assertAssignTaskWorks( - taskId: T, + private fun assertAssignMissionWorks( + missionId: T, hero: Hero ) { - val assignedTask = when (taskId) { - is PendingTaskId -> heroesDesk.assignTask( - taskId, + val assignedMission = when (missionId) { + is PendingMissionId -> heroesDesk.assignMission( + missionId, HeroIds(hero), hero.id ).getOrElse { throw AssertionError("$it") } - is InProgressTaskId -> heroesDesk.assignTask( - taskId, + is InProgressMissionId -> heroesDesk.assignMission( + missionId, HeroIds(hero), hero.id ).getOrElse { throw AssertionError("$it") } - else -> throw AssertionError("Non assignable task id type $taskId") + else -> throw AssertionError("Non assignable mission id type $missionId") } - assertEquals(taskId, assignedTask.taskId) - assertEquals(HeroIds(hero), assignedTask.assignees) + assertEquals(missionId, assignedMission.missionId) + assertEquals(HeroIds(hero), assignedMission.assignees) } @Test - fun `assign task on pending task id fails on non existing task`() { - assertAssignTaskFailsOnNonExistingTask(nonExistingPendingTaskId()) + fun `assign mission on pending mission id fails on non existing mission`() { + assertAssignMissionFailsOnNonExistingMission(nonExistingPendingMissionId()) } @Test - fun `assign task on in progress task id fails on non existing task`() { - assertAssignTaskFailsOnNonExistingTask(nonExistingWorkInProgressTaskId()) + fun `assign mission on in progress mission id fails on non existing mission`() { + assertAssignMissionFailsOnNonExistingMission(nonExistingWorkInProgressMissionId()) } - private fun assertAssignTaskFailsOnNonExistingTask( - id: TaskId + private fun assertAssignMissionFailsOnNonExistingMission( + id: MissionId ) { val hero = createHeroOrThrow("heroId1") val heroes = Heroes(hero) - val assignedTask = when (id) { - is PendingTaskId -> heroesDesk.assignTask( + val assignedMission = when (id) { + is PendingMissionId -> heroesDesk.assignMission( id, HeroIds(heroes), hero.id ) - is InProgressTaskId -> heroesDesk.assignTask( + is InProgressMissionId -> heroesDesk.assignMission( id, HeroIds(heroes), hero.id ) - else -> throw AssertionError("Non assignable task id type $id") + else -> throw AssertionError("Non assignable mission id type $id") } - assertTrue(assignedTask.isLeft()) - assignedTask.onLeft { + assertTrue(assignedMission.isLeft()) + assignedMission.onLeft { assertTrue(it.head is SquadNotExistingError, "$it") } } @Test - fun `assign task on pending task id fails when assigned hero not assigned to squad`() { - assertAssignTaskFailsWhenAssignedHeroNotAssignedToSquad(createAssignedPendingTask().first) + fun `assign mission on pending mission id fails when assigned hero not assigned to squad`() { + assertAssignMissionFailsWhenAssignedHeroNotAssignedToSquad(createAssignedPendingMission().first) } @Test - fun `assign task on in progress task id fails when assigned hero not assigned to squad`() { - assertAssignTaskFailsWhenAssignedHeroNotAssignedToSquad(createAssignedInProgressTask().first) + fun `assign mission on in progress mission id fails when assigned hero not assigned to squad`() { + assertAssignMissionFailsWhenAssignedHeroNotAssignedToSquad(createAssignedInProgressMission().first) } - private fun assertAssignTaskFailsWhenAssignedHeroNotAssignedToSquad( - taskId: TaskId + private fun assertAssignMissionFailsWhenAssignedHeroNotAssignedToSquad( + missionId: MissionId ) { val nonSquadAssignedHeroes = ensureHeroExisting("nonSquadAssignedHero") val assignmentAuthor = ensureHeroExisting("assignmentAuthor").id - val assignedTask = when (taskId) { - is PendingTaskId -> - heroesDesk.assignTask( - taskId, + val assignedMission = when (missionId) { + is PendingMissionId -> + heroesDesk.assignMission( + missionId, HeroIds(nonSquadAssignedHeroes), assignmentAuthor ) - is InProgressTaskId -> - heroesDesk.assignTask( - taskId, + is InProgressMissionId -> + heroesDesk.assignMission( + missionId, HeroIds(nonSquadAssignedHeroes), assignmentAuthor ) - else -> throw AssertionError("Non assignable task id type $taskId") + else -> throw AssertionError("Non assignable mission id type $missionId") } - assertTrue(assignedTask.isLeft()) - assignedTask.onLeft { + assertTrue(assignedMission.isLeft()) + assignedMission.onLeft { assertTrue(it.head is HeroesNotInSquadError, "$it") } } @Test - fun `start work on pending task works on existing & pending task`() { - val (taskId, hero) = createAssignedPendingTask() + fun `start work on pending mission works on existing & pending mission`() { + val (missionId, hero) = createAssignedPendingMission() - val updatedTaskId = - heroesDesk.startWork(taskId, hero.id) + val updatedMissionId = + heroesDesk.startWork(missionId, hero.id) .getOrElse { throw AssertionError("$it") } - assertEquals(updatedTaskId.taskId, taskId) + assertEquals(updatedMissionId.missionId, missionId) } @Test - fun `start work assigns hero starting work to task if no other assignee is present`() { - val createdTask = ensureTaskExisting("title", "randomHeroId") - val taskId = createdTask.taskId + fun `start work assigns hero starting work to mission if no other assignee is present`() { + val createdMission = ensureMissionExisting("title", "randomHeroId") + val missionId = createdMission.missionId val hero = ensureHeroExisting("heroId1") val heroes = Heroes(hero) - assignSquad(createdTask, heroes) + assignSquad(createdMission, heroes) - val updatedTaskId = - heroesDesk.startWork(taskId, hero.id).getOrElse { throw AssertionError("$it") } + val updatedMissionId = + heroesDesk.startWork(missionId, hero.id).getOrElse { throw AssertionError("$it") } - assertEquals(taskId.value, updatedTaskId.taskId.value) - assertTrue(updatedTaskId.assignees.contains(hero.id)) + assertEquals(missionId.value, updatedMissionId.missionId.value) + assertTrue(updatedMissionId.assignees.contains(hero.id)) } @Test - fun `start work fails with non existing TaskId`() { + fun `start work fails with non existing MissionId`() { val hero = createHeroOrThrow("heroId") - val updatedTaskId = - heroesDesk.startWork(nonExistingPendingTaskId(), hero.id) + val updatedMissionId = + heroesDesk.startWork(nonExistingPendingMissionId(), hero.id) - assertTrue(updatedTaskId.isLeft()) - updatedTaskId + assertTrue(updatedMissionId.isLeft()) + updatedMissionId .onLeft { - assertTrue(it.head is TaskNotExistingError, "$it") + assertTrue(it.head is MissionNotExistingError, "$it") } } @Test fun `start work fails with non existing hero`() { - val createdTask = ensureTaskExisting("title", "heroId") - assignSquad(createdTask, empty) + val createdMission = ensureMissionExisting("title", "heroId") + assignSquad(createdMission, empty) - val updatedTaskId = - heroesDesk.startWork(createdTask.taskId, createHeroOrThrow("nonExistingHero").id) + val updatedMissionId = + heroesDesk.startWork(createdMission.missionId, createHeroOrThrow("nonExistingHero").id) - assertTrue(updatedTaskId.isLeft()) - updatedTaskId.onLeft { + assertTrue(updatedMissionId.isLeft()) + updatedMissionId.onLeft { assertTrue(it.head is HeroesNotInSquadError, "$it") } } @Test fun `start work fails when hero not in the squad`() { - val createdTask = ensureTaskExisting("title", "heroId") + val createdMission = ensureMissionExisting("title", "heroId") - val updatedTaskId = - heroesDesk.startWork(createdTask.taskId, ensureHeroExisting("heroId1").id) + val updatedMissionId = + heroesDesk.startWork(createdMission.missionId, ensureHeroExisting("heroId1").id) - assertTrue(updatedTaskId.isLeft()) - updatedTaskId.onLeft { + assertTrue(updatedMissionId.isLeft()) + updatedMissionId.onLeft { assertTrue(it.head is HeroesNotInSquadError, "$it") } } @Test - fun `pause work on in progress task works`() { - val (taskId, assignedHero) = createAssignedPendingTask() - val inProgressTask = heroesDesk.startWork(taskId, assignedHero.id).getOrElse { throw AssertionError("$it") } + fun `pause work on in progress mission works`() { + val (missionId, assignedHero) = createAssignedPendingMission() + val inProgressMission = heroesDesk.startWork(missionId, assignedHero.id).getOrElse { throw AssertionError("$it") } - val pausedTask = - heroesDesk.pauseWork(inProgressTask.taskId, assignedHero.id).getOrElse { throw AssertionError("$it") } + val pausedMission = + heroesDesk.pauseWork(inProgressMission.missionId, assignedHero.id).getOrElse { throw AssertionError("$it") } - assertEquals(taskId, pausedTask.taskId) + assertEquals(missionId, pausedMission.missionId) } @Test - fun `pause work fails with non existing TaskId`() { + fun `pause work fails with non existing MissionId`() { val hero = createHeroOrThrow("heroId") - val updatedTaskId = - heroesDesk.pauseWork(nonExistingWorkInProgressTaskId(), hero.id) + val updatedMissionId = + heroesDesk.pauseWork(nonExistingWorkInProgressMissionId(), hero.id) - assertTrue(updatedTaskId.isLeft()) - updatedTaskId + assertTrue(updatedMissionId.isLeft()) + updatedMissionId .onLeft { - assertTrue(it.head is TaskNotExistingError, "$it") + assertTrue(it.head is MissionNotExistingError, "$it") } } @Test fun `pause work fails with non existing hero`() { - val (pendingTaskId, hero) = createAssignedPendingTask() - val updatedTask = - heroesDesk.startWork(pendingTaskId, hero.id).getOrElse { throw AssertionError("$it") } + val (pendingMissionId, hero) = createAssignedPendingMission() + val updatedMission = + heroesDesk.startWork(pendingMissionId, hero.id).getOrElse { throw AssertionError("$it") } - val pauseWorkResult = heroesDesk.pauseWork(updatedTask.taskId, createHeroOrThrow("nonExistingHero").id) + val pauseWorkResult = heroesDesk.pauseWork(updatedMission.missionId, createHeroOrThrow("nonExistingHero").id) assertTrue(pauseWorkResult.isLeft()) pauseWorkResult.onLeft { @@ -701,12 +701,12 @@ abstract class AbstractHeroesDeskTest { @Test fun `pause work fails when hero not in the squad`() { - val (pendingTaskId, hero) = createAssignedPendingTask() - val updatedTask = - heroesDesk.startWork(pendingTaskId, hero.id).getOrElse { throw AssertionError("$it") } + val (pendingMissionId, hero) = createAssignedPendingMission() + val updatedMission = + heroesDesk.startWork(pendingMissionId, hero.id).getOrElse { throw AssertionError("$it") } val pauseWorkResult = - heroesDesk.pauseWork(updatedTask.taskId, ensureHeroExisting("${hero.id.value}Different").id) + heroesDesk.pauseWork(updatedMission.missionId, ensureHeroExisting("${hero.id.value}Different").id) assertTrue(pauseWorkResult.isLeft()) pauseWorkResult.onLeft { @@ -715,76 +715,76 @@ abstract class AbstractHeroesDeskTest { } @Test - fun `end work on in progress task works, removing all assignees on the way`() { - val (taskId, hero) = createAssignedInProgressTask() + fun `end work on in progress mission works, removing all assignees on the way`() { + val (missionId, hero) = createAssignedInProgressMission() - val doneTask = heroesDesk.endWork(taskId, hero.id).getOrElse { throw AssertionError("$it") } + val doneMission = heroesDesk.endWork(missionId, hero.id).getOrElse { throw AssertionError("$it") } - assertEquals(taskId, doneTask.taskId) - assertTrue(doneTask.assignees.isEmpty()) + assertEquals(missionId, doneMission.missionId) + assertTrue(doneMission.assignees.isEmpty()) } @Test - fun `end work fails with non existing TaskId`() { + fun `end work fails with non existing MissionId`() { val hero = createHeroOrThrow("heroId") - val updatedTaskId = - heroesDesk.endWork(nonExistingWorkInProgressTaskId(), hero.id) + val updatedMissionId = + heroesDesk.endWork(nonExistingWorkInProgressMissionId(), hero.id) - assertTrue(updatedTaskId.isLeft()) - updatedTaskId + assertTrue(updatedMissionId.isLeft()) + updatedMissionId .onLeft { - assertTrue(it.head is TaskNotExistingError, "$it") + assertTrue(it.head is MissionNotExistingError, "$it") } } @Test fun `end work fails with non existing hero`() { - val (inProgressTaskId, _) = createAssignedInProgressTask() + val (inProgressMissionId, _) = createAssignedInProgressMission() - val updatedTaskId = - heroesDesk.endWork(inProgressTaskId, createHeroOrThrow("nonExistingHero").id) + val updatedMissionId = + heroesDesk.endWork(inProgressMissionId, createHeroOrThrow("nonExistingHero").id) - assertTrue(updatedTaskId.isLeft()) - updatedTaskId.onLeft { + assertTrue(updatedMissionId.isLeft()) + updatedMissionId.onLeft { assertTrue(it.head is HeroesNotInSquadError, "$it") } } @Test fun `end work fails when hero not in the squad`() { - val (inProgressTaskId, hero) = createAssignedInProgressTask() + val (inProgressMissionId, hero) = createAssignedInProgressMission() - val updatedTaskId = - heroesDesk.endWork(inProgressTaskId, ensureHeroExisting("${hero.id.value}AndMore").id) + val updatedMissionId = + heroesDesk.endWork(inProgressMissionId, ensureHeroExisting("${hero.id.value}AndMore").id) - assertTrue(updatedTaskId.isLeft()) - updatedTaskId.onLeft { + assertTrue(updatedMissionId.isLeft()) + updatedMissionId.onLeft { assertTrue(it.head is HeroesNotInSquadError, "$it") } } - private fun createAssignedInProgressTask(): Pair { - val (taskId, hero) = createAssignedPendingTask() + private fun createAssignedInProgressMission(): Pair { + val (missionId, hero) = createAssignedPendingMission() return Pair( - heroesDesk.startWork(taskId, hero.id).getOrElse { throw AssertionError("$it") }.taskId, + heroesDesk.startWork(missionId, hero.id).getOrElse { throw AssertionError("$it") }.missionId, hero ) } - private fun createAssignedPendingTask(): Pair { - val createdTask = ensureTaskExisting("title", "randomHeroId") - val taskId = createdTask.taskId + private fun createAssignedPendingMission(): Pair { + val createdMission = ensureMissionExisting("title", "randomHeroId") + val missionId = createdMission.missionId val hero = ensureHeroExisting("heroId1") val heroes = Heroes(hero) - assignSquad(createdTask, heroes) - heroesDesk.assignTask(taskId, HeroIds(hero), hero.id).getOrElse { throw AssertionError("$it") } - return Pair(taskId, hero) + assignSquad(createdMission, heroes) + heroesDesk.assignMission(missionId, HeroIds(hero), hero.id).getOrElse { throw AssertionError("$it") } + return Pair(missionId, hero) } - private fun assignSquad(task: Task<*>, heroes: Heroes): SquadMembers { - return assignSquad(task.squadKey(), heroes) + private fun assignSquad(mission: Mission<*>, heroes: Heroes): SquadMembers { + return assignSquad(mission.squadKey(), heroes) } private fun assignSquad( @@ -799,14 +799,14 @@ abstract class AbstractHeroesDeskTest { .getOrElse { throw AssertionError("$it") } } - private fun ensureTaskExisting(title: String, hero: String): PendingTask = - ensureTaskExisting(title, ensureHeroExisting(hero)) + private fun ensureMissionExisting(title: String, hero: String): PendingMission = + ensureMissionExisting(title, ensureHeroExisting(hero)) - private fun ensureTaskExisting(title: String, hero: Hero): PendingTask { + private fun ensureMissionExisting(title: String, hero: Hero): PendingMission { val squad = ensureSquadExisting("squadKey") assignSquad(squad.key, Heroes(hero)) return heroesDesk - .createTask( + .createMission( squad.key, createTitleOrThrow(title), hero.id ) .getOrElse { throw AssertionError("$it") } @@ -822,17 +822,17 @@ abstract class AbstractHeroesDeskTest { } - private fun nonExistingPendingTaskId(): PendingTaskId = - createPendingTaskIdOrThrow("nonExistingPendingTaskId", nonExistingRawTaskId()) + private fun nonExistingPendingMissionId(): PendingMissionId = + createPendingMissionIdOrThrow("nonExistingPendingMissionId", nonExistingRawMissionId()) - private fun nonExistingWorkInProgressTaskId(): InProgressTaskId = - createInProgressTaskIdOrThrow("nonExistingInProgressTaskId", nonExistingRawTaskId()) + private fun nonExistingWorkInProgressMissionId(): InProgressMissionId = + createInProgressMissionIdOrThrow("nonExistingInProgressMissionId", nonExistingRawMissionId()) abstract fun instrumentedUserRepository(): InstrumentedUserRepository abstract fun createHeroesDesk(userRepo: InstrumentedUserRepository): HeroesDesk - abstract fun nonExistingRawTaskId(): String + abstract fun nonExistingRawMissionId(): String @BeforeEach fun beforeEach() { diff --git a/heroesdesk-test/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/test/HeroesDeskTestUtils.kt b/heroesdesk-test/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/test/HeroesDeskTestUtils.kt index ed945f2..b672eaf 100644 --- a/heroesdesk-test/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/test/HeroesDeskTestUtils.kt +++ b/heroesdesk-test/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/test/HeroesDeskTestUtils.kt @@ -4,8 +4,8 @@ import arrow.core.getOrElse import org.hexastacks.heroesdesk.kotlin.HeroesDesk import org.hexastacks.heroesdesk.kotlin.squad.Name import org.hexastacks.heroesdesk.kotlin.squad.SquadKey -import org.hexastacks.heroesdesk.kotlin.impl.task.* -import org.hexastacks.heroesdesk.kotlin.impl.user.* +import org.hexastacks.heroesdesk.kotlin.mission.* +import org.hexastacks.heroesdesk.kotlin.user.* object HeroesDeskTestUtils { @@ -19,13 +19,13 @@ object HeroesDeskTestUtils { fun createHeroOrThrow(id: String) = Hero(createUserNameOrThrow(id), createHeroIdOrThrow(id)) - fun createPendingTaskIdOrThrow(squadKey: String, id: String) = - PendingTaskId(createSquadKeyOrThrow(squadKey), id).getOrElse { throw AssertionError() } + fun createPendingMissionIdOrThrow(squadKey: String, id: String) = + PendingMissionId(createSquadKeyOrThrow(squadKey), id).getOrElse { throw AssertionError() } - fun createInProgressTaskIdOrThrow(squadKey: String, id: String): InProgressTaskId = - InProgressTaskId(createSquadKeyOrThrow(squadKey), id).getOrElse { throw AssertionError() } + fun createInProgressMissionIdOrThrow(squadKey: String, id: String): InProgressMissionId = + InProgressMissionId(createSquadKeyOrThrow(squadKey), id).getOrElse { throw AssertionError() } - fun HeroesDesk.getTaskOrThrow(id: TaskId): Task<*> = this.getTask(id).getOrElse { throw AssertionError() } + fun HeroesDesk.getMissionOrThrow(id: MissionId): Mission<*> = this.getMission(id).getOrElse { throw AssertionError() } fun createAdminIdOrThrow(adminId: String): AdminId = AdminId(adminId).getOrElse { throw AssertionError() } fun createAdminOrThrow(adminId: String): Admin = Admin(createAdminIdOrThrow(adminId), createUserNameOrThrow(adminId)) diff --git a/heroesdesk-test/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/test/InstrumentedUserRepository.kt b/heroesdesk-test/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/test/InstrumentedUserRepository.kt index c07949b..7c11dc0 100644 --- a/heroesdesk-test/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/test/InstrumentedUserRepository.kt +++ b/heroesdesk-test/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/test/InstrumentedUserRepository.kt @@ -2,8 +2,8 @@ package org.hexastacks.heroesdesk.kotlin.test import org.hexastacks.heroesdesk.kotlin.test.HeroesDeskTestUtils.createAdminOrThrow import org.hexastacks.heroesdesk.kotlin.test.HeroesDeskTestUtils.createHeroOrThrow -import org.hexastacks.heroesdesk.kotlin.impl.user.Admin -import org.hexastacks.heroesdesk.kotlin.impl.user.Hero +import org.hexastacks.heroesdesk.kotlin.user.Admin +import org.hexastacks.heroesdesk.kotlin.user.Hero import org.hexastacks.heroesdesk.kotlin.ports.UserRepository interface InstrumentedUserRepository : UserRepository { diff --git a/heroesdesk/README.md b/heroesdesk/README.md index c3edce3..139fad9 100644 --- a/heroesdesk/README.md +++ b/heroesdesk/README.md @@ -21,7 +21,7 @@ Regarding the ports, if sticking strictly to the hexagonal naming, there are 3 s ``` org.hexastacks.heroesdesk.kotlin.HeroesDesk org.hexastacks.heroesdesk.kotlin.ports.UserRepository -org.hexastacks.heroesdesk.kotlin.ports.TaskRepository +org.hexastacks.heroesdesk.kotlin.ports.MissionRepository ``` The HeroesDesk one is the interface exposed to consumers of this domain, the primary one as says Alistair Cockburn diff --git a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/HeroesDesk.kt b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/HeroesDesk.kt index 6d52d84..862587f 100644 --- a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/HeroesDesk.kt +++ b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/HeroesDesk.kt @@ -6,10 +6,10 @@ import org.hexastacks.heroesdesk.kotlin.squad.Name import org.hexastacks.heroesdesk.kotlin.squad.Squad import org.hexastacks.heroesdesk.kotlin.squad.SquadKey import org.hexastacks.heroesdesk.kotlin.squad.SquadMembers -import org.hexastacks.heroesdesk.kotlin.impl.task.* -import org.hexastacks.heroesdesk.kotlin.impl.user.AdminId -import org.hexastacks.heroesdesk.kotlin.impl.user.HeroId -import org.hexastacks.heroesdesk.kotlin.impl.user.HeroIds +import org.hexastacks.heroesdesk.kotlin.user.AdminId +import org.hexastacks.heroesdesk.kotlin.user.HeroId +import org.hexastacks.heroesdesk.kotlin.user.HeroIds +import org.hexastacks.heroesdesk.kotlin.mission.* interface HeroesDesk { @@ -24,38 +24,38 @@ interface HeroesDesk { fun getSquad(squadKey: SquadKey): EitherNel fun getSquadMembers(squadKey: SquadKey): EitherNel - fun createTask(squadKey: SquadKey, title: Title, creator: HeroId): EitherNel - fun getTask(id: TaskId): EitherNel> + fun createMission(squadKey: SquadKey, title: Title, creator: HeroId): EitherNel + fun getMission(id: MissionId): EitherNel> - fun updateTitle(id: TaskId, title: Title, author: HeroId): EitherNel> + fun updateTitle(id: MissionId, title: Title, author: HeroId): EitherNel> fun updateDescription( - id: TaskId, description: Description, author: HeroId - ): EitherNel> + id: MissionId, description: Description, author: HeroId + ): EitherNel> - fun assignTask(id: PendingTaskId, assignees: HeroIds, author: HeroId): EitherNel> - fun assignTask(id: InProgressTaskId, assignees: HeroIds, author: HeroId): EitherNel> + fun assignMission(id: PendingMissionId, assignees: HeroIds, author: HeroId): EitherNel> + fun assignMission(id: InProgressMissionId, assignees: HeroIds, author: HeroId): EitherNel> /** * Adds the author to the assignees if not in already */ - fun startWork(id: PendingTaskId, author: HeroId): EitherNel + fun startWork(id: PendingMissionId, author: HeroId): EitherNel /** * Adds the author to the assignees if not in already */ - fun startWork(id: DoneTaskId, author: HeroId): EitherNel + fun startWork(id: DoneMissionId, author: HeroId): EitherNel - fun pauseWork(id: InProgressTaskId, author: HeroId): EitherNel - fun pauseWork(id: DoneTaskId, author: HeroId): EitherNel + fun pauseWork(id: InProgressMissionId, author: HeroId): EitherNel + fun pauseWork(id: DoneMissionId, author: HeroId): EitherNel /** * Clears assignees */ - fun endWork(id: PendingTaskId, author: HeroId): EitherNel + fun endWork(id: PendingMissionId, author: HeroId): EitherNel /** * Clears assignees */ - fun endWork(id: InProgressTaskId, author: HeroId): EitherNel + fun endWork(id: InProgressMissionId, author: HeroId): EitherNel } \ No newline at end of file diff --git a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/errors/Errors.kt b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/errors/Errors.kt index 236657c..fc1e5f9 100644 --- a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/errors/Errors.kt +++ b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/errors/Errors.kt @@ -1,21 +1,21 @@ package org.hexastacks.heroesdesk.kotlin.errors -import org.hexastacks.heroesdesk.kotlin.impl.ErrorMessage +import org.hexastacks.heroesdesk.kotlin.misc.ErrorMessage import org.hexastacks.heroesdesk.kotlin.squad.Name import org.hexastacks.heroesdesk.kotlin.squad.SquadKey -import org.hexastacks.heroesdesk.kotlin.impl.task.InProgressTaskId -import org.hexastacks.heroesdesk.kotlin.impl.task.PendingTaskId -import org.hexastacks.heroesdesk.kotlin.impl.task.Task -import org.hexastacks.heroesdesk.kotlin.impl.task.TaskId -import org.hexastacks.heroesdesk.kotlin.impl.user.AdminId -import org.hexastacks.heroesdesk.kotlin.impl.user.HeroId -import org.hexastacks.heroesdesk.kotlin.impl.user.HeroIds -import org.hexastacks.heroesdesk.kotlin.impl.user.Heroes +import org.hexastacks.heroesdesk.kotlin.mission.InProgressMissionId +import org.hexastacks.heroesdesk.kotlin.mission.PendingMissionId +import org.hexastacks.heroesdesk.kotlin.mission.Mission +import org.hexastacks.heroesdesk.kotlin.mission.MissionId +import org.hexastacks.heroesdesk.kotlin.user.AdminId +import org.hexastacks.heroesdesk.kotlin.user.HeroId +import org.hexastacks.heroesdesk.kotlin.user.HeroIds +import org.hexastacks.heroesdesk.kotlin.user.Heroes sealed interface HeroesDeskError : ErrorMessage sealed interface CreateSquadError : HeroesDeskError -sealed interface AreHeroesInSquadError : HeroesDeskError, CreateTaskError, AssignTaskError, PauseWorkError, EndWorkError,UpdateTitleError +sealed interface AreHeroesInSquadError : HeroesDeskError, CreateMissionError, AssignMissionError, PauseWorkError, EndWorkError,UpdateTitleError data class SquadNameAlreadyExistingError(val name: Name) : CreateSquadError { override val message = "Squad $name already exists" @@ -33,26 +33,26 @@ data class SquadNotExistingError(val squadKey: SquadKey) : GetSquadError, GetSqu sealed interface UpdateSquadNameError : HeroesDeskError -sealed interface GetSquadError : HeroesDeskError, AssignHeroesOnSquadError, UpdateSquadNameError, CreateTaskError, +sealed interface GetSquadError : HeroesDeskError, AssignHeroesOnSquadError, UpdateSquadNameError, CreateMissionError, AreHeroesInSquadError sealed interface GetSquadMembersError : HeroesDeskError -sealed interface CreateTaskError : HeroesDeskError +sealed interface CreateMissionError : HeroesDeskError -data class HeroesNotInSquadError(val heroIds: HeroIds, val squadKey: SquadKey) : CreateTaskError, EndWorkError, - PauseWorkError, StartWorkError, AssignTaskError, AreHeroesInSquadError { +data class HeroesNotInSquadError(val heroIds: HeroIds, val squadKey: SquadKey) : CreateMissionError, EndWorkError, + PauseWorkError, StartWorkError, AssignMissionError, AreHeroesInSquadError { constructor(heroId: HeroId, squadKey: SquadKey) : this(HeroIds(heroId), squadKey) constructor(heroes: Heroes, squadKey: SquadKey) : this(HeroIds(heroes), squadKey) override val message = "${heroIds} not in $squadKey squad" } -sealed interface GetTaskError : HeroesDeskError, AssignTaskError, PauseWorkError, EndWorkError, UpdateTitleError, +sealed interface GetMissionError : HeroesDeskError, AssignMissionError, PauseWorkError, EndWorkError, UpdateTitleError, UpdateDescriptionError, AreHeroesInSquadError, StartWorkError -data class TaskNotExistingError(val taskId: TaskId) : GetTaskError { - override val message = "Task $taskId does not exist" +data class MissionNotExistingError(val missionId: MissionId) : GetMissionError { + override val message = "Mission $missionId does not exist" } sealed interface UpdateTitleError : HeroesDeskError @@ -61,23 +61,23 @@ sealed interface UpdateDescriptionError : HeroesDeskError sealed interface EndWorkError : HeroesDeskError -data class TaskNotInProgressError(val task: Task<*>, val taskId: InProgressTaskId) : EndWorkError, PauseWorkError { - override val message = "Task $task not a pending one, despite being $taskId" +data class MissionNotInProgressError(val mission: Mission<*>, val missionIdId: InProgressMissionId) : EndWorkError, PauseWorkError { + override val message = "Mission $mission not a pending one, despite being $missionIdId" } sealed interface PauseWorkError : HeroesDeskError sealed interface StartWorkError : HeroesDeskError -data class TaskNotPendingError(val task: Task<*>, val taskId: PendingTaskId) : StartWorkError { - override val message = "Task $task not a pending one, despite being $taskId" +data class MissionNotPendingError(val mission: Mission<*>, val missionId: PendingMissionId) : StartWorkError { + override val message = "Mission $mission not a pending one, despite being $missionId" } -sealed interface AssignTaskError : HeroesDeskError, StartWorkError +sealed interface AssignMissionError : HeroesDeskError, StartWorkError sealed interface UserRepositoryError : HeroesDeskError -sealed interface GetHeroError : UserRepositoryError, AssignHeroesOnSquadError, CreateTaskError, UpdateTitleError, - UpdateDescriptionError, AssignTaskError, PauseWorkError, EndWorkError +sealed interface GetHeroError : UserRepositoryError, AssignHeroesOnSquadError, CreateMissionError, UpdateTitleError, + UpdateDescriptionError, AssignMissionError, PauseWorkError, EndWorkError data class HeroesNotExistingError(val heroIds: HeroIds) : GetHeroError { override val message = "Heroes $heroIds do not exist" @@ -89,12 +89,12 @@ data class AdminNotExistingError(val adminId: AdminId) : GetAdminError { override val message = "Admin $adminId does not exist" } -data class TaskRepositoryError( +data class MissionRepositoryError( override val message: String, val exception: Exception? = null, val error: ErrorMessage? = null ) : HeroesDeskError, - CreateSquadError, GetSquadError, UpdateSquadNameError, GetSquadMembersError, CreateTaskError, GetTaskError { + CreateSquadError, GetSquadError, UpdateSquadNameError, GetSquadMembersError, CreateMissionError, GetMissionError { constructor(exception: Exception) : this(exception.message ?: "Unknown error", exception) constructor(error: ErrorMessage) : this(error.message, error = error) } \ No newline at end of file diff --git a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/HeroesDeskImpl.kt b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/HeroesDeskImpl.kt deleted file mode 100644 index bb7cbfa..0000000 --- a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/HeroesDeskImpl.kt +++ /dev/null @@ -1,185 +0,0 @@ -package org.hexastacks.heroesdesk.kotlin.impl - -import arrow.core.Either.Left -import arrow.core.Either.Right -import arrow.core.EitherNel -import arrow.core.nonEmptyListOf -import arrow.core.raise.either -import org.hexastacks.heroesdesk.kotlin.HeroesDesk -import org.hexastacks.heroesdesk.kotlin.errors.* -import org.hexastacks.heroesdesk.kotlin.squad.Name -import org.hexastacks.heroesdesk.kotlin.squad.Squad -import org.hexastacks.heroesdesk.kotlin.squad.SquadKey -import org.hexastacks.heroesdesk.kotlin.squad.SquadMembers -import org.hexastacks.heroesdesk.kotlin.impl.task.* -import org.hexastacks.heroesdesk.kotlin.impl.user.AdminId -import org.hexastacks.heroesdesk.kotlin.impl.user.HeroId -import org.hexastacks.heroesdesk.kotlin.impl.user.HeroIds -import org.hexastacks.heroesdesk.kotlin.ports.TaskRepository -import org.hexastacks.heroesdesk.kotlin.ports.UserRepository - - -class HeroesDeskImpl(private val userRepository: UserRepository, private val taskRepository: TaskRepository) : - HeroesDesk { - override fun createSquad(squadKey: SquadKey, name: Name, creator: AdminId): EitherNel = - either { - userRepository.getAdmin(creator).bind() - taskRepository.createSquad(squadKey, name).bind() - } - - override fun assignSquad( - squadKey: SquadKey, - assignees: HeroIds, - changeAuthor: AdminId - ): EitherNel = - either { - val heroes = userRepository.getHeroes(assignees).bind() - userRepository.getAdmin(changeAuthor).bind() - taskRepository.assignSquad(squadKey, heroes).bind() - } - - override fun updateSquadName( - squadKey: SquadKey, - name: Name, - changeAuthor: AdminId - ): EitherNel = - either { - userRepository.getAdmin(changeAuthor).bind() - taskRepository.updateSquadName(squadKey, name).bind() - } - - override fun getSquad(squadKey: SquadKey): EitherNel = - taskRepository.getSquad(squadKey) - - override fun getSquadMembers(squadKey: SquadKey): EitherNel = - taskRepository.getSquadMembers(squadKey) - - override fun createTask( - squadKey: SquadKey, - title: Title, - creator: HeroId - ): EitherNel = - either { - taskRepository.areHeroesInSquad(HeroIds(creator), squadKey).bind() - taskRepository.createTask(squadKey, title).bind() - } - - override fun getTask(id: TaskId): EitherNel> = taskRepository.getTask(id) - - override fun updateTitle( - id: TaskId, - title: Title, - author: HeroId - ): EitherNel> = - either { - taskRepository.areHeroesInSquad(HeroIds(author), id).bind() - taskRepository.updateTitle(id, title).bind() - } - - override fun updateDescription( - id: TaskId, - description: Description, - author: HeroId - ): EitherNel> = - either { - userRepository.getHero(author).bind() - taskRepository.updateDescription(id, description).bind() - } - - override fun assignTask( - id: PendingTaskId, - assignees: HeroIds, - author: HeroId - ): EitherNel> = - doAssignTask(id, assignees, author) - - override fun assignTask( - id: InProgressTaskId, - assignees: HeroIds, - author: HeroId - ): EitherNel> = - doAssignTask(id, assignees, author) - - private fun doAssignTask( - id: TaskId, - assignees: HeroIds, - author: HeroId - ): EitherNel> = - either { - taskRepository.areHeroesInSquad(assignees + author, id.squadKey).bind() - taskRepository.assignTask(id, assignees).bind() - } - - override fun startWork( - id: PendingTaskId, - author: HeroId - ): EitherNel = - either { - val task = taskRepository.areHeroesInSquad(HeroIds(author), id).bind() - val verifiedTask = when (task) { - is PendingTask -> Right(task) - else -> Left(nonEmptyListOf(TaskNotPendingError(task, id))) - }.bind() - if (verifiedTask.assignees.isNotEmpty()) { - Right(verifiedTask) - } else { - Right(assignAuthorToTask(verifiedTask, author, id)) - }.bind() - taskRepository.startWork(id).bind() - } - - - private fun assignAuthorToTask( - verifiedTask: PendingTask, - author: HeroId, - id: PendingTaskId - ): EitherNel> = - taskRepository - .assignTask(id, verifiedTask.assignees.add(author)) - - override fun startWork( - id: DoneTaskId, - author: HeroId - ): EitherNel { - TODO("Not yet implemented") - } - - override fun pauseWork( - id: InProgressTaskId, - author: HeroId - ): EitherNel = - either { - val task = taskRepository.getTask(id).bind() - val verifiedTask = when (task) { - is InProgressTask -> Right(task) - else -> Left(nonEmptyListOf(TaskNotInProgressError(task, id))) - }.bind() - taskRepository.areHeroesInSquad(HeroIds(author), verifiedTask.squadKey()).bind() - taskRepository.pauseWork(id).bind() - } - - override fun pauseWork( - id: DoneTaskId, - author: HeroId - ): EitherNel { - TODO("Not yet implemented") - } - - override fun endWork(id: PendingTaskId, author: HeroId): EitherNel { - TODO("Not yet implemented") - } - - override fun endWork( - id: InProgressTaskId, - author: HeroId - ): EitherNel = - either { - val task = taskRepository.getTask(id).bind() - val verifiedTask = when (task) { - is InProgressTask -> Right(task) - else -> Left(nonEmptyListOf(TaskNotInProgressError(task, id))) - }.bind() - taskRepository.areHeroesInSquad(HeroIds(author), verifiedTask.squadKey()).bind() - taskRepository.endWork(id).bind() - } -} \ No newline at end of file diff --git a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/ValidationError.kt b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/ValidationError.kt deleted file mode 100644 index 3dc8454..0000000 --- a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/ValidationError.kt +++ /dev/null @@ -1,3 +0,0 @@ -package org.hexastacks.heroesdesk.kotlin.impl - -interface ValidationError: ErrorMessage diff --git a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/DoneTask.kt b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/DoneTask.kt deleted file mode 100644 index 1837368..0000000 --- a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/DoneTask.kt +++ /dev/null @@ -1,11 +0,0 @@ -package org.hexastacks.heroesdesk.kotlin.impl.task - -import org.hexastacks.heroesdesk.kotlin.impl.user.HeroIds - -data class DoneTask( - override val taskId: DoneTaskId, - override val title: Title, - override val description: Description, -) : Task { - override val assignees: HeroIds = HeroIds.empty -} diff --git a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/InProgressTask.kt b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/InProgressTask.kt deleted file mode 100644 index a68a8b9..0000000 --- a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/InProgressTask.kt +++ /dev/null @@ -1,10 +0,0 @@ -package org.hexastacks.heroesdesk.kotlin.impl.task - -import org.hexastacks.heroesdesk.kotlin.impl.user.HeroIds - -data class InProgressTask( - override val taskId: InProgressTaskId, - override val title: Title, - override val description: Description, - override val assignees: HeroIds -) : Task \ No newline at end of file diff --git a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/PendingTask.kt b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/PendingTask.kt deleted file mode 100644 index 11fa11d..0000000 --- a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/PendingTask.kt +++ /dev/null @@ -1,10 +0,0 @@ -package org.hexastacks.heroesdesk.kotlin.impl.task - -import org.hexastacks.heroesdesk.kotlin.impl.user.HeroIds - -data class PendingTask( - override val taskId: PendingTaskId, - override val title: Title, - override val description: Description = Description.EMPTY_DESCRIPTION, - override val assignees: HeroIds = HeroIds.empty -) : Task \ No newline at end of file diff --git a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/Task.kt b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/Task.kt deleted file mode 100644 index 76fa1a6..0000000 --- a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/Task.kt +++ /dev/null @@ -1,31 +0,0 @@ -package org.hexastacks.heroesdesk.kotlin.impl.task - -import org.hexastacks.heroesdesk.kotlin.squad.SquadKey -import org.hexastacks.heroesdesk.kotlin.impl.user.HeroIds - -sealed interface Task { - fun updateTitle(title: Title): Task = when (this) { - is PendingTask -> copy(title = title) - is InProgressTask -> copy(title = title) - is DoneTask -> copy(title = title) - } - - fun updateDescription(description: Description): Task = when (this) { - is PendingTask -> copy(description = description) - is InProgressTask -> copy(description = description) - is DoneTask -> copy(description = description) - } - - fun assign(assignees: HeroIds): Task = when (this) { - is PendingTask -> copy(assignees = assignees) - is InProgressTask -> copy(assignees = assignees) - is DoneTask -> this - } - - val taskId: T - val title: Title - val description: Description - val assignees: HeroIds - - fun squadKey(): SquadKey = taskId.squadKey -} \ No newline at end of file diff --git a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/TaskId.kt b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/TaskId.kt deleted file mode 100644 index c6fe250..0000000 --- a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/TaskId.kt +++ /dev/null @@ -1,25 +0,0 @@ -package org.hexastacks.heroesdesk.kotlin.impl.task - -import org.hexastacks.heroesdesk.kotlin.impl.ErrorMessage -import org.hexastacks.heroesdesk.kotlin.squad.SquadKey - -sealed interface TaskId { - - companion object { - const val MIN_LENGTH = 1 - const val MAX_LENGTH = 36 - } - - val squadKey: SquadKey - val value: String - - sealed interface TaskIdError : ErrorMessage - - data class BelowMinLengthError(val string: String) : TaskIdError { - override val message: String = "Task id must be above $MIN_LENGTH characters, got ${string.length} in $string" - } - - data class AboveMaxLengthError(val string: String) : TaskIdError { - override val message: String = "Task id must be below $MAX_LENGTH characters, got ${string.length} in $string" - } -} \ No newline at end of file diff --git a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/AbstractStringValue.kt b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/misc/AbstractStringValue.kt similarity index 91% rename from heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/AbstractStringValue.kt rename to heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/misc/AbstractStringValue.kt index 2aee73a..71ab937 100644 --- a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/AbstractStringValue.kt +++ b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/misc/AbstractStringValue.kt @@ -1,4 +1,4 @@ -package org.hexastacks.heroesdesk.kotlin.impl +package org.hexastacks.heroesdesk.kotlin.misc open class AbstractStringValue(override val value: String) : StringValue { diff --git a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/ErrorMessage.kt b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/misc/ErrorMessage.kt similarity index 53% rename from heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/ErrorMessage.kt rename to heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/misc/ErrorMessage.kt index cbbdfa9..59395a1 100644 --- a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/ErrorMessage.kt +++ b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/misc/ErrorMessage.kt @@ -1,4 +1,4 @@ -package org.hexastacks.heroesdesk.kotlin.impl +package org.hexastacks.heroesdesk.kotlin.misc interface ErrorMessage { val message: String diff --git a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/misc/HeroesDeskImpl.kt b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/misc/HeroesDeskImpl.kt new file mode 100644 index 0000000..c3de0a1 --- /dev/null +++ b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/misc/HeroesDeskImpl.kt @@ -0,0 +1,185 @@ +package org.hexastacks.heroesdesk.kotlin.misc + +import arrow.core.Either.Left +import arrow.core.Either.Right +import arrow.core.EitherNel +import arrow.core.nonEmptyListOf +import arrow.core.raise.either +import org.hexastacks.heroesdesk.kotlin.HeroesDesk +import org.hexastacks.heroesdesk.kotlin.errors.* +import org.hexastacks.heroesdesk.kotlin.squad.Name +import org.hexastacks.heroesdesk.kotlin.squad.Squad +import org.hexastacks.heroesdesk.kotlin.squad.SquadKey +import org.hexastacks.heroesdesk.kotlin.squad.SquadMembers +import org.hexastacks.heroesdesk.kotlin.user.AdminId +import org.hexastacks.heroesdesk.kotlin.user.HeroId +import org.hexastacks.heroesdesk.kotlin.user.HeroIds +import org.hexastacks.heroesdesk.kotlin.mission.* +import org.hexastacks.heroesdesk.kotlin.ports.MissionRepository +import org.hexastacks.heroesdesk.kotlin.ports.UserRepository + + +class HeroesDeskImpl(private val userRepository: UserRepository, private val missionRepository: MissionRepository) : + HeroesDesk { + override fun createSquad(squadKey: SquadKey, name: Name, creator: AdminId): EitherNel = + either { + userRepository.getAdmin(creator).bind() + missionRepository.createSquad(squadKey, name).bind() + } + + override fun assignSquad( + squadKey: SquadKey, + assignees: HeroIds, + changeAuthor: AdminId + ): EitherNel = + either { + val heroes = userRepository.getHeroes(assignees).bind() + userRepository.getAdmin(changeAuthor).bind() + missionRepository.assignSquad(squadKey, heroes).bind() + } + + override fun updateSquadName( + squadKey: SquadKey, + name: Name, + changeAuthor: AdminId + ): EitherNel = + either { + userRepository.getAdmin(changeAuthor).bind() + missionRepository.updateSquadName(squadKey, name).bind() + } + + override fun getSquad(squadKey: SquadKey): EitherNel = + missionRepository.getSquad(squadKey) + + override fun getSquadMembers(squadKey: SquadKey): EitherNel = + missionRepository.getSquadMembers(squadKey) + + override fun createMission( + squadKey: SquadKey, + title: Title, + creator: HeroId + ): EitherNel = + either { + missionRepository.areHeroesInSquad(HeroIds(creator), squadKey).bind() + missionRepository.createMission(squadKey, title).bind() + } + + override fun getMission(id: MissionId): EitherNel> = missionRepository.getMission(id) + + override fun updateTitle( + id: MissionId, + title: Title, + author: HeroId + ): EitherNel> = + either { + missionRepository.areHeroesInSquad(HeroIds(author), id).bind() + missionRepository.updateTitle(id, title).bind() + } + + override fun updateDescription( + id: MissionId, + description: Description, + author: HeroId + ): EitherNel> = + either { + userRepository.getHero(author).bind() + missionRepository.updateDescription(id, description).bind() + } + + override fun assignMission( + id: PendingMissionId, + assignees: HeroIds, + author: HeroId + ): EitherNel> = + doAssignMission(id, assignees, author) + + override fun assignMission( + id: InProgressMissionId, + assignees: HeroIds, + author: HeroId + ): EitherNel> = + doAssignMission(id, assignees, author) + + private fun doAssignMission( + id: MissionId, + assignees: HeroIds, + author: HeroId + ): EitherNel> = + either { + missionRepository.areHeroesInSquad(assignees + author, id.squadKey).bind() + missionRepository.assignMission(id, assignees).bind() + } + + override fun startWork( + id: PendingMissionId, + author: HeroId + ): EitherNel = + either { + val mission = missionRepository.areHeroesInSquad(HeroIds(author), id).bind() + val verifiedMission = when (mission) { + is PendingMission -> Right(mission) + else -> Left(nonEmptyListOf(MissionNotPendingError(mission, id))) + }.bind() + if (verifiedMission.assignees.isNotEmpty()) { + Right(verifiedMission) + } else { + Right(assignAuthorToMission(verifiedMission, author, id)) + }.bind() + missionRepository.startWork(id).bind() + } + + + private fun assignAuthorToMission( + verifiedMission: PendingMission, + author: HeroId, + id: PendingMissionId + ): EitherNel> = + missionRepository + .assignMission(id, verifiedMission.assignees.add(author)) + + override fun startWork( + id: DoneMissionId, + author: HeroId + ): EitherNel { + TODO("Not yet implemented") + } + + override fun pauseWork( + id: InProgressMissionId, + author: HeroId + ): EitherNel = + either { + val mission = missionRepository.getMission(id).bind() + val verifiedMission = when (mission) { + is InProgressMission -> Right(mission) + else -> Left(nonEmptyListOf(MissionNotInProgressError(mission, id))) + }.bind() + missionRepository.areHeroesInSquad(HeroIds(author), verifiedMission.squadKey()).bind() + missionRepository.pauseWork(id).bind() + } + + override fun pauseWork( + id: DoneMissionId, + author: HeroId + ): EitherNel { + TODO("Not yet implemented") + } + + override fun endWork(id: PendingMissionId, author: HeroId): EitherNel { + TODO("Not yet implemented") + } + + override fun endWork( + id: InProgressMissionId, + author: HeroId + ): EitherNel = + either { + val mission = missionRepository.getMission(id).bind() + val verifiedMission = when (mission) { + is InProgressMission -> Right(mission) + else -> Left(nonEmptyListOf(MissionNotInProgressError(mission, id))) + }.bind() + missionRepository.areHeroesInSquad(HeroIds(author), verifiedMission.squadKey()).bind() + missionRepository.endWork(id).bind() + } +} \ No newline at end of file diff --git a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/StringValue.kt b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/misc/StringValue.kt similarity index 51% rename from heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/StringValue.kt rename to heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/misc/StringValue.kt index 82d50f1..d5ab07d 100644 --- a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/StringValue.kt +++ b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/misc/StringValue.kt @@ -1,4 +1,4 @@ -package org.hexastacks.heroesdesk.kotlin.impl +package org.hexastacks.heroesdesk.kotlin.misc interface StringValue { val value: String diff --git a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/misc/ValidationError.kt b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/misc/ValidationError.kt new file mode 100644 index 0000000..cec7472 --- /dev/null +++ b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/misc/ValidationError.kt @@ -0,0 +1,3 @@ +package org.hexastacks.heroesdesk.kotlin.misc + +interface ValidationError: ErrorMessage diff --git a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/AbstractTaskId.kt b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/mission/AbstractMissionId.kt similarity index 76% rename from heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/AbstractTaskId.kt rename to heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/mission/AbstractMissionId.kt index 4be5038..a831304 100644 --- a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/AbstractTaskId.kt +++ b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/mission/AbstractMissionId.kt @@ -1,10 +1,10 @@ -package org.hexastacks.heroesdesk.kotlin.impl.task +package org.hexastacks.heroesdesk.kotlin.mission -abstract class AbstractTaskId() : TaskId { +abstract class AbstractMissionId() : MissionId { override fun equals(other: Any?): Boolean { if (this === other) return true - if (other !is AbstractTaskId) return false + if (other !is AbstractMissionId) return false if (squadKey != other.squadKey) return false if (value != other.value) return false diff --git a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/Description.kt b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/mission/Description.kt similarity index 87% rename from heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/Description.kt rename to heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/mission/Description.kt index 42f7821..271861a 100644 --- a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/Description.kt +++ b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/mission/Description.kt @@ -1,12 +1,12 @@ -package org.hexastacks.heroesdesk.kotlin.impl.task +package org.hexastacks.heroesdesk.kotlin.mission import arrow.core.Either import arrow.core.NonEmptyList import arrow.core.nonEmptyListOf import arrow.core.raise.either import arrow.core.raise.ensure -import org.hexastacks.heroesdesk.kotlin.impl.AbstractStringValue -import org.hexastacks.heroesdesk.kotlin.impl.StringValueError +import org.hexastacks.heroesdesk.kotlin.misc.AbstractStringValue +import org.hexastacks.heroesdesk.kotlin.misc.StringValueError class Description private constructor(value: String) : AbstractStringValue(value) { diff --git a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/mission/DoneMission.kt b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/mission/DoneMission.kt new file mode 100644 index 0000000..5348c12 --- /dev/null +++ b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/mission/DoneMission.kt @@ -0,0 +1,11 @@ +package org.hexastacks.heroesdesk.kotlin.mission + +import org.hexastacks.heroesdesk.kotlin.user.HeroIds + +data class DoneMission( + override val missionId: DoneMissionId, + override val title: Title, + override val description: Description, +) : Mission { + override val assignees: HeroIds = HeroIds.empty +} diff --git a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/DoneTaskId.kt b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/mission/DoneMissionId.kt similarity index 66% rename from heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/DoneTaskId.kt rename to heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/mission/DoneMissionId.kt index d6a6107..b856649 100644 --- a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/DoneTaskId.kt +++ b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/mission/DoneMissionId.kt @@ -1,21 +1,21 @@ -package org.hexastacks.heroesdesk.kotlin.impl.task +package org.hexastacks.heroesdesk.kotlin.mission import arrow.core.EitherNel import arrow.core.raise.either import arrow.core.raise.ensure import arrow.core.raise.zipOrAccumulate import org.hexastacks.heroesdesk.kotlin.squad.SquadKey -import org.hexastacks.heroesdesk.kotlin.impl.task.TaskId.* -import org.hexastacks.heroesdesk.kotlin.impl.task.TaskId.Companion.MAX_LENGTH -import org.hexastacks.heroesdesk.kotlin.impl.task.TaskId.Companion.MIN_LENGTH +import org.hexastacks.heroesdesk.kotlin.mission.MissionId.* +import org.hexastacks.heroesdesk.kotlin.mission.MissionId.Companion.MAX_LENGTH +import org.hexastacks.heroesdesk.kotlin.mission.MissionId.Companion.MIN_LENGTH -class DoneTaskId private constructor(override val squadKey: SquadKey, override val value: String) : AbstractTaskId() { +class DoneMissionId private constructor(override val squadKey: SquadKey, override val value: String) : AbstractMissionId() { companion object { operator fun invoke( squadKey: SquadKey, stringBetween1And36Chars: String - ): EitherNel = + ): EitherNel = either { zipOrAccumulate( { @@ -33,7 +33,7 @@ class DoneTaskId private constructor(override val squadKey: SquadKey, override v } }, ) { _, _ -> - DoneTaskId(squadKey, stringBetween1And36Chars) + DoneMissionId(squadKey, stringBetween1And36Chars) } } } diff --git a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/mission/InProgressMission.kt b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/mission/InProgressMission.kt new file mode 100644 index 0000000..b2ab964 --- /dev/null +++ b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/mission/InProgressMission.kt @@ -0,0 +1,10 @@ +package org.hexastacks.heroesdesk.kotlin.mission + +import org.hexastacks.heroesdesk.kotlin.user.HeroIds + +data class InProgressMission( + override val missionId: InProgressMissionId, + override val title: Title, + override val description: Description, + override val assignees: HeroIds +) : Mission \ No newline at end of file diff --git a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/PendingTaskId.kt b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/mission/InProgressMissionId.kt similarity index 65% rename from heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/PendingTaskId.kt rename to heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/mission/InProgressMissionId.kt index 808e63e..fc52305 100644 --- a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/PendingTaskId.kt +++ b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/mission/InProgressMissionId.kt @@ -1,23 +1,23 @@ -package org.hexastacks.heroesdesk.kotlin.impl.task +package org.hexastacks.heroesdesk.kotlin.mission import arrow.core.Either import arrow.core.NonEmptyList import arrow.core.raise.either import arrow.core.raise.ensure import arrow.core.raise.zipOrAccumulate +import org.hexastacks.heroesdesk.kotlin.mission.MissionId.* +import org.hexastacks.heroesdesk.kotlin.mission.MissionId.Companion.MAX_LENGTH +import org.hexastacks.heroesdesk.kotlin.mission.MissionId.Companion.MIN_LENGTH import org.hexastacks.heroesdesk.kotlin.squad.SquadKey -import org.hexastacks.heroesdesk.kotlin.impl.task.TaskId.* -import org.hexastacks.heroesdesk.kotlin.impl.task.TaskId.Companion.MAX_LENGTH -import org.hexastacks.heroesdesk.kotlin.impl.task.TaskId.Companion.MIN_LENGTH -class PendingTaskId private constructor(override val squadKey: SquadKey, override val value: String) : AbstractTaskId() { +class InProgressMissionId private constructor(override val squadKey: SquadKey, override val value: String) : + AbstractMissionId() { companion object { - operator fun invoke( squadKey: SquadKey, stringBetween1And36Chars: String - ): Either, PendingTaskId> = + ): Either, InProgressMissionId> = either { zipOrAccumulate( { @@ -35,7 +35,7 @@ class PendingTaskId private constructor(override val squadKey: SquadKey, overrid } }, ) { _, _ -> - PendingTaskId(squadKey, stringBetween1And36Chars) + InProgressMissionId(squadKey, stringBetween1And36Chars) } } } diff --git a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/mission/Mission.kt b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/mission/Mission.kt new file mode 100644 index 0000000..e270663 --- /dev/null +++ b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/mission/Mission.kt @@ -0,0 +1,31 @@ +package org.hexastacks.heroesdesk.kotlin.mission + +import org.hexastacks.heroesdesk.kotlin.squad.SquadKey +import org.hexastacks.heroesdesk.kotlin.user.HeroIds + +sealed interface Mission { + fun updateTitle(title: Title): Mission = when (this) { + is PendingMission -> copy(title = title) + is InProgressMission -> copy(title = title) + is DoneMission -> copy(title = title) + } + + fun updateDescription(description: Description): Mission = when (this) { + is PendingMission -> copy(description = description) + is InProgressMission -> copy(description = description) + is DoneMission -> copy(description = description) + } + + fun assign(assignees: HeroIds): Mission = when (this) { + is PendingMission -> copy(assignees = assignees) + is InProgressMission -> copy(assignees = assignees) + is DoneMission -> this + } + + val missionId: T + val title: Title + val description: Description + val assignees: HeroIds + + fun squadKey(): SquadKey = missionId.squadKey +} \ No newline at end of file diff --git a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/mission/MissionId.kt b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/mission/MissionId.kt new file mode 100644 index 0000000..5888921 --- /dev/null +++ b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/mission/MissionId.kt @@ -0,0 +1,25 @@ +package org.hexastacks.heroesdesk.kotlin.mission + +import org.hexastacks.heroesdesk.kotlin.misc.ErrorMessage +import org.hexastacks.heroesdesk.kotlin.squad.SquadKey + +sealed interface MissionId { + + companion object { + const val MIN_LENGTH = 1 + const val MAX_LENGTH = 36 + } + + val squadKey: SquadKey + val value: String + + sealed interface MissionIdError : ErrorMessage + + data class BelowMinLengthError(val string: String) : MissionIdError { + override val message: String = "Mission id must be above $MIN_LENGTH characters, got ${string.length} in $string" + } + + data class AboveMaxLengthError(val string: String) : MissionIdError { + override val message: String = "Mission id must be below $MAX_LENGTH characters, got ${string.length} in $string" + } +} \ No newline at end of file diff --git a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/mission/PendingMission.kt b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/mission/PendingMission.kt new file mode 100644 index 0000000..06f3aa5 --- /dev/null +++ b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/mission/PendingMission.kt @@ -0,0 +1,10 @@ +package org.hexastacks.heroesdesk.kotlin.mission + +import org.hexastacks.heroesdesk.kotlin.user.HeroIds + +data class PendingMission( + override val missionId: PendingMissionId, + override val title: Title, + override val description: Description = Description.EMPTY_DESCRIPTION, + override val assignees: HeroIds = HeroIds.empty +) : Mission \ No newline at end of file diff --git a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/InProgressTaskId.kt b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/mission/PendingMissionId.kt similarity index 66% rename from heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/InProgressTaskId.kt rename to heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/mission/PendingMissionId.kt index f97e0cf..1f0db75 100644 --- a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/InProgressTaskId.kt +++ b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/mission/PendingMissionId.kt @@ -1,23 +1,23 @@ -package org.hexastacks.heroesdesk.kotlin.impl.task +package org.hexastacks.heroesdesk.kotlin.mission import arrow.core.Either import arrow.core.NonEmptyList import arrow.core.raise.either import arrow.core.raise.ensure import arrow.core.raise.zipOrAccumulate -import org.hexastacks.heroesdesk.kotlin.impl.task.TaskId.* -import org.hexastacks.heroesdesk.kotlin.impl.task.TaskId.Companion.MAX_LENGTH -import org.hexastacks.heroesdesk.kotlin.impl.task.TaskId.Companion.MIN_LENGTH import org.hexastacks.heroesdesk.kotlin.squad.SquadKey +import org.hexastacks.heroesdesk.kotlin.mission.MissionId.* +import org.hexastacks.heroesdesk.kotlin.mission.MissionId.Companion.MAX_LENGTH +import org.hexastacks.heroesdesk.kotlin.mission.MissionId.Companion.MIN_LENGTH -class InProgressTaskId private constructor(override val squadKey: SquadKey, override val value: String) : - AbstractTaskId() { +class PendingMissionId private constructor(override val squadKey: SquadKey, override val value: String) : AbstractMissionId() { companion object { + operator fun invoke( squadKey: SquadKey, stringBetween1And36Chars: String - ): Either, InProgressTaskId> = + ): Either, PendingMissionId> = either { zipOrAccumulate( { @@ -35,7 +35,7 @@ class InProgressTaskId private constructor(override val squadKey: SquadKey, over } }, ) { _, _ -> - InProgressTaskId(squadKey, stringBetween1And36Chars) + PendingMissionId(squadKey, stringBetween1And36Chars) } } } diff --git a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/Title.kt b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/mission/Title.kt similarity index 78% rename from heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/Title.kt rename to heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/mission/Title.kt index 09ead3a..a0be9d0 100644 --- a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/Title.kt +++ b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/mission/Title.kt @@ -1,13 +1,12 @@ -package org.hexastacks.heroesdesk.kotlin.impl.task +package org.hexastacks.heroesdesk.kotlin.mission import arrow.core.Either import arrow.core.NonEmptyList import arrow.core.raise.either import arrow.core.raise.ensure import arrow.core.raise.zipOrAccumulate -import org.hexastacks.heroesdesk.kotlin.impl.AbstractStringValue -import org.hexastacks.heroesdesk.kotlin.impl.StringValueError -import org.hexastacks.heroesdesk.kotlin.impl.user.HeroId +import org.hexastacks.heroesdesk.kotlin.misc.AbstractStringValue +import org.hexastacks.heroesdesk.kotlin.misc.StringValueError class Title private constructor(value: String) : AbstractStringValue(value) { @@ -42,11 +41,11 @@ class Title private constructor(value: String) : AbstractStringValue(value) { sealed interface TitleError : StringValueError data class BelowMinLengthError(val string: String) : TitleError { override val message: String = - "Title must be above ${MIN_LENGTH} characters, got ${string.length} in $string" + "Title must be above $MIN_LENGTH characters, got ${string.length} in $string" } data class AboveMaxLengthError(val string: String) : TitleError { override val message: String = - "Title must be below ${MAX_LENGTH} characters, got ${string.length} in $string" + "Title must be below $MAX_LENGTH characters, got ${string.length} in $string" } } \ No newline at end of file diff --git a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/ports/MissionRepository.kt b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/ports/MissionRepository.kt new file mode 100644 index 0000000..51b8c17 --- /dev/null +++ b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/ports/MissionRepository.kt @@ -0,0 +1,64 @@ +package org.hexastacks.heroesdesk.kotlin.ports + +import arrow.core.EitherNel +import arrow.core.raise.either +import org.hexastacks.heroesdesk.kotlin.errors.* +import org.hexastacks.heroesdesk.kotlin.squad.Name +import org.hexastacks.heroesdesk.kotlin.squad.Squad +import org.hexastacks.heroesdesk.kotlin.squad.SquadKey +import org.hexastacks.heroesdesk.kotlin.squad.SquadMembers +import org.hexastacks.heroesdesk.kotlin.user.HeroIds +import org.hexastacks.heroesdesk.kotlin.user.Heroes +import org.hexastacks.heroesdesk.kotlin.mission.* + +interface MissionRepository { + fun createSquad(squadKey: SquadKey, name: Name): EitherNel + + fun getSquad(squadKey: SquadKey): EitherNel + fun getSquadMembers(squadKey: SquadKey): EitherNel + + fun updateSquadName( + squadKey: SquadKey, + name: Name + ): EitherNel + + fun assignSquad( + squadKey: SquadKey, + assignees: Heroes + ): EitherNel + + fun areHeroesInSquad(heroIds: HeroIds, squadKey: SquadKey): EitherNel + fun areHeroesInSquad(heroIds: HeroIds, missionId: MissionId): EitherNel> = + either { + val mission = getMission(missionId).bind() + areHeroesInSquad(heroIds, mission.squadKey()).bind() + mission + } + + fun createMission(squadKey: SquadKey, title: Title): EitherNel + + fun getMission(missionId: MissionId): EitherNel> + + fun updateTitle( + missionId: MissionId, + title: Title + ): EitherNel> + + fun updateDescription( + missionId: MissionId, + description: Description + ): EitherNel> + + fun assignMission( + missionId: MissionId, + assignees: HeroIds + ): EitherNel> + + fun startWork(pendingMissionId: PendingMissionId): EitherNel + + fun pauseWork(inProgressMissionId: InProgressMissionId): EitherNel + + fun endWork(inProgressMissionId: InProgressMissionId): EitherNel + + +} diff --git a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/ports/TaskRepository.kt b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/ports/TaskRepository.kt deleted file mode 100644 index 929f898..0000000 --- a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/ports/TaskRepository.kt +++ /dev/null @@ -1,64 +0,0 @@ -package org.hexastacks.heroesdesk.kotlin.ports - -import arrow.core.EitherNel -import arrow.core.raise.either -import org.hexastacks.heroesdesk.kotlin.errors.* -import org.hexastacks.heroesdesk.kotlin.squad.Name -import org.hexastacks.heroesdesk.kotlin.squad.Squad -import org.hexastacks.heroesdesk.kotlin.squad.SquadKey -import org.hexastacks.heroesdesk.kotlin.squad.SquadMembers -import org.hexastacks.heroesdesk.kotlin.impl.task.* -import org.hexastacks.heroesdesk.kotlin.impl.user.HeroIds -import org.hexastacks.heroesdesk.kotlin.impl.user.Heroes - -interface TaskRepository { - fun createSquad(squadKey: SquadKey, name: Name): EitherNel - - fun getSquad(squadKey: SquadKey): EitherNel - fun getSquadMembers(squadKey: SquadKey): EitherNel - - fun updateSquadName( - squadKey: SquadKey, - name: Name - ): EitherNel - - fun assignSquad( - squadKey: SquadKey, - assignees: Heroes - ): EitherNel - - fun areHeroesInSquad(heroIds: HeroIds, squadKey: SquadKey): EitherNel - fun areHeroesInSquad(heroIds: HeroIds, taskId: TaskId): EitherNel> = - either { - val task = getTask(taskId).bind() - areHeroesInSquad(heroIds, task.squadKey()).bind() - task - } - - fun createTask(squadKey: SquadKey, title: Title): EitherNel - - fun getTask(taskId: TaskId): EitherNel> - - fun updateTitle( - taskId: TaskId, - title: Title - ): EitherNel> - - fun updateDescription( - taskId: TaskId, - description: Description - ): EitherNel> - - fun assignTask( - taskId: TaskId, - assignees: HeroIds - ): EitherNel> - - fun startWork(pendingTaskId: PendingTaskId): EitherNel - - fun pauseWork(inProgressTaskId: InProgressTaskId): EitherNel - - fun endWork(inProgressTaskId: InProgressTaskId): EitherNel - - -} diff --git a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/ports/UserRepository.kt b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/ports/UserRepository.kt index 9662747..e55b32a 100644 --- a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/ports/UserRepository.kt +++ b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/ports/UserRepository.kt @@ -5,7 +5,7 @@ import arrow.core.Either.Right import org.hexastacks.heroesdesk.kotlin.errors.GetAdminError import org.hexastacks.heroesdesk.kotlin.errors.GetHeroError import org.hexastacks.heroesdesk.kotlin.errors.HeroesNotExistingError -import org.hexastacks.heroesdesk.kotlin.impl.user.* +import org.hexastacks.heroesdesk.kotlin.user.* interface UserRepository { fun getHero(heroId: HeroId): EitherNel = diff --git a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/squad/Name.kt b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/squad/Name.kt index 4fd5466..ff32eba 100644 --- a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/squad/Name.kt +++ b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/squad/Name.kt @@ -5,8 +5,8 @@ import arrow.core.NonEmptyList import arrow.core.raise.either import arrow.core.raise.ensure import arrow.core.raise.zipOrAccumulate -import org.hexastacks.heroesdesk.kotlin.impl.AbstractStringValue -import org.hexastacks.heroesdesk.kotlin.impl.StringValueError +import org.hexastacks.heroesdesk.kotlin.misc.AbstractStringValue +import org.hexastacks.heroesdesk.kotlin.misc.StringValueError class Name private constructor(value: String) : AbstractStringValue(value) { diff --git a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/squad/SquadKey.kt b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/squad/SquadKey.kt index c3a5bf2..e49eb03 100644 --- a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/squad/SquadKey.kt +++ b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/squad/SquadKey.kt @@ -4,8 +4,8 @@ import arrow.core.EitherNel import arrow.core.raise.either import arrow.core.raise.ensure import arrow.core.raise.zipOrAccumulate -import org.hexastacks.heroesdesk.kotlin.impl.AbstractStringValue -import org.hexastacks.heroesdesk.kotlin.impl.StringValueError +import org.hexastacks.heroesdesk.kotlin.misc.AbstractStringValue +import org.hexastacks.heroesdesk.kotlin.misc.StringValueError class SquadKey private constructor(value: String) : AbstractStringValue(value) { diff --git a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/squad/SquadMembers.kt b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/squad/SquadMembers.kt index ab56e2b..67c0e7e 100644 --- a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/squad/SquadMembers.kt +++ b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/squad/SquadMembers.kt @@ -1,6 +1,6 @@ package org.hexastacks.heroesdesk.kotlin.squad -import org.hexastacks.heroesdesk.kotlin.impl.user.HeroIds +import org.hexastacks.heroesdesk.kotlin.user.HeroIds data class SquadMembers(val squadKey: SquadKey, val heroes: HeroIds = HeroIds.empty) { fun containsAll(heroIds: HeroIds): Boolean = heroes.containsAll(heroIds) diff --git a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/user/AbstractUser.kt b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/user/AbstractUser.kt similarity index 87% rename from heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/user/AbstractUser.kt rename to heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/user/AbstractUser.kt index 7cc5a62..61712af 100644 --- a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/user/AbstractUser.kt +++ b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/user/AbstractUser.kt @@ -1,4 +1,4 @@ -package org.hexastacks.heroesdesk.kotlin.impl.user +package org.hexastacks.heroesdesk.kotlin.user abstract class AbstractUser() : User { final override fun equals(other: Any?): Boolean { diff --git a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/user/Admin.kt b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/user/Admin.kt similarity index 66% rename from heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/user/Admin.kt rename to heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/user/Admin.kt index b2078eb..923d1d3 100644 --- a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/user/Admin.kt +++ b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/user/Admin.kt @@ -1,4 +1,4 @@ -package org.hexastacks.heroesdesk.kotlin.impl.user +package org.hexastacks.heroesdesk.kotlin.user data class Admin(override val id: AdminId, override val name: UserName): AbstractUser() { } \ No newline at end of file diff --git a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/user/AdminId.kt b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/user/AdminId.kt similarity index 90% rename from heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/user/AdminId.kt rename to heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/user/AdminId.kt index eeceb2c..588e881 100644 --- a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/user/AdminId.kt +++ b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/user/AdminId.kt @@ -1,12 +1,12 @@ -package org.hexastacks.heroesdesk.kotlin.impl.user +package org.hexastacks.heroesdesk.kotlin.user import arrow.core.Either import arrow.core.NonEmptyList import arrow.core.raise.either import arrow.core.raise.ensure import arrow.core.raise.zipOrAccumulate -import org.hexastacks.heroesdesk.kotlin.impl.AbstractStringValue -import org.hexastacks.heroesdesk.kotlin.impl.StringValueError +import org.hexastacks.heroesdesk.kotlin.misc.AbstractStringValue +import org.hexastacks.heroesdesk.kotlin.misc.StringValueError class AdminId private constructor(value: String) : UserId, AbstractStringValue(value) { diff --git a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/user/Hero.kt b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/user/Hero.kt similarity index 66% rename from heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/user/Hero.kt rename to heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/user/Hero.kt index 0043d46..60123e2 100644 --- a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/user/Hero.kt +++ b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/user/Hero.kt @@ -1,4 +1,4 @@ -package org.hexastacks.heroesdesk.kotlin.impl.user +package org.hexastacks.heroesdesk.kotlin.user data class Hero(override val name: UserName, override val id: HeroId): AbstractUser() { } diff --git a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/user/HeroId.kt b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/user/HeroId.kt similarity index 82% rename from heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/user/HeroId.kt rename to heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/user/HeroId.kt index 415c982..d8ff4e1 100644 --- a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/user/HeroId.kt +++ b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/user/HeroId.kt @@ -1,13 +1,13 @@ -package org.hexastacks.heroesdesk.kotlin.impl.user +package org.hexastacks.heroesdesk.kotlin.user import arrow.core.EitherNel import arrow.core.raise.either import arrow.core.raise.ensure import arrow.core.raise.zipOrAccumulate -import org.hexastacks.heroesdesk.kotlin.impl.AbstractStringValue -import org.hexastacks.heroesdesk.kotlin.impl.StringValueError -import org.hexastacks.heroesdesk.kotlin.impl.user.UserId.Companion.MAX_LENGTH -import org.hexastacks.heroesdesk.kotlin.impl.user.UserId.Companion.MIN_LENGTH +import org.hexastacks.heroesdesk.kotlin.misc.AbstractStringValue +import org.hexastacks.heroesdesk.kotlin.misc.StringValueError +import org.hexastacks.heroesdesk.kotlin.user.UserId.Companion.MAX_LENGTH +import org.hexastacks.heroesdesk.kotlin.user.UserId.Companion.MIN_LENGTH class HeroId private constructor(value: String) : UserId, AbstractStringValue(value) { diff --git a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/user/HeroIds.kt b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/user/HeroIds.kt similarity index 95% rename from heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/user/HeroIds.kt rename to heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/user/HeroIds.kt index 55ca86f..5e8b919 100644 --- a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/user/HeroIds.kt +++ b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/user/HeroIds.kt @@ -1,4 +1,4 @@ -package org.hexastacks.heroesdesk.kotlin.impl.user +package org.hexastacks.heroesdesk.kotlin.user import arrow.core.NonEmptyList diff --git a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/user/Heroes.kt b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/user/Heroes.kt similarity index 96% rename from heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/user/Heroes.kt rename to heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/user/Heroes.kt index 3b5ffbe..ad355a6 100644 --- a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/user/Heroes.kt +++ b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/user/Heroes.kt @@ -1,4 +1,4 @@ -package org.hexastacks.heroesdesk.kotlin.impl.user +package org.hexastacks.heroesdesk.kotlin.user import arrow.core.Option import arrow.core.firstOrNone diff --git a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/user/User.kt b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/user/User.kt similarity index 80% rename from heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/user/User.kt rename to heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/user/User.kt index 6824a89..86c206e 100644 --- a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/user/User.kt +++ b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/user/User.kt @@ -1,4 +1,4 @@ -package org.hexastacks.heroesdesk.kotlin.impl.user +package org.hexastacks.heroesdesk.kotlin.user sealed interface User { fun asHero(): Hero? = diff --git a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/user/UserId.kt b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/user/UserId.kt similarity index 56% rename from heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/user/UserId.kt rename to heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/user/UserId.kt index 97b4143..4ad35a6 100644 --- a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/user/UserId.kt +++ b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/user/UserId.kt @@ -1,6 +1,6 @@ -package org.hexastacks.heroesdesk.kotlin.impl.user +package org.hexastacks.heroesdesk.kotlin.user -import org.hexastacks.heroesdesk.kotlin.impl.StringValue +import org.hexastacks.heroesdesk.kotlin.misc.StringValue sealed interface UserId : StringValue { diff --git a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/user/UserName.kt b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/user/UserName.kt similarity index 90% rename from heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/user/UserName.kt rename to heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/user/UserName.kt index 18d2f75..af4f215 100644 --- a/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/impl/user/UserName.kt +++ b/heroesdesk/src/main/kotlin/org/hexastacks/heroesdesk/kotlin/user/UserName.kt @@ -1,12 +1,12 @@ -package org.hexastacks.heroesdesk.kotlin.impl.user +package org.hexastacks.heroesdesk.kotlin.user import arrow.core.Either import arrow.core.NonEmptyList import arrow.core.raise.either import arrow.core.raise.ensure import arrow.core.raise.zipOrAccumulate -import org.hexastacks.heroesdesk.kotlin.impl.AbstractStringValue -import org.hexastacks.heroesdesk.kotlin.impl.StringValueError +import org.hexastacks.heroesdesk.kotlin.misc.AbstractStringValue +import org.hexastacks.heroesdesk.kotlin.misc.StringValueError class UserName private constructor(value: String) : AbstractStringValue(value) { diff --git a/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/AbstractTaskIdTest.kt b/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/AbstractTaskIdTest.kt deleted file mode 100644 index 5321a36..0000000 --- a/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/AbstractTaskIdTest.kt +++ /dev/null @@ -1,114 +0,0 @@ -package org.hexastacks.heroesdesk.kotlin.impl.task - -import arrow.core.EitherNel -import arrow.core.getOrElse -import org.hexastacks.heroesdesk.kotlin.impl.TestUtils.createSquadKeyOrThrow -import org.hexastacks.heroesdesk.kotlin.squad.SquadKey -import org.hexastacks.heroesdesk.kotlin.impl.task.TaskId.TaskIdError -import kotlin.test.Test -import kotlin.test.assertEquals -import kotlin.test.assertNotEquals -import kotlin.test.assertTrue - -abstract class AbstractTaskIdTest { - @Test - fun `taskId at min length creates taskId`() { - val desc = "f".repeat(minLength) - - val taskId = createTaskIdOrThrow(desc) - - assertEquals(desc, taskId.value) - } - - @Test - fun `string above min length creates taskId`() { - val desc = "f".repeat(minLength + 1) - - val taskId = createTaskIdOrThrow(desc) - - assertEquals(desc, taskId.value) - } - - @Test - fun `string below max length creates taskId`() { - val desc = "f".repeat(maxLength - 1) - - val description = createTaskIdOrThrow(desc) - - assertEquals(desc, description.value) - } - - @Test - fun `string at max length creates taskId`() { - val desc = "f".repeat(maxLength) - - val description = createTaskIdOrThrow(desc) - - assertEquals(desc, description.value) - } - - @Test - fun `taskId not possible with string above max length`() { - val tooLongValue = "f".repeat(maxLength + 1) - - val description = createTaskId(tooLongValue) - - assertTrue(description.isLeft()) - } - - @Test - fun `taskId not possible with string below min length`() { - val tooSmallValue = "f".repeat(minLength - 1) - - val taskId = createTaskId(tooSmallValue) - - assertTrue(taskId.isLeft()) - } - - @Test - fun `toString displays the string value`() { - val value = "my own desc" - val description = createTaskIdOrThrow(value) - - val toString = description.toString() - - assertTrue(toString.contains(value)) - } - - @Test - fun `two string values with the same values are equal`() { - val value = "my own desc" - val description1 = createTaskIdOrThrow(value) - val description2 = createTaskIdOrThrow(value) - - assertEquals(description1, description2) - } - - @Test - fun `two string values with different values aren't equal`() { - val description1 = createTaskIdOrThrow("description1") - val description2 = createTaskIdOrThrow("description2") - - assertNotEquals(description1, description2) - } - - @Test - fun `two string values with the same value have the same hashcode`() { - val value = "my own text" - val description1 = createTaskIdOrThrow(value) - val description2 = createTaskIdOrThrow(value) - - assertEquals(description1.hashCode(), description2.hashCode()) - } - - abstract fun createTaskId(squad: SquadKey, value: String): EitherNel - - private fun createTaskId(value: String) = - createTaskId(createSquadKeyOrThrow("randomSquad"), value) - - private fun createTaskIdOrThrow(value: String) = - createTaskId(createSquadKeyOrThrow("randomSquad"), value).getOrElse { throw IllegalStateException() } - - private val minLength: Int = TaskId.MIN_LENGTH - private val maxLength: Int = TaskId.MAX_LENGTH -} \ No newline at end of file diff --git a/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/AbstractTaskTest.kt b/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/AbstractTaskTest.kt deleted file mode 100644 index 5a71299..0000000 --- a/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/AbstractTaskTest.kt +++ /dev/null @@ -1,46 +0,0 @@ -package org.hexastacks.heroesdesk.kotlin.impl.task - -import arrow.core.getOrElse -import org.hexastacks.heroesdesk.kotlin.impl.TestUtils.createDescriptionOrThrow -import org.hexastacks.heroesdesk.kotlin.impl.TestUtils.createSquadKeyOrThrow -import org.hexastacks.heroesdesk.kotlin.impl.TestUtils.createTitleOrThrow -import org.hexastacks.heroesdesk.kotlin.squad.SquadKey -import org.hexastacks.heroesdesk.kotlin.impl.user.HeroIds -import kotlin.test.Test -import kotlin.test.assertEquals - -abstract class AbstractTaskTest> { - - @Test - fun `updateTitle should return a new task with the updated title`() { - val task = createTaskOrThrow("squadKey", "taskId", "title", "description") - val newTitle = Title("new title").getOrElse { throw RuntimeException("new title should be valid") } - - val updatedTask = task.updateTitle(newTitle) - - assertEquals(newTitle, updatedTask.title) - } - - private fun createTaskOrThrow( - squadKey: String, - taskId: String, - title: String, - description: String - ): T { - val squad = createSquadKeyOrThrow(squadKey) - return createTaskOrThrow( - createTaskIdOrThrow(squad, taskId), - createTitleOrThrow(title), - createDescriptionOrThrow(description) - ) - } - - abstract fun createTaskIdOrThrow(squad: SquadKey, taskId: String): Id - - abstract fun createTaskOrThrow( - id: Id, - title: Title, - description: Description, - assignees: HeroIds = HeroIds.empty - ): T -} diff --git a/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/DoneTaskIdTest.kt b/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/DoneTaskIdTest.kt deleted file mode 100644 index f2aa629..0000000 --- a/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/DoneTaskIdTest.kt +++ /dev/null @@ -1,11 +0,0 @@ -package org.hexastacks.heroesdesk.kotlin.impl.task - -import arrow.core.EitherNel -import org.hexastacks.heroesdesk.kotlin.squad.SquadKey -import org.hexastacks.heroesdesk.kotlin.impl.task.TaskId.TaskIdError - -class DoneTaskIdTest : AbstractTaskIdTest() { - override fun createTaskId(squadKey: SquadKey, value: String): EitherNel = - DoneTaskId(squadKey, value) - -} \ No newline at end of file diff --git a/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/DoneTaskTest.kt b/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/DoneTaskTest.kt deleted file mode 100644 index d1b7c4d..0000000 --- a/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/DoneTaskTest.kt +++ /dev/null @@ -1,20 +0,0 @@ -package org.hexastacks.heroesdesk.kotlin.impl.task - -import arrow.core.getOrElse -import org.hexastacks.heroesdesk.kotlin.squad.SquadKey -import org.hexastacks.heroesdesk.kotlin.impl.user.HeroIds - -class DoneTaskTest : AbstractTaskTest() { - override fun createTaskOrThrow( - id: DoneTaskId, - title: Title, - description: Description, - assignees: HeroIds - ): DoneTask = - DoneTask(id, title, description) - - - override fun createTaskIdOrThrow(squadKey: SquadKey, taskId: String): DoneTaskId = - DoneTaskId(squadKey, taskId).getOrElse { throw RuntimeException("$taskId should be valid") } - -} \ No newline at end of file diff --git a/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/InProgressTaskIdTest.kt b/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/InProgressTaskIdTest.kt deleted file mode 100644 index 802e15d..0000000 --- a/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/InProgressTaskIdTest.kt +++ /dev/null @@ -1,10 +0,0 @@ -package org.hexastacks.heroesdesk.kotlin.impl.task - -import arrow.core.EitherNel -import org.hexastacks.heroesdesk.kotlin.squad.SquadKey - -class InProgressTaskIdTest : AbstractTaskIdTest() { - - override fun createTaskId(squadKey: SquadKey, value: String): EitherNel = InProgressTaskId(squadKey, value) - -} \ No newline at end of file diff --git a/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/InProgressTaskTest.kt b/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/InProgressTaskTest.kt deleted file mode 100644 index 55f0394..0000000 --- a/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/InProgressTaskTest.kt +++ /dev/null @@ -1,19 +0,0 @@ -package org.hexastacks.heroesdesk.kotlin.impl.task - -import arrow.core.getOrElse -import org.hexastacks.heroesdesk.kotlin.squad.SquadKey -import org.hexastacks.heroesdesk.kotlin.impl.user.HeroIds - -class InProgressTaskTest : AbstractTaskTest() { - override fun createTaskOrThrow( - id: InProgressTaskId, - title: Title, - description: Description, - assignees: HeroIds - ) = - InProgressTask(id, title, description, assignees) - - override fun createTaskIdOrThrow(squadKey: SquadKey, taskId: String): InProgressTaskId = - InProgressTaskId(squadKey, taskId).getOrElse { throw RuntimeException("$taskId should be valid") } - -} \ No newline at end of file diff --git a/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/PendingTaskIdTest.kt b/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/PendingTaskIdTest.kt deleted file mode 100644 index 3a36c16..0000000 --- a/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/PendingTaskIdTest.kt +++ /dev/null @@ -1,10 +0,0 @@ -package org.hexastacks.heroesdesk.kotlin.impl.task - -import arrow.core.EitherNel -import org.hexastacks.heroesdesk.kotlin.squad.SquadKey - -class PendingTaskIdTest : AbstractTaskIdTest() { - override fun createTaskId(squadKey: SquadKey, value: String): EitherNel = - PendingTaskId(squadKey, value) - -} \ No newline at end of file diff --git a/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/PendingTaskTest.kt b/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/PendingTaskTest.kt deleted file mode 100644 index cac9748..0000000 --- a/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/PendingTaskTest.kt +++ /dev/null @@ -1,19 +0,0 @@ -package org.hexastacks.heroesdesk.kotlin.impl.task - -import arrow.core.getOrElse -import org.hexastacks.heroesdesk.kotlin.squad.SquadKey -import org.hexastacks.heroesdesk.kotlin.impl.user.HeroIds - -class PendingTaskTest : AbstractTaskTest() { - override fun createTaskOrThrow( - id: PendingTaskId, - title: Title, - description: Description, - assignees: HeroIds - ) = - PendingTask(id, title, description, assignees) - - override fun createTaskIdOrThrow(squadKey: SquadKey, taskId: String): PendingTaskId = - PendingTaskId(squadKey, taskId).getOrElse { throw RuntimeException("$taskId should be valid") } - -} \ No newline at end of file diff --git a/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/AbstractStringValueTest.kt b/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/AbstractStringValueTest.kt similarity index 98% rename from heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/AbstractStringValueTest.kt rename to heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/AbstractStringValueTest.kt index b080587..4dace31 100644 --- a/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/AbstractStringValueTest.kt +++ b/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/AbstractStringValueTest.kt @@ -1,4 +1,4 @@ -package org.hexastacks.heroesdesk.kotlin.impl +package org.hexastacks.heroesdesk.kotlin.misc import arrow.core.EitherNel import arrow.core.getOrElse diff --git a/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/TestUtils.kt b/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/TestUtils.kt similarity index 75% rename from heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/TestUtils.kt rename to heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/TestUtils.kt index b31c56e..39667c1 100644 --- a/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/TestUtils.kt +++ b/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/TestUtils.kt @@ -1,12 +1,12 @@ -package org.hexastacks.heroesdesk.kotlin.impl +package org.hexastacks.heroesdesk.kotlin.misc import arrow.core.getOrElse import org.hexastacks.heroesdesk.kotlin.squad.SquadKey -import org.hexastacks.heroesdesk.kotlin.impl.task.Description -import org.hexastacks.heroesdesk.kotlin.impl.task.Title -import org.hexastacks.heroesdesk.kotlin.impl.user.Hero -import org.hexastacks.heroesdesk.kotlin.impl.user.HeroId -import org.hexastacks.heroesdesk.kotlin.impl.user.UserName +import org.hexastacks.heroesdesk.kotlin.mission.Description +import org.hexastacks.heroesdesk.kotlin.mission.Title +import org.hexastacks.heroesdesk.kotlin.user.Hero +import org.hexastacks.heroesdesk.kotlin.user.HeroId +import org.hexastacks.heroesdesk.kotlin.user.UserName object TestUtils { diff --git a/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/mission/AbstractMissionIdTest.kt b/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/mission/AbstractMissionIdTest.kt new file mode 100644 index 0000000..aac8306 --- /dev/null +++ b/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/mission/AbstractMissionIdTest.kt @@ -0,0 +1,115 @@ +package org.hexastacks.heroesdesk.kotlin.misc.mission + +import arrow.core.EitherNel +import arrow.core.getOrElse +import org.hexastacks.heroesdesk.kotlin.misc.TestUtils.createSquadKeyOrThrow +import org.hexastacks.heroesdesk.kotlin.mission.MissionId +import org.hexastacks.heroesdesk.kotlin.squad.SquadKey +import org.hexastacks.heroesdesk.kotlin.mission.MissionId.MissionIdError +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertNotEquals +import kotlin.test.assertTrue + +abstract class AbstractMissionIdTest { + @Test + fun `missionId at min length creates missionId`() { + val desc = "f".repeat(minLength) + + val missionId = createMissionIdOrThrow(desc) + + assertEquals(desc, missionId.value) + } + + @Test + fun `string above min length creates missionId`() { + val desc = "f".repeat(minLength + 1) + + val missionId = createMissionIdOrThrow(desc) + + assertEquals(desc, missionId.value) + } + + @Test + fun `string below max length creates missionId`() { + val desc = "f".repeat(maxLength - 1) + + val description = createMissionIdOrThrow(desc) + + assertEquals(desc, description.value) + } + + @Test + fun `string at max length creates missionId`() { + val desc = "f".repeat(maxLength) + + val description = createMissionIdOrThrow(desc) + + assertEquals(desc, description.value) + } + + @Test + fun `missionId not possible with string above max length`() { + val tooLongValue = "f".repeat(maxLength + 1) + + val description = createMissionId(tooLongValue) + + assertTrue(description.isLeft()) + } + + @Test + fun `missionId not possible with string below min length`() { + val tooSmallValue = "f".repeat(minLength - 1) + + val missionId = createMissionId(tooSmallValue) + + assertTrue(missionId.isLeft()) + } + + @Test + fun `toString displays the string value`() { + val value = "my own desc" + val description = createMissionIdOrThrow(value) + + val toString = description.toString() + + assertTrue(toString.contains(value)) + } + + @Test + fun `two string values with the same values are equal`() { + val value = "my own desc" + val description1 = createMissionIdOrThrow(value) + val description2 = createMissionIdOrThrow(value) + + assertEquals(description1, description2) + } + + @Test + fun `two string values with different values aren't equal`() { + val description1 = createMissionIdOrThrow("description1") + val description2 = createMissionIdOrThrow("description2") + + assertNotEquals(description1, description2) + } + + @Test + fun `two string values with the same value have the same hashcode`() { + val value = "my own text" + val description1 = createMissionIdOrThrow(value) + val description2 = createMissionIdOrThrow(value) + + assertEquals(description1.hashCode(), description2.hashCode()) + } + + abstract fun createMissionId(squad: SquadKey, value: String): EitherNel + + private fun createMissionId(value: String) = + createMissionId(createSquadKeyOrThrow("randomSquad"), value) + + private fun createMissionIdOrThrow(value: String) = + createMissionId(createSquadKeyOrThrow("randomSquad"), value).getOrElse { throw IllegalStateException() } + + private val minLength: Int = MissionId.MIN_LENGTH + private val maxLength: Int = MissionId.MAX_LENGTH +} \ No newline at end of file diff --git a/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/mission/AbstractMissionTest.kt b/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/mission/AbstractMissionTest.kt new file mode 100644 index 0000000..f55f4b0 --- /dev/null +++ b/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/mission/AbstractMissionTest.kt @@ -0,0 +1,50 @@ +package org.hexastacks.heroesdesk.kotlin.misc.mission + +import arrow.core.getOrElse +import org.hexastacks.heroesdesk.kotlin.misc.TestUtils.createDescriptionOrThrow +import org.hexastacks.heroesdesk.kotlin.misc.TestUtils.createSquadKeyOrThrow +import org.hexastacks.heroesdesk.kotlin.misc.TestUtils.createTitleOrThrow +import org.hexastacks.heroesdesk.kotlin.squad.SquadKey +import org.hexastacks.heroesdesk.kotlin.user.HeroIds +import org.hexastacks.heroesdesk.kotlin.mission.Description +import org.hexastacks.heroesdesk.kotlin.mission.Mission +import org.hexastacks.heroesdesk.kotlin.mission.MissionId +import org.hexastacks.heroesdesk.kotlin.mission.Title +import kotlin.test.Test +import kotlin.test.assertEquals + +abstract class AbstractMissionTest> { + + @Test + fun `updateTitle should return a new mission with the updated title`() { + val mission = createMissionOrThrow("squadKey", "missionId", "title", "description") + val newTitle = Title("new title").getOrElse { throw RuntimeException("new title should be valid") } + + val updatedMission = mission.updateTitle(newTitle) + + assertEquals(newTitle, updatedMission.title) + } + + private fun createMissionOrThrow( + squadKey: String, + missionId: String, + title: String, + description: String + ): T { + val squad = createSquadKeyOrThrow(squadKey) + return createMissionOrThrow( + createMissionIdOrThrow(squad, missionId), + createTitleOrThrow(title), + createDescriptionOrThrow(description) + ) + } + + abstract fun createMissionIdOrThrow(squad: SquadKey, missionId: String): Id + + abstract fun createMissionOrThrow( + id: Id, + title: Title, + description: Description, + assignees: HeroIds = HeroIds.empty + ): T +} diff --git a/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/DescriptionTest.kt b/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/mission/DescriptionTest.kt similarity index 51% rename from heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/DescriptionTest.kt rename to heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/mission/DescriptionTest.kt index 83faddd..9f78d0f 100644 --- a/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/DescriptionTest.kt +++ b/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/mission/DescriptionTest.kt @@ -1,8 +1,9 @@ -package org.hexastacks.heroesdesk.kotlin.impl.task +package org.hexastacks.heroesdesk.kotlin.misc.mission -import org.hexastacks.heroesdesk.kotlin.impl.AbstractStringValueTest -import org.hexastacks.heroesdesk.kotlin.impl.task.Description.DescriptionError +import org.hexastacks.heroesdesk.kotlin.misc.AbstractStringValueTest +import org.hexastacks.heroesdesk.kotlin.mission.Description +import org.hexastacks.heroesdesk.kotlin.mission.Description.DescriptionError class DescriptionTest : AbstractStringValueTest() { diff --git a/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/mission/DoneMissionIdTest.kt b/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/mission/DoneMissionIdTest.kt new file mode 100644 index 0000000..fa32ad4 --- /dev/null +++ b/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/mission/DoneMissionIdTest.kt @@ -0,0 +1,12 @@ +package org.hexastacks.heroesdesk.kotlin.misc.mission + +import arrow.core.EitherNel +import org.hexastacks.heroesdesk.kotlin.squad.SquadKey +import org.hexastacks.heroesdesk.kotlin.mission.MissionId.MissionIdError +import org.hexastacks.heroesdesk.kotlin.mission.DoneMissionId + +class DoneMissionIdTest : AbstractMissionIdTest() { + override fun createMissionId(squadKey: SquadKey, value: String): EitherNel = + DoneMissionId(squadKey, value) + +} \ No newline at end of file diff --git a/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/mission/DoneMissionTest.kt b/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/mission/DoneMissionTest.kt new file mode 100644 index 0000000..2cfb65f --- /dev/null +++ b/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/mission/DoneMissionTest.kt @@ -0,0 +1,24 @@ +package org.hexastacks.heroesdesk.kotlin.misc.mission + +import arrow.core.getOrElse +import org.hexastacks.heroesdesk.kotlin.squad.SquadKey +import org.hexastacks.heroesdesk.kotlin.user.HeroIds +import org.hexastacks.heroesdesk.kotlin.mission.Description +import org.hexastacks.heroesdesk.kotlin.mission.DoneMission +import org.hexastacks.heroesdesk.kotlin.mission.DoneMissionId +import org.hexastacks.heroesdesk.kotlin.mission.Title + +class DoneMissionTest : AbstractMissionTest() { + override fun createMissionOrThrow( + id: DoneMissionId, + title: Title, + description: Description, + assignees: HeroIds + ): DoneMission = + DoneMission(id, title, description) + + + override fun createMissionIdOrThrow(squadKey: SquadKey, missionId: String): DoneMissionId = + DoneMissionId(squadKey, missionId).getOrElse { throw RuntimeException("$missionId should be valid") } + +} \ No newline at end of file diff --git a/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/mission/InProgressMissionIdTest.kt b/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/mission/InProgressMissionIdTest.kt new file mode 100644 index 0000000..a91c262 --- /dev/null +++ b/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/mission/InProgressMissionIdTest.kt @@ -0,0 +1,12 @@ +package org.hexastacks.heroesdesk.kotlin.misc.mission + +import arrow.core.EitherNel +import org.hexastacks.heroesdesk.kotlin.mission.InProgressMissionId +import org.hexastacks.heroesdesk.kotlin.mission.MissionId +import org.hexastacks.heroesdesk.kotlin.squad.SquadKey + +class InProgressMissionIdTest : AbstractMissionIdTest() { + + override fun createMissionId(squadKey: SquadKey, value: String): EitherNel = InProgressMissionId(squadKey, value) + +} \ No newline at end of file diff --git a/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/mission/InProgressMissionTest.kt b/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/mission/InProgressMissionTest.kt new file mode 100644 index 0000000..d144d16 --- /dev/null +++ b/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/mission/InProgressMissionTest.kt @@ -0,0 +1,23 @@ +package org.hexastacks.heroesdesk.kotlin.misc.mission + +import arrow.core.getOrElse +import org.hexastacks.heroesdesk.kotlin.squad.SquadKey +import org.hexastacks.heroesdesk.kotlin.user.HeroIds +import org.hexastacks.heroesdesk.kotlin.mission.Description +import org.hexastacks.heroesdesk.kotlin.mission.InProgressMission +import org.hexastacks.heroesdesk.kotlin.mission.InProgressMissionId +import org.hexastacks.heroesdesk.kotlin.mission.Title + +class InProgressMissionTest : AbstractMissionTest() { + override fun createMissionOrThrow( + id: InProgressMissionId, + title: Title, + description: Description, + assignees: HeroIds + ) = + InProgressMission(id, title, description, assignees) + + override fun createMissionIdOrThrow(squadKey: SquadKey, missionId: String): InProgressMissionId = + InProgressMissionId(squadKey, missionId).getOrElse { throw RuntimeException("$missionId should be valid") } + +} \ No newline at end of file diff --git a/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/mission/PendingMissionIdTest.kt b/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/mission/PendingMissionIdTest.kt new file mode 100644 index 0000000..40cbb19 --- /dev/null +++ b/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/mission/PendingMissionIdTest.kt @@ -0,0 +1,12 @@ +package org.hexastacks.heroesdesk.kotlin.misc.mission + +import arrow.core.EitherNel +import org.hexastacks.heroesdesk.kotlin.mission.MissionId +import org.hexastacks.heroesdesk.kotlin.mission.PendingMissionId +import org.hexastacks.heroesdesk.kotlin.squad.SquadKey + +class PendingMissionIdTest : AbstractMissionIdTest() { + override fun createMissionId(squadKey: SquadKey, value: String): EitherNel = + PendingMissionId(squadKey, value) + +} \ No newline at end of file diff --git a/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/mission/PendingMissionTest.kt b/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/mission/PendingMissionTest.kt new file mode 100644 index 0000000..f152f8f --- /dev/null +++ b/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/mission/PendingMissionTest.kt @@ -0,0 +1,23 @@ +package org.hexastacks.heroesdesk.kotlin.misc.mission + +import arrow.core.getOrElse +import org.hexastacks.heroesdesk.kotlin.squad.SquadKey +import org.hexastacks.heroesdesk.kotlin.user.HeroIds +import org.hexastacks.heroesdesk.kotlin.mission.Description +import org.hexastacks.heroesdesk.kotlin.mission.PendingMission +import org.hexastacks.heroesdesk.kotlin.mission.PendingMissionId +import org.hexastacks.heroesdesk.kotlin.mission.Title + +class PendingMissionTest : AbstractMissionTest() { + override fun createMissionOrThrow( + id: PendingMissionId, + title: Title, + description: Description, + assignees: HeroIds + ) = + PendingMission(id, title, description, assignees) + + override fun createMissionIdOrThrow(squadKey: SquadKey, missionId: String): PendingMissionId = + PendingMissionId(squadKey, missionId).getOrElse { throw RuntimeException("$missionId should be valid") } + +} \ No newline at end of file diff --git a/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/TitleTest.kt b/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/mission/TitleTest.kt similarity index 55% rename from heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/TitleTest.kt rename to heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/mission/TitleTest.kt index 7a60d50..a434a45 100644 --- a/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/task/TitleTest.kt +++ b/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/mission/TitleTest.kt @@ -1,8 +1,9 @@ -package org.hexastacks.heroesdesk.kotlin.impl.task +package org.hexastacks.heroesdesk.kotlin.misc.mission import arrow.core.EitherNel -import org.hexastacks.heroesdesk.kotlin.impl.AbstractStringValueTest -import org.hexastacks.heroesdesk.kotlin.impl.task.Title.TitleError +import org.hexastacks.heroesdesk.kotlin.misc.AbstractStringValueTest +import org.hexastacks.heroesdesk.kotlin.mission.Title +import org.hexastacks.heroesdesk.kotlin.mission.Title.TitleError class TitleTest : AbstractStringValueTest() { override fun createStringValue(value: String): EitherNel = Title(value) diff --git a/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/squad/NameTest.kt b/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/squad/NameTest.kt similarity index 77% rename from heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/squad/NameTest.kt rename to heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/squad/NameTest.kt index 0bf37dc..c889245 100644 --- a/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/squad/NameTest.kt +++ b/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/squad/NameTest.kt @@ -1,7 +1,7 @@ -package org.hexastacks.heroesdesk.kotlin.impl.squad +package org.hexastacks.heroesdesk.kotlin.misc.squad import arrow.core.EitherNel -import org.hexastacks.heroesdesk.kotlin.impl.AbstractStringValueTest +import org.hexastacks.heroesdesk.kotlin.misc.AbstractStringValueTest import org.hexastacks.heroesdesk.kotlin.squad.Name import org.hexastacks.heroesdesk.kotlin.squad.Name.NameError diff --git a/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/squad/SquadMembersTest.kt b/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/squad/SquadMembersTest.kt similarity index 86% rename from heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/squad/SquadMembersTest.kt rename to heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/squad/SquadMembersTest.kt index 781fddc..e47b67f 100644 --- a/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/squad/SquadMembersTest.kt +++ b/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/squad/SquadMembersTest.kt @@ -1,8 +1,8 @@ -package org.hexastacks.heroesdesk.kotlin.impl.squad +package org.hexastacks.heroesdesk.kotlin.misc.squad -import org.hexastacks.heroesdesk.kotlin.impl.TestUtils.createHeroIdOrThrow -import org.hexastacks.heroesdesk.kotlin.impl.TestUtils.createSquadKeyOrThrow -import org.hexastacks.heroesdesk.kotlin.impl.user.HeroIds +import org.hexastacks.heroesdesk.kotlin.misc.TestUtils.createHeroIdOrThrow +import org.hexastacks.heroesdesk.kotlin.misc.TestUtils.createSquadKeyOrThrow +import org.hexastacks.heroesdesk.kotlin.user.HeroIds import org.hexastacks.heroesdesk.kotlin.squad.SquadMembers import kotlin.test.Test import kotlin.test.assertFalse diff --git a/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/squad/SquadTest.kt b/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/squad/SquadTest.kt similarity index 93% rename from heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/squad/SquadTest.kt rename to heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/squad/SquadTest.kt index 8fecd30..85473bb 100644 --- a/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/squad/SquadTest.kt +++ b/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/squad/SquadTest.kt @@ -1,10 +1,10 @@ -package org.hexastacks.heroesdesk.kotlin.impl.squad +package org.hexastacks.heroesdesk.kotlin.misc.squad import arrow.core.getOrElse -import org.hexastacks.heroesdesk.kotlin.impl.user.* import org.hexastacks.heroesdesk.kotlin.squad.Name import org.hexastacks.heroesdesk.kotlin.squad.Squad import org.hexastacks.heroesdesk.kotlin.squad.SquadKey +import org.hexastacks.heroesdesk.kotlin.user.Heroes import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Assertions.assertNotEquals import kotlin.test.Test diff --git a/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/user/AdminIdTest.kt b/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/user/AdminIdTest.kt similarity index 57% rename from heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/user/AdminIdTest.kt rename to heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/user/AdminIdTest.kt index d9a09cd..036bebd 100644 --- a/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/user/AdminIdTest.kt +++ b/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/user/AdminIdTest.kt @@ -1,8 +1,9 @@ -package org.hexastacks.heroesdesk.kotlin.impl.user +package org.hexastacks.heroesdesk.kotlin.misc.user import arrow.core.EitherNel -import org.hexastacks.heroesdesk.kotlin.impl.AbstractStringValueTest -import org.hexastacks.heroesdesk.kotlin.impl.user.AdminId.AdminIdError +import org.hexastacks.heroesdesk.kotlin.misc.AbstractStringValueTest +import org.hexastacks.heroesdesk.kotlin.user.AdminId +import org.hexastacks.heroesdesk.kotlin.user.AdminId.AdminIdError class AdminIdTest : AbstractStringValueTest() { override fun createStringValue(value: String): EitherNel = AdminId(value) diff --git a/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/user/HeroIdTest.kt b/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/user/HeroIdTest.kt similarity index 52% rename from heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/user/HeroIdTest.kt rename to heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/user/HeroIdTest.kt index d35c183..64164fb 100644 --- a/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/user/HeroIdTest.kt +++ b/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/user/HeroIdTest.kt @@ -1,8 +1,10 @@ -package org.hexastacks.heroesdesk.kotlin.impl.user +package org.hexastacks.heroesdesk.kotlin.misc.user import arrow.core.EitherNel -import org.hexastacks.heroesdesk.kotlin.impl.AbstractStringValueTest -import org.hexastacks.heroesdesk.kotlin.impl.user.HeroId.HeroIdError +import org.hexastacks.heroesdesk.kotlin.misc.AbstractStringValueTest +import org.hexastacks.heroesdesk.kotlin.user.HeroId +import org.hexastacks.heroesdesk.kotlin.user.HeroId.HeroIdError +import org.hexastacks.heroesdesk.kotlin.user.UserId class HeroIdTest : AbstractStringValueTest() { override fun createStringValue(value: String): EitherNel = HeroId(value) diff --git a/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/user/HeroIdsTest.kt b/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/user/HeroIdsTest.kt similarity index 96% rename from heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/user/HeroIdsTest.kt rename to heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/user/HeroIdsTest.kt index 35f148f..ca97e45 100644 --- a/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/user/HeroIdsTest.kt +++ b/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/user/HeroIdsTest.kt @@ -1,7 +1,7 @@ -package org.hexastacks.heroesdesk.kotlin.impl.user +package org.hexastacks.heroesdesk.kotlin.misc.user -import org.hexastacks.heroesdesk.kotlin.impl.TestUtils -import org.hexastacks.heroesdesk.kotlin.impl.TestUtils.createHeroIdOrThrow +import org.hexastacks.heroesdesk.kotlin.misc.TestUtils.createHeroIdOrThrow +import org.hexastacks.heroesdesk.kotlin.user.HeroIds import org.junit.jupiter.api.Assertions.* import org.junit.jupiter.api.Test import java.util.concurrent.atomic.AtomicInteger diff --git a/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/user/HeroTest.kt b/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/user/HeroTest.kt similarity index 86% rename from heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/user/HeroTest.kt rename to heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/user/HeroTest.kt index bee6a64..2173869 100644 --- a/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/user/HeroTest.kt +++ b/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/user/HeroTest.kt @@ -1,6 +1,9 @@ -package org.hexastacks.heroesdesk.kotlin.impl.user +package org.hexastacks.heroesdesk.kotlin.misc.user import arrow.core.getOrElse +import org.hexastacks.heroesdesk.kotlin.user.Hero +import org.hexastacks.heroesdesk.kotlin.user.HeroId +import org.hexastacks.heroesdesk.kotlin.user.UserName import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Assertions.assertNotEquals import kotlin.test.Test diff --git a/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/user/HeroesTest.kt b/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/user/HeroesTest.kt similarity index 95% rename from heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/user/HeroesTest.kt rename to heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/user/HeroesTest.kt index a8cef69..6b208e0 100644 --- a/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/user/HeroesTest.kt +++ b/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/user/HeroesTest.kt @@ -1,8 +1,11 @@ -package org.hexastacks.heroesdesk.kotlin.impl.user - -import org.hexastacks.heroesdesk.kotlin.impl.TestUtils.createHeroIdOrThrow -import org.hexastacks.heroesdesk.kotlin.impl.TestUtils.createHeroNameOrThrow -import org.hexastacks.heroesdesk.kotlin.impl.TestUtils.createHeroOrThrow +package org.hexastacks.heroesdesk.kotlin.misc.user + +import org.hexastacks.heroesdesk.kotlin.misc.TestUtils.createHeroIdOrThrow +import org.hexastacks.heroesdesk.kotlin.misc.TestUtils.createHeroNameOrThrow +import org.hexastacks.heroesdesk.kotlin.misc.TestUtils.createHeroOrThrow +import org.hexastacks.heroesdesk.kotlin.user.Hero +import org.hexastacks.heroesdesk.kotlin.user.HeroIds +import org.hexastacks.heroesdesk.kotlin.user.Heroes import org.junit.jupiter.api.Assertions.assertFalse import org.junit.jupiter.api.Assertions.assertTrue import org.junit.jupiter.api.Test diff --git a/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/user/UserNameTest.kt b/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/user/UserNameTest.kt similarity index 57% rename from heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/user/UserNameTest.kt rename to heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/user/UserNameTest.kt index 50fcb39..9f76313 100644 --- a/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/impl/user/UserNameTest.kt +++ b/heroesdesk/src/test/kotlin/org/hexastacks/heroesdesk/kotlin/misc/user/UserNameTest.kt @@ -1,8 +1,9 @@ -package org.hexastacks.heroesdesk.kotlin.impl.user +package org.hexastacks.heroesdesk.kotlin.misc.user import arrow.core.EitherNel -import org.hexastacks.heroesdesk.kotlin.impl.AbstractStringValueTest -import org.hexastacks.heroesdesk.kotlin.impl.user.UserName.HeroNameError +import org.hexastacks.heroesdesk.kotlin.misc.AbstractStringValueTest +import org.hexastacks.heroesdesk.kotlin.user.UserName +import org.hexastacks.heroesdesk.kotlin.user.UserName.HeroNameError class UserNameTest : AbstractStringValueTest() { override fun createStringValue(value: String): EitherNel = UserName(value) diff --git a/settings.gradle.kts b/settings.gradle.kts index ffb98b2..27b21b1 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -2,7 +2,7 @@ plugins { id("org.gradle.toolchains.foojay-resolver-convention") version "0.7.0" } rootProject.name = "hexa-playground" -include("heroesdesk", "heroesdesk-test", "heroesdesk-inmemory-adapters", "heroesdesk-taskrepo-jooq-pg-adapter") +include("heroesdesk", "heroesdesk-test", "heroesdesk-inmemory-adapters", "heroesdesk-missionrepo-jooq-pg-adapter") dependencyResolutionManagement { versionCatalogs {