From 5b1fc50b10746de25d29e05b40fefad36fcc6f77 Mon Sep 17 00:00:00 2001 From: krzykrucz Date: Thu, 21 May 2020 02:44:25 +0200 Subject: [PATCH 1/9] starting lesson organized --- .../currentlesson/ELessonApplication.kt | 9 ++++ .../CheckScheduledLessonAdapter.kt | 2 +- .../startlesson/FetchClassRegistryAdapter.kt | 2 +- .../startlesson/StartLessonAdapters.kt | 17 +++++++ .../startlesson/StartLessonDomainConfig.kt | 18 ------- ...ntAdapter.kt => StartLessonRestAdapter.kt} | 46 +++++++++--------- .../StartedLessonPersistenceAdapter.kt | 13 +---- .../currentlesson/domain/startlesson/Types.kt | 1 + .../startlesson/WorkflowImplementation.kt | 47 ------------------- .../domain/startlesson/Workflows.kt | 45 ++++++++++++++++-- src/main/resources/application.properties | 1 + 11 files changed, 94 insertions(+), 107 deletions(-) create mode 100644 src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartLessonAdapters.kt delete mode 100644 src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartLessonDomainConfig.kt rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/{StartLessonEndpointAdapter.kt => StartLessonRestAdapter.kt} (65%) delete mode 100644 src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/startlesson/WorkflowImplementation.kt create mode 100644 src/main/resources/application.properties diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/ELessonApplication.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/ELessonApplication.kt index f6cd93c..82f5f99 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/ELessonApplication.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/ELessonApplication.kt @@ -1,7 +1,10 @@ package com.krzykrucz.elesson.currentlesson +import com.krzykrucz.elesson.currentlesson.adapters.startlesson.startLessonAdapters import org.springframework.boot.autoconfigure.SpringBootApplication import org.springframework.boot.runApplication +import org.springframework.context.ApplicationContextInitializer +import org.springframework.context.support.GenericApplicationContext @SpringBootApplication class ELessonApplication @@ -9,3 +12,9 @@ class ELessonApplication fun main(args: Array) { runApplication(*args) } + +object BeansInitializer : ApplicationContextInitializer { + override fun initialize(context: GenericApplicationContext) { + startLessonAdapters.initialize(context) + } +} diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/CheckScheduledLessonAdapter.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/CheckScheduledLessonAdapter.kt index 63d6f1e..a0b953a 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/CheckScheduledLessonAdapter.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/CheckScheduledLessonAdapter.kt @@ -12,7 +12,7 @@ import com.krzykrucz.elesson.currentlesson.domain.startlesson.StartLessonError import java.time.LocalDateTime -val lessonSchedulesClient: FetchScheduledLesson = { teacher: Teacher, time: LocalDateTime -> +internal val checkScheduledLessonAdapter: FetchScheduledLesson = { teacher: Teacher, time: LocalDateTime -> LessonHourNumber.of(NaturalNumber.THREE) .map { ScheduledLesson( diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/FetchClassRegistryAdapter.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/FetchClassRegistryAdapter.kt index 4d8f55f..5a95a41 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/FetchClassRegistryAdapter.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/FetchClassRegistryAdapter.kt @@ -11,7 +11,7 @@ import com.krzykrucz.elesson.currentlesson.domain.shared.StudentRecord import com.krzykrucz.elesson.currentlesson.domain.startlesson.FetchClassRegistry -val eRegisterClient: FetchClassRegistry = { className -> +internal val fetchClassRegistryAdapter: FetchClassRegistry = { className -> listOf( StudentRecord( FirstName( diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartLessonAdapters.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartLessonAdapters.kt new file mode 100644 index 0000000..16bb4bd --- /dev/null +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartLessonAdapters.kt @@ -0,0 +1,17 @@ +package com.krzykrucz.elesson.currentlesson.adapters.startlesson + +import com.krzykrucz.elesson.currentlesson.adapters.startlesson.rest.startLessonRestAdapter +import com.krzykrucz.elesson.currentlesson.domain.startlesson.startLesson +import org.springframework.context.support.beans + +val startLessonAdapters = beans { + bean { + startLessonRestAdapter( + startedLessonPersistenceAdapter, + startLesson( + checkScheduledLessonAdapter, + fetchClassRegistryAdapter + ) + ) + } +} diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartLessonDomainConfig.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartLessonDomainConfig.kt deleted file mode 100644 index 37be741..0000000 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartLessonDomainConfig.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.krzykrucz.elesson.currentlesson.adapters.startlesson - -import com.krzykrucz.elesson.currentlesson.domain.startlesson.StartLesson -import com.krzykrucz.elesson.currentlesson.domain.startlesson.startLesson -import org.springframework.context.annotation.Bean -import org.springframework.context.annotation.Configuration - -@Configuration -class StartLessonDomainConfig { - - @Bean - fun createStartLesson(): StartLesson = - startLesson( - lessonSchedulesClient, - eRegisterClient - ) - -} diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartLessonEndpointAdapter.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartLessonRestAdapter.kt similarity index 65% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartLessonEndpointAdapter.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartLessonRestAdapter.kt index eb579f3..22a1a8d 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartLessonEndpointAdapter.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartLessonRestAdapter.kt @@ -11,20 +11,36 @@ import com.krzykrucz.elesson.currentlesson.domain.shared.Teacher import com.krzykrucz.elesson.currentlesson.domain.startlesson.LessonStartTime import com.krzykrucz.elesson.currentlesson.domain.startlesson.PersistStartedLessonIfDoesNotExist import com.krzykrucz.elesson.currentlesson.domain.startlesson.StartLesson -import org.springframework.context.annotation.Bean -import org.springframework.context.annotation.Configuration import org.springframework.web.reactive.function.server.awaitBody import org.springframework.web.reactive.function.server.coRouter import javax.validation.constraints.NotEmpty -data class StudentResponse(val name: String) -data class ClassRegistryResponse( +internal fun startLessonRestAdapter(persistLesson: PersistStartedLessonIfDoesNotExist, + startLesson: StartLesson +) = + coRouter { + POST("/startlesson") { request -> + val startLessonRequest = request.awaitBody() + val teacher = startLessonRequest.toTeacher() + val now = LessonStartTime.now() + + startLesson(teacher, now) + .asyncDoIfRight { persistLesson(it) } + .map(StartedLesson::toDto) + .toServerResponse() + } + } + + +private data class StudentResponse(val name: String) + +private data class ClassRegistryResponse( val lessonId: LessonIdentifier, val students: List ) -data class StartLessonRequest( +private data class StartLessonRequest( @NotEmpty val teacherFirstName: String, @NotEmpty @@ -46,23 +62,3 @@ private fun StartedLesson.toDto() = .map { StudentResponse("${it.firstName.name.text} ${it.secondName.name.text}") } .let { ClassRegistryResponse(this.id, it) } -@Configuration -class StartLessonRouteAdapter { - - @Bean - fun startLessonRoute(persistLesson: PersistStartedLessonIfDoesNotExist, - startLesson: StartLesson - ) = - coRouter { - POST("/startlesson") { request -> - val startLessonRequest = request.awaitBody() - val teacher = startLessonRequest.toTeacher() - val now = LessonStartTime.now() - - startLesson(teacher, now) - .asyncDoIfRight { persistLesson(it) } - .map(StartedLesson::toDto) - .toServerResponse() - } - } -} diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartedLessonPersistenceAdapter.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartedLessonPersistenceAdapter.kt index 67054df..0e8bd95 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartedLessonPersistenceAdapter.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartedLessonPersistenceAdapter.kt @@ -7,12 +7,10 @@ import com.krzykrucz.elesson.currentlesson.domain.shared.StartedLesson import com.krzykrucz.elesson.currentlesson.domain.startlesson.PersistStartedLessonIfDoesNotExist import com.krzykrucz.elesson.currentlesson.infrastructure.Database.Companion.LESSON_DATABASE import com.krzykrucz.elesson.currentlesson.infrastructure.PersistentCurrentLesson -import org.springframework.context.annotation.Bean -import org.springframework.context.annotation.Configuration // TODO maybe check if lesson not started somewhere else -private val persistStartedLessonInRepository: PersistStartedLessonIfDoesNotExist = +internal val startedLessonPersistenceAdapter: PersistStartedLessonIfDoesNotExist = { lesson -> if (!StartedLessonInMemoryRepository.contains(lesson.id)) { StartedLessonInMemoryRepository.store(lesson) @@ -46,12 +44,3 @@ private object StartedLessonInMemoryRepository { } } - - -@Configuration -class StartedLessonPersistenceAdapterConfig { - - @Bean - fun create(): PersistStartedLessonIfDoesNotExist = - persistStartedLessonInRepository -} diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/startlesson/Types.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/startlesson/Types.kt index 0ba66f7..38d0cbe 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/startlesson/Types.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/startlesson/Types.kt @@ -16,6 +16,7 @@ data class ScheduledLesson(val scheduledTime: ScheduledLessonStartTime, typealias ValidatedScheduledLesson = ScheduledLesson +typealias LessonStartTime = LocalDateTime sealed class StartLessonError { data class NotScheduledLesson(val error: String = "Cannot start a lesson outside of a lesson hour for which it's scheduled") : StartLessonError() diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/startlesson/WorkflowImplementation.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/startlesson/WorkflowImplementation.kt deleted file mode 100644 index 8857c3f..0000000 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/startlesson/WorkflowImplementation.kt +++ /dev/null @@ -1,47 +0,0 @@ -package com.krzykrucz.elesson.currentlesson.domain.startlesson - -import arrow.core.Either -import arrow.core.flatMap -import com.krzykrucz.elesson.currentlesson.adapters.asyncFlatMap -import com.krzykrucz.elesson.currentlesson.domain.shared.ClassRegistry -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier -import com.krzykrucz.elesson.currentlesson.domain.shared.StartedLesson - - -private fun ScheduledLesson.lessonIdentifier() = - LessonIdentifier(this.scheduledTime.toLocalDate(), this.lessonHourNumber, this.className) - -private fun Either.toCurrentLessonWithClass( - scheduledLesson: ScheduledLesson -): Either = - map { classRegistry -> - StartedLesson(scheduledLesson.lessonIdentifier(), classRegistry, scheduledLesson.subject) - } - - -fun startLesson( - fetchScheduledLesson: FetchScheduledLesson, - fetchClassRegistry: FetchClassRegistry, - validateLessonStartTime: ValidateLessonStartTime = validateStartTime() -): StartLesson = { teacher, attemptedStartTime -> - val scheduledLessonOrError = fetchScheduledLesson(teacher, attemptedStartTime) - -// TODO introduce another internal error type (lesson started too early or so) - - val validatedScheduledLesson = scheduledLessonOrError - .flatMap { validateLessonStartTime(it, attemptedStartTime) } - - validatedScheduledLesson - .asyncFlatMap { scheduledLesson -> - fetchClassRegistry(scheduledLesson.className) - .toCurrentLessonWithClass(scheduledLesson) - } -} - -private fun validateStartTime(): ValidateLessonStartTime = { lesson, time -> - when { - time.isBefore(lesson.scheduledTime) -> Either.left(StartLessonError.NotScheduledLesson()) - time.isAfter(lesson.scheduledTime.plusMinutes(44)) -> Either.left(StartLessonError.NotScheduledLesson()) - else -> Either.right(lesson) - } -} diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/startlesson/Workflows.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/startlesson/Workflows.kt index c37f621..2602871 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/startlesson/Workflows.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/startlesson/Workflows.kt @@ -1,17 +1,56 @@ package com.krzykrucz.elesson.currentlesson.domain.startlesson import arrow.core.Either -import arrow.fx.IO +import arrow.core.flatMap +import com.krzykrucz.elesson.currentlesson.adapters.asyncFlatMap import com.krzykrucz.elesson.currentlesson.domain.shared.ClassName import com.krzykrucz.elesson.currentlesson.domain.shared.ClassRegistry +import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier import com.krzykrucz.elesson.currentlesson.domain.shared.StartedLesson import com.krzykrucz.elesson.currentlesson.domain.shared.Teacher import java.time.LocalDateTime -typealias FetchScheduledLesson = suspend (Teacher, LocalDateTime) -> Either +typealias FetchScheduledLesson = suspend (Teacher, LocalDateTime) -> Either typealias FetchClassRegistry = suspend (ClassName) -> Either// TODO can be removed if class is an aggregate root -typealias LessonStartTime = LocalDateTime typealias ValidateLessonStartTime = (ScheduledLesson, LocalDateTime) -> Either + +private fun validateStartTime(): ValidateLessonStartTime = { lesson, time -> + when { + time.isBefore(lesson.scheduledTime) -> Either.left(StartLessonError.NotScheduledLesson()) + time.isAfter(lesson.scheduledTime.plusMinutes(44)) -> Either.left(StartLessonError.NotScheduledLesson()) + else -> Either.right(lesson) + } +} + typealias StartLesson = suspend (Teacher, LessonStartTime) -> Either + +fun startLesson( + fetchScheduledLesson: FetchScheduledLesson, + fetchClassRegistry: FetchClassRegistry, + validateLessonStartTime: ValidateLessonStartTime = validateStartTime() +): StartLesson = { teacher, attemptedStartTime -> + val scheduledLessonOrError = fetchScheduledLesson(teacher, attemptedStartTime) + +// TODO introduce another internal error type (lesson started too early or so) + + val validatedScheduledLesson = scheduledLessonOrError + .flatMap { validateLessonStartTime(it, attemptedStartTime) } + + validatedScheduledLesson + .asyncFlatMap { scheduledLesson -> + fetchClassRegistry(scheduledLesson.className) + .toCurrentLessonWithClass(scheduledLesson) + } +} + +private fun ScheduledLesson.lessonIdentifier() = + LessonIdentifier(this.scheduledTime.toLocalDate(), this.lessonHourNumber, this.className) + +private fun Either.toCurrentLessonWithClass( + scheduledLesson: ScheduledLesson +): Either = + map { classRegistry -> + StartedLesson(scheduledLesson.lessonIdentifier(), classRegistry, scheduledLesson.subject) + } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..45cfde2 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1 @@ +context.initializer.classes=com.krzykrucz.elesson.currentlesson.BeansInitializer From 5627c41378c6f691eade5a4c69554afe053b31a7 Mon Sep 17 00:00:00 2001 From: krzykrucz Date: Thu, 21 May 2020 03:06:45 +0200 Subject: [PATCH 2/9] topic fu beans --- .../currentlesson/ELessonApplication.kt | 2 + .../adapters/topic/ChooseTopicDto.kt | 6 --- .../adapters/topic/TopicAdapters.kt | 13 +++++++ ...onnector.kt => TopicPersistenceAdapter.kt} | 8 ++-- .../adapters/topic/TopicRestAdapter.kt | 37 +++++++++++++++++++ .../adapters/topic/rest/TopicRouterConfig.kt | 28 -------------- .../topic/usecase/ChooseTopicDtoHandler.kt | 23 ------------ .../{TopicPersistence.kt => Persistence.kt} | 3 +- .../currentlesson/domain/topic/Topic.kt | 16 -------- .../currentlesson/domain/topic/Types.kt | 8 ++++ ...WorkflowImplementation.kt => Workflows.kt} | 17 ++++++++- .../domain/topic/ChooseTopicSteps.kt | 15 +++++--- 12 files changed, 89 insertions(+), 87 deletions(-) delete mode 100644 src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/topic/ChooseTopicDto.kt create mode 100644 src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/topic/TopicAdapters.kt rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/topic/{usecase/persistence/TopicDatabaseConnector.kt => TopicPersistenceAdapter.kt} (78%) create mode 100644 src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/topic/TopicRestAdapter.kt delete mode 100644 src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/topic/rest/TopicRouterConfig.kt delete mode 100644 src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/topic/usecase/ChooseTopicDtoHandler.kt rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/topic/{TopicPersistence.kt => Persistence.kt} (67%) delete mode 100644 src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/topic/Topic.kt create mode 100644 src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/topic/Types.kt rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/topic/{TopicWorkflowImplementation.kt => Workflows.kt} (53%) diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/ELessonApplication.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/ELessonApplication.kt index 82f5f99..5762ff9 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/ELessonApplication.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/ELessonApplication.kt @@ -1,6 +1,7 @@ package com.krzykrucz.elesson.currentlesson import com.krzykrucz.elesson.currentlesson.adapters.startlesson.startLessonAdapters +import com.krzykrucz.elesson.currentlesson.adapters.topic.topicAdapters import org.springframework.boot.autoconfigure.SpringBootApplication import org.springframework.boot.runApplication import org.springframework.context.ApplicationContextInitializer @@ -16,5 +17,6 @@ fun main(args: Array) { object BeansInitializer : ApplicationContextInitializer { override fun initialize(context: GenericApplicationContext) { startLessonAdapters.initialize(context) + topicAdapters.initialize(context) } } diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/topic/ChooseTopicDto.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/topic/ChooseTopicDto.kt deleted file mode 100644 index be23fcf..0000000 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/topic/ChooseTopicDto.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.krzykrucz.elesson.currentlesson.adapters.topic - -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier -import com.krzykrucz.elesson.currentlesson.domain.shared.TopicTitle - -data class ChooseTopicDto(val lessonIdentifier: LessonIdentifier, val topicTitle: TopicTitle) diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/topic/TopicAdapters.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/topic/TopicAdapters.kt new file mode 100644 index 0000000..98644f8 --- /dev/null +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/topic/TopicAdapters.kt @@ -0,0 +1,13 @@ +package com.krzykrucz.elesson.currentlesson.adapters.topic + +import org.springframework.context.support.beans + +val topicAdapters = beans { + bean { + topicRestAdapter( + checkIfAttendanceIsChecked, + fetchFinishedLessonsCount, + persistInProgressLesson + ) + } +} diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/topic/usecase/persistence/TopicDatabaseConnector.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/topic/TopicPersistenceAdapter.kt similarity index 78% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/topic/usecase/persistence/TopicDatabaseConnector.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/topic/TopicPersistenceAdapter.kt index 57a4ac4..25151a5 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/topic/usecase/persistence/TopicDatabaseConnector.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/topic/TopicPersistenceAdapter.kt @@ -1,4 +1,4 @@ -package com.krzykrucz.elesson.currentlesson.adapters.topic.usecase.persistence +package com.krzykrucz.elesson.currentlesson.adapters.topic import arrow.core.getOrElse import arrow.core.some @@ -13,21 +13,21 @@ import com.krzykrucz.elesson.currentlesson.domain.topic.PersistInProgressLesson import com.krzykrucz.elesson.currentlesson.infrastructure.Database -val fetchFinishedLessonsCount: CountFinishedLessons = { +internal val fetchFinishedLessonsCount: CountFinishedLessons = { Database.LESSON_DATABASE.values.stream() .filter { it.status == Finished } .count() .let { FinishedLessonsCount(it.toInt()) } } -val checkIfAttendanceIsChecked: CheckIfAttendanceIsChecked = { lessonId -> +internal val checkIfAttendanceIsChecked: CheckIfAttendanceIsChecked = { lessonId -> Database.LESSON_DATABASE[lessonId].toOption() .map { lesson -> lesson.attendance is CheckedAttendanceList } .getOrElse { false } } -val persistInProgressLesson: PersistInProgressLesson = { lessonId, inProgressLesson -> +internal val persistInProgressLesson: PersistInProgressLesson = { lessonId, inProgressLesson -> Database.LESSON_DATABASE.compute(lessonId) { _, lesson -> lesson?.copy( lessonTopic = inProgressLesson.lessonTopic.some()) diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/topic/TopicRestAdapter.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/topic/TopicRestAdapter.kt new file mode 100644 index 0000000..fddb23e --- /dev/null +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/topic/TopicRestAdapter.kt @@ -0,0 +1,37 @@ +package com.krzykrucz.elesson.currentlesson.adapters.topic + + +import com.krzykrucz.elesson.currentlesson.adapters.asyncDoIfRight +import com.krzykrucz.elesson.currentlesson.adapters.toServerResponse +import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier +import com.krzykrucz.elesson.currentlesson.domain.shared.TopicTitle +import com.krzykrucz.elesson.currentlesson.domain.topic.CheckIfAttendanceIsChecked +import com.krzykrucz.elesson.currentlesson.domain.topic.CountFinishedLessons +import com.krzykrucz.elesson.currentlesson.domain.topic.PersistInProgressLesson +import com.krzykrucz.elesson.currentlesson.domain.topic.chooseTopic +import org.springframework.web.reactive.function.server.awaitBody +import org.springframework.web.reactive.function.server.coRouter + + +internal fun topicRestAdapter( + checkIfAttendanceIsChecked: CheckIfAttendanceIsChecked, + fetchFinishedLessons: CountFinishedLessons, + persistInProgressLesson: PersistInProgressLesson +) = coRouter { + POST("/topic") { request -> + val chooseTopicDto = request.awaitBody() + chooseTopic( + checkIfAttendanceIsChecked, + chooseTopicDto.topicTitle, + fetchFinishedLessons, + chooseTopicDto.lessonIdentifier + ) + .asyncDoIfRight { inProgressLesson -> persistInProgressLesson(chooseTopicDto.lessonIdentifier, inProgressLesson) } + .toServerResponse() + } +} + +private data class ChooseTopicDto( + val lessonIdentifier: LessonIdentifier, + val topicTitle: TopicTitle +) diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/topic/rest/TopicRouterConfig.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/topic/rest/TopicRouterConfig.kt deleted file mode 100644 index aadf230..0000000 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/topic/rest/TopicRouterConfig.kt +++ /dev/null @@ -1,28 +0,0 @@ -package com.krzykrucz.elesson.currentlesson.adapters.topic.rest - - -import com.krzykrucz.elesson.currentlesson.adapters.AsyncRequestHandler -import com.krzykrucz.elesson.currentlesson.adapters.toServerResponse -import com.krzykrucz.elesson.currentlesson.adapters.topic.ChooseTopicDto -import com.krzykrucz.elesson.currentlesson.adapters.topic.usecase.handleChooseTopicDto -import org.springframework.context.annotation.Bean -import org.springframework.context.annotation.Configuration -import org.springframework.web.reactive.function.server.awaitBody -import org.springframework.web.reactive.function.server.coRouter - -@Configuration -class TopicRouterConfig { - @Bean - fun topicRouter() = coRouter { - POST("/topic", handleChooseTopicRequest) - } - - private val handleChooseTopicRequest: AsyncRequestHandler = { request -> - val chooseTopicDto = request.awaitBody() - handleChooseTopicDto(chooseTopicDto) - .toServerResponse() - } - -} - - diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/topic/usecase/ChooseTopicDtoHandler.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/topic/usecase/ChooseTopicDtoHandler.kt deleted file mode 100644 index e9e4ceb..0000000 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/topic/usecase/ChooseTopicDtoHandler.kt +++ /dev/null @@ -1,23 +0,0 @@ -package com.krzykrucz.elesson.currentlesson.adapters.topic.usecase - -import arrow.core.Either -import com.krzykrucz.elesson.currentlesson.adapters.asyncMap -import com.krzykrucz.elesson.currentlesson.adapters.topic.ChooseTopicDto -import com.krzykrucz.elesson.currentlesson.adapters.topic.usecase.persistence.checkIfAttendanceIsChecked -import com.krzykrucz.elesson.currentlesson.adapters.topic.usecase.persistence.fetchFinishedLessonsCount -import com.krzykrucz.elesson.currentlesson.adapters.topic.usecase.persistence.persistInProgressLesson -import com.krzykrucz.elesson.currentlesson.domain.topic.ChooseTopicError -import com.krzykrucz.elesson.currentlesson.domain.topic.chooseTopic - - -val handleChooseTopicDto: suspend (ChooseTopicDto) -> Either = { chooseTopicDto -> - val isAttendanceChecked = checkIfAttendanceIsChecked(chooseTopicDto.lessonIdentifier) - val finishedLessonsCount = fetchFinishedLessonsCount() - chooseTopic( - isAttendanceChecked, - chooseTopicDto.topicTitle, - finishedLessonsCount, - chooseTopicDto.lessonIdentifier - ) - .asyncMap { inProgressLesson -> persistInProgressLesson(chooseTopicDto.lessonIdentifier, inProgressLesson) } -} diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/topic/TopicPersistence.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/topic/Persistence.kt similarity index 67% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/topic/TopicPersistence.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/topic/Persistence.kt index cfdf96a..e7fa815 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/topic/TopicPersistence.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/topic/Persistence.kt @@ -3,6 +3,5 @@ package com.krzykrucz.elesson.currentlesson.domain.topic import com.krzykrucz.elesson.currentlesson.domain.shared.InProgressLesson import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier -typealias CountFinishedLessons = suspend () -> FinishedLessonsCount -typealias CheckIfAttendanceIsChecked = suspend (LessonIdentifier) -> Boolean + typealias PersistInProgressLesson = suspend (LessonIdentifier, InProgressLesson) -> Unit diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/topic/Topic.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/topic/Topic.kt deleted file mode 100644 index 809d991..0000000 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/topic/Topic.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.krzykrucz.elesson.currentlesson.domain.topic - -import arrow.core.Either -import com.krzykrucz.elesson.currentlesson.domain.shared.InProgressLesson -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier -import com.krzykrucz.elesson.currentlesson.domain.shared.TopicTitle - -data class FinishedLessonsCount(val count: Int) -typealias IsAttendanceChecked = Boolean - -sealed class ChooseTopicError { - data class AttendanceNotChecked(val error: String = "Cannot choose topic for lesson that does not have attendance checked") : ChooseTopicError() -} - -typealias ChooseTopic = - (IsAttendanceChecked, TopicTitle, FinishedLessonsCount, LessonIdentifier) -> Either diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/topic/Types.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/topic/Types.kt new file mode 100644 index 0000000..099f59a --- /dev/null +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/topic/Types.kt @@ -0,0 +1,8 @@ +package com.krzykrucz.elesson.currentlesson.domain.topic + +data class FinishedLessonsCount(val count: Int) + +sealed class ChooseTopicError { + data class AttendanceNotChecked(val error: String = "Cannot choose topic for lesson that does not have attendance checked") : ChooseTopicError() +} + diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/topic/TopicWorkflowImplementation.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/topic/Workflows.kt similarity index 53% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/topic/TopicWorkflowImplementation.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/topic/Workflows.kt index 77dc4ef..7d697d4 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/topic/TopicWorkflowImplementation.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/topic/Workflows.kt @@ -1,14 +1,27 @@ package com.krzykrucz.elesson.currentlesson.domain.topic - +import arrow.core.Either import arrow.core.getOrElse import arrow.core.maybe import com.krzykrucz.elesson.currentlesson.domain.shared.InProgressLesson +import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier import com.krzykrucz.elesson.currentlesson.domain.shared.LessonOrdinalInSemester import com.krzykrucz.elesson.currentlesson.domain.shared.LessonTopic import com.krzykrucz.elesson.currentlesson.domain.shared.NaturalNumber +import com.krzykrucz.elesson.currentlesson.domain.shared.TopicTitle + + +typealias CountFinishedLessons = suspend () -> FinishedLessonsCount +typealias CheckIfAttendanceIsChecked = suspend (LessonIdentifier) -> Boolean + +typealias ChooseTopic = suspend (CheckIfAttendanceIsChecked, + TopicTitle, + CountFinishedLessons, + LessonIdentifier) -> Either -val chooseTopic: ChooseTopic = { isAttendanceChecked, topicTitle, finishedLessonsCount, lessonId -> +val chooseTopic: ChooseTopic = { checkIfAttendanceIsChecked, topicTitle, countFinishedLessons, lessonId -> + val isAttendanceChecked = checkIfAttendanceIsChecked(lessonId) + val finishedLessonsCount = countFinishedLessons() isAttendanceChecked.maybe { (finishedLessonsCount.count + 1) .let { NaturalNumber.of(it).getOrElse { NaturalNumber.ONE } } diff --git a/src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/topic/ChooseTopicSteps.kt b/src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/topic/ChooseTopicSteps.kt index fa05b6e..daa61c3 100644 --- a/src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/topic/ChooseTopicSteps.kt +++ b/src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/topic/ChooseTopicSteps.kt @@ -13,14 +13,15 @@ import com.krzykrucz.elesson.currentlesson.domain.shared.NaturalNumber import com.krzykrucz.elesson.currentlesson.domain.shared.NonEmptyText import com.krzykrucz.elesson.currentlesson.domain.shared.TopicTitle import io.cucumber.java8.En +import kotlinx.coroutines.runBlocking import org.assertj.core.api.Assertions.assertThat import java.time.LocalDate class ChooseTopicSteps : En { lateinit var topicTitle: TopicTitle lateinit var inProgressLesson: Either - lateinit var finishedLessonsCount: FinishedLessonsCount - var isAttendanceChecked: Boolean = true + lateinit var finishedLessonsCount: CountFinishedLessons + var isAttendanceChecked: CheckIfAttendanceIsChecked = { true } private val today = LocalDate.now() private val lessonIdentifier = LessonIdentifier( today, @@ -35,16 +36,18 @@ class ChooseTopicSteps : En { ) } Given("Checked Attendance") { - isAttendanceChecked = true + isAttendanceChecked = { true } } And("Finished Lessons Count") { - finishedLessonsCount = FinishedLessonsCount(4) + finishedLessonsCount = { FinishedLessonsCount(4) } } And("Attendance is not checked") { - isAttendanceChecked = false + isAttendanceChecked = { false } } When("Choosing a topic") { - inProgressLesson = chooseTopic(isAttendanceChecked, topicTitle, finishedLessonsCount, lessonIdentifier) + inProgressLesson = runBlocking { + chooseTopic(isAttendanceChecked, topicTitle, finishedLessonsCount, lessonIdentifier) + } } Then("Lesson is in progress") { assertThat(inProgressLesson.getSuccess()).isEqualToComparingFieldByField( From b501af759d1a7f9364c6e67447ffd4d44187f922 Mon Sep 17 00:00:00 2001 From: krzykrucz Date: Thu, 21 May 2020 03:10:42 +0200 Subject: [PATCH 3/9] refactor db --- .../StartedLessonPersistenceAdapter.kt | 2 +- .../currentlesson/infrastructure/Database.kt | 122 +++++++++--------- .../currentlesson/infrastructure/Routes.kt | 11 -- 3 files changed, 60 insertions(+), 75 deletions(-) delete mode 100644 src/main/kotlin/com/krzykrucz/elesson/currentlesson/infrastructure/Routes.kt diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartedLessonPersistenceAdapter.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartedLessonPersistenceAdapter.kt index 0e8bd95..ee31906 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartedLessonPersistenceAdapter.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartedLessonPersistenceAdapter.kt @@ -5,7 +5,7 @@ import com.krzykrucz.elesson.currentlesson.domain.shared.InProgress import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier import com.krzykrucz.elesson.currentlesson.domain.shared.StartedLesson import com.krzykrucz.elesson.currentlesson.domain.startlesson.PersistStartedLessonIfDoesNotExist -import com.krzykrucz.elesson.currentlesson.infrastructure.Database.Companion.LESSON_DATABASE +import com.krzykrucz.elesson.currentlesson.infrastructure.Database.LESSON_DATABASE import com.krzykrucz.elesson.currentlesson.infrastructure.PersistentCurrentLesson diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/infrastructure/Database.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/infrastructure/Database.kt index bca9d7a..1bb0c08 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/infrastructure/Database.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/infrastructure/Database.kt @@ -73,78 +73,74 @@ data class PersistentCurrentLesson( } -class Database { - - companion object { - - private val lessonId1 = - lessonIdOf("2019-09-09", 1, "1A") - - private val classRegistryOf1A = ClassRegistry( - students = listOf( - createStudentRecord( - "Harry", - "Potter", - 1 - ), - createStudentRecord( - "Tom", - "Riddle", - 2 - ) +object Database { + + private val lessonId1 = + lessonIdOf("2019-09-09", 1, "1A") + + private val classRegistryOf1A = ClassRegistry( + students = listOf( + createStudentRecord( + "Harry", + "Potter", + 1 + ), + createStudentRecord( + "Tom", + "Riddle", + 2 + ) + ), + className = classNameOf("1A") + ) + + val LESSON_DATABASE: ConcurrentHashMap = ConcurrentHashMap(mutableMapOf( + lessonId1 to PersistentCurrentLesson( + lessonId1, + classRegistryOf1A, + semester = WinterSemester, + subject = LessonSubject( + NonEmptyText( + "Defense from dark arts" + ) ), - className = classNameOf("1A") + status = Scheduled ) + )) - val LESSON_DATABASE: ConcurrentHashMap = ConcurrentHashMap(mutableMapOf( - lessonId1 to PersistentCurrentLesson( - lessonId1, - classRegistryOf1A, - semester = WinterSemester, - subject = LessonSubject( - NonEmptyText( - "Defense from dark arts" - ) - ), - status = Scheduled - ) - )) + private fun lessonIdOf(date: String, number: Int, className: String) = + LessonIdentifier( + LocalDate.parse(date), + lessonHourNumberOf(number), + classNameOf(className) + ) - fun lessonIdOf(date: String, number: Int, className: String) = - LessonIdentifier( - LocalDate.parse(date), - lessonHourNumberOf(number), - classNameOf(className) - ) + private fun lessonHourNumberOf(number: Int) = + LessonHourNumber.of(number).orNull()!! - private fun lessonHourNumberOf(number: Int) = - LessonHourNumber.of(number).orNull()!! + private fun classNameOf(name: String) = + ClassName( + NonEmptyText.of( + name + )!! + ) - private fun classNameOf(name: String) = - ClassName( + private fun createStudentRecord(name: String, surname: String, numberInRegister: Int): StudentRecord = + StudentRecord( + firstName = FirstName( NonEmptyText.of( name )!! - ) - - private fun createStudentRecord(name: String, surname: String, numberInRegister: Int): StudentRecord = - StudentRecord( - firstName = FirstName( - NonEmptyText.of( - name - )!! - ), - secondName = SecondName( - NonEmptyText.of( - surname - )!! - ), - numberInRegister = NaturalNumber.of(numberInRegister) - .map(::NumberInRegister) - .orNull()!! - ) - - } + ), + secondName = SecondName( + NonEmptyText.of( + surname + )!! + ), + numberInRegister = NaturalNumber.of(numberInRegister) + .map(::NumberInRegister) + .orNull()!! + ) } diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/infrastructure/Routes.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/infrastructure/Routes.kt deleted file mode 100644 index b2519a6..0000000 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/infrastructure/Routes.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.krzykrucz.elesson.currentlesson.infrastructure - -import com.krzykrucz.elesson.currentlesson.adapters.lessonprogress.rest.handleLessonProgressViewRequest -import com.krzykrucz.elesson.currentlesson.adapters.lessonprogress.usecase.LoadLessonProgress -import org.springframework.web.reactive.function.server.coRouter - -fun routes( - loadLessonProgress: LoadLessonProgress -) = coRouter { - GET("/progress", handleLessonProgressViewRequest(loadLessonProgress)) -} From 293adbedf025d51ded398a9945751e29794eb0cb Mon Sep 17 00:00:00 2001 From: krzykrucz Date: Thu, 21 May 2020 03:31:28 +0200 Subject: [PATCH 4/9] finish lesson fu beans --- .../currentlesson/ELessonApplication.kt | 2 ++ .../finishlesson/FinishLessonAdapters.kt | 13 +++++++ .../finishlesson/FinishLessonRestAdapter.kt | 34 ++++++++----------- .../finishlesson/FinishLessonUseCase.kt | 17 ---------- .../finishlesson/InProgressLessonReadModel.kt | 1 + ...nce.kt => StoreLessonAsFinishedAdapter.kt} | 3 +- .../startlesson/StartLessonAdapters.kt | 4 +-- .../adapters/topic/TopicAdapters.kt | 7 ++-- .../adapters/topic/TopicRestAdapter.kt | 18 +++------- .../domain/finishlesson/Persistence.kt | 5 +++ .../domain/finishlesson/Types.kt | 4 --- .../domain/finishlesson/Workflows.kt | 20 +++++++++-- .../finishlesson/WorkflowsImplementation.kt | 27 --------------- .../domain/startlesson/Workflows.kt | 2 +- .../currentlesson/domain/topic/Workflows.kt | 10 +++--- .../FinishLessonAcceptanceSpec.groovy | 16 ++++++--- .../StartLessonAcceptanceSpec.groovy | 7 ++-- .../domain/finishlesson/FinishLessonSteps.kt | 6 ++-- .../domain/startlesson/StartLessonSteps.kt | 2 +- .../domain/topic/ChooseTopicSteps.kt | 2 +- 20 files changed, 93 insertions(+), 107 deletions(-) create mode 100644 src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/finishlesson/FinishLessonAdapters.kt delete mode 100644 src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/finishlesson/FinishLessonUseCase.kt rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/finishlesson/{FinishedLessonPersistence.kt => StoreLessonAsFinishedAdapter.kt} (67%) create mode 100644 src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/finishlesson/Persistence.kt delete mode 100644 src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/finishlesson/WorkflowsImplementation.kt diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/ELessonApplication.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/ELessonApplication.kt index 5762ff9..d0166a8 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/ELessonApplication.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/ELessonApplication.kt @@ -1,5 +1,6 @@ package com.krzykrucz.elesson.currentlesson +import com.krzykrucz.elesson.currentlesson.adapters.finishlesson.finishLessonAdapters import com.krzykrucz.elesson.currentlesson.adapters.startlesson.startLessonAdapters import com.krzykrucz.elesson.currentlesson.adapters.topic.topicAdapters import org.springframework.boot.autoconfigure.SpringBootApplication @@ -18,5 +19,6 @@ object BeansInitializer : ApplicationContextInitializer - request.awaitBody() - .let { finishLesson(it) } - } - - private suspend fun finishLesson(dto: FinishLessonDto) = - finishInProgressLesson(dto.lessonIdentifier) +fun finishLessonRestAdapter( + finishLesson: FinishLesson, + storeLessonAsFinished: StoreLessonAsFinished +) = coRouter { + PUT("/finished-lessons") { request -> + val dto = request.awaitBody() + readInProgressLesson(dto.lessonIdentifier) + .map { inProgressLesson -> finishLesson(inProgressLesson, FinishLessonTime.now()) } + .asyncMap { storeLessonAsFinished(dto.lessonIdentifier) } .toServerResponse() - + } } -data class FinishLessonDto(val lessonIdentifier: LessonIdentifier) +private data class FinishLessonDto(val lessonIdentifier: LessonIdentifier) diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/finishlesson/FinishLessonUseCase.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/finishlesson/FinishLessonUseCase.kt deleted file mode 100644 index 3dbdc1f..0000000 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/finishlesson/FinishLessonUseCase.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.krzykrucz.elesson.currentlesson.adapters.finishlesson - -import arrow.core.Either -import com.krzykrucz.elesson.currentlesson.adapters.asyncMap -import com.krzykrucz.elesson.currentlesson.domain.finishlesson.FinishLessonError -import com.krzykrucz.elesson.currentlesson.domain.finishlesson.FinishLessonTime -import com.krzykrucz.elesson.currentlesson.domain.finishlesson.bellRang -import com.krzykrucz.elesson.currentlesson.domain.finishlesson.finishLesson -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier - - -suspend fun finishInProgressLesson(lessonIdentifier: LessonIdentifier): Either { - val finishLesson = finishLesson(bellRang()) - return readInProgressLesson(lessonIdentifier) - .map { inProgressLesson -> finishLesson(inProgressLesson, FinishLessonTime.now()) } - .asyncMap { storeLessonAsFinished(lessonIdentifier) } -} diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/finishlesson/InProgressLessonReadModel.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/finishlesson/InProgressLessonReadModel.kt index fb08171..9c03c6f 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/finishlesson/InProgressLessonReadModel.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/finishlesson/InProgressLessonReadModel.kt @@ -9,6 +9,7 @@ import com.krzykrucz.elesson.currentlesson.domain.shared.InProgressLesson import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier import com.krzykrucz.elesson.currentlesson.infrastructure.Database +// TODO extract port suspend fun readInProgressLesson(id: LessonIdentifier): Either = Database.LESSON_DATABASE[id].toOption() .filter { lesson -> lesson.status.status == InProgress.status } diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/finishlesson/FinishedLessonPersistence.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/finishlesson/StoreLessonAsFinishedAdapter.kt similarity index 67% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/finishlesson/FinishedLessonPersistence.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/finishlesson/StoreLessonAsFinishedAdapter.kt index 577fe1f..09b5373 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/finishlesson/FinishedLessonPersistence.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/finishlesson/StoreLessonAsFinishedAdapter.kt @@ -1,10 +1,11 @@ package com.krzykrucz.elesson.currentlesson.adapters.finishlesson +import com.krzykrucz.elesson.currentlesson.domain.finishlesson.StoreLessonAsFinished import com.krzykrucz.elesson.currentlesson.domain.shared.Finished import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier import com.krzykrucz.elesson.currentlesson.infrastructure.Database -suspend fun storeLessonAsFinished(lessonId: LessonIdentifier) { +internal val storeLessonAsFinishedAdapter: StoreLessonAsFinished = { lessonId: LessonIdentifier -> Database.LESSON_DATABASE.compute(lessonId) { _, lesson -> lesson?.copy(status = Finished) } diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartLessonAdapters.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartLessonAdapters.kt index 16bb4bd..d3e2ea7 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartLessonAdapters.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartLessonAdapters.kt @@ -1,14 +1,14 @@ package com.krzykrucz.elesson.currentlesson.adapters.startlesson import com.krzykrucz.elesson.currentlesson.adapters.startlesson.rest.startLessonRestAdapter -import com.krzykrucz.elesson.currentlesson.domain.startlesson.startLesson +import com.krzykrucz.elesson.currentlesson.domain.startlesson.startLessonWorkflow import org.springframework.context.support.beans val startLessonAdapters = beans { bean { startLessonRestAdapter( startedLessonPersistenceAdapter, - startLesson( + startLessonWorkflow( checkScheduledLessonAdapter, fetchClassRegistryAdapter ) diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/topic/TopicAdapters.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/topic/TopicAdapters.kt index 98644f8..f671df1 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/topic/TopicAdapters.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/topic/TopicAdapters.kt @@ -1,12 +1,15 @@ package com.krzykrucz.elesson.currentlesson.adapters.topic +import com.krzykrucz.elesson.currentlesson.domain.topic.chooseTopicWorkflow import org.springframework.context.support.beans val topicAdapters = beans { bean { topicRestAdapter( - checkIfAttendanceIsChecked, - fetchFinishedLessonsCount, + chooseTopicWorkflow( + checkIfAttendanceIsChecked, + fetchFinishedLessonsCount + ), persistInProgressLesson ) } diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/topic/TopicRestAdapter.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/topic/TopicRestAdapter.kt index fddb23e..f1fe917 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/topic/TopicRestAdapter.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/topic/TopicRestAdapter.kt @@ -5,28 +5,20 @@ import com.krzykrucz.elesson.currentlesson.adapters.asyncDoIfRight import com.krzykrucz.elesson.currentlesson.adapters.toServerResponse import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier import com.krzykrucz.elesson.currentlesson.domain.shared.TopicTitle -import com.krzykrucz.elesson.currentlesson.domain.topic.CheckIfAttendanceIsChecked -import com.krzykrucz.elesson.currentlesson.domain.topic.CountFinishedLessons +import com.krzykrucz.elesson.currentlesson.domain.topic.ChooseTopic import com.krzykrucz.elesson.currentlesson.domain.topic.PersistInProgressLesson -import com.krzykrucz.elesson.currentlesson.domain.topic.chooseTopic import org.springframework.web.reactive.function.server.awaitBody import org.springframework.web.reactive.function.server.coRouter internal fun topicRestAdapter( - checkIfAttendanceIsChecked: CheckIfAttendanceIsChecked, - fetchFinishedLessons: CountFinishedLessons, + chooseTopic: ChooseTopic, persistInProgressLesson: PersistInProgressLesson ) = coRouter { POST("/topic") { request -> - val chooseTopicDto = request.awaitBody() - chooseTopic( - checkIfAttendanceIsChecked, - chooseTopicDto.topicTitle, - fetchFinishedLessons, - chooseTopicDto.lessonIdentifier - ) - .asyncDoIfRight { inProgressLesson -> persistInProgressLesson(chooseTopicDto.lessonIdentifier, inProgressLesson) } + val (id, title) = request.awaitBody() + chooseTopic(title, id) + .asyncDoIfRight { inProgressLesson -> persistInProgressLesson(id, inProgressLesson) } .toServerResponse() } } diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/finishlesson/Persistence.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/finishlesson/Persistence.kt new file mode 100644 index 0000000..3196ed0 --- /dev/null +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/finishlesson/Persistence.kt @@ -0,0 +1,5 @@ +package com.krzykrucz.elesson.currentlesson.domain.finishlesson + +import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier + +typealias StoreLessonAsFinished = suspend (LessonIdentifier) -> Unit diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/finishlesson/Types.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/finishlesson/Types.kt index 5b4073d..8d30bdc 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/finishlesson/Types.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/finishlesson/Types.kt @@ -4,10 +4,6 @@ import com.krzykrucz.elesson.currentlesson.domain.shared.LessonOrdinalInSemester import com.krzykrucz.elesson.currentlesson.domain.shared.LessonTopic import java.time.LocalTime -enum class LessonBell { - RANG, NOT_RANG -} - data class FinishedLesson private constructor(val lessonTopic: LessonTopic, val lessonOrdinalInSemester: LessonOrdinalInSemester) { constructor(lessonTopic: LessonTopic) : this(lessonTopic, lessonTopic.lessonOrdinalInSemester) } diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/finishlesson/Workflows.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/finishlesson/Workflows.kt index a3639ab..fb2a26d 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/finishlesson/Workflows.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/finishlesson/Workflows.kt @@ -1,9 +1,25 @@ package com.krzykrucz.elesson.currentlesson.domain.finishlesson import arrow.core.Either +import arrow.core.maybe import com.krzykrucz.elesson.currentlesson.domain.shared.InProgressLesson import com.krzykrucz.elesson.currentlesson.domain.shared.LessonHourNumber -typealias CheckIfBellRang = (LessonHourNumber, FinishLessonTime) -> LessonBell +typealias CheckIfBellRang = (LessonHourNumber, FinishLessonTime) -> Boolean -typealias FinishLesson = (InProgressLesson, FinishLessonTime) -> Either \ No newline at end of file +private val bellRang: CheckIfBellRang = { lessonHourNumber, finishLessonTime -> + lessonHourNumber.run { + finishLessonTime.isAfter(lessonScheduledEndTime()) + } +} + +typealias FinishLesson = (InProgressLesson, FinishLessonTime) -> Either + +fun finishLessonWorkflow(checkIfBellRang: CheckIfBellRang = bellRang): FinishLesson = { inProgressLesson, currentTime -> + inProgressLesson + .lessonIdentifier + .lessonHourNumber + .let { checkIfBellRang(it, currentTime) } + .maybe { FinishedLesson(inProgressLesson.lessonTopic) } + .toEither { FinishLessonError.BellNotRang() } +} diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/finishlesson/WorkflowsImplementation.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/finishlesson/WorkflowsImplementation.kt deleted file mode 100644 index b850142..0000000 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/finishlesson/WorkflowsImplementation.kt +++ /dev/null @@ -1,27 +0,0 @@ -package com.krzykrucz.elesson.currentlesson.domain.finishlesson - -import arrow.core.toOption -import com.krzykrucz.elesson.currentlesson.domain.finishlesson.LessonBell.NOT_RANG -import com.krzykrucz.elesson.currentlesson.domain.finishlesson.LessonBell.RANG - - -fun bellRang(): CheckIfBellRang = { lessonHourNumber, finishLessonTime -> - lessonHourNumber.run { - if (finishLessonTime.isAfter(lessonScheduledEndTime())) { - RANG - } else { - NOT_RANG - } - } -} - -fun finishLesson(checkIfBellRang: CheckIfBellRang): FinishLesson = { inProgressLesson, currentTime -> - inProgressLesson - .lessonIdentifier - .lessonHourNumber - .let { checkIfBellRang(it, currentTime) } - .toOption() - .filter { it == RANG } - .map { FinishedLesson(inProgressLesson.lessonTopic) } - .toEither { FinishLessonError.BellNotRang() } -} \ No newline at end of file diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/startlesson/Workflows.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/startlesson/Workflows.kt index 2602871..899e881 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/startlesson/Workflows.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/startlesson/Workflows.kt @@ -26,7 +26,7 @@ private fun validateStartTime(): ValidateLessonStartTime = { lesson, time -> typealias StartLesson = suspend (Teacher, LessonStartTime) -> Either -fun startLesson( +fun startLessonWorkflow( fetchScheduledLesson: FetchScheduledLesson, fetchClassRegistry: FetchClassRegistry, validateLessonStartTime: ValidateLessonStartTime = validateStartTime() diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/topic/Workflows.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/topic/Workflows.kt index 7d697d4..a3338b4 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/topic/Workflows.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/topic/Workflows.kt @@ -14,12 +14,12 @@ import com.krzykrucz.elesson.currentlesson.domain.shared.TopicTitle typealias CountFinishedLessons = suspend () -> FinishedLessonsCount typealias CheckIfAttendanceIsChecked = suspend (LessonIdentifier) -> Boolean -typealias ChooseTopic = suspend (CheckIfAttendanceIsChecked, - TopicTitle, - CountFinishedLessons, - LessonIdentifier) -> Either +typealias ChooseTopic = suspend (TopicTitle, LessonIdentifier) -> Either -val chooseTopic: ChooseTopic = { checkIfAttendanceIsChecked, topicTitle, countFinishedLessons, lessonId -> +fun chooseTopicWorkflow( + checkIfAttendanceIsChecked: CheckIfAttendanceIsChecked, + countFinishedLessons: CountFinishedLessons +): ChooseTopic = { topicTitle, lessonId -> val isAttendanceChecked = checkIfAttendanceIsChecked(lessonId) val finishedLessonsCount = countFinishedLessons() isAttendanceChecked.maybe { diff --git a/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/finishlesson/FinishLessonAcceptanceSpec.groovy b/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/finishlesson/FinishLessonAcceptanceSpec.groovy index 9e1c0b9..3cb806e 100644 --- a/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/finishlesson/FinishLessonAcceptanceSpec.groovy +++ b/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/finishlesson/FinishLessonAcceptanceSpec.groovy @@ -2,13 +2,21 @@ package com.krzykrucz.elesson.currentlesson.adapters.finishlesson import arrow.core.Some import com.krzykrucz.elesson.currentlesson.adapters.AcceptanceSpec -import com.krzykrucz.elesson.currentlesson.infrastructure.Database -import com.krzykrucz.elesson.currentlesson.infrastructure.PersistentCurrentLesson import com.krzykrucz.elesson.currentlesson.domain.attendance.AbsentStudent import com.krzykrucz.elesson.currentlesson.domain.attendance.CheckedAttendanceList import com.krzykrucz.elesson.currentlesson.domain.attendance.PresentStudent import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api.StudentsUnpreparedForLesson -import com.krzykrucz.elesson.currentlesson.domain.shared.* +import com.krzykrucz.elesson.currentlesson.domain.shared.Finished +import com.krzykrucz.elesson.currentlesson.domain.shared.InProgress +import com.krzykrucz.elesson.currentlesson.domain.shared.LessonOrdinalInSemester +import com.krzykrucz.elesson.currentlesson.domain.shared.LessonSubject +import com.krzykrucz.elesson.currentlesson.domain.shared.LessonTopic +import com.krzykrucz.elesson.currentlesson.domain.shared.NaturalNumber +import com.krzykrucz.elesson.currentlesson.domain.shared.NonEmptyText +import com.krzykrucz.elesson.currentlesson.domain.shared.TopicTitle +import com.krzykrucz.elesson.currentlesson.domain.shared.WinterSemester +import com.krzykrucz.elesson.currentlesson.infrastructure.Database +import com.krzykrucz.elesson.currentlesson.infrastructure.PersistentCurrentLesson import org.springframework.http.HttpEntity import org.springframework.http.HttpMethod import org.springframework.http.HttpStatus @@ -42,7 +50,7 @@ class FinishLessonAcceptanceSpec extends AcceptanceSpec { "/finished-lessons", HttpMethod.PUT, new HttpEntity<>(dto), - String.class + String ) then: "in progress lesson is finished" diff --git a/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartLessonAcceptanceSpec.groovy b/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartLessonAcceptanceSpec.groovy index f77944d..18abd44 100644 --- a/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartLessonAcceptanceSpec.groovy +++ b/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartLessonAcceptanceSpec.groovy @@ -4,8 +4,6 @@ import com.krzykrucz.elesson.currentlesson.adapters.AcceptanceSpec import com.krzykrucz.elesson.currentlesson.adapters.startlesson.rest.ClassRegistryResponse import com.krzykrucz.elesson.currentlesson.adapters.startlesson.rest.StartLessonRequest import com.krzykrucz.elesson.currentlesson.infrastructure.Database -import org.springframework.http.HttpEntity -import org.springframework.http.HttpMethod import java.time.LocalDate @@ -15,10 +13,9 @@ class StartLessonAcceptanceSpec extends AcceptanceSpec { def "should start lesson"() { when: 'Dark Arts classes started by Severus Snape' - def lessonIdAndStudents = rest.exchange( + def lessonIdAndStudents = rest.postForEntity( "/startlesson", - HttpMethod.POST, - new HttpEntity<>(new StartLessonRequest('Severus', 'Snape')), + new StartLessonRequest('Severus', 'Snape'), ClassRegistryResponse ).body diff --git a/src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/finishlesson/FinishLessonSteps.kt b/src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/finishlesson/FinishLessonSteps.kt index 3744fbb..4834b7c 100644 --- a/src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/finishlesson/FinishLessonSteps.kt +++ b/src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/finishlesson/FinishLessonSteps.kt @@ -1,6 +1,8 @@ package com.krzykrucz.elesson.currentlesson.domain.finishlesson import arrow.core.Either +import com.krzykrucz.elesson.currentlesson.domain.lessonHourNumberOf +import com.krzykrucz.elesson.currentlesson.domain.newClassName import com.krzykrucz.elesson.currentlesson.domain.shared.InProgressLesson import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier import com.krzykrucz.elesson.currentlesson.domain.shared.LessonOrdinalInSemester @@ -8,8 +10,6 @@ import com.krzykrucz.elesson.currentlesson.domain.shared.LessonTopic import com.krzykrucz.elesson.currentlesson.domain.shared.NaturalNumber import com.krzykrucz.elesson.currentlesson.domain.shared.NonEmptyText import com.krzykrucz.elesson.currentlesson.domain.shared.TopicTitle -import com.krzykrucz.elesson.currentlesson.domain.lessonHourNumberOf -import com.krzykrucz.elesson.currentlesson.domain.newClassName import io.cucumber.java8.En import java.time.LocalDate import kotlin.test.assertTrue @@ -37,7 +37,7 @@ class FinishLessonSteps : En { } When("Finishing a lesson") { - finishedLesson = finishLesson(bellRang())( + finishedLesson = finishLessonWorkflow()( inProgressLesson, finishLessonTime ) diff --git a/src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/startlesson/StartLessonSteps.kt b/src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/startlesson/StartLessonSteps.kt index e57cabe..e37328a 100644 --- a/src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/startlesson/StartLessonSteps.kt +++ b/src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/startlesson/StartLessonSteps.kt @@ -86,7 +86,7 @@ class StartLessonSteps : En { When("Lesson is started at {word}") { startTime: String -> attemptedStartTime = LocalDateTime.parse(startTime) val result = runBlocking { - startLesson( + startLessonWorkflow( scheduledLessonProvider, classRegistryProvider )( diff --git a/src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/topic/ChooseTopicSteps.kt b/src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/topic/ChooseTopicSteps.kt index daa61c3..6d0f353 100644 --- a/src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/topic/ChooseTopicSteps.kt +++ b/src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/topic/ChooseTopicSteps.kt @@ -46,7 +46,7 @@ class ChooseTopicSteps : En { } When("Choosing a topic") { inProgressLesson = runBlocking { - chooseTopic(isAttendanceChecked, topicTitle, finishedLessonsCount, lessonIdentifier) + chooseTopicWorkflow(isAttendanceChecked, finishedLessonsCount)(topicTitle, lessonIdentifier) } } Then("Lesson is in progress") { From 3f0e4b963b92f8c2ad3275bd0a14a77dd5d0eaa0 Mon Sep 17 00:00:00 2001 From: krzykrucz Date: Thu, 21 May 2020 20:35:15 +0200 Subject: [PATCH 5/9] domains cleaned up --- .../attendance/rest/AttendanceRouterConfig.kt | 1 - .../attendance/usecase/AttendanceHandler.kt | 28 +--- .../StudentUnpreparedDomainConfig.kt | 46 ++---- .../eventpublisher/EventPublisherAdapter.kt | 2 +- .../CurrentLessonDatabaseAdapter.kt | 4 +- .../UnpreparedStudentDatabaseAdapter.kt | 2 +- .../PreparednessInSemesterReadModel.kt | 10 +- .../rest/UnpreparedStudentHttpEndpoint.kt | 4 +- .../AttendanceWorkflowImplementation.kt | 108 -------------- .../attendance/{Attendance.kt => Types.kt} | 15 -- .../domain/attendance/Workflows.kt | 130 +++++++++++++++++ .../ReportUnpreparedStudentApi.kt => Api.kt} | 13 +- .../{domain/api => }/Persistence.kt | 3 +- ....kt => PreparednessInSemesterReadModel.kt} | 3 +- .../preparedness/{domain/api => }/Types.kt | 4 +- .../domain/preparedness/Workflows.kt | 133 ++++++++++++++++++ .../preparedness/domain/api/Dependencies.kt | 19 --- .../preparedness/domain/api/Workflows.kt | 16 --- .../domain/implementation/Dependencies.kt | 46 ------ .../domain/implementation/Workflows.kt | 85 ----------- .../shared/CurrentLessonSharedKernel.kt | 4 +- .../currentlesson/infrastructure/Database.kt | 2 +- .../FinishLessonAcceptanceSpec.groovy | 2 +- .../LessonProgressAcceptanceSpec.groovy | 2 +- .../UnpreparedStudentAcceptanceSpec.groovy | 12 +- .../adapters/topic/TopicAcceptanceSpec.groovy | 17 ++- .../domain/attendance/CheckAttendanceSteps.kt | 64 +++------ .../domain/attendance/IsNotTooLateSteps.kt | 12 +- .../preparedness/StudentUnpreparedSteps.kt | 29 +--- 29 files changed, 351 insertions(+), 465 deletions(-) delete mode 100644 src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/attendance/AttendanceWorkflowImplementation.kt rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/attendance/{Attendance.kt => Types.kt} (68%) create mode 100644 src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/attendance/Workflows.kt rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/{domain/ReportUnpreparedStudentApi.kt => Api.kt} (57%) rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/{domain/api => }/Persistence.kt (84%) rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/{readmodel/PreparednessInSemester.kt => PreparednessInSemesterReadModel.kt} (89%) rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/{domain/api => }/Types.kt (93%) create mode 100644 src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/Workflows.kt delete mode 100644 src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/domain/api/Dependencies.kt delete mode 100644 src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/domain/api/Workflows.kt delete mode 100644 src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/domain/implementation/Dependencies.kt delete mode 100644 src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/domain/implementation/Workflows.kt diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/rest/AttendanceRouterConfig.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/rest/AttendanceRouterConfig.kt index 46f5832..fba7f98 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/rest/AttendanceRouterConfig.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/rest/AttendanceRouterConfig.kt @@ -14,7 +14,6 @@ import org.springframework.context.annotation.Configuration import org.springframework.web.reactive.function.server.awaitBody import org.springframework.web.reactive.function.server.coRouter -// TODO divide this config to 3 different adapters @Configuration class AttendanceRouterConfig { diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/usecase/AttendanceHandler.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/usecase/AttendanceHandler.kt index 5f079c3..3afd2ba 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/usecase/AttendanceHandler.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/usecase/AttendanceHandler.kt @@ -12,15 +12,9 @@ import com.krzykrucz.elesson.currentlesson.domain.attendance.AttendanceError import com.krzykrucz.elesson.currentlesson.domain.attendance.FetchCheckedAttendance import com.krzykrucz.elesson.currentlesson.domain.attendance.FetchIncompleteAttendance import com.krzykrucz.elesson.currentlesson.domain.attendance.PersistAttendance -import com.krzykrucz.elesson.currentlesson.domain.attendance.addAbsentStudent -import com.krzykrucz.elesson.currentlesson.domain.attendance.addPresentStudent -import com.krzykrucz.elesson.currentlesson.domain.attendance.completeList -import com.krzykrucz.elesson.currentlesson.domain.attendance.getLessonStartTime -import com.krzykrucz.elesson.currentlesson.domain.attendance.isInRegistry -import com.krzykrucz.elesson.currentlesson.domain.attendance.isNotTooLate -import com.krzykrucz.elesson.currentlesson.domain.attendance.noteAbsence -import com.krzykrucz.elesson.currentlesson.domain.attendance.noteLate -import com.krzykrucz.elesson.currentlesson.domain.attendance.notePresence +import com.krzykrucz.elesson.currentlesson.domain.attendance.noteAbsenceWorkflow +import com.krzykrucz.elesson.currentlesson.domain.attendance.noteLateWorkflow +import com.krzykrucz.elesson.currentlesson.domain.attendance.notePresenceWorkflow import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import java.time.LocalDateTime @@ -45,11 +39,7 @@ class AttendanceHandler( val notePresenceResult = Option.fx { val (incompleteAttendance) = incompleteAttendanceDtoOpt - notePresence( - isInRegistry(), - completeList(), - addPresentStudent() - )( + notePresenceWorkflow()( attendanceDto.uncheckedStudent, incompleteAttendance.incompleteAttendanceList, incompleteAttendance.classRegistry @@ -68,11 +58,7 @@ class AttendanceHandler( val noteAbsenceResult = Option.fx { val (incompleteAttendance) = incompleteAttendanceDtoOpt - noteAbsence( - isInRegistry(), - completeList(), - addAbsentStudent() - )( + noteAbsenceWorkflow()( attendanceDto.uncheckedStudent, incompleteAttendance.incompleteAttendanceList, incompleteAttendance.classRegistry @@ -93,9 +79,7 @@ class AttendanceHandler( val checkedAttendanceOpt = fetchCheckedAttendance(lateAttendanceDto.lessonId) val noteLateResult = Option.fx { val (checkedAttendance) = checkedAttendanceOpt - noteLate( - isNotTooLate(getLessonStartTime()) - )( + noteLateWorkflow()( lateAttendanceDto.lessonId.lessonHourNumber, lateAttendanceDto.absentStudent, checkedAttendance, diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/StudentUnpreparedDomainConfig.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/StudentUnpreparedDomainConfig.kt index 457cb42..9b32db7 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/StudentUnpreparedDomainConfig.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/StudentUnpreparedDomainConfig.kt @@ -1,55 +1,29 @@ package com.krzykrucz.elesson.currentlesson.adapters.preparedness -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.ReportUnpreparedStudentApi -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api.FindCurrentLesson -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api.NotifyStudentMarkedUnprepared -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api.PersistUnpreparedStudentToLesson -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api.ReportUnpreparedness -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.implementation.areStudentsEqual -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.implementation.checkNumberOfTimesStudentWasUnpreparedInSemester -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.implementation.checkStudentCanReportUnprepared -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.implementation.checkStudentIsPresent -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.implementation.createEvent -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.implementation.hasStudentAlreadyRaisedUnprepared -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.implementation.hasStudentUsedAllUnpreparedness -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.implementation.noteStudentUnprepared -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.implementation.reportUnpreparedness -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.reportUnpreparedStudentApi -import com.krzykrucz.elesson.currentlesson.domain.preparedness.readmodel.GetStudentSubjectUnpreparednessInASemester +import com.krzykrucz.elesson.currentlesson.domain.preparedness.FindCurrentLesson +import com.krzykrucz.elesson.currentlesson.domain.preparedness.GetStudentSubjectUnpreparednessInASemester +import com.krzykrucz.elesson.currentlesson.domain.preparedness.NotifyStudentMarkedUnprepared +import com.krzykrucz.elesson.currentlesson.domain.preparedness.PersistUnpreparedStudentToLesson +import com.krzykrucz.elesson.currentlesson.domain.preparedness.ReportUnpreparedStudentApi +import com.krzykrucz.elesson.currentlesson.domain.preparedness.reportUnpreparedStudentApi import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration @Configuration class StudentUnpreparedDomainConfig { - @Bean - fun reportUnpreparednessBean( - getStudentSubjectUnpreparednessInASemester: GetStudentSubjectUnpreparednessInASemester - ): ReportUnpreparedness = - reportUnpreparedness( - checkStudentCanReportUnprepared( - checkNumberOfTimesStudentWasUnpreparedInSemester( - getStudentSubjectUnpreparednessInASemester - ), - hasStudentUsedAllUnpreparedness - ), - noteStudentUnprepared(hasStudentAlreadyRaisedUnprepared), - checkStudentIsPresent(areStudentsEqual), - createEvent - ) - @Bean fun reportUnpreparednessApiBean( - reportUnpreparedness: ReportUnpreparedness, findCurrentLesson: FindCurrentLesson, persistUnpreparedStudentToLesson: PersistUnpreparedStudentToLesson, - notifyStudentMarkedUnprepared: NotifyStudentMarkedUnprepared + notifyStudentMarkedUnprepared: NotifyStudentMarkedUnprepared, + getStudentSubjectUnpreparednessInASemester: GetStudentSubjectUnpreparednessInASemester ): ReportUnpreparedStudentApi = reportUnpreparedStudentApi( findCurrentLesson, - reportUnpreparedness, persistUnpreparedStudentToLesson, - notifyStudentMarkedUnprepared + notifyStudentMarkedUnprepared, + getStudentSubjectUnpreparednessInASemester ) } diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/eventpublisher/EventPublisherAdapter.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/eventpublisher/EventPublisherAdapter.kt index 3a304a1..00305e9 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/eventpublisher/EventPublisherAdapter.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/eventpublisher/EventPublisherAdapter.kt @@ -1,6 +1,6 @@ package com.krzykrucz.elesson.currentlesson.adapters.preparedness.eventpublisher -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api.NotifyStudentMarkedUnprepared +import com.krzykrucz.elesson.currentlesson.domain.preparedness.NotifyStudentMarkedUnprepared import org.springframework.context.ApplicationEventPublisher import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/findcurrentlesson/CurrentLessonDatabaseAdapter.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/findcurrentlesson/CurrentLessonDatabaseAdapter.kt index 7d5a972..3839123 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/findcurrentlesson/CurrentLessonDatabaseAdapter.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/findcurrentlesson/CurrentLessonDatabaseAdapter.kt @@ -2,8 +2,8 @@ package com.krzykrucz.elesson.currentlesson.adapters.preparedness.findcurrentles import arrow.core.orElse import arrow.core.toOption -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api.FindCurrentLesson -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api.UnpreparednessError +import com.krzykrucz.elesson.currentlesson.domain.preparedness.FindCurrentLesson +import com.krzykrucz.elesson.currentlesson.domain.preparedness.UnpreparednessError import com.krzykrucz.elesson.currentlesson.infrastructure.Database import com.krzykrucz.elesson.currentlesson.infrastructure.PersistentCurrentLesson import org.springframework.context.annotation.Bean diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/persistence/UnpreparedStudentDatabaseAdapter.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/persistence/UnpreparedStudentDatabaseAdapter.kt index fa4b99f..74fa9c2 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/persistence/UnpreparedStudentDatabaseAdapter.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/persistence/UnpreparedStudentDatabaseAdapter.kt @@ -1,6 +1,6 @@ package com.krzykrucz.elesson.currentlesson.adapters.preparedness.persistence -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api.PersistUnpreparedStudentToLesson +import com.krzykrucz.elesson.currentlesson.domain.preparedness.PersistUnpreparedStudentToLesson import com.krzykrucz.elesson.currentlesson.infrastructure.Database import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/readmodel/PreparednessInSemesterReadModel.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/readmodel/PreparednessInSemesterReadModel.kt index 413aad0..e9cc1fc 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/readmodel/PreparednessInSemesterReadModel.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/readmodel/PreparednessInSemesterReadModel.kt @@ -4,11 +4,11 @@ import arrow.core.Option import arrow.core.getOrElse import arrow.core.right import com.krzykrucz.elesson.currentlesson.adapters.preparedness.readmodel.StudentInSemesterReadModel.READ_MODEL -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api.StudentMarkedUnprepared -import com.krzykrucz.elesson.currentlesson.domain.preparedness.readmodel.GetStudentSubjectUnpreparednessInASemester -import com.krzykrucz.elesson.currentlesson.domain.preparedness.readmodel.StudentInSemester -import com.krzykrucz.elesson.currentlesson.domain.preparedness.readmodel.StudentSubjectUnpreparednessInASemester -import com.krzykrucz.elesson.currentlesson.domain.preparedness.readmodel.WriteUnpreparednessInTheRegister +import com.krzykrucz.elesson.currentlesson.domain.preparedness.GetStudentSubjectUnpreparednessInASemester +import com.krzykrucz.elesson.currentlesson.domain.preparedness.StudentInSemester +import com.krzykrucz.elesson.currentlesson.domain.preparedness.StudentMarkedUnprepared +import com.krzykrucz.elesson.currentlesson.domain.preparedness.StudentSubjectUnpreparednessInASemester +import com.krzykrucz.elesson.currentlesson.domain.preparedness.WriteUnpreparednessInTheRegister import kotlinx.coroutines.runBlocking import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/rest/UnpreparedStudentHttpEndpoint.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/rest/UnpreparedStudentHttpEndpoint.kt index 5237c7d..da1da1a 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/rest/UnpreparedStudentHttpEndpoint.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/rest/UnpreparedStudentHttpEndpoint.kt @@ -1,7 +1,7 @@ package com.krzykrucz.elesson.currentlesson.adapters.preparedness.rest -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.ReportUnpreparedStudentApi -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api.StudentReportingUnpreparedness +import com.krzykrucz.elesson.currentlesson.domain.preparedness.ReportUnpreparedStudentApi +import com.krzykrucz.elesson.currentlesson.domain.preparedness.StudentReportingUnpreparedness import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/attendance/AttendanceWorkflowImplementation.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/attendance/AttendanceWorkflowImplementation.kt deleted file mode 100644 index 7df5af5..0000000 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/attendance/AttendanceWorkflowImplementation.kt +++ /dev/null @@ -1,108 +0,0 @@ -package com.krzykrucz.elesson.currentlesson.domain.attendance - -import arrow.core.getOrElse -import arrow.core.maybe -import com.krzykrucz.elesson.currentlesson.domain.shared.StudentRecord -import java.time.temporal.ChronoUnit - -fun noteAbsence( - isInRegistry: IsInRegistry, - completeListIfAllStudentsChecked: CompleteListIfAllStudentsChecked, - addAbsentStudent: AddAbsentStudent -): NoteAbsence = { uncheckedStudent, notCompletedAttendance, classRegistry -> - isInRegistry(uncheckedStudent, classRegistry) - .maybe { - addAbsentStudent(notCompletedAttendance, uncheckedStudent) - }.map { - completeListIfAllStudentsChecked(it, classRegistry) - }.toEither { - AttendanceError.StudentNotInRegistry() - } -} - -fun notePresence( - isInRegistry: IsInRegistry, - completeListIfAllStudentsChecked: CompleteListIfAllStudentsChecked, - addPresentStudent: AddPresentStudent -): NotePresence = { uncheckedStudent, notCompletedAttendance, classRegistry -> - isInRegistry(uncheckedStudent, classRegistry) - .maybe { - addPresentStudent(notCompletedAttendance, uncheckedStudent) - }.map { - completeListIfAllStudentsChecked(it, classRegistry) - }.toEither { - AttendanceError.StudentNotInRegistry() - } -} - -fun noteLate( - isNotTooLate: IsNotTooLate -): NoteLate = { lessonHourNumber, absentStudent, checkedAttendance, currentTime -> - isNotTooLate(lessonHourNumber, currentTime) - .maybe { - checkedAttendance.copy( - absentStudents = checkedAttendance.absentStudents - absentStudent, - presentStudents = checkedAttendance.presentStudents + absentStudent.toPresent() - ) - }.getOrElse { - checkedAttendance - } -} - -fun isNotTooLate(getLessonStartTime: GetLessonStartTime): IsNotTooLate = { lessonHour, currentTime -> - val lessonStartTime = getLessonStartTime(lessonHour) - val timeDifference: Long = ChronoUnit.MINUTES.between(lessonStartTime, currentTime) // TODO refactor - timeDifference <= 15 -} - -fun isInRegistry(): IsInRegistry = { student, classRegistry -> - classRegistry.students.contains( - StudentRecord( - firstName = student.firstName, - secondName = student.secondName, - numberInRegister = student.numberInRegister - ) - ) -} - -fun completeList(): CompleteListIfAllStudentsChecked = { attendanceList, classRegistry -> - val absentStudentsRecords = attendanceList.absentStudents - .map { student -> - StudentRecord( - firstName = student.firstName, - secondName = student.secondName, - numberInRegister = student.numberInRegister - ) - } - val presentStudentsRecords = attendanceList.presentStudents - .map { student -> - StudentRecord( - firstName = student.firstName, - secondName = student.secondName, - numberInRegister = student.numberInRegister - ) - } - val checkedStudents = (absentStudentsRecords + presentStudentsRecords) - val students = classRegistry.students - val containsAll = checkedStudents.containsAll(students) - containsAll - .maybe { - CheckedAttendanceList( - attendanceList.presentStudents, - attendanceList.absentStudents - ) - } - .getOrElse { attendanceList } -} - -fun addAbsentStudent(): AddAbsentStudent = { attendanceList, student -> - attendanceList.copy(absentStudents = attendanceList.absentStudents + student.toAbsent()) -} - -fun addPresentStudent(): AddPresentStudent = { attendanceList, student -> - attendanceList.copy(presentStudents = attendanceList.presentStudents + student.toPresent()) -} - -fun getLessonStartTime(): GetLessonStartTime = { lessonHourNumber -> - lessonHourNumber.getLessonScheduledStartTime() -} diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/attendance/Attendance.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/attendance/Types.kt similarity index 68% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/attendance/Attendance.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/attendance/Types.kt index c29b077..77a77ea 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/attendance/Attendance.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/attendance/Types.kt @@ -1,9 +1,6 @@ package com.krzykrucz.elesson.currentlesson.domain.attendance -import arrow.core.Either -import com.krzykrucz.elesson.currentlesson.domain.shared.ClassRegistry import com.krzykrucz.elesson.currentlesson.domain.shared.FirstName -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonHourNumber import com.krzykrucz.elesson.currentlesson.domain.shared.NumberInRegister import com.krzykrucz.elesson.currentlesson.domain.shared.SecondName import java.time.LocalDateTime @@ -62,16 +59,4 @@ sealed class AttendanceError { typealias CurrentTime = LocalDateTime typealias LessonTime = LocalTime -typealias IsInRegistry = (Student, ClassRegistry) -> Boolean -typealias GetLessonStartTime = (LessonHourNumber) -> LessonTime -typealias IsNotTooLate = (LessonHourNumber, CurrentTime) -> Boolean - -typealias AddAbsentStudent = (IncompleteAttendanceList, UncheckedStudent) -> IncompleteAttendanceList -typealias AddPresentStudent = (IncompleteAttendanceList, UncheckedStudent) -> IncompleteAttendanceList - -typealias CompleteListIfAllStudentsChecked = (IncompleteAttendanceList, ClassRegistry) -> Attendance - -typealias NotePresence = (UncheckedStudent, IncompleteAttendanceList, ClassRegistry) -> Either -typealias NoteAbsence = (UncheckedStudent, IncompleteAttendanceList, ClassRegistry) -> Either -typealias NoteLate = (LessonHourNumber, AbsentStudent, CheckedAttendanceList, CurrentTime) -> CheckedAttendanceList diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/attendance/Workflows.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/attendance/Workflows.kt new file mode 100644 index 0000000..72b25fc --- /dev/null +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/attendance/Workflows.kt @@ -0,0 +1,130 @@ +package com.krzykrucz.elesson.currentlesson.domain.attendance + +import arrow.core.Either +import arrow.core.getOrElse +import arrow.core.maybe +import com.krzykrucz.elesson.currentlesson.domain.shared.ClassRegistry +import com.krzykrucz.elesson.currentlesson.domain.shared.LessonHourNumber +import com.krzykrucz.elesson.currentlesson.domain.shared.StudentRecord +import java.time.temporal.ChronoUnit + + +private typealias IsNotTooLate = (LessonHourNumber, CurrentTime) -> Boolean + +private fun isNotTooLate(getLessonStartTime: GetLessonStartTime): IsNotTooLate = { lessonHour, currentTime -> + val lessonStartTime = getLessonStartTime(lessonHour) + val timeDifference: Long = ChronoUnit.MINUTES.between(lessonStartTime, currentTime) // TODO refactor + timeDifference <= 15 +} + +private typealias IsInRegistry = (Student, ClassRegistry) -> Boolean + +private val isInRegistry: IsInRegistry = { student, classRegistry -> + classRegistry.students.contains( + StudentRecord( + firstName = student.firstName, + secondName = student.secondName, + numberInRegister = student.numberInRegister + ) + ) +} + +private typealias CompleteListIfAllStudentsChecked = (IncompleteAttendanceList, ClassRegistry) -> Attendance + +private val completeList: CompleteListIfAllStudentsChecked = { attendanceList, classRegistry -> + val absentStudentsRecords = attendanceList.absentStudents + .map { student -> + StudentRecord( + firstName = student.firstName, + secondName = student.secondName, + numberInRegister = student.numberInRegister + ) + } + val presentStudentsRecords = attendanceList.presentStudents + .map { student -> + StudentRecord( + firstName = student.firstName, + secondName = student.secondName, + numberInRegister = student.numberInRegister + ) + } + val checkedStudents = (absentStudentsRecords + presentStudentsRecords) + val students = classRegistry.students + val containsAll = checkedStudents.containsAll(students) + containsAll + .maybe { + CheckedAttendanceList( + attendanceList.presentStudents, + attendanceList.absentStudents + ) + } + .getOrElse { attendanceList } +} + +private typealias AddAbsentStudent = (IncompleteAttendanceList, UncheckedStudent) -> IncompleteAttendanceList + +private val addAbsentStudent: AddAbsentStudent = { attendanceList, student -> + attendanceList.copy(absentStudents = attendanceList.absentStudents + student.toAbsent()) +} + +private typealias AddPresentStudent = (IncompleteAttendanceList, UncheckedStudent) -> IncompleteAttendanceList + +private val addPresentStudent: AddPresentStudent = { attendanceList, student -> + attendanceList.copy(presentStudents = attendanceList.presentStudents + student.toPresent()) +} + +private typealias GetLessonStartTime = (LessonHourNumber) -> LessonTime + +private val getLessonStartTime: GetLessonStartTime = { lessonHourNumber -> + lessonHourNumber.getLessonScheduledStartTime() +} + +typealias NoteAbsence = (UncheckedStudent, IncompleteAttendanceList, ClassRegistry) -> Either + +fun noteAbsenceWorkflow( + isStudentInRegistry: IsInRegistry = isInRegistry, + completeListIfAllStudentsChecked: CompleteListIfAllStudentsChecked = completeList, + addAbsentStudentToList: AddAbsentStudent = addAbsentStudent +): NoteAbsence = { uncheckedStudent, notCompletedAttendance, classRegistry -> + isStudentInRegistry(uncheckedStudent, classRegistry) + .maybe { + addAbsentStudentToList(notCompletedAttendance, uncheckedStudent) + }.map { + completeListIfAllStudentsChecked(it, classRegistry) + }.toEither { + AttendanceError.StudentNotInRegistry() + } +} + +typealias NotePresence = (UncheckedStudent, IncompleteAttendanceList, ClassRegistry) -> Either + +fun notePresenceWorkflow( + isStudentInRegistry: IsInRegistry = isInRegistry, + completeListIfAllStudentsChecked: CompleteListIfAllStudentsChecked = completeList, + addPresentStudentToList: AddPresentStudent = addPresentStudent +): NotePresence = { uncheckedStudent, notCompletedAttendance, classRegistry -> + isStudentInRegistry(uncheckedStudent, classRegistry) + .maybe { + addPresentStudentToList(notCompletedAttendance, uncheckedStudent) + }.map { + completeListIfAllStudentsChecked(it, classRegistry) + }.toEither { + AttendanceError.StudentNotInRegistry() + } +} + +typealias NoteLate = (LessonHourNumber, AbsentStudent, CheckedAttendanceList, CurrentTime) -> CheckedAttendanceList + +fun noteLateWorkflow( + isNotTooLate: IsNotTooLate = isNotTooLate(getLessonStartTime) +): NoteLate = { lessonHourNumber, absentStudent, checkedAttendance, currentTime -> + isNotTooLate(lessonHourNumber, currentTime) + .maybe { + checkedAttendance.copy( + absentStudents = checkedAttendance.absentStudents - absentStudent, + presentStudents = checkedAttendance.presentStudents + absentStudent.toPresent() + ) + }.getOrElse { + checkedAttendance + } +} diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/domain/ReportUnpreparedStudentApi.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/Api.kt similarity index 57% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/domain/ReportUnpreparedStudentApi.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/Api.kt index 1a5f9ae..299ee0f 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/domain/ReportUnpreparedStudentApi.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/Api.kt @@ -1,14 +1,8 @@ -package com.krzykrucz.elesson.currentlesson.domain.preparedness.domain +package com.krzykrucz.elesson.currentlesson.domain.preparedness import arrow.core.Either import com.krzykrucz.elesson.currentlesson.adapters.asyncDoIfRight import com.krzykrucz.elesson.currentlesson.adapters.asyncFlatMap -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api.FindCurrentLesson -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api.NotifyStudentMarkedUnprepared -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api.PersistUnpreparedStudentToLesson -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api.ReportUnpreparedness -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api.StudentReportingUnpreparedness -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api.UnpreparednessError import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier @@ -17,9 +11,10 @@ typealias ReportUnpreparedStudentApi = fun reportUnpreparedStudentApi( findCurrentLesson: FindCurrentLesson, - reportUnpreparedness: ReportUnpreparedness, persistUnpreparedStudentToLesson: PersistUnpreparedStudentToLesson, - notifyStudentMarkedUnprepared: NotifyStudentMarkedUnprepared + notifyStudentMarkedUnprepared: NotifyStudentMarkedUnprepared, + getStudentSubjectUnpreparednessInASemester: GetStudentSubjectUnpreparednessInASemester, + reportUnpreparedness: ReportUnpreparedness = reportUnpreparednessWorkflow(getStudentSubjectUnpreparednessInASemester) ): ReportUnpreparedStudentApi = { lessonId, student -> findCurrentLesson(lessonId) .asyncFlatMap { currentLesson -> reportUnpreparedness(student, currentLesson) } diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/domain/api/Persistence.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/Persistence.kt similarity index 84% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/domain/api/Persistence.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/Persistence.kt index bfbee9f..87b0579 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/domain/api/Persistence.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/Persistence.kt @@ -1,10 +1,9 @@ -package com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api +package com.krzykrucz.elesson.currentlesson.domain.preparedness import arrow.core.Either import com.krzykrucz.elesson.currentlesson.domain.shared.CurrentLesson import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier -//persistence typealias PersistUnpreparedStudentToLesson = suspend (StudentMarkedUnprepared) -> LessonIdentifier typealias NotifyStudentMarkedUnprepared = suspend (StudentMarkedUnprepared) -> Unit diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/readmodel/PreparednessInSemester.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/PreparednessInSemesterReadModel.kt similarity index 89% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/readmodel/PreparednessInSemester.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/PreparednessInSemesterReadModel.kt index 32f7f2d..d8777c4 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/readmodel/PreparednessInSemester.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/PreparednessInSemesterReadModel.kt @@ -1,8 +1,7 @@ -package com.krzykrucz.elesson.currentlesson.domain.preparedness.readmodel +package com.krzykrucz.elesson.currentlesson.domain.preparedness import arrow.core.Either import arrow.core.Option -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api.StudentMarkedUnprepared import com.krzykrucz.elesson.currentlesson.domain.shared.ClassName import com.krzykrucz.elesson.currentlesson.domain.shared.FirstName import com.krzykrucz.elesson.currentlesson.domain.shared.SecondName diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/domain/api/Types.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/Types.kt similarity index 93% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/domain/api/Types.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/Types.kt index 1e17255..b0a69cd 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/domain/api/Types.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/Types.kt @@ -1,4 +1,4 @@ -package com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api +package com.krzykrucz.elesson.currentlesson.domain.preparedness import com.krzykrucz.elesson.currentlesson.domain.shared.FirstName import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier @@ -32,4 +32,4 @@ data class StudentMarkedUnprepared( val happenedAt: LocalDateTime = LocalDateTime.now(), val unpreparedStudent: UnpreparedStudent, val studentsUnpreparedForLesson: StudentsUnpreparedForLesson -) \ No newline at end of file +) diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/Workflows.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/Workflows.kt new file mode 100644 index 0000000..9986d29 --- /dev/null +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/Workflows.kt @@ -0,0 +1,133 @@ +package com.krzykrucz.elesson.currentlesson.domain.preparedness + +import arrow.core.Either +import arrow.core.extensions.either.applicativeError.handleError +import arrow.core.extensions.list.foldable.find +import arrow.core.left +import arrow.core.maybe +import com.krzykrucz.elesson.currentlesson.adapters.asyncFlatMap +import com.krzykrucz.elesson.currentlesson.adapters.asyncMap +import com.krzykrucz.elesson.currentlesson.domain.attendance.CheckedAttendanceList +import com.krzykrucz.elesson.currentlesson.domain.attendance.PresentStudent +import com.krzykrucz.elesson.currentlesson.domain.shared.ClassName +import com.krzykrucz.elesson.currentlesson.domain.shared.CurrentLesson +import com.krzykrucz.elesson.currentlesson.domain.shared.LessonAfterAttendance +import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier +import com.krzykrucz.elesson.currentlesson.domain.shared.failIf + +private typealias CheckNumberOfTimesStudentWasUnpreparedInSemester = suspend (PresentStudent, ClassName) -> Either + +private fun checkNumberOfTimesStudentWasUnpreparedInSemester( + getStudentSubjectUnpreparednessInASemester: GetStudentSubjectUnpreparednessInASemester +): CheckNumberOfTimesStudentWasUnpreparedInSemester = { student, className -> + StudentInSemester( + className, + student.firstName, + student.secondName + ) + .let { getStudentSubjectUnpreparednessInASemester(it) } +} + +private typealias HasStudentUsedAllUnpreparedness = (StudentSubjectUnpreparednessInASemester) -> Boolean + +private val hasStudentUsedAllUnpreparedness: HasStudentUsedAllUnpreparedness = { + it.count >= 3 +} + +private typealias HasStudentAlreadyRaisedUnprepared = (StudentsUnpreparedForLesson, PresentStudent) -> Boolean + +private val hasStudentAlreadyRaisedUnprepared: HasStudentAlreadyRaisedUnprepared = { studentsUnpreparedForLesson, presentStudent -> + UnpreparedStudent( + presentStudent.firstName, + presentStudent.secondName + ) + .let { studentsUnpreparedForLesson.students.contains(it) } +} + +private typealias CheckStudentIsPresent = (StudentReportingUnpreparedness, CheckedAttendanceList) -> Either + +private fun checkStudentIsPresent( + areStudentsEqual: AreStudentsEqual +): CheckStudentIsPresent = { studentReportingUnpreparedness, checkedAttendanceList -> + checkedAttendanceList.presentStudents + .find { areStudentsEqual(it, studentReportingUnpreparedness) } + .toEither { UnpreparednessError.StudentNotPresent } +} + +private typealias AreStudentsEqual = (PresentStudent, StudentReportingUnpreparedness) -> Boolean + +private val areStudentsEqual: AreStudentsEqual = { presentStudent, studentReportingUnpreparedness -> + (presentStudent.firstName.name.text == studentReportingUnpreparedness.firstName) + .and(presentStudent.secondName.name.text == studentReportingUnpreparedness.secondName) +} + +typealias CheckStudentCanReportUnprepared = suspend (PresentStudent, ClassName) -> Either + +private fun checkStudentCanReportUnprepared( + checkNumberOfTimesStudentWasUnpreparedInSemester: CheckNumberOfTimesStudentWasUnpreparedInSemester, + hasStudentUsedAllUnpreparedness: HasStudentUsedAllUnpreparedness +): CheckStudentCanReportUnprepared = { presentStudent, className -> + checkNumberOfTimesStudentWasUnpreparedInSemester(presentStudent, className) + .handleError { presentStudent.toStudentInSemester(className).let(StudentSubjectUnpreparednessInASemester.Companion::createEmpty) } + .failIf(hasStudentUsedAllUnpreparedness, UnpreparednessError.UnpreparedTooManyTimes) + .map { presentStudent } + .mapLeft { it as UnpreparednessError } +} + +typealias NoteStudentUnpreparedForLesson = (PresentStudent, StudentsUnpreparedForLesson) -> Either + +private fun noteStudentUnprepared( + hasStudentAlreadyRaisedUnprepared: HasStudentAlreadyRaisedUnprepared +): NoteStudentUnpreparedForLesson = { presentStudent, studentsUnpreparedForLesson -> + hasStudentAlreadyRaisedUnprepared(studentsUnpreparedForLesson, presentStudent).not() + .maybe { + UnpreparedStudent( + presentStudent.firstName, + presentStudent.secondName + ) + } + .map { studentsUnpreparedForLesson.students + it } + .map(studentsUnpreparedForLesson::copy) + .toEither { UnpreparednessError.AlreadyRaised } +} + +typealias CreateEvent = (LessonIdentifier, StudentsUnpreparedForLesson) -> StudentMarkedUnprepared + +private fun createEvent(): CreateEvent = { lessonIdentifier, studentsUnpreparedForLesson -> + StudentMarkedUnprepared( + lessonId = lessonIdentifier, + unpreparedStudent = studentsUnpreparedForLesson.students.last(), + studentsUnpreparedForLesson = studentsUnpreparedForLesson + ) +} + + +typealias ReportUnpreparedness = suspend (StudentReportingUnpreparedness, CurrentLesson) -> Either + +fun reportUnpreparednessWorkflow( + getStudentSubjectUnpreparednessInASemester: GetStudentSubjectUnpreparednessInASemester +): ReportUnpreparedness = { studentReportingUnpreparedness, lesson -> + val checkIfStudentCanReportUnprepared = checkStudentCanReportUnprepared( + checkNumberOfTimesStudentWasUnpreparedInSemester(getStudentSubjectUnpreparednessInASemester), + hasStudentUsedAllUnpreparedness + ) + val checkStudentIsPresent = checkStudentIsPresent(areStudentsEqual) + val noteStudentUnpreparedForLesson = noteStudentUnprepared(hasStudentAlreadyRaisedUnprepared) + val createEvent = createEvent() + + when (lesson) { + is LessonAfterAttendance -> + checkStudentIsPresent(studentReportingUnpreparedness, lesson.attendance) + .asyncFlatMap { checkIfStudentCanReportUnprepared(it, lesson.identifier.className) } + .asyncFlatMap { noteStudentUnpreparedForLesson(it, lesson.unpreparedStudents) } + .asyncMap { createEvent(lesson.identifier, it) } + else -> UnpreparednessError.TooLateToRaiseUnpreparedness.left() + } +} + +private fun PresentStudent.toStudentInSemester(className: ClassName) = + StudentInSemester( + className, + this.firstName, + this.secondName + ) diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/domain/api/Dependencies.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/domain/api/Dependencies.kt deleted file mode 100644 index 4d695a4..0000000 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/domain/api/Dependencies.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api - -import arrow.core.Either -import com.krzykrucz.elesson.currentlesson.domain.attendance.CheckedAttendanceList -import com.krzykrucz.elesson.currentlesson.domain.attendance.PresentStudent -import com.krzykrucz.elesson.currentlesson.domain.preparedness.readmodel.StudentInSemesterReadError -import com.krzykrucz.elesson.currentlesson.domain.preparedness.readmodel.StudentSubjectUnpreparednessInASemester -import com.krzykrucz.elesson.currentlesson.domain.shared.ClassName - - -typealias CheckNumberOfTimesStudentWasUnpreparedInSemester = suspend (PresentStudent, ClassName) -> Either - -typealias HasStudentUsedAllUnpreparedness = (StudentSubjectUnpreparednessInASemester) -> Boolean - -typealias HasStudentAlreadyRaisedUnprepared = (StudentsUnpreparedForLesson, PresentStudent) -> Boolean - -typealias CheckStudentIsPresent = (StudentReportingUnpreparedness, CheckedAttendanceList) -> Either - -typealias AreStudentsEqual = (PresentStudent, StudentReportingUnpreparedness) -> Boolean diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/domain/api/Workflows.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/domain/api/Workflows.kt deleted file mode 100644 index 438048f..0000000 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/domain/api/Workflows.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api - -import arrow.core.Either -import com.krzykrucz.elesson.currentlesson.domain.attendance.PresentStudent -import com.krzykrucz.elesson.currentlesson.domain.shared.ClassName -import com.krzykrucz.elesson.currentlesson.domain.shared.CurrentLesson -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier - -typealias CheckStudentCanReportUnprepared = suspend (PresentStudent, ClassName) -> Either - -typealias NoteStudentUnpreparedForLesson = (PresentStudent, StudentsUnpreparedForLesson) -> Either - -typealias CreateEvent = (LessonIdentifier, StudentsUnpreparedForLesson) -> StudentMarkedUnprepared - - -typealias ReportUnpreparedness = suspend (StudentReportingUnpreparedness, CurrentLesson) -> Either diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/domain/implementation/Dependencies.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/domain/implementation/Dependencies.kt deleted file mode 100644 index 5cf77dc..0000000 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/domain/implementation/Dependencies.kt +++ /dev/null @@ -1,46 +0,0 @@ -package com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.implementation - -import arrow.core.extensions.list.foldable.find -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api.AreStudentsEqual -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api.CheckNumberOfTimesStudentWasUnpreparedInSemester -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api.CheckStudentIsPresent -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api.HasStudentAlreadyRaisedUnprepared -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api.HasStudentUsedAllUnpreparedness -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api.UnpreparedStudent -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api.UnpreparednessError -import com.krzykrucz.elesson.currentlesson.domain.preparedness.readmodel.GetStudentSubjectUnpreparednessInASemester -import com.krzykrucz.elesson.currentlesson.domain.preparedness.readmodel.StudentInSemester - -fun checkNumberOfTimesStudentWasUnpreparedInSemester( - getStudentSubjectUnpreparednessInASemester: GetStudentSubjectUnpreparednessInASemester -): CheckNumberOfTimesStudentWasUnpreparedInSemester = { student, className -> - StudentInSemester( - className, - student.firstName, - student.secondName - ) - .let { getStudentSubjectUnpreparednessInASemester(it) } -} - -val hasStudentAlreadyRaisedUnprepared: HasStudentAlreadyRaisedUnprepared = { studentsUnpreparedForLesson, presentStudent -> - UnpreparedStudent( - presentStudent.firstName, - presentStudent.secondName - ) - .let { studentsUnpreparedForLesson.students.contains(it) } -} -val hasStudentUsedAllUnpreparedness: HasStudentUsedAllUnpreparedness = { - it.count >= 3 -} -val areStudentsEqual: AreStudentsEqual = { presentStudent, studentReportingUnpreparedness -> - (presentStudent.firstName.name.text == studentReportingUnpreparedness.firstName) - .and(presentStudent.secondName.name.text == studentReportingUnpreparedness.secondName) -} - -fun checkStudentIsPresent( - areStudentsEqual: AreStudentsEqual -): CheckStudentIsPresent = { studentReportingUnpreparedness, checkedAttendanceList -> - checkedAttendanceList.presentStudents - .find { areStudentsEqual(it, studentReportingUnpreparedness) } - .toEither { UnpreparednessError.StudentNotPresent } -} diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/domain/implementation/Workflows.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/domain/implementation/Workflows.kt deleted file mode 100644 index f7e328d..0000000 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/domain/implementation/Workflows.kt +++ /dev/null @@ -1,85 +0,0 @@ -package com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.implementation - -import arrow.core.extensions.either.applicativeError.handleError -import arrow.core.left -import arrow.core.maybe -import com.krzykrucz.elesson.currentlesson.adapters.asyncFlatMap -import com.krzykrucz.elesson.currentlesson.adapters.asyncMap -import com.krzykrucz.elesson.currentlesson.domain.attendance.PresentStudent -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api.CheckNumberOfTimesStudentWasUnpreparedInSemester -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api.CheckStudentCanReportUnprepared -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api.CheckStudentIsPresent -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api.CreateEvent -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api.HasStudentAlreadyRaisedUnprepared -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api.HasStudentUsedAllUnpreparedness -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api.NoteStudentUnpreparedForLesson -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api.ReportUnpreparedness -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api.StudentMarkedUnprepared -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api.UnpreparedStudent -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api.UnpreparednessError -import com.krzykrucz.elesson.currentlesson.domain.preparedness.readmodel.StudentInSemester -import com.krzykrucz.elesson.currentlesson.domain.preparedness.readmodel.StudentSubjectUnpreparednessInASemester -import com.krzykrucz.elesson.currentlesson.domain.shared.ClassName -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonAfterAttendance -import com.krzykrucz.elesson.currentlesson.domain.shared.failIf - -//workflows -fun checkStudentCanReportUnprepared( - checkNumberOfTimesStudentWasUnpreparedInSemester: CheckNumberOfTimesStudentWasUnpreparedInSemester, - hasStudentUsedAllUnpreparedness: HasStudentUsedAllUnpreparedness -): CheckStudentCanReportUnprepared = { presentStudent, className -> - checkNumberOfTimesStudentWasUnpreparedInSemester(presentStudent, className) - .handleError { presentStudent.toStudentInSemester(className).let(StudentSubjectUnpreparednessInASemester.Companion::createEmpty) } - .failIf(hasStudentUsedAllUnpreparedness, UnpreparednessError.UnpreparedTooManyTimes) - .map { presentStudent } - .mapLeft { it as UnpreparednessError } -} - - -fun noteStudentUnprepared( - hasStudentAlreadyRaisedUnprepared: HasStudentAlreadyRaisedUnprepared -): NoteStudentUnpreparedForLesson = { presentStudent, studentsUnpreparedForLesson -> - hasStudentAlreadyRaisedUnprepared(studentsUnpreparedForLesson, presentStudent).not() - .maybe { - UnpreparedStudent( - presentStudent.firstName, - presentStudent.secondName - ) - } - .map { studentsUnpreparedForLesson.students + it } - .map(studentsUnpreparedForLesson::copy) - .toEither { UnpreparednessError.AlreadyRaised } -} - -fun PresentStudent.toStudentInSemester(className: ClassName) = - StudentInSemester( - className, - this.firstName, - this.secondName - ) - -val createEvent: CreateEvent = { lessonIdentifier, studentsUnpreparedForLesson -> - StudentMarkedUnprepared( - lessonId = lessonIdentifier, - unpreparedStudent = studentsUnpreparedForLesson.students.last(), - studentsUnpreparedForLesson = studentsUnpreparedForLesson - ) -} - -//pipeline -fun reportUnpreparedness( - checkStudentCanReportUnprepared: CheckStudentCanReportUnprepared, - noteStudentUnpreparedForLesson: NoteStudentUnpreparedForLesson, - checkStudentIsPresent: CheckStudentIsPresent, - createEvent: CreateEvent -): ReportUnpreparedness = { studentReportingUnpreparedness, lesson -> - - when (lesson) { - is LessonAfterAttendance -> - checkStudentIsPresent(studentReportingUnpreparedness, lesson.attendance) - .asyncFlatMap { checkStudentCanReportUnprepared(it, lesson.identifier.className) } - .asyncFlatMap { noteStudentUnpreparedForLesson(it, lesson.unpreparedStudents) } - .asyncMap { createEvent(lesson.identifier, it) } - else -> UnpreparednessError.TooLateToRaiseUnpreparedness.left() - } -} diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/shared/CurrentLessonSharedKernel.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/shared/CurrentLessonSharedKernel.kt index d864dff..dd094d4 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/shared/CurrentLessonSharedKernel.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/shared/CurrentLessonSharedKernel.kt @@ -5,7 +5,7 @@ import arrow.core.None import arrow.core.Option import arrow.core.Some import com.krzykrucz.elesson.currentlesson.domain.attendance.CheckedAttendanceList -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api.StudentsUnpreparedForLesson +import com.krzykrucz.elesson.currentlesson.domain.preparedness.StudentsUnpreparedForLesson import java.time.LocalDate import java.time.LocalTime @@ -118,4 +118,4 @@ data class StartedLesson( // val attendance: CheckedAttendanceList, // val unpreparedStudents: StudentsUnpreparedForLesson, // val lessonTopic: LessonTopic -//) : CurrentLesson() \ No newline at end of file +//) : CurrentLesson() diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/infrastructure/Database.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/infrastructure/Database.kt index 1bb0c08..cf84726 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/infrastructure/Database.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/infrastructure/Database.kt @@ -4,7 +4,7 @@ import arrow.core.Option import com.krzykrucz.elesson.currentlesson.domain.attendance.Attendance import com.krzykrucz.elesson.currentlesson.domain.attendance.CheckedAttendanceList import com.krzykrucz.elesson.currentlesson.domain.attendance.IncompleteAttendanceList -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api.StudentsUnpreparedForLesson +import com.krzykrucz.elesson.currentlesson.domain.preparedness.StudentsUnpreparedForLesson import com.krzykrucz.elesson.currentlesson.domain.shared.ClassName import com.krzykrucz.elesson.currentlesson.domain.shared.ClassRegistry import com.krzykrucz.elesson.currentlesson.domain.shared.FirstName diff --git a/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/finishlesson/FinishLessonAcceptanceSpec.groovy b/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/finishlesson/FinishLessonAcceptanceSpec.groovy index 3cb806e..300d8f7 100644 --- a/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/finishlesson/FinishLessonAcceptanceSpec.groovy +++ b/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/finishlesson/FinishLessonAcceptanceSpec.groovy @@ -5,7 +5,7 @@ import com.krzykrucz.elesson.currentlesson.adapters.AcceptanceSpec import com.krzykrucz.elesson.currentlesson.domain.attendance.AbsentStudent import com.krzykrucz.elesson.currentlesson.domain.attendance.CheckedAttendanceList import com.krzykrucz.elesson.currentlesson.domain.attendance.PresentStudent -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api.StudentsUnpreparedForLesson +import com.krzykrucz.elesson.currentlesson.domain.preparedness.StudentsUnpreparedForLesson import com.krzykrucz.elesson.currentlesson.domain.shared.Finished import com.krzykrucz.elesson.currentlesson.domain.shared.InProgress import com.krzykrucz.elesson.currentlesson.domain.shared.LessonOrdinalInSemester diff --git a/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/LessonProgressAcceptanceSpec.groovy b/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/LessonProgressAcceptanceSpec.groovy index b99a6f4..e1f2919 100644 --- a/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/LessonProgressAcceptanceSpec.groovy +++ b/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/LessonProgressAcceptanceSpec.groovy @@ -6,7 +6,7 @@ import com.krzykrucz.elesson.currentlesson.adapters.lessonprogress.rest.LessonPr import com.krzykrucz.elesson.currentlesson.domain.attendance.AbsentStudent import com.krzykrucz.elesson.currentlesson.domain.attendance.CheckedAttendanceList import com.krzykrucz.elesson.currentlesson.domain.attendance.PresentStudent -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api.StudentsUnpreparedForLesson +import com.krzykrucz.elesson.currentlesson.domain.preparedness.StudentsUnpreparedForLesson import com.krzykrucz.elesson.currentlesson.domain.shared.InProgress import com.krzykrucz.elesson.currentlesson.domain.shared.LessonSubject import com.krzykrucz.elesson.currentlesson.domain.shared.NonEmptyText diff --git a/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/preparedness/UnpreparedStudentAcceptanceSpec.groovy b/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/preparedness/UnpreparedStudentAcceptanceSpec.groovy index a394e25..16aeef5 100644 --- a/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/preparedness/UnpreparedStudentAcceptanceSpec.groovy +++ b/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/preparedness/UnpreparedStudentAcceptanceSpec.groovy @@ -2,19 +2,19 @@ package com.krzykrucz.elesson.currentlesson.adapters.preparedness import arrow.core.None import com.krzykrucz.elesson.currentlesson.adapters.AcceptanceSpec -import com.krzykrucz.elesson.currentlesson.infrastructure.Database -import com.krzykrucz.elesson.currentlesson.infrastructure.PersistentCurrentLesson import com.krzykrucz.elesson.currentlesson.adapters.preparedness.readmodel.StudentInSemesterReadModel import com.krzykrucz.elesson.currentlesson.adapters.preparedness.rest.ReportUnpreparedRequest import com.krzykrucz.elesson.currentlesson.domain.attendance.CheckedAttendanceList -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api.StudentReportingUnpreparedness -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api.StudentsUnpreparedForLesson -import com.krzykrucz.elesson.currentlesson.domain.preparedness.readmodel.StudentInSemester -import com.krzykrucz.elesson.currentlesson.domain.preparedness.readmodel.StudentSubjectUnpreparednessInASemester +import com.krzykrucz.elesson.currentlesson.domain.preparedness.StudentInSemester +import com.krzykrucz.elesson.currentlesson.domain.preparedness.StudentReportingUnpreparedness +import com.krzykrucz.elesson.currentlesson.domain.preparedness.StudentSubjectUnpreparednessInASemester +import com.krzykrucz.elesson.currentlesson.domain.preparedness.StudentsUnpreparedForLesson import com.krzykrucz.elesson.currentlesson.domain.shared.InProgress import com.krzykrucz.elesson.currentlesson.domain.shared.LessonSubject import com.krzykrucz.elesson.currentlesson.domain.shared.NonEmptyText import com.krzykrucz.elesson.currentlesson.domain.shared.WinterSemester +import com.krzykrucz.elesson.currentlesson.infrastructure.Database +import com.krzykrucz.elesson.currentlesson.infrastructure.PersistentCurrentLesson import org.springframework.http.HttpEntity import org.springframework.http.HttpMethod import org.springframework.http.HttpStatus diff --git a/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/topic/TopicAcceptanceSpec.groovy b/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/topic/TopicAcceptanceSpec.groovy index 66c6a04..2ed49a8 100644 --- a/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/topic/TopicAcceptanceSpec.groovy +++ b/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/topic/TopicAcceptanceSpec.groovy @@ -2,13 +2,22 @@ package com.krzykrucz.elesson.currentlesson.adapters.topic import arrow.core.None import com.krzykrucz.elesson.currentlesson.adapters.AcceptanceSpec -import com.krzykrucz.elesson.currentlesson.infrastructure.Database -import com.krzykrucz.elesson.currentlesson.infrastructure.PersistentCurrentLesson import com.krzykrucz.elesson.currentlesson.domain.attendance.AbsentStudent import com.krzykrucz.elesson.currentlesson.domain.attendance.CheckedAttendanceList import com.krzykrucz.elesson.currentlesson.domain.attendance.PresentStudent -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api.StudentsUnpreparedForLesson -import com.krzykrucz.elesson.currentlesson.domain.shared.* +import com.krzykrucz.elesson.currentlesson.domain.preparedness.StudentsUnpreparedForLesson +import com.krzykrucz.elesson.currentlesson.domain.shared.InProgress +import com.krzykrucz.elesson.currentlesson.domain.shared.LessonHourNumber +import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier +import com.krzykrucz.elesson.currentlesson.domain.shared.LessonOrdinalInSemester +import com.krzykrucz.elesson.currentlesson.domain.shared.LessonSubject +import com.krzykrucz.elesson.currentlesson.domain.shared.LessonTopic +import com.krzykrucz.elesson.currentlesson.domain.shared.NaturalNumber +import com.krzykrucz.elesson.currentlesson.domain.shared.NonEmptyText +import com.krzykrucz.elesson.currentlesson.domain.shared.TopicTitle +import com.krzykrucz.elesson.currentlesson.domain.shared.WinterSemester +import com.krzykrucz.elesson.currentlesson.infrastructure.Database +import com.krzykrucz.elesson.currentlesson.infrastructure.PersistentCurrentLesson import org.springframework.http.HttpEntity import org.springframework.http.HttpMethod import org.springframework.http.HttpStatus diff --git a/src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/attendance/CheckAttendanceSteps.kt b/src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/attendance/CheckAttendanceSteps.kt index 5e4a38b..f690758 100644 --- a/src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/attendance/CheckAttendanceSteps.kt +++ b/src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/attendance/CheckAttendanceSteps.kt @@ -1,6 +1,10 @@ package com.krzykrucz.elesson.currentlesson.domain.attendance import arrow.core.Either +import com.krzykrucz.elesson.currentlesson.domain.getError +import com.krzykrucz.elesson.currentlesson.domain.getSuccess +import com.krzykrucz.elesson.currentlesson.domain.newClassName +import com.krzykrucz.elesson.currentlesson.domain.newStudent import com.krzykrucz.elesson.currentlesson.domain.shared.ClassRegistry import com.krzykrucz.elesson.currentlesson.domain.shared.FirstName import com.krzykrucz.elesson.currentlesson.domain.shared.LessonHourNumber @@ -10,10 +14,6 @@ import com.krzykrucz.elesson.currentlesson.domain.shared.NumberInRegister import com.krzykrucz.elesson.currentlesson.domain.shared.SecondName import com.krzykrucz.elesson.currentlesson.domain.shared.isError import com.krzykrucz.elesson.currentlesson.domain.shared.isSuccess -import com.krzykrucz.elesson.currentlesson.domain.getError -import com.krzykrucz.elesson.currentlesson.domain.getSuccess -import com.krzykrucz.elesson.currentlesson.domain.newClassName -import com.krzykrucz.elesson.currentlesson.domain.newStudent import io.cucumber.java8.En import org.assertj.core.api.Assertions.assertThat import java.time.LocalDateTime @@ -27,27 +27,9 @@ class CheckAttendanceSteps : En { lateinit var checkedAttendance: CheckedAttendanceList lateinit var currentTime: LocalDateTime - val completeListIfAllStudentsChecked: CompleteListIfAllStudentsChecked = - completeList() - val isInRegistry: IsInRegistry = - isInRegistry() - val noteAbsence: NoteAbsence = - noteAbsence( - isInRegistry, - completeListIfAllStudentsChecked, - addAbsentStudent() - ) - val notePresence: NotePresence = - notePresence( - isInRegistry, - completeListIfAllStudentsChecked, - addPresentStudent() - ) - val noteLate: NoteLate = - noteLate( - isNotTooLate(getLessonStartTime()) - ) - + val noteAbsence: NoteAbsence = noteAbsenceWorkflow() + val notePresence: NotePresence = notePresenceWorkflow() + val noteLate: NoteLate = noteLateWorkflow() val className = newClassName("Slytherin") val lessonHourNumber = LessonHourNumber.of(NaturalNumber.ONE).orNull()!! @@ -151,10 +133,10 @@ class CheckAttendanceSteps : En { When("Noting Student is late") { val absentStudent = student as AbsentStudent currentCheckedAttendance = noteLate( - lessonHourNumber, - absentStudent, - checkedAttendance, - currentTime + lessonHourNumber, + absentStudent, + checkedAttendance, + currentTime ) } @@ -202,25 +184,25 @@ class CheckAttendanceSteps : En { Then("Student is present") { assertThat(currentCheckedAttendance.absentStudents).doesNotContain(student as AbsentStudent) assertThat(currentCheckedAttendance.presentStudents) - .contains( - PresentStudent( - student.firstName, - student.secondName, - student.numberInRegister - ) + .contains( + PresentStudent( + student.firstName, + student.secondName, + student.numberInRegister ) + ) } Then("Student is still absent") { assertThat(currentCheckedAttendance.absentStudents).contains(student as AbsentStudent) assertThat(currentCheckedAttendance.presentStudents) - .doesNotContain( - PresentStudent( - student.firstName, - student.secondName, - student.numberInRegister - ) + .doesNotContain( + PresentStudent( + student.firstName, + student.secondName, + student.numberInRegister ) + ) } Then("The result should be an error explaining that student is not in registry") { diff --git a/src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/attendance/IsNotTooLateSteps.kt b/src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/attendance/IsNotTooLateSteps.kt index 8e6adce..16de0a6 100644 --- a/src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/attendance/IsNotTooLateSteps.kt +++ b/src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/attendance/IsNotTooLateSteps.kt @@ -2,15 +2,13 @@ package com.krzykrucz.elesson.currentlesson.domain.attendance import com.krzykrucz.elesson.currentlesson.domain.shared.LessonHourNumber import io.cucumber.java8.En -import org.assertj.core.api.Assertions.assertThat import java.time.LocalDateTime // FIXME move these test cases entirely to check attendance spec (we should only test pipeline, not specific functions) class IsNotTooLateSteps : En { lateinit var lessonHourNumber: LessonHourNumber lateinit var currentTime: CurrentTime - private val getLessonStartTime: GetLessonStartTime = - getLessonStartTime() +// private val getLessonStartTime: GetLessonStartTime = getLessonStartTime() var isNotTooLate: Boolean = true init { @@ -21,13 +19,13 @@ class IsNotTooLateSteps : En { currentTime = LocalDateTime.parse(time) } When("Checking if it is too late") { - isNotTooLate = isNotTooLate(getLessonStartTime)(lessonHourNumber, currentTime) +// isNotTooLate = isNotTooLate(getLessonStartTime)(lessonHourNumber, currentTime) } Then("It's too late") { - assertThat(isNotTooLate).isFalse() +// assertThat(isNotTooLate).isFalse() } Then("It's not too late") { - assertThat(isNotTooLate).isTrue() +// assertThat(isNotTooLate).isTrue() } } -} \ No newline at end of file +} diff --git a/src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/StudentUnpreparedSteps.kt b/src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/StudentUnpreparedSteps.kt index e3fc07d..c1357ea 100644 --- a/src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/StudentUnpreparedSteps.kt +++ b/src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/StudentUnpreparedSteps.kt @@ -6,23 +6,6 @@ import arrow.core.orNull import arrow.core.right import com.krzykrucz.elesson.currentlesson.domain.attendance.CheckedAttendanceList import com.krzykrucz.elesson.currentlesson.domain.attendance.PresentStudent -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api.ReportUnpreparedness -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api.StudentMarkedUnprepared -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api.StudentReportingUnpreparedness -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api.StudentsUnpreparedForLesson -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api.UnpreparedStudent -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.api.UnpreparednessError -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.implementation.areStudentsEqual -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.implementation.checkNumberOfTimesStudentWasUnpreparedInSemester -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.implementation.checkStudentCanReportUnprepared -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.implementation.checkStudentIsPresent -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.implementation.createEvent -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.implementation.hasStudentAlreadyRaisedUnprepared -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.implementation.hasStudentUsedAllUnpreparedness -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.implementation.noteStudentUnprepared -import com.krzykrucz.elesson.currentlesson.domain.preparedness.domain.implementation.reportUnpreparedness -import com.krzykrucz.elesson.currentlesson.domain.preparedness.readmodel.StudentInSemester -import com.krzykrucz.elesson.currentlesson.domain.preparedness.readmodel.StudentSubjectUnpreparednessInASemester import com.krzykrucz.elesson.currentlesson.domain.shared.ClassName import com.krzykrucz.elesson.currentlesson.domain.shared.CurrentLesson import com.krzykrucz.elesson.currentlesson.domain.shared.FirstName @@ -52,17 +35,7 @@ class StudentUnpreparedSteps : En { lateinit var studentSubjectUnpreparednessInASemester: StudentSubjectUnpreparednessInASemester val reportUnpreparednessFacade: ReportUnpreparedness = - reportUnpreparedness( - checkStudentCanReportUnprepared( - checkNumberOfTimesStudentWasUnpreparedInSemester { - studentSubjectUnpreparednessInASemester.right() - }, - hasStudentUsedAllUnpreparedness - ), - noteStudentUnprepared(hasStudentAlreadyRaisedUnprepared), - checkStudentIsPresent(areStudentsEqual), - createEvent - ) + reportUnpreparednessWorkflow { studentSubjectUnpreparednessInASemester.right() } lateinit var result: Either From ca3093549c87291f5f7d2c5ff3e76df1dac783a1 Mon Sep 17 00:00:00 2001 From: krzykrucz Date: Thu, 21 May 2020 20:42:48 +0200 Subject: [PATCH 6/9] domains cleaned up --- .../{infrastructure => }/Database.kt | 2 +- .../adapters/CoroutineExtensions.kt | 2 +- .../adapters/attendance/AttendanceAPI.kt | 20 ------ .../AttendanceDatabaseConnector.kt | 2 +- ...uterConfig.kt => AttendanceRestAdapter.kt} | 45 ++++++++----- ...{AttendanceHandler.kt => AttendanceApi.kt} | 13 ++-- .../finishlesson/InProgressLessonReadModel.kt | 2 +- .../StoreLessonAsFinishedAdapter.kt | 2 +- .../LessonProgressDatabaseConnector.kt | 2 +- .../rest/LessonProgressRequestHandler.kt | 4 +- .../CurrentLessonDatabaseAdapter.kt | 4 +- .../UnpreparedStudentDatabaseAdapter.kt | 2 +- .../startlesson/StartLessonAdapters.kt | 9 +-- .../adapters/startlesson/StartLessonApi.kt | 54 ++++++++++++++++ .../startlesson/StartLessonRestAdapter.kt | 64 +++---------------- .../StartedLessonPersistenceAdapter.kt | 8 +-- .../adapters/topic/TopicPersistenceAdapter.kt | 2 +- .../domain/startlesson/Persistence.kt | 2 +- .../AttendanceAcceptanceSpec.groovy | 5 +- .../FinishLessonAcceptanceSpec.groovy | 4 +- .../LessonProgressAcceptanceSpec.groovy | 4 +- .../UnpreparedStudentAcceptanceSpec.groovy | 4 +- .../StartLessonAcceptanceSpec.groovy | 4 +- .../adapters/topic/TopicAcceptanceSpec.groovy | 4 +- 24 files changed, 132 insertions(+), 132 deletions(-) rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/{infrastructure => }/Database.kt (98%) delete mode 100644 src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/AttendanceAPI.kt rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/rest/{AttendanceRouterConfig.kt => AttendanceRestAdapter.kt} (51%) rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/usecase/{AttendanceHandler.kt => AttendanceApi.kt} (86%) create mode 100644 src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartLessonApi.kt diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/infrastructure/Database.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/Database.kt similarity index 98% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/infrastructure/Database.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/Database.kt index cf84726..02e5ecd 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/infrastructure/Database.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/Database.kt @@ -1,4 +1,4 @@ -package com.krzykrucz.elesson.currentlesson.infrastructure +package com.krzykrucz.elesson.currentlesson import arrow.core.Option import com.krzykrucz.elesson.currentlesson.domain.attendance.Attendance diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/CoroutineExtensions.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/CoroutineExtensions.kt index 3f975b0..d7eca08 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/CoroutineExtensions.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/CoroutineExtensions.kt @@ -33,4 +33,4 @@ suspend fun Either.toServerResponse(statusHandler: (L) -> HttpStatu ifRight = { ServerResponse.ok().bodyValueAndAwait(it as Any) } ) -typealias AsyncRequestHandler = suspend (ServerRequest) -> ServerResponse +typealias RestApi = suspend (ServerRequest) -> ServerResponse diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/AttendanceAPI.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/AttendanceAPI.kt deleted file mode 100644 index 2e990bb..0000000 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/AttendanceAPI.kt +++ /dev/null @@ -1,20 +0,0 @@ -package com.krzykrucz.elesson.currentlesson.adapters.attendance - -import com.krzykrucz.elesson.currentlesson.domain.attendance.AbsentStudent -import com.krzykrucz.elesson.currentlesson.domain.attendance.UncheckedStudent -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier - -data class AttendanceDto( - val uncheckedStudent: UncheckedStudent, - val lessonId: LessonIdentifier -) - -data class AttendanceResponseDto( - val checked: Boolean -) - -data class LateAttendanceDto( - val lessonId: LessonIdentifier, - val absentStudent: AbsentStudent, - val currentTime: String -) diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/persistence/AttendanceDatabaseConnector.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/persistence/AttendanceDatabaseConnector.kt index 6752bed..c5acb34 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/persistence/AttendanceDatabaseConnector.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/persistence/AttendanceDatabaseConnector.kt @@ -1,13 +1,13 @@ package com.krzykrucz.elesson.currentlesson.adapters.attendance.persistence import arrow.core.toOption +import com.krzykrucz.elesson.currentlesson.Database import com.krzykrucz.elesson.currentlesson.domain.attendance.CheckedAttendanceList import com.krzykrucz.elesson.currentlesson.domain.attendance.FetchCheckedAttendance import com.krzykrucz.elesson.currentlesson.domain.attendance.FetchIncompleteAttendance import com.krzykrucz.elesson.currentlesson.domain.attendance.IncompleteAttendanceDto import com.krzykrucz.elesson.currentlesson.domain.attendance.IncompleteAttendanceList import com.krzykrucz.elesson.currentlesson.domain.attendance.PersistAttendance -import com.krzykrucz.elesson.currentlesson.infrastructure.Database import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/rest/AttendanceRouterConfig.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/rest/AttendanceRestAdapter.kt similarity index 51% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/rest/AttendanceRouterConfig.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/rest/AttendanceRestAdapter.kt index fba7f98..ab1751d 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/rest/AttendanceRouterConfig.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/rest/AttendanceRestAdapter.kt @@ -1,13 +1,13 @@ package com.krzykrucz.elesson.currentlesson.adapters.attendance.rest -import com.krzykrucz.elesson.currentlesson.adapters.AsyncRequestHandler -import com.krzykrucz.elesson.currentlesson.adapters.attendance.AttendanceDto -import com.krzykrucz.elesson.currentlesson.adapters.attendance.AttendanceResponseDto -import com.krzykrucz.elesson.currentlesson.adapters.attendance.LateAttendanceDto -import com.krzykrucz.elesson.currentlesson.adapters.attendance.usecase.HandleNoteAbsent +import com.krzykrucz.elesson.currentlesson.adapters.RestApi import com.krzykrucz.elesson.currentlesson.adapters.attendance.usecase.HandleNoteLate -import com.krzykrucz.elesson.currentlesson.adapters.attendance.usecase.HandleNotePresent +import com.krzykrucz.elesson.currentlesson.adapters.attendance.usecase.NoteAbsentApi +import com.krzykrucz.elesson.currentlesson.adapters.attendance.usecase.NotePresentApi import com.krzykrucz.elesson.currentlesson.adapters.toServerResponse +import com.krzykrucz.elesson.currentlesson.domain.attendance.AbsentStudent +import com.krzykrucz.elesson.currentlesson.domain.attendance.UncheckedStudent +import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier import org.springframework.beans.factory.annotation.Qualifier import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration @@ -18,36 +18,51 @@ import org.springframework.web.reactive.function.server.coRouter class AttendanceRouterConfig { @Bean - fun attendanceRouter(@Qualifier("noteAbsent") handleNoteAbsentDto: HandleNoteAbsent, - @Qualifier("notePresent") handleNotePresentDto: HandleNotePresent, + fun attendanceRouter(@Qualifier("noteAbsent") noteAbsentApiDto: NoteAbsentApi, + @Qualifier("notePresent") notePresentApi: NotePresentApi, handleNoteLateDto: HandleNoteLate ) = coRouter { "/attendance".nest { - POST("/absent", handleAttentanceAbsent(handleNoteAbsentDto)) - POST("/present", handleAttentancePresent(handleNotePresentDto)) + POST("/absent", handleAttentanceAbsent(noteAbsentApiDto)) + POST("/present", handleAttentancePresent(notePresentApi)) POST("/late", handleAttentanceLate(handleNoteLateDto)) } } } -fun handleAttentanceAbsent(handleNoteAbsentDto: HandleNoteAbsent): AsyncRequestHandler = { request -> +fun handleAttentanceAbsent(noteAbsentApiDto: NoteAbsentApi): RestApi = { request -> val dto = request.awaitBody() - handleNoteAbsentDto(dto) + noteAbsentApiDto(dto) .map { AttendanceResponseDto(it) } .toServerResponse() } -fun handleAttentancePresent(handleNotePresentDto: HandleNotePresent): AsyncRequestHandler = { request -> +fun handleAttentancePresent(notePresentApi: NotePresentApi): RestApi = { request -> val dto = request.awaitBody() - handleNotePresentDto(dto) + notePresentApi(dto) .map { AttendanceResponseDto(it) } .toServerResponse() } -fun handleAttentanceLate(handleNoteLateDto: HandleNoteLate): AsyncRequestHandler = { request -> +fun handleAttentanceLate(handleNoteLateDto: HandleNoteLate): RestApi = { request -> val dto = request.awaitBody() handleNoteLateDto(dto) .map { AttendanceResponseDto(it) } .toServerResponse() } + +data class AttendanceDto( + val uncheckedStudent: UncheckedStudent, + val lessonId: LessonIdentifier +) + +data class AttendanceResponseDto( + val checked: Boolean +) + +data class LateAttendanceDto( + val lessonId: LessonIdentifier, + val absentStudent: AbsentStudent, + val currentTime: String +) diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/usecase/AttendanceHandler.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/usecase/AttendanceApi.kt similarity index 86% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/usecase/AttendanceHandler.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/usecase/AttendanceApi.kt index 3afd2ba..91203a0 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/usecase/AttendanceHandler.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/usecase/AttendanceApi.kt @@ -6,8 +6,8 @@ import arrow.core.extensions.either.monad.flatten import arrow.core.extensions.fx import arrow.core.fix import com.krzykrucz.elesson.currentlesson.adapters.asyncMap -import com.krzykrucz.elesson.currentlesson.adapters.attendance.AttendanceDto -import com.krzykrucz.elesson.currentlesson.adapters.attendance.LateAttendanceDto +import com.krzykrucz.elesson.currentlesson.adapters.attendance.rest.AttendanceDto +import com.krzykrucz.elesson.currentlesson.adapters.attendance.rest.LateAttendanceDto import com.krzykrucz.elesson.currentlesson.domain.attendance.AttendanceError import com.krzykrucz.elesson.currentlesson.domain.attendance.FetchCheckedAttendance import com.krzykrucz.elesson.currentlesson.domain.attendance.FetchIncompleteAttendance @@ -21,11 +21,10 @@ import java.time.LocalDateTime typealias IsAttendanceChecked = Boolean -typealias HandleNotePresent = suspend (AttendanceDto) -> Either -typealias HandleNoteAbsent = suspend (AttendanceDto) -> Either +typealias NotePresentApi = suspend (AttendanceDto) -> Either +typealias NoteAbsentApi = suspend (AttendanceDto) -> Either typealias HandleNoteLate = suspend (LateAttendanceDto) -> Either -// TODO remove this whole layer @Configuration class AttendanceHandler( val persistAttendance: PersistAttendance, @@ -34,7 +33,7 @@ class AttendanceHandler( ) { @Bean("notePresent") - fun handleNotePresentDto(): HandleNotePresent = { attendanceDto -> + fun handleNotePresentDto(): NotePresentApi = { attendanceDto -> val incompleteAttendanceDtoOpt = fetchIncompleteAttendance(attendanceDto.lessonId) val notePresenceResult = Option.fx { @@ -53,7 +52,7 @@ class AttendanceHandler( } @Bean("noteAbsent") - fun handleNoteAbsentDto(): HandleNoteAbsent = { attendanceDto -> + fun handleNoteAbsentDto(): NoteAbsentApi = { attendanceDto -> val incompleteAttendanceDtoOpt = fetchIncompleteAttendance(attendanceDto.lessonId) val noteAbsenceResult = Option.fx { diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/finishlesson/InProgressLessonReadModel.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/finishlesson/InProgressLessonReadModel.kt index 9c03c6f..8ff0a71 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/finishlesson/InProgressLessonReadModel.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/finishlesson/InProgressLessonReadModel.kt @@ -2,12 +2,12 @@ package com.krzykrucz.elesson.currentlesson.adapters.finishlesson import arrow.core.Either import arrow.core.toOption +import com.krzykrucz.elesson.currentlesson.Database import com.krzykrucz.elesson.currentlesson.domain.finishlesson.FinishLessonError import com.krzykrucz.elesson.currentlesson.domain.finishlesson.FinishLessonError.LessonNotFound import com.krzykrucz.elesson.currentlesson.domain.shared.InProgress import com.krzykrucz.elesson.currentlesson.domain.shared.InProgressLesson import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier -import com.krzykrucz.elesson.currentlesson.infrastructure.Database // TODO extract port suspend fun readInProgressLesson(id: LessonIdentifier): Either = diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/finishlesson/StoreLessonAsFinishedAdapter.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/finishlesson/StoreLessonAsFinishedAdapter.kt index 09b5373..e68a745 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/finishlesson/StoreLessonAsFinishedAdapter.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/finishlesson/StoreLessonAsFinishedAdapter.kt @@ -1,9 +1,9 @@ package com.krzykrucz.elesson.currentlesson.adapters.finishlesson +import com.krzykrucz.elesson.currentlesson.Database import com.krzykrucz.elesson.currentlesson.domain.finishlesson.StoreLessonAsFinished import com.krzykrucz.elesson.currentlesson.domain.shared.Finished import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier -import com.krzykrucz.elesson.currentlesson.infrastructure.Database internal val storeLessonAsFinishedAdapter: StoreLessonAsFinished = { lessonId: LessonIdentifier -> Database.LESSON_DATABASE.compute(lessonId) { _, lesson -> diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/persistence/LessonProgressDatabaseConnector.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/persistence/LessonProgressDatabaseConnector.kt index 0f0e9fd..3b4eebf 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/persistence/LessonProgressDatabaseConnector.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/persistence/LessonProgressDatabaseConnector.kt @@ -1,10 +1,10 @@ package com.krzykrucz.elesson.currentlesson.adapters.lessonprogress.persistence import arrow.core.toOption +import com.krzykrucz.elesson.currentlesson.Database import com.krzykrucz.elesson.currentlesson.adapters.lessonprogress.usecase.LessonProgress import com.krzykrucz.elesson.currentlesson.adapters.lessonprogress.usecase.LessonProgressError import com.krzykrucz.elesson.currentlesson.adapters.lessonprogress.usecase.LoadLessonProgress -import com.krzykrucz.elesson.currentlesson.infrastructure.Database import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/rest/LessonProgressRequestHandler.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/rest/LessonProgressRequestHandler.kt index c7fe478..260740f 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/rest/LessonProgressRequestHandler.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/rest/LessonProgressRequestHandler.kt @@ -2,7 +2,7 @@ package com.krzykrucz.elesson.currentlesson.adapters.lessonprogress.rest import arrow.core.Option import arrow.core.extensions.fx -import com.krzykrucz.elesson.currentlesson.adapters.AsyncRequestHandler +import com.krzykrucz.elesson.currentlesson.adapters.RestApi import com.krzykrucz.elesson.currentlesson.adapters.asyncFlatMap import com.krzykrucz.elesson.currentlesson.adapters.lessonprogress.usecase.LoadLessonProgress import com.krzykrucz.elesson.currentlesson.adapters.toServerResponse @@ -13,7 +13,7 @@ import com.krzykrucz.elesson.currentlesson.domain.shared.NonEmptyText import java.time.LocalDate import java.util.Optional -fun handleLessonProgressViewRequest(loadLessonProgress: LoadLessonProgress): AsyncRequestHandler = { serverRequest -> +fun handleLessonProgressViewRequest(loadLessonProgress: LoadLessonProgress): RestApi = { serverRequest -> val readDateFromParams = serverRequest.queryParam("date").toOption() .map { LocalDate.parse(it) } val readLessonHourNumberFromParams = serverRequest.queryParam("lessonHourNumber").toOption() diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/findcurrentlesson/CurrentLessonDatabaseAdapter.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/findcurrentlesson/CurrentLessonDatabaseAdapter.kt index 3839123..d00f4a8 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/findcurrentlesson/CurrentLessonDatabaseAdapter.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/findcurrentlesson/CurrentLessonDatabaseAdapter.kt @@ -2,10 +2,10 @@ package com.krzykrucz.elesson.currentlesson.adapters.preparedness.findcurrentles import arrow.core.orElse import arrow.core.toOption +import com.krzykrucz.elesson.currentlesson.Database +import com.krzykrucz.elesson.currentlesson.PersistentCurrentLesson import com.krzykrucz.elesson.currentlesson.domain.preparedness.FindCurrentLesson import com.krzykrucz.elesson.currentlesson.domain.preparedness.UnpreparednessError -import com.krzykrucz.elesson.currentlesson.infrastructure.Database -import com.krzykrucz.elesson.currentlesson.infrastructure.PersistentCurrentLesson import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/persistence/UnpreparedStudentDatabaseAdapter.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/persistence/UnpreparedStudentDatabaseAdapter.kt index 74fa9c2..5a91939 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/persistence/UnpreparedStudentDatabaseAdapter.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/persistence/UnpreparedStudentDatabaseAdapter.kt @@ -1,7 +1,7 @@ package com.krzykrucz.elesson.currentlesson.adapters.preparedness.persistence +import com.krzykrucz.elesson.currentlesson.Database import com.krzykrucz.elesson.currentlesson.domain.preparedness.PersistUnpreparedStudentToLesson -import com.krzykrucz.elesson.currentlesson.infrastructure.Database import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartLessonAdapters.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartLessonAdapters.kt index d3e2ea7..f801dab 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartLessonAdapters.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartLessonAdapters.kt @@ -1,17 +1,14 @@ package com.krzykrucz.elesson.currentlesson.adapters.startlesson import com.krzykrucz.elesson.currentlesson.adapters.startlesson.rest.startLessonRestAdapter -import com.krzykrucz.elesson.currentlesson.domain.startlesson.startLessonWorkflow import org.springframework.context.support.beans val startLessonAdapters = beans { bean { startLessonRestAdapter( - startedLessonPersistenceAdapter, - startLessonWorkflow( - checkScheduledLessonAdapter, - fetchClassRegistryAdapter - ) + checkScheduledLessonAdapter, + fetchClassRegistryAdapter, + startedLessonPersistenceAdapter ) } } diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartLessonApi.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartLessonApi.kt new file mode 100644 index 0000000..11e3a84 --- /dev/null +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartLessonApi.kt @@ -0,0 +1,54 @@ +package com.krzykrucz.elesson.currentlesson.adapters.startlesson + +import com.krzykrucz.elesson.currentlesson.adapters.RestApi +import com.krzykrucz.elesson.currentlesson.adapters.asyncDoIfRight +import com.krzykrucz.elesson.currentlesson.adapters.toServerResponse +import com.krzykrucz.elesson.currentlesson.domain.shared.FirstName +import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier +import com.krzykrucz.elesson.currentlesson.domain.shared.NonEmptyText +import com.krzykrucz.elesson.currentlesson.domain.shared.SecondName +import com.krzykrucz.elesson.currentlesson.domain.shared.StartedLesson +import com.krzykrucz.elesson.currentlesson.domain.shared.Teacher +import com.krzykrucz.elesson.currentlesson.domain.startlesson.FetchClassRegistry +import com.krzykrucz.elesson.currentlesson.domain.startlesson.FetchScheduledLesson +import com.krzykrucz.elesson.currentlesson.domain.startlesson.PersistStartedLesson +import com.krzykrucz.elesson.currentlesson.domain.startlesson.StartLesson +import com.krzykrucz.elesson.currentlesson.domain.startlesson.startLessonWorkflow +import org.springframework.web.reactive.function.server.awaitBody +import java.time.LocalDateTime +import javax.validation.constraints.NotEmpty + + +fun startLessonApi( + fetchScheduledLesson: FetchScheduledLesson, + fetchClassRegistry: FetchClassRegistry, + persistStartedLesson: PersistStartedLesson, + startLesson: StartLesson = startLessonWorkflow(fetchScheduledLesson, fetchClassRegistry) +): RestApi = { request -> + request.awaitBody() + .toTeacher() + .let { teacher -> startLesson(teacher, LocalDateTime.now()) } + .asyncDoIfRight { persistStartedLesson(it) } + .map(StartedLesson::toDto) + .toServerResponse() +} + +private data class StudentResponse(val name: String) + +private data class ClassRegistryResponse( + val lessonId: LessonIdentifier, + val students: List +) + +private data class StartLessonRequest( + @NotEmpty val teacherFirstName: String, + @NotEmpty val teacherSecondName: String +) { + fun toTeacher() = + Teacher(FirstName(NonEmptyText.of(teacherFirstName)!!), SecondName(NonEmptyText.of(teacherSecondName)!!)) +} + +private fun StartedLesson.toDto() = + this.clazz.students + .map { StudentResponse("${it.firstName.name.text} ${it.secondName.name.text}") } + .let { ClassRegistryResponse(this.id, it) } diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartLessonRestAdapter.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartLessonRestAdapter.kt index 22a1a8d..9c9538b 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartLessonRestAdapter.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartLessonRestAdapter.kt @@ -1,64 +1,18 @@ package com.krzykrucz.elesson.currentlesson.adapters.startlesson.rest -import com.krzykrucz.elesson.currentlesson.adapters.asyncDoIfRight -import com.krzykrucz.elesson.currentlesson.adapters.toServerResponse -import com.krzykrucz.elesson.currentlesson.domain.shared.FirstName -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier -import com.krzykrucz.elesson.currentlesson.domain.shared.NonEmptyText -import com.krzykrucz.elesson.currentlesson.domain.shared.SecondName -import com.krzykrucz.elesson.currentlesson.domain.shared.StartedLesson -import com.krzykrucz.elesson.currentlesson.domain.shared.Teacher -import com.krzykrucz.elesson.currentlesson.domain.startlesson.LessonStartTime -import com.krzykrucz.elesson.currentlesson.domain.startlesson.PersistStartedLessonIfDoesNotExist -import com.krzykrucz.elesson.currentlesson.domain.startlesson.StartLesson -import org.springframework.web.reactive.function.server.awaitBody +import com.krzykrucz.elesson.currentlesson.adapters.startlesson.startLessonApi +import com.krzykrucz.elesson.currentlesson.domain.startlesson.FetchClassRegistry +import com.krzykrucz.elesson.currentlesson.domain.startlesson.FetchScheduledLesson +import com.krzykrucz.elesson.currentlesson.domain.startlesson.PersistStartedLesson import org.springframework.web.reactive.function.server.coRouter -import javax.validation.constraints.NotEmpty -internal fun startLessonRestAdapter(persistLesson: PersistStartedLessonIfDoesNotExist, - startLesson: StartLesson +internal fun startLessonRestAdapter( + fetchScheduledLesson: FetchScheduledLesson, + fetchClassRegistry: FetchClassRegistry, + persistStartedLesson: PersistStartedLesson ) = coRouter { - POST("/startlesson") { request -> - val startLessonRequest = request.awaitBody() - val teacher = startLessonRequest.toTeacher() - val now = LessonStartTime.now() - - startLesson(teacher, now) - .asyncDoIfRight { persistLesson(it) } - .map(StartedLesson::toDto) - .toServerResponse() - } + POST("/startlesson", startLessonApi(fetchScheduledLesson, fetchClassRegistry, persistStartedLesson)) } - -private data class StudentResponse(val name: String) - -private data class ClassRegistryResponse( - val lessonId: LessonIdentifier, - val students: List -) - -private data class StartLessonRequest( - @NotEmpty - val teacherFirstName: String, - @NotEmpty - val teacherSecondName: String -) { - fun toTeacher() = - Teacher( - FirstName( - NonEmptyText.of(teacherFirstName)!! - ), - SecondName( - NonEmptyText.of(teacherSecondName)!! - ) - ) -} - -private fun StartedLesson.toDto() = - this.clazz.students - .map { StudentResponse("${it.firstName.name.text} ${it.secondName.name.text}") } - .let { ClassRegistryResponse(this.id, it) } - diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartedLessonPersistenceAdapter.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartedLessonPersistenceAdapter.kt index ee31906..a0ecc43 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartedLessonPersistenceAdapter.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartedLessonPersistenceAdapter.kt @@ -1,16 +1,16 @@ package com.krzykrucz.elesson.currentlesson.adapters.startlesson import arrow.core.Option +import com.krzykrucz.elesson.currentlesson.Database.LESSON_DATABASE +import com.krzykrucz.elesson.currentlesson.PersistentCurrentLesson import com.krzykrucz.elesson.currentlesson.domain.shared.InProgress import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier import com.krzykrucz.elesson.currentlesson.domain.shared.StartedLesson -import com.krzykrucz.elesson.currentlesson.domain.startlesson.PersistStartedLessonIfDoesNotExist -import com.krzykrucz.elesson.currentlesson.infrastructure.Database.LESSON_DATABASE -import com.krzykrucz.elesson.currentlesson.infrastructure.PersistentCurrentLesson +import com.krzykrucz.elesson.currentlesson.domain.startlesson.PersistStartedLesson // TODO maybe check if lesson not started somewhere else -internal val startedLessonPersistenceAdapter: PersistStartedLessonIfDoesNotExist = +internal val startedLessonPersistenceAdapter: PersistStartedLesson = { lesson -> if (!StartedLessonInMemoryRepository.contains(lesson.id)) { StartedLessonInMemoryRepository.store(lesson) diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/topic/TopicPersistenceAdapter.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/topic/TopicPersistenceAdapter.kt index 25151a5..a341cac 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/topic/TopicPersistenceAdapter.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/topic/TopicPersistenceAdapter.kt @@ -4,13 +4,13 @@ import arrow.core.getOrElse import arrow.core.some import arrow.core.toOption import arrow.fx.IO +import com.krzykrucz.elesson.currentlesson.Database import com.krzykrucz.elesson.currentlesson.domain.attendance.CheckedAttendanceList import com.krzykrucz.elesson.currentlesson.domain.shared.Finished import com.krzykrucz.elesson.currentlesson.domain.topic.CheckIfAttendanceIsChecked import com.krzykrucz.elesson.currentlesson.domain.topic.CountFinishedLessons import com.krzykrucz.elesson.currentlesson.domain.topic.FinishedLessonsCount import com.krzykrucz.elesson.currentlesson.domain.topic.PersistInProgressLesson -import com.krzykrucz.elesson.currentlesson.infrastructure.Database internal val fetchFinishedLessonsCount: CountFinishedLessons = { diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/startlesson/Persistence.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/startlesson/Persistence.kt index 3636dde..69d0bb3 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/startlesson/Persistence.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/startlesson/Persistence.kt @@ -4,4 +4,4 @@ import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier import com.krzykrucz.elesson.currentlesson.domain.shared.StartedLesson -typealias PersistStartedLessonIfDoesNotExist = suspend (StartedLesson) -> LessonIdentifier +typealias PersistStartedLesson = suspend (StartedLesson) -> LessonIdentifier diff --git a/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/attendance/AttendanceAcceptanceSpec.groovy b/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/attendance/AttendanceAcceptanceSpec.groovy index 3013360..003d021 100644 --- a/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/attendance/AttendanceAcceptanceSpec.groovy +++ b/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/attendance/AttendanceAcceptanceSpec.groovy @@ -1,7 +1,10 @@ package com.krzykrucz.elesson.currentlesson.adapters.attendance -import com.krzykrucz.elesson.currentlesson.infrastructure.Database +import com.krzykrucz.elesson.currentlesson.Database +import com.krzykrucz.elesson.currentlesson.adapters.attendance.rest.AttendanceDto +import com.krzykrucz.elesson.currentlesson.adapters.attendance.rest.AttendanceResponseDto +import com.krzykrucz.elesson.currentlesson.adapters.attendance.rest.LateAttendanceDto import org.springframework.http.HttpEntity import org.springframework.http.HttpMethod diff --git a/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/finishlesson/FinishLessonAcceptanceSpec.groovy b/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/finishlesson/FinishLessonAcceptanceSpec.groovy index 300d8f7..e721ef3 100644 --- a/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/finishlesson/FinishLessonAcceptanceSpec.groovy +++ b/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/finishlesson/FinishLessonAcceptanceSpec.groovy @@ -1,6 +1,8 @@ package com.krzykrucz.elesson.currentlesson.adapters.finishlesson import arrow.core.Some +import com.krzykrucz.elesson.currentlesson.Database +import com.krzykrucz.elesson.currentlesson.PersistentCurrentLesson import com.krzykrucz.elesson.currentlesson.adapters.AcceptanceSpec import com.krzykrucz.elesson.currentlesson.domain.attendance.AbsentStudent import com.krzykrucz.elesson.currentlesson.domain.attendance.CheckedAttendanceList @@ -15,8 +17,6 @@ import com.krzykrucz.elesson.currentlesson.domain.shared.NaturalNumber import com.krzykrucz.elesson.currentlesson.domain.shared.NonEmptyText import com.krzykrucz.elesson.currentlesson.domain.shared.TopicTitle import com.krzykrucz.elesson.currentlesson.domain.shared.WinterSemester -import com.krzykrucz.elesson.currentlesson.infrastructure.Database -import com.krzykrucz.elesson.currentlesson.infrastructure.PersistentCurrentLesson import org.springframework.http.HttpEntity import org.springframework.http.HttpMethod import org.springframework.http.HttpStatus diff --git a/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/LessonProgressAcceptanceSpec.groovy b/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/LessonProgressAcceptanceSpec.groovy index e1f2919..cc60b3a 100644 --- a/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/LessonProgressAcceptanceSpec.groovy +++ b/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/LessonProgressAcceptanceSpec.groovy @@ -1,6 +1,8 @@ package com.krzykrucz.elesson.currentlesson.adapters.lessonprogress import arrow.core.None +import com.krzykrucz.elesson.currentlesson.Database +import com.krzykrucz.elesson.currentlesson.PersistentCurrentLesson import com.krzykrucz.elesson.currentlesson.adapters.AcceptanceSpec import com.krzykrucz.elesson.currentlesson.adapters.lessonprogress.rest.LessonProgressDto import com.krzykrucz.elesson.currentlesson.domain.attendance.AbsentStudent @@ -11,8 +13,6 @@ import com.krzykrucz.elesson.currentlesson.domain.shared.InProgress import com.krzykrucz.elesson.currentlesson.domain.shared.LessonSubject import com.krzykrucz.elesson.currentlesson.domain.shared.NonEmptyText import com.krzykrucz.elesson.currentlesson.domain.shared.WinterSemester -import com.krzykrucz.elesson.currentlesson.infrastructure.Database -import com.krzykrucz.elesson.currentlesson.infrastructure.PersistentCurrentLesson import org.springframework.http.HttpEntity import org.springframework.http.HttpMethod diff --git a/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/preparedness/UnpreparedStudentAcceptanceSpec.groovy b/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/preparedness/UnpreparedStudentAcceptanceSpec.groovy index 16aeef5..382aba4 100644 --- a/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/preparedness/UnpreparedStudentAcceptanceSpec.groovy +++ b/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/preparedness/UnpreparedStudentAcceptanceSpec.groovy @@ -1,6 +1,8 @@ package com.krzykrucz.elesson.currentlesson.adapters.preparedness import arrow.core.None +import com.krzykrucz.elesson.currentlesson.Database +import com.krzykrucz.elesson.currentlesson.PersistentCurrentLesson import com.krzykrucz.elesson.currentlesson.adapters.AcceptanceSpec import com.krzykrucz.elesson.currentlesson.adapters.preparedness.readmodel.StudentInSemesterReadModel import com.krzykrucz.elesson.currentlesson.adapters.preparedness.rest.ReportUnpreparedRequest @@ -13,8 +15,6 @@ import com.krzykrucz.elesson.currentlesson.domain.shared.InProgress import com.krzykrucz.elesson.currentlesson.domain.shared.LessonSubject import com.krzykrucz.elesson.currentlesson.domain.shared.NonEmptyText import com.krzykrucz.elesson.currentlesson.domain.shared.WinterSemester -import com.krzykrucz.elesson.currentlesson.infrastructure.Database -import com.krzykrucz.elesson.currentlesson.infrastructure.PersistentCurrentLesson import org.springframework.http.HttpEntity import org.springframework.http.HttpMethod import org.springframework.http.HttpStatus diff --git a/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartLessonAcceptanceSpec.groovy b/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartLessonAcceptanceSpec.groovy index 18abd44..f29b3fc 100644 --- a/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartLessonAcceptanceSpec.groovy +++ b/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartLessonAcceptanceSpec.groovy @@ -1,9 +1,7 @@ package com.krzykrucz.elesson.currentlesson.adapters.startlesson +import com.krzykrucz.elesson.currentlesson.Database import com.krzykrucz.elesson.currentlesson.adapters.AcceptanceSpec -import com.krzykrucz.elesson.currentlesson.adapters.startlesson.rest.ClassRegistryResponse -import com.krzykrucz.elesson.currentlesson.adapters.startlesson.rest.StartLessonRequest -import com.krzykrucz.elesson.currentlesson.infrastructure.Database import java.time.LocalDate diff --git a/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/topic/TopicAcceptanceSpec.groovy b/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/topic/TopicAcceptanceSpec.groovy index 2ed49a8..002c386 100644 --- a/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/topic/TopicAcceptanceSpec.groovy +++ b/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/topic/TopicAcceptanceSpec.groovy @@ -1,6 +1,8 @@ package com.krzykrucz.elesson.currentlesson.adapters.topic import arrow.core.None +import com.krzykrucz.elesson.currentlesson.Database +import com.krzykrucz.elesson.currentlesson.PersistentCurrentLesson import com.krzykrucz.elesson.currentlesson.adapters.AcceptanceSpec import com.krzykrucz.elesson.currentlesson.domain.attendance.AbsentStudent import com.krzykrucz.elesson.currentlesson.domain.attendance.CheckedAttendanceList @@ -16,8 +18,6 @@ import com.krzykrucz.elesson.currentlesson.domain.shared.NaturalNumber import com.krzykrucz.elesson.currentlesson.domain.shared.NonEmptyText import com.krzykrucz.elesson.currentlesson.domain.shared.TopicTitle import com.krzykrucz.elesson.currentlesson.domain.shared.WinterSemester -import com.krzykrucz.elesson.currentlesson.infrastructure.Database -import com.krzykrucz.elesson.currentlesson.infrastructure.PersistentCurrentLesson import org.springframework.http.HttpEntity import org.springframework.http.HttpMethod import org.springframework.http.HttpStatus From 707d3298c58a6d279c08b85e99cbea81b4554993 Mon Sep 17 00:00:00 2001 From: krzykrucz Date: Thu, 21 May 2020 21:07:14 +0200 Subject: [PATCH 7/9] repackaged rest of stuff --- .../attendance/{usecase => }/AttendanceApi.kt | 4 +--- ...nector.kt => AttendancePersistenceAdapter.kt} | 4 ++-- .../{rest => }/AttendanceRestAdapter.kt | 5 +---- ...essRequestHandler.kt => LessonProgressApi.kt} | 3 +-- ...ector.kt => LessonProgressDatabaseAdapter.kt} | 7 ++----- ...ogressDto.kt => LessonProgressRestAdapter.kt} | 16 +++++++++++++--- ...ssonProgressPersistence.kt => Persistence.kt} | 2 +- .../{usecase/LessonProgress.kt => Types.kt} | 2 +- .../rest/LessonProgressRouteConfig.kt | 15 --------------- .../CurrentLessonDatabaseAdapter.kt | 2 +- .../EventPublisherAdapter.kt | 2 +- .../PreparednessInSemesterReadModel.kt | 4 ++-- .../UnpreparedStudentDatabaseAdapter.kt | 2 +- ...dpoint.kt => UnpreparedStudentRestAdapter.kt} | 2 +- .../attendance/AttendanceAcceptanceSpec.groovy | 3 --- .../LessonProgressAcceptanceSpec.groovy | 1 - .../UnpreparedStudentAcceptanceSpec.groovy | 2 -- 17 files changed, 28 insertions(+), 48 deletions(-) rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/{usecase => }/AttendanceApi.kt (93%) rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/{persistence/AttendanceDatabaseConnector.kt => AttendancePersistenceAdapter.kt} (94%) rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/{rest => }/AttendanceRestAdapter.kt (87%) rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/{rest/LessonProgressRequestHandler.kt => LessonProgressApi.kt} (94%) rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/{persistence/LessonProgressDatabaseConnector.kt => LessonProgressDatabaseAdapter.kt} (73%) rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/{rest/LessonProgressDto.kt => LessonProgressRestAdapter.kt} (67%) rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/{usecase/LessonProgressPersistence.kt => Persistence.kt} (97%) rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/{usecase/LessonProgress.kt => Types.kt} (98%) delete mode 100644 src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/rest/LessonProgressRouteConfig.kt rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/{findcurrentlesson => }/CurrentLessonDatabaseAdapter.kt (98%) rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/{eventpublisher => }/EventPublisherAdapter.kt (97%) rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/{readmodel => }/PreparednessInSemesterReadModel.kt (97%) rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/{persistence => }/UnpreparedStudentDatabaseAdapter.kt (98%) rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/{rest/UnpreparedStudentHttpEndpoint.kt => UnpreparedStudentRestAdapter.kt} (99%) diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/usecase/AttendanceApi.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/AttendanceApi.kt similarity index 93% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/usecase/AttendanceApi.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/AttendanceApi.kt index 91203a0..54ca832 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/usecase/AttendanceApi.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/AttendanceApi.kt @@ -1,4 +1,4 @@ -package com.krzykrucz.elesson.currentlesson.adapters.attendance.usecase +package com.krzykrucz.elesson.currentlesson.adapters.attendance import arrow.core.Either import arrow.core.Option @@ -6,8 +6,6 @@ import arrow.core.extensions.either.monad.flatten import arrow.core.extensions.fx import arrow.core.fix import com.krzykrucz.elesson.currentlesson.adapters.asyncMap -import com.krzykrucz.elesson.currentlesson.adapters.attendance.rest.AttendanceDto -import com.krzykrucz.elesson.currentlesson.adapters.attendance.rest.LateAttendanceDto import com.krzykrucz.elesson.currentlesson.domain.attendance.AttendanceError import com.krzykrucz.elesson.currentlesson.domain.attendance.FetchCheckedAttendance import com.krzykrucz.elesson.currentlesson.domain.attendance.FetchIncompleteAttendance diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/persistence/AttendanceDatabaseConnector.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/AttendancePersistenceAdapter.kt similarity index 94% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/persistence/AttendanceDatabaseConnector.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/AttendancePersistenceAdapter.kt index c5acb34..375de36 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/persistence/AttendanceDatabaseConnector.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/AttendancePersistenceAdapter.kt @@ -1,4 +1,4 @@ -package com.krzykrucz.elesson.currentlesson.adapters.attendance.persistence +package com.krzykrucz.elesson.currentlesson.adapters.attendance import arrow.core.toOption import com.krzykrucz.elesson.currentlesson.Database @@ -12,7 +12,7 @@ import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration @Configuration -class AttendanceDatabaseConnector { +class AttendancePersistenceAdapter { @Bean fun fetchCheckedAttendance(): FetchCheckedAttendance = { lessonId -> diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/rest/AttendanceRestAdapter.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/AttendanceRestAdapter.kt similarity index 87% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/rest/AttendanceRestAdapter.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/AttendanceRestAdapter.kt index ab1751d..abd6496 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/rest/AttendanceRestAdapter.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/AttendanceRestAdapter.kt @@ -1,9 +1,6 @@ -package com.krzykrucz.elesson.currentlesson.adapters.attendance.rest +package com.krzykrucz.elesson.currentlesson.adapters.attendance import com.krzykrucz.elesson.currentlesson.adapters.RestApi -import com.krzykrucz.elesson.currentlesson.adapters.attendance.usecase.HandleNoteLate -import com.krzykrucz.elesson.currentlesson.adapters.attendance.usecase.NoteAbsentApi -import com.krzykrucz.elesson.currentlesson.adapters.attendance.usecase.NotePresentApi import com.krzykrucz.elesson.currentlesson.adapters.toServerResponse import com.krzykrucz.elesson.currentlesson.domain.attendance.AbsentStudent import com.krzykrucz.elesson.currentlesson.domain.attendance.UncheckedStudent diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/rest/LessonProgressRequestHandler.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/LessonProgressApi.kt similarity index 94% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/rest/LessonProgressRequestHandler.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/LessonProgressApi.kt index 260740f..a4d96cb 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/rest/LessonProgressRequestHandler.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/LessonProgressApi.kt @@ -1,10 +1,9 @@ -package com.krzykrucz.elesson.currentlesson.adapters.lessonprogress.rest +package com.krzykrucz.elesson.currentlesson.adapters.lessonprogress import arrow.core.Option import arrow.core.extensions.fx import com.krzykrucz.elesson.currentlesson.adapters.RestApi import com.krzykrucz.elesson.currentlesson.adapters.asyncFlatMap -import com.krzykrucz.elesson.currentlesson.adapters.lessonprogress.usecase.LoadLessonProgress import com.krzykrucz.elesson.currentlesson.adapters.toServerResponse import com.krzykrucz.elesson.currentlesson.domain.shared.ClassName import com.krzykrucz.elesson.currentlesson.domain.shared.LessonHourNumber diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/persistence/LessonProgressDatabaseConnector.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/LessonProgressDatabaseAdapter.kt similarity index 73% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/persistence/LessonProgressDatabaseConnector.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/LessonProgressDatabaseAdapter.kt index 3b4eebf..3b26ff3 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/persistence/LessonProgressDatabaseConnector.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/LessonProgressDatabaseAdapter.kt @@ -1,15 +1,12 @@ -package com.krzykrucz.elesson.currentlesson.adapters.lessonprogress.persistence +package com.krzykrucz.elesson.currentlesson.adapters.lessonprogress import arrow.core.toOption import com.krzykrucz.elesson.currentlesson.Database -import com.krzykrucz.elesson.currentlesson.adapters.lessonprogress.usecase.LessonProgress -import com.krzykrucz.elesson.currentlesson.adapters.lessonprogress.usecase.LessonProgressError -import com.krzykrucz.elesson.currentlesson.adapters.lessonprogress.usecase.LoadLessonProgress import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration @Configuration -class LessonProgressDatabaseConnector { +class LessonProgressDatabaseAdapter { @Bean fun loadLessonProgress(): LoadLessonProgress = { lessonIdentifier -> diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/rest/LessonProgressDto.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/LessonProgressRestAdapter.kt similarity index 67% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/rest/LessonProgressDto.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/LessonProgressRestAdapter.kt index cef9363..c58c2d8 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/rest/LessonProgressDto.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/LessonProgressRestAdapter.kt @@ -1,7 +1,18 @@ -package com.krzykrucz.elesson.currentlesson.adapters.lessonprogress.rest +package com.krzykrucz.elesson.currentlesson.adapters.lessonprogress -import com.krzykrucz.elesson.currentlesson.adapters.lessonprogress.usecase.LessonProgress import com.krzykrucz.elesson.currentlesson.domain.shared.LessonTopic +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration +import org.springframework.web.reactive.function.server.coRouter + +@Configuration +class LessonProgressRestAdapter { + + @Bean + fun lessonProgressRouter(loadLessonProgress: LoadLessonProgress) = coRouter { + GET("/progress", handleLessonProgressViewRequest(loadLessonProgress)) + } +} data class LessonProgressDto( val semester: Int, @@ -23,4 +34,3 @@ data class LessonProgressDto( ) } } - diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/usecase/LessonProgressPersistence.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/Persistence.kt similarity index 97% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/usecase/LessonProgressPersistence.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/Persistence.kt index cc0636b..403a442 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/usecase/LessonProgressPersistence.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/Persistence.kt @@ -1,4 +1,4 @@ -package com.krzykrucz.elesson.currentlesson.adapters.lessonprogress.usecase +package com.krzykrucz.elesson.currentlesson.adapters.lessonprogress import arrow.core.Either import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/usecase/LessonProgress.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/Types.kt similarity index 98% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/usecase/LessonProgress.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/Types.kt index 2367ded..462b7bb 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/usecase/LessonProgress.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/Types.kt @@ -1,4 +1,4 @@ -package com.krzykrucz.elesson.currentlesson.adapters.lessonprogress.usecase +package com.krzykrucz.elesson.currentlesson.adapters.lessonprogress import arrow.core.Option import com.krzykrucz.elesson.currentlesson.domain.shared.ClassName diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/rest/LessonProgressRouteConfig.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/rest/LessonProgressRouteConfig.kt deleted file mode 100644 index 18c28cf..0000000 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/rest/LessonProgressRouteConfig.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.krzykrucz.elesson.currentlesson.adapters.lessonprogress.rest - -import com.krzykrucz.elesson.currentlesson.adapters.lessonprogress.usecase.LoadLessonProgress -import org.springframework.context.annotation.Bean -import org.springframework.context.annotation.Configuration -import org.springframework.web.reactive.function.server.coRouter - -@Configuration -class LessonProgressRouteConfig { - - @Bean - fun lessonProgressRouter(loadLessonProgress: LoadLessonProgress) = coRouter { - GET("/progress", handleLessonProgressViewRequest(loadLessonProgress)) - } -} diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/findcurrentlesson/CurrentLessonDatabaseAdapter.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/CurrentLessonDatabaseAdapter.kt similarity index 98% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/findcurrentlesson/CurrentLessonDatabaseAdapter.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/CurrentLessonDatabaseAdapter.kt index d00f4a8..6780a00 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/findcurrentlesson/CurrentLessonDatabaseAdapter.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/CurrentLessonDatabaseAdapter.kt @@ -1,4 +1,4 @@ -package com.krzykrucz.elesson.currentlesson.adapters.preparedness.findcurrentlesson +package com.krzykrucz.elesson.currentlesson.adapters.preparedness import arrow.core.orElse import arrow.core.toOption diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/eventpublisher/EventPublisherAdapter.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/EventPublisherAdapter.kt similarity index 97% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/eventpublisher/EventPublisherAdapter.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/EventPublisherAdapter.kt index 00305e9..66468ba 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/eventpublisher/EventPublisherAdapter.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/EventPublisherAdapter.kt @@ -1,4 +1,4 @@ -package com.krzykrucz.elesson.currentlesson.adapters.preparedness.eventpublisher +package com.krzykrucz.elesson.currentlesson.adapters.preparedness import com.krzykrucz.elesson.currentlesson.domain.preparedness.NotifyStudentMarkedUnprepared import org.springframework.context.ApplicationEventPublisher diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/readmodel/PreparednessInSemesterReadModel.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/PreparednessInSemesterReadModel.kt similarity index 97% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/readmodel/PreparednessInSemesterReadModel.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/PreparednessInSemesterReadModel.kt index e9cc1fc..9276699 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/readmodel/PreparednessInSemesterReadModel.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/PreparednessInSemesterReadModel.kt @@ -1,9 +1,9 @@ -package com.krzykrucz.elesson.currentlesson.adapters.preparedness.readmodel +package com.krzykrucz.elesson.currentlesson.adapters.preparedness import arrow.core.Option import arrow.core.getOrElse import arrow.core.right -import com.krzykrucz.elesson.currentlesson.adapters.preparedness.readmodel.StudentInSemesterReadModel.READ_MODEL +import com.krzykrucz.elesson.currentlesson.adapters.preparedness.StudentInSemesterReadModel.READ_MODEL import com.krzykrucz.elesson.currentlesson.domain.preparedness.GetStudentSubjectUnpreparednessInASemester import com.krzykrucz.elesson.currentlesson.domain.preparedness.StudentInSemester import com.krzykrucz.elesson.currentlesson.domain.preparedness.StudentMarkedUnprepared diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/persistence/UnpreparedStudentDatabaseAdapter.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/UnpreparedStudentDatabaseAdapter.kt similarity index 98% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/persistence/UnpreparedStudentDatabaseAdapter.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/UnpreparedStudentDatabaseAdapter.kt index 5a91939..c0a1255 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/persistence/UnpreparedStudentDatabaseAdapter.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/UnpreparedStudentDatabaseAdapter.kt @@ -1,4 +1,4 @@ -package com.krzykrucz.elesson.currentlesson.adapters.preparedness.persistence +package com.krzykrucz.elesson.currentlesson.adapters.preparedness import com.krzykrucz.elesson.currentlesson.Database import com.krzykrucz.elesson.currentlesson.domain.preparedness.PersistUnpreparedStudentToLesson diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/rest/UnpreparedStudentHttpEndpoint.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/UnpreparedStudentRestAdapter.kt similarity index 99% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/rest/UnpreparedStudentHttpEndpoint.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/UnpreparedStudentRestAdapter.kt index da1da1a..5678952 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/rest/UnpreparedStudentHttpEndpoint.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/UnpreparedStudentRestAdapter.kt @@ -1,4 +1,4 @@ -package com.krzykrucz.elesson.currentlesson.adapters.preparedness.rest +package com.krzykrucz.elesson.currentlesson.adapters.preparedness import com.krzykrucz.elesson.currentlesson.domain.preparedness.ReportUnpreparedStudentApi import com.krzykrucz.elesson.currentlesson.domain.preparedness.StudentReportingUnpreparedness diff --git a/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/attendance/AttendanceAcceptanceSpec.groovy b/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/attendance/AttendanceAcceptanceSpec.groovy index 003d021..36a858b 100644 --- a/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/attendance/AttendanceAcceptanceSpec.groovy +++ b/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/attendance/AttendanceAcceptanceSpec.groovy @@ -2,9 +2,6 @@ package com.krzykrucz.elesson.currentlesson.adapters.attendance import com.krzykrucz.elesson.currentlesson.Database -import com.krzykrucz.elesson.currentlesson.adapters.attendance.rest.AttendanceDto -import com.krzykrucz.elesson.currentlesson.adapters.attendance.rest.AttendanceResponseDto -import com.krzykrucz.elesson.currentlesson.adapters.attendance.rest.LateAttendanceDto import org.springframework.http.HttpEntity import org.springframework.http.HttpMethod diff --git a/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/LessonProgressAcceptanceSpec.groovy b/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/LessonProgressAcceptanceSpec.groovy index cc60b3a..b60a281 100644 --- a/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/LessonProgressAcceptanceSpec.groovy +++ b/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/LessonProgressAcceptanceSpec.groovy @@ -4,7 +4,6 @@ import arrow.core.None import com.krzykrucz.elesson.currentlesson.Database import com.krzykrucz.elesson.currentlesson.PersistentCurrentLesson import com.krzykrucz.elesson.currentlesson.adapters.AcceptanceSpec -import com.krzykrucz.elesson.currentlesson.adapters.lessonprogress.rest.LessonProgressDto import com.krzykrucz.elesson.currentlesson.domain.attendance.AbsentStudent import com.krzykrucz.elesson.currentlesson.domain.attendance.CheckedAttendanceList import com.krzykrucz.elesson.currentlesson.domain.attendance.PresentStudent diff --git a/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/preparedness/UnpreparedStudentAcceptanceSpec.groovy b/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/preparedness/UnpreparedStudentAcceptanceSpec.groovy index 382aba4..02817a5 100644 --- a/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/preparedness/UnpreparedStudentAcceptanceSpec.groovy +++ b/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/preparedness/UnpreparedStudentAcceptanceSpec.groovy @@ -4,8 +4,6 @@ import arrow.core.None import com.krzykrucz.elesson.currentlesson.Database import com.krzykrucz.elesson.currentlesson.PersistentCurrentLesson import com.krzykrucz.elesson.currentlesson.adapters.AcceptanceSpec -import com.krzykrucz.elesson.currentlesson.adapters.preparedness.readmodel.StudentInSemesterReadModel -import com.krzykrucz.elesson.currentlesson.adapters.preparedness.rest.ReportUnpreparedRequest import com.krzykrucz.elesson.currentlesson.domain.attendance.CheckedAttendanceList import com.krzykrucz.elesson.currentlesson.domain.preparedness.StudentInSemester import com.krzykrucz.elesson.currentlesson.domain.preparedness.StudentReportingUnpreparedness From 1ee92544f1ca219ec812d41ef58b1af693c7480a Mon Sep 17 00:00:00 2001 From: krzykrucz Date: Tue, 16 Jun 2020 20:48:40 +0200 Subject: [PATCH 8/9] repackaging --- .../elesson/currentlesson/Database.kt | 46 +++++----- .../currentlesson/ELessonApplication.kt | 6 +- .../StoreLessonAsFinishedAdapter.kt | 12 --- .../adapters/lessonprogress/Types.kt | 21 ----- .../PreparednessInSemesterReadModel.kt | 54 ------------ .../CheckScheduledLessonAdapter.kt | 36 -------- .../startlesson/StartLessonRestAdapter.kt | 18 ---- .../attendance/AttendanceApi.kt | 11 +-- .../AttendancePersistenceAdapter.kt | 8 +- .../attendance/AttendanceRestAdapter.kt | 10 +-- .../{domain => }/attendance/Persistence.kt | 6 +- .../{domain => }/attendance/Types.kt | 8 +- .../{domain => }/attendance/Workflows.kt | 8 +- .../domain/finishlesson/Persistence.kt | 5 -- .../PreparednessInSemesterReadModel.kt | 39 --------- .../domain/startlesson/Persistence.kt | 7 -- .../currentlesson/domain/topic/Persistence.kt | 7 -- .../finishlesson/FinishLessonAdapters.kt | 3 +- .../finishlesson/FinishLessonRestAdapter.kt | 11 +-- .../FinishLessonTypesConfiguration.kt | 10 +-- .../finishlesson/InProgressLessonReadModel.kt | 11 ++- .../currentlesson/finishlesson/Persistence.kt | 5 ++ .../StoreLessonAsFinishedAdapter.kt | 11 +++ .../{domain => }/finishlesson/Types.kt | 6 +- .../{domain => }/finishlesson/Workflows.kt | 6 +- .../lessonprogress/LessonProgressApi.kt | 16 ++-- .../LessonProgressDatabaseAdapter.kt | 2 +- .../LessonProgressRestAdapter.kt | 4 +- .../lessonprogress/Persistence.kt | 4 +- .../currentlesson/lessonprogress/Types.kt | 21 +++++ .../{domain => }/preparedness/Api.kt | 8 +- .../CurrentLessonDatabaseAdapter.kt | 4 +- .../preparedness/EventPublisherAdapter.kt | 3 +- .../{domain => }/preparedness/Persistence.kt | 6 +- .../PreparednessInSemesterReadModel.kt | 86 +++++++++++++++++++ .../StudentUnpreparedDomainConfig.kt | 8 +- .../{domain => }/preparedness/Types.kt | 8 +- .../UnpreparedStudentDatabaseAdapter.kt | 3 +- .../UnpreparedStudentRestAdapter.kt | 6 +- .../{domain => }/preparedness/Workflows.kt | 20 ++--- .../currentlesson/{domain => }/shared/Base.kt | 2 +- .../shared/CurrentLessonSharedKernel.kt | 6 +- .../Extensions.kt} | 2 +- .../CheckScheduledLessonAdapter.kt | 33 +++++++ .../startlesson/FetchClassRegistryAdapter.kt | 17 ++-- .../currentlesson/startlesson/Persistence.kt | 7 ++ .../startlesson/StartLessonAdapters.kt | 4 +- .../startlesson/StartLessonApi.kt | 25 +++--- .../startlesson/StartLessonRestAdapter.kt | 18 ++++ .../StartedLessonPersistenceAdapter.kt | 9 +- .../{domain => }/startlesson/Types.kt | 10 +-- .../{domain => }/startlesson/Workflows.kt | 14 +-- .../currentlesson/topic/Persistence.kt | 7 ++ .../{adapters => }/topic/TopicAdapters.kt | 3 +- .../topic/TopicPersistenceAdapter.kt | 10 +-- .../{adapters => }/topic/TopicRestAdapter.kt | 12 ++- .../currentlesson/{domain => }/topic/Types.kt | 2 +- .../{domain => }/topic/Workflows.kt | 14 +-- .../{adapters => }/AcceptanceSpec.groovy | 18 +++- .../AttendanceAcceptanceSpec.groovy | 41 ++++++++- .../FinishLessonAcceptanceSpec.groovy | 30 +++---- .../LessonProgressAcceptanceSpec.groovy | 20 ++--- .../StartLessonAcceptanceSpec.groovy | 5 +- .../topic => }/TopicAcceptanceSpec.groovy | 33 ++++--- .../UnpreparedStudentAcceptanceSpec.groovy | 23 ++--- .../attendance/AttendanceBaseSpec.groovy | 35 -------- .../attendance => }/CheckAttendanceSteps.kt | 38 +++++--- .../{domain/topic => }/ChooseTopicSteps.kt | 24 +++--- .../{domain => }/DomainHelper.kt | 20 ++--- .../{adapters => }/ELessonApplicationTest.kt | 2 +- .../finishlesson => }/FinishLessonSteps.kt | 23 ++--- .../attendance => }/IsNotTooLateSteps.kt | 5 +- .../{domain => }/RunCukesTest.kt | 4 +- .../startlesson => }/StartLessonSteps.kt | 29 +++---- .../StudentUnpreparedSteps.kt | 43 ++++++---- .../adapters/ArchitectureTest.kt | 38 -------- .../CheckAttendance.feature | 0 .../topic => features}/ChooseTopic.feature | 0 .../FinishLesson.feature | 0 .../IsNotTooLate.feature | 0 .../{domain => features}/StartLesson.feature | 0 .../StudentUnprepared.feature | 0 82 files changed, 564 insertions(+), 626 deletions(-) delete mode 100644 src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/finishlesson/StoreLessonAsFinishedAdapter.kt delete mode 100644 src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/Types.kt delete mode 100644 src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/PreparednessInSemesterReadModel.kt delete mode 100644 src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/CheckScheduledLessonAdapter.kt delete mode 100644 src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartLessonRestAdapter.kt rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/{adapters => }/attendance/AttendanceApi.kt (81%) rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/{adapters => }/attendance/AttendancePersistenceAdapter.kt (70%) rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/{adapters => }/attendance/AttendanceRestAdapter.kt (81%) rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/{domain => }/attendance/Persistence.kt (67%) rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/{domain => }/attendance/Types.kt (87%) rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/{domain => }/attendance/Workflows.kt (94%) delete mode 100644 src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/finishlesson/Persistence.kt delete mode 100644 src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/PreparednessInSemesterReadModel.kt delete mode 100644 src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/startlesson/Persistence.kt delete mode 100644 src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/topic/Persistence.kt rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/{adapters => }/finishlesson/FinishLessonAdapters.kt (60%) rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/{adapters => }/finishlesson/FinishLessonRestAdapter.kt (57%) rename src/{test/kotlin/com/krzykrucz/elesson/currentlesson/domain => main/kotlin/com/krzykrucz/elesson/currentlesson}/finishlesson/FinishLessonTypesConfiguration.kt (91%) rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/{adapters => }/finishlesson/InProgressLessonReadModel.kt (56%) create mode 100644 src/main/kotlin/com/krzykrucz/elesson/currentlesson/finishlesson/Persistence.kt create mode 100644 src/main/kotlin/com/krzykrucz/elesson/currentlesson/finishlesson/StoreLessonAsFinishedAdapter.kt rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/{domain => }/finishlesson/Types.kt (71%) rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/{domain => }/finishlesson/Workflows.kt (78%) rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/{adapters => }/lessonprogress/LessonProgressApi.kt (68%) rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/{adapters => }/lessonprogress/LessonProgressDatabaseAdapter.kt (93%) rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/{adapters => }/lessonprogress/LessonProgressRestAdapter.kt (89%) rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/{adapters => }/lessonprogress/Persistence.kt (65%) create mode 100644 src/main/kotlin/com/krzykrucz/elesson/currentlesson/lessonprogress/Types.kt rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/{domain => }/preparedness/Api.kt (78%) rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/{adapters => }/preparedness/CurrentLessonDatabaseAdapter.kt (77%) rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/{adapters => }/preparedness/EventPublisherAdapter.kt (79%) rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/{domain => }/preparedness/Persistence.kt (61%) create mode 100644 src/main/kotlin/com/krzykrucz/elesson/currentlesson/preparedness/PreparednessInSemesterReadModel.kt rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/{adapters => }/preparedness/StudentUnpreparedDomainConfig.kt (55%) rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/{domain => }/preparedness/Types.kt (76%) rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/{adapters => }/preparedness/UnpreparedStudentDatabaseAdapter.kt (78%) rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/{adapters => }/preparedness/UnpreparedStudentRestAdapter.kt (80%) rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/{domain => }/preparedness/Workflows.kt (88%) rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/{domain => }/shared/Base.kt (96%) rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/{domain => }/shared/CurrentLessonSharedKernel.kt (94%) rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/{adapters/CoroutineExtensions.kt => shared/Extensions.kt} (95%) create mode 100644 src/main/kotlin/com/krzykrucz/elesson/currentlesson/startlesson/CheckScheduledLessonAdapter.kt rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/{adapters => }/startlesson/FetchClassRegistryAdapter.kt (56%) create mode 100644 src/main/kotlin/com/krzykrucz/elesson/currentlesson/startlesson/Persistence.kt rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/{adapters => }/startlesson/StartLessonAdapters.kt (63%) rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/{adapters => }/startlesson/StartLessonApi.kt (55%) create mode 100644 src/main/kotlin/com/krzykrucz/elesson/currentlesson/startlesson/StartLessonRestAdapter.kt rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/{adapters => }/startlesson/StartedLessonPersistenceAdapter.kt (78%) rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/{domain => }/startlesson/Types.kt (86%) rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/{domain => }/startlesson/Workflows.kt (81%) create mode 100644 src/main/kotlin/com/krzykrucz/elesson/currentlesson/topic/Persistence.kt rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/{adapters => }/topic/TopicAdapters.kt (69%) rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/{adapters => }/topic/TopicPersistenceAdapter.kt (62%) rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/{adapters => }/topic/TopicRestAdapter.kt (56%) rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/{domain => }/topic/Types.kt (80%) rename src/main/kotlin/com/krzykrucz/elesson/currentlesson/{domain => }/topic/Workflows.kt (70%) rename src/test/groovy/com/krzykrucz/elesson/currentlesson/{adapters => }/AcceptanceSpec.groovy (65%) rename src/test/groovy/com/krzykrucz/elesson/currentlesson/{adapters/attendance => }/AttendanceAcceptanceSpec.groovy (54%) rename src/test/groovy/com/krzykrucz/elesson/currentlesson/{adapters/finishlesson => }/FinishLessonAcceptanceSpec.groovy (61%) rename src/test/groovy/com/krzykrucz/elesson/currentlesson/{adapters/lessonprogress => }/LessonProgressAcceptanceSpec.groovy (71%) rename src/test/groovy/com/krzykrucz/elesson/currentlesson/{adapters/startlesson => }/StartLessonAcceptanceSpec.groovy (81%) rename src/test/groovy/com/krzykrucz/elesson/currentlesson/{adapters/topic => }/TopicAcceptanceSpec.groovy (60%) rename src/test/groovy/com/krzykrucz/elesson/currentlesson/{adapters/preparedness => }/UnpreparedStudentAcceptanceSpec.groovy (71%) delete mode 100644 src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/attendance/AttendanceBaseSpec.groovy rename src/test/kotlin/com/krzykrucz/elesson/currentlesson/{domain/attendance => }/CheckAttendanceSteps.kt (82%) rename src/test/kotlin/com/krzykrucz/elesson/currentlesson/{domain/topic => }/ChooseTopicSteps.kt (68%) rename src/test/kotlin/com/krzykrucz/elesson/currentlesson/{domain => }/DomainHelper.kt (61%) rename src/test/kotlin/com/krzykrucz/elesson/currentlesson/{adapters => }/ELessonApplicationTest.kt (84%) rename src/test/kotlin/com/krzykrucz/elesson/currentlesson/{domain/finishlesson => }/FinishLessonSteps.kt (65%) rename src/test/kotlin/com/krzykrucz/elesson/currentlesson/{domain/attendance => }/IsNotTooLateSteps.kt (85%) rename src/test/kotlin/com/krzykrucz/elesson/currentlesson/{domain => }/RunCukesTest.kt (57%) rename src/test/kotlin/com/krzykrucz/elesson/currentlesson/{domain/startlesson => }/StartLessonSteps.kt (82%) rename src/test/kotlin/com/krzykrucz/elesson/currentlesson/{domain/preparedness => }/StudentUnpreparedSteps.kt (74%) delete mode 100644 src/test/kotlin/com/krzykrucz/elesson/currentlesson/adapters/ArchitectureTest.kt rename src/test/resources/com/krzykrucz/elesson/currentlesson/{domain/attendance => features}/CheckAttendance.feature (100%) rename src/test/resources/com/krzykrucz/elesson/currentlesson/{domain/topic => features}/ChooseTopic.feature (100%) rename src/test/resources/com/krzykrucz/elesson/currentlesson/{domain/finishlesson => features}/FinishLesson.feature (100%) rename src/test/resources/com/krzykrucz/elesson/currentlesson/{domain/attendance => features}/IsNotTooLate.feature (100%) rename src/test/resources/com/krzykrucz/elesson/currentlesson/{domain => features}/StartLesson.feature (100%) rename src/test/resources/com/krzykrucz/elesson/currentlesson/{domain => features}/StudentUnprepared.feature (100%) diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/Database.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/Database.kt index 02e5ecd..6adbe96 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/Database.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/Database.kt @@ -1,29 +1,29 @@ package com.krzykrucz.elesson.currentlesson import arrow.core.Option -import com.krzykrucz.elesson.currentlesson.domain.attendance.Attendance -import com.krzykrucz.elesson.currentlesson.domain.attendance.CheckedAttendanceList -import com.krzykrucz.elesson.currentlesson.domain.attendance.IncompleteAttendanceList -import com.krzykrucz.elesson.currentlesson.domain.preparedness.StudentsUnpreparedForLesson -import com.krzykrucz.elesson.currentlesson.domain.shared.ClassName -import com.krzykrucz.elesson.currentlesson.domain.shared.ClassRegistry -import com.krzykrucz.elesson.currentlesson.domain.shared.FirstName -import com.krzykrucz.elesson.currentlesson.domain.shared.InProgressLesson -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonAfterAttendance -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonHourNumber -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonStatus -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonSubject -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonTopic -import com.krzykrucz.elesson.currentlesson.domain.shared.NaturalNumber -import com.krzykrucz.elesson.currentlesson.domain.shared.NonEmptyText -import com.krzykrucz.elesson.currentlesson.domain.shared.NumberInRegister -import com.krzykrucz.elesson.currentlesson.domain.shared.Scheduled -import com.krzykrucz.elesson.currentlesson.domain.shared.SecondName -import com.krzykrucz.elesson.currentlesson.domain.shared.Semester -import com.krzykrucz.elesson.currentlesson.domain.shared.StartedLesson -import com.krzykrucz.elesson.currentlesson.domain.shared.StudentRecord -import com.krzykrucz.elesson.currentlesson.domain.shared.WinterSemester +import com.krzykrucz.elesson.currentlesson.attendance.Attendance +import com.krzykrucz.elesson.currentlesson.attendance.CheckedAttendanceList +import com.krzykrucz.elesson.currentlesson.attendance.IncompleteAttendanceList +import com.krzykrucz.elesson.currentlesson.preparedness.StudentsUnpreparedForLesson +import com.krzykrucz.elesson.currentlesson.shared.ClassName +import com.krzykrucz.elesson.currentlesson.shared.ClassRegistry +import com.krzykrucz.elesson.currentlesson.shared.FirstName +import com.krzykrucz.elesson.currentlesson.shared.InProgressLesson +import com.krzykrucz.elesson.currentlesson.shared.LessonAfterAttendance +import com.krzykrucz.elesson.currentlesson.shared.LessonHourNumber +import com.krzykrucz.elesson.currentlesson.shared.LessonIdentifier +import com.krzykrucz.elesson.currentlesson.shared.LessonStatus +import com.krzykrucz.elesson.currentlesson.shared.LessonSubject +import com.krzykrucz.elesson.currentlesson.shared.LessonTopic +import com.krzykrucz.elesson.currentlesson.shared.NaturalNumber +import com.krzykrucz.elesson.currentlesson.shared.NonEmptyText +import com.krzykrucz.elesson.currentlesson.shared.NumberInRegister +import com.krzykrucz.elesson.currentlesson.shared.Scheduled +import com.krzykrucz.elesson.currentlesson.shared.SecondName +import com.krzykrucz.elesson.currentlesson.shared.Semester +import com.krzykrucz.elesson.currentlesson.shared.StartedLesson +import com.krzykrucz.elesson.currentlesson.shared.StudentRecord +import com.krzykrucz.elesson.currentlesson.shared.WinterSemester import java.time.LocalDate import java.util.concurrent.ConcurrentHashMap import arrow.core.Option.Companion as Option1 diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/ELessonApplication.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/ELessonApplication.kt index d0166a8..eeb574d 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/ELessonApplication.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/ELessonApplication.kt @@ -1,8 +1,8 @@ package com.krzykrucz.elesson.currentlesson -import com.krzykrucz.elesson.currentlesson.adapters.finishlesson.finishLessonAdapters -import com.krzykrucz.elesson.currentlesson.adapters.startlesson.startLessonAdapters -import com.krzykrucz.elesson.currentlesson.adapters.topic.topicAdapters +import com.krzykrucz.elesson.currentlesson.finishlesson.finishLessonAdapters +import com.krzykrucz.elesson.currentlesson.startlesson.startLessonAdapters +import com.krzykrucz.elesson.currentlesson.topic.topicAdapters import org.springframework.boot.autoconfigure.SpringBootApplication import org.springframework.boot.runApplication import org.springframework.context.ApplicationContextInitializer diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/finishlesson/StoreLessonAsFinishedAdapter.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/finishlesson/StoreLessonAsFinishedAdapter.kt deleted file mode 100644 index e68a745..0000000 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/finishlesson/StoreLessonAsFinishedAdapter.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.krzykrucz.elesson.currentlesson.adapters.finishlesson - -import com.krzykrucz.elesson.currentlesson.Database -import com.krzykrucz.elesson.currentlesson.domain.finishlesson.StoreLessonAsFinished -import com.krzykrucz.elesson.currentlesson.domain.shared.Finished -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier - -internal val storeLessonAsFinishedAdapter: StoreLessonAsFinished = { lessonId: LessonIdentifier -> - Database.LESSON_DATABASE.compute(lessonId) { _, lesson -> - lesson?.copy(status = Finished) - } -} diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/Types.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/Types.kt deleted file mode 100644 index 462b7bb..0000000 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/Types.kt +++ /dev/null @@ -1,21 +0,0 @@ -package com.krzykrucz.elesson.currentlesson.adapters.lessonprogress - -import arrow.core.Option -import com.krzykrucz.elesson.currentlesson.domain.shared.ClassName -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonStatus -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonSubject -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonTopic -import com.krzykrucz.elesson.currentlesson.domain.shared.Semester -import java.time.LocalDate - - -typealias LessonDate = LocalDate - -data class LessonProgress( - val semester: Semester, - val className: ClassName, - val subject: LessonSubject, - val date: LessonDate, - val topic: Option, - val status: LessonStatus -) diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/PreparednessInSemesterReadModel.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/PreparednessInSemesterReadModel.kt deleted file mode 100644 index 9276699..0000000 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/PreparednessInSemesterReadModel.kt +++ /dev/null @@ -1,54 +0,0 @@ -package com.krzykrucz.elesson.currentlesson.adapters.preparedness - -import arrow.core.Option -import arrow.core.getOrElse -import arrow.core.right -import com.krzykrucz.elesson.currentlesson.adapters.preparedness.StudentInSemesterReadModel.READ_MODEL -import com.krzykrucz.elesson.currentlesson.domain.preparedness.GetStudentSubjectUnpreparednessInASemester -import com.krzykrucz.elesson.currentlesson.domain.preparedness.StudentInSemester -import com.krzykrucz.elesson.currentlesson.domain.preparedness.StudentMarkedUnprepared -import com.krzykrucz.elesson.currentlesson.domain.preparedness.StudentSubjectUnpreparednessInASemester -import com.krzykrucz.elesson.currentlesson.domain.preparedness.WriteUnpreparednessInTheRegister -import kotlinx.coroutines.runBlocking -import org.springframework.context.annotation.Bean -import org.springframework.context.annotation.Configuration -import org.springframework.context.event.EventListener -import java.util.concurrent.ConcurrentHashMap - -val writeUnpreparednessInTheRegister: WriteUnpreparednessInTheRegister = { - StudentInSemester( - it.lessonId.className, - it.unpreparedStudent.firstName, - it.unpreparedStudent.secondName - ) - .let { READ_MODEL[it] ?: StudentSubjectUnpreparednessInASemester.createEmpty(it) } - .let { it.copy(count = it.count.inc()) } - .apply { READ_MODEL[this.student] = this } -} - -private val getStudentSubjectUnpreparednessInASemester: GetStudentSubjectUnpreparednessInASemester = { student -> - READ_MODEL[student] - .let { Option.fromNullable(it) } - .getOrElse { StudentSubjectUnpreparednessInASemester.createEmpty(student) } - .right() -} - -object StudentInSemesterReadModel { - - val READ_MODEL: MutableMap = ConcurrentHashMap() - -} - -@Configuration -class ReadModelBeans { - @Bean - fun getBean() = - getStudentSubjectUnpreparednessInASemester - - @EventListener - fun eventListenerStudentMarkedUnprepared(event: StudentMarkedUnprepared) { - runBlocking { - writeUnpreparednessInTheRegister(event) - } - } -} diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/CheckScheduledLessonAdapter.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/CheckScheduledLessonAdapter.kt deleted file mode 100644 index a0b953a..0000000 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/CheckScheduledLessonAdapter.kt +++ /dev/null @@ -1,36 +0,0 @@ -package com.krzykrucz.elesson.currentlesson.adapters.startlesson - -import com.krzykrucz.elesson.currentlesson.domain.shared.ClassName -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonHourNumber -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonSubject -import com.krzykrucz.elesson.currentlesson.domain.shared.NaturalNumber -import com.krzykrucz.elesson.currentlesson.domain.shared.NonEmptyText -import com.krzykrucz.elesson.currentlesson.domain.shared.Teacher -import com.krzykrucz.elesson.currentlesson.domain.startlesson.FetchScheduledLesson -import com.krzykrucz.elesson.currentlesson.domain.startlesson.ScheduledLesson -import com.krzykrucz.elesson.currentlesson.domain.startlesson.StartLessonError -import java.time.LocalDateTime - - -internal val checkScheduledLessonAdapter: FetchScheduledLesson = { teacher: Teacher, time: LocalDateTime -> - LessonHourNumber.of(NaturalNumber.THREE) - .map { - ScheduledLesson( - time, - it, - teacher, - ClassName( - NonEmptyText.of( - "Gryffindor" - )!! - ), - LessonSubject( - NonEmptyText( - "Elixirs" - ) - ) - ) - } - .toEither { StartLessonError.NotScheduledLesson() } -} - diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartLessonRestAdapter.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartLessonRestAdapter.kt deleted file mode 100644 index 9c9538b..0000000 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartLessonRestAdapter.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.krzykrucz.elesson.currentlesson.adapters.startlesson.rest - -import com.krzykrucz.elesson.currentlesson.adapters.startlesson.startLessonApi -import com.krzykrucz.elesson.currentlesson.domain.startlesson.FetchClassRegistry -import com.krzykrucz.elesson.currentlesson.domain.startlesson.FetchScheduledLesson -import com.krzykrucz.elesson.currentlesson.domain.startlesson.PersistStartedLesson -import org.springframework.web.reactive.function.server.coRouter - - -internal fun startLessonRestAdapter( - fetchScheduledLesson: FetchScheduledLesson, - fetchClassRegistry: FetchClassRegistry, - persistStartedLesson: PersistStartedLesson -) = - coRouter { - POST("/startlesson", startLessonApi(fetchScheduledLesson, fetchClassRegistry, persistStartedLesson)) - } - diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/AttendanceApi.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/attendance/AttendanceApi.kt similarity index 81% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/AttendanceApi.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/attendance/AttendanceApi.kt index 54ca832..3023725 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/AttendanceApi.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/attendance/AttendanceApi.kt @@ -1,18 +1,11 @@ -package com.krzykrucz.elesson.currentlesson.adapters.attendance +package com.krzykrucz.elesson.currentlesson.attendance import arrow.core.Either import arrow.core.Option import arrow.core.extensions.either.monad.flatten import arrow.core.extensions.fx import arrow.core.fix -import com.krzykrucz.elesson.currentlesson.adapters.asyncMap -import com.krzykrucz.elesson.currentlesson.domain.attendance.AttendanceError -import com.krzykrucz.elesson.currentlesson.domain.attendance.FetchCheckedAttendance -import com.krzykrucz.elesson.currentlesson.domain.attendance.FetchIncompleteAttendance -import com.krzykrucz.elesson.currentlesson.domain.attendance.PersistAttendance -import com.krzykrucz.elesson.currentlesson.domain.attendance.noteAbsenceWorkflow -import com.krzykrucz.elesson.currentlesson.domain.attendance.noteLateWorkflow -import com.krzykrucz.elesson.currentlesson.domain.attendance.notePresenceWorkflow +import com.krzykrucz.elesson.currentlesson.shared.asyncMap import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import java.time.LocalDateTime diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/AttendancePersistenceAdapter.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/attendance/AttendancePersistenceAdapter.kt similarity index 70% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/AttendancePersistenceAdapter.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/attendance/AttendancePersistenceAdapter.kt index 375de36..e019688 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/AttendancePersistenceAdapter.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/attendance/AttendancePersistenceAdapter.kt @@ -1,13 +1,7 @@ -package com.krzykrucz.elesson.currentlesson.adapters.attendance +package com.krzykrucz.elesson.currentlesson.attendance import arrow.core.toOption import com.krzykrucz.elesson.currentlesson.Database -import com.krzykrucz.elesson.currentlesson.domain.attendance.CheckedAttendanceList -import com.krzykrucz.elesson.currentlesson.domain.attendance.FetchCheckedAttendance -import com.krzykrucz.elesson.currentlesson.domain.attendance.FetchIncompleteAttendance -import com.krzykrucz.elesson.currentlesson.domain.attendance.IncompleteAttendanceDto -import com.krzykrucz.elesson.currentlesson.domain.attendance.IncompleteAttendanceList -import com.krzykrucz.elesson.currentlesson.domain.attendance.PersistAttendance import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/AttendanceRestAdapter.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/attendance/AttendanceRestAdapter.kt similarity index 81% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/AttendanceRestAdapter.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/attendance/AttendanceRestAdapter.kt index abd6496..c28b756 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/attendance/AttendanceRestAdapter.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/attendance/AttendanceRestAdapter.kt @@ -1,10 +1,8 @@ -package com.krzykrucz.elesson.currentlesson.adapters.attendance +package com.krzykrucz.elesson.currentlesson.attendance -import com.krzykrucz.elesson.currentlesson.adapters.RestApi -import com.krzykrucz.elesson.currentlesson.adapters.toServerResponse -import com.krzykrucz.elesson.currentlesson.domain.attendance.AbsentStudent -import com.krzykrucz.elesson.currentlesson.domain.attendance.UncheckedStudent -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier +import com.krzykrucz.elesson.currentlesson.shared.LessonIdentifier +import com.krzykrucz.elesson.currentlesson.shared.RestApi +import com.krzykrucz.elesson.currentlesson.shared.toServerResponse import org.springframework.beans.factory.annotation.Qualifier import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/attendance/Persistence.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/attendance/Persistence.kt similarity index 67% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/attendance/Persistence.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/attendance/Persistence.kt index e134c0f..5573110 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/attendance/Persistence.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/attendance/Persistence.kt @@ -1,8 +1,8 @@ -package com.krzykrucz.elesson.currentlesson.domain.attendance +package com.krzykrucz.elesson.currentlesson.attendance import arrow.core.Option -import com.krzykrucz.elesson.currentlesson.domain.shared.ClassRegistry -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier +import com.krzykrucz.elesson.currentlesson.shared.ClassRegistry +import com.krzykrucz.elesson.currentlesson.shared.LessonIdentifier typealias PersistAttendance = suspend (LessonIdentifier, Attendance) -> Boolean diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/attendance/Types.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/attendance/Types.kt similarity index 87% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/attendance/Types.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/attendance/Types.kt index 77a77ea..5ea49f5 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/attendance/Types.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/attendance/Types.kt @@ -1,8 +1,8 @@ -package com.krzykrucz.elesson.currentlesson.domain.attendance +package com.krzykrucz.elesson.currentlesson.attendance -import com.krzykrucz.elesson.currentlesson.domain.shared.FirstName -import com.krzykrucz.elesson.currentlesson.domain.shared.NumberInRegister -import com.krzykrucz.elesson.currentlesson.domain.shared.SecondName +import com.krzykrucz.elesson.currentlesson.shared.FirstName +import com.krzykrucz.elesson.currentlesson.shared.NumberInRegister +import com.krzykrucz.elesson.currentlesson.shared.SecondName import java.time.LocalDateTime import java.time.LocalTime diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/attendance/Workflows.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/attendance/Workflows.kt similarity index 94% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/attendance/Workflows.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/attendance/Workflows.kt index 72b25fc..5749505 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/attendance/Workflows.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/attendance/Workflows.kt @@ -1,11 +1,11 @@ -package com.krzykrucz.elesson.currentlesson.domain.attendance +package com.krzykrucz.elesson.currentlesson.attendance import arrow.core.Either import arrow.core.getOrElse import arrow.core.maybe -import com.krzykrucz.elesson.currentlesson.domain.shared.ClassRegistry -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonHourNumber -import com.krzykrucz.elesson.currentlesson.domain.shared.StudentRecord +import com.krzykrucz.elesson.currentlesson.shared.ClassRegistry +import com.krzykrucz.elesson.currentlesson.shared.LessonHourNumber +import com.krzykrucz.elesson.currentlesson.shared.StudentRecord import java.time.temporal.ChronoUnit diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/finishlesson/Persistence.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/finishlesson/Persistence.kt deleted file mode 100644 index 3196ed0..0000000 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/finishlesson/Persistence.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.krzykrucz.elesson.currentlesson.domain.finishlesson - -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier - -typealias StoreLessonAsFinished = suspend (LessonIdentifier) -> Unit diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/PreparednessInSemesterReadModel.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/PreparednessInSemesterReadModel.kt deleted file mode 100644 index d8777c4..0000000 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/PreparednessInSemesterReadModel.kt +++ /dev/null @@ -1,39 +0,0 @@ -package com.krzykrucz.elesson.currentlesson.domain.preparedness - -import arrow.core.Either -import arrow.core.Option -import com.krzykrucz.elesson.currentlesson.domain.shared.ClassName -import com.krzykrucz.elesson.currentlesson.domain.shared.FirstName -import com.krzykrucz.elesson.currentlesson.domain.shared.SecondName -import com.krzykrucz.elesson.currentlesson.domain.shared.WholeNumber - - -typealias WriteUnpreparednessInTheRegister = suspend (StudentMarkedUnprepared) -> StudentSubjectUnpreparednessInASemester - -typealias GetStudentSubjectUnpreparednessInASemester = suspend (StudentInSemester) -> Either - -data class StudentInSemester(val className: ClassName, val firstName: FirstName, val secondName: SecondName) // todo add subject - -typealias StudentInSemesterReadError = String - -data class StudentSubjectUnpreparednessInASemester private constructor( - val student: StudentInSemester, val count: WholeNumber -) { - companion object { - fun createEmpty(student: StudentInSemester) = - StudentSubjectUnpreparednessInASemester( - student, - WholeNumber.ZERO - ) - - fun create(number: Int, student: StudentInSemester): Option = - WholeNumber.of(number) - ?.let { - StudentSubjectUnpreparednessInASemester( - student, - it - ) - } - .let { Option.fromNullable(it) } - } -} diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/startlesson/Persistence.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/startlesson/Persistence.kt deleted file mode 100644 index 69d0bb3..0000000 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/startlesson/Persistence.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.krzykrucz.elesson.currentlesson.domain.startlesson - -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier -import com.krzykrucz.elesson.currentlesson.domain.shared.StartedLesson - - -typealias PersistStartedLesson = suspend (StartedLesson) -> LessonIdentifier diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/topic/Persistence.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/topic/Persistence.kt deleted file mode 100644 index e7fa815..0000000 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/topic/Persistence.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.krzykrucz.elesson.currentlesson.domain.topic - -import com.krzykrucz.elesson.currentlesson.domain.shared.InProgressLesson -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier - - -typealias PersistInProgressLesson = suspend (LessonIdentifier, InProgressLesson) -> Unit diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/finishlesson/FinishLessonAdapters.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/finishlesson/FinishLessonAdapters.kt similarity index 60% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/finishlesson/FinishLessonAdapters.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/finishlesson/FinishLessonAdapters.kt index 19f64a8..58bdec3 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/finishlesson/FinishLessonAdapters.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/finishlesson/FinishLessonAdapters.kt @@ -1,6 +1,5 @@ -package com.krzykrucz.elesson.currentlesson.adapters.finishlesson +package com.krzykrucz.elesson.currentlesson.finishlesson -import com.krzykrucz.elesson.currentlesson.domain.finishlesson.finishLessonWorkflow import org.springframework.context.support.beans val finishLessonAdapters = beans { diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/finishlesson/FinishLessonRestAdapter.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/finishlesson/FinishLessonRestAdapter.kt similarity index 57% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/finishlesson/FinishLessonRestAdapter.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/finishlesson/FinishLessonRestAdapter.kt index 83ab8ff..c6345a9 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/finishlesson/FinishLessonRestAdapter.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/finishlesson/FinishLessonRestAdapter.kt @@ -1,11 +1,8 @@ -package com.krzykrucz.elesson.currentlesson.adapters.finishlesson +package com.krzykrucz.elesson.currentlesson.finishlesson -import com.krzykrucz.elesson.currentlesson.adapters.asyncMap -import com.krzykrucz.elesson.currentlesson.adapters.toServerResponse -import com.krzykrucz.elesson.currentlesson.domain.finishlesson.FinishLesson -import com.krzykrucz.elesson.currentlesson.domain.finishlesson.FinishLessonTime -import com.krzykrucz.elesson.currentlesson.domain.finishlesson.StoreLessonAsFinished -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier +import com.krzykrucz.elesson.currentlesson.shared.LessonIdentifier +import com.krzykrucz.elesson.currentlesson.shared.asyncMap +import com.krzykrucz.elesson.currentlesson.shared.toServerResponse import org.springframework.web.reactive.function.server.awaitBody import org.springframework.web.reactive.function.server.coRouter diff --git a/src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/finishlesson/FinishLessonTypesConfiguration.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/finishlesson/FinishLessonTypesConfiguration.kt similarity index 91% rename from src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/finishlesson/FinishLessonTypesConfiguration.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/finishlesson/FinishLessonTypesConfiguration.kt index 99c6b14..e51bf6b 100644 --- a/src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/finishlesson/FinishLessonTypesConfiguration.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/finishlesson/FinishLessonTypesConfiguration.kt @@ -1,13 +1,13 @@ -package com.krzykrucz.elesson.currentlesson.domain.finishlesson +package com.krzykrucz.elesson.currentlesson.finishlesson import arrow.core.Either import arrow.core.getOrElse -import com.krzykrucz.elesson.currentlesson.domain.shared.InProgressLesson -import com.krzykrucz.elesson.currentlesson.domain.shared.isError +import com.krzykrucz.elesson.currentlesson.shared.InProgressLesson +import com.krzykrucz.elesson.currentlesson.shared.isError import io.cucumber.core.api.TypeRegistry import io.cucumber.core.api.TypeRegistryConfigurer import io.cucumber.cucumberexpressions.ParameterType -import java.util.* +import java.util.Locale import java.util.Locale.ENGLISH @@ -71,4 +71,4 @@ class FinishLessonTypesConfiguration : TypeRegistryConfigurer { } } ) -} \ No newline at end of file +} diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/finishlesson/InProgressLessonReadModel.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/finishlesson/InProgressLessonReadModel.kt similarity index 56% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/finishlesson/InProgressLessonReadModel.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/finishlesson/InProgressLessonReadModel.kt index 8ff0a71..dd18470 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/finishlesson/InProgressLessonReadModel.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/finishlesson/InProgressLessonReadModel.kt @@ -1,13 +1,12 @@ -package com.krzykrucz.elesson.currentlesson.adapters.finishlesson +package com.krzykrucz.elesson.currentlesson.finishlesson import arrow.core.Either import arrow.core.toOption import com.krzykrucz.elesson.currentlesson.Database -import com.krzykrucz.elesson.currentlesson.domain.finishlesson.FinishLessonError -import com.krzykrucz.elesson.currentlesson.domain.finishlesson.FinishLessonError.LessonNotFound -import com.krzykrucz.elesson.currentlesson.domain.shared.InProgress -import com.krzykrucz.elesson.currentlesson.domain.shared.InProgressLesson -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier +import com.krzykrucz.elesson.currentlesson.finishlesson.FinishLessonError.LessonNotFound +import com.krzykrucz.elesson.currentlesson.shared.InProgress +import com.krzykrucz.elesson.currentlesson.shared.InProgressLesson +import com.krzykrucz.elesson.currentlesson.shared.LessonIdentifier // TODO extract port suspend fun readInProgressLesson(id: LessonIdentifier): Either = diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/finishlesson/Persistence.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/finishlesson/Persistence.kt new file mode 100644 index 0000000..f494ca5 --- /dev/null +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/finishlesson/Persistence.kt @@ -0,0 +1,5 @@ +package com.krzykrucz.elesson.currentlesson.finishlesson + +import com.krzykrucz.elesson.currentlesson.shared.LessonIdentifier + +typealias StoreLessonAsFinished = suspend (LessonIdentifier) -> Unit diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/finishlesson/StoreLessonAsFinishedAdapter.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/finishlesson/StoreLessonAsFinishedAdapter.kt new file mode 100644 index 0000000..e8784b9 --- /dev/null +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/finishlesson/StoreLessonAsFinishedAdapter.kt @@ -0,0 +1,11 @@ +package com.krzykrucz.elesson.currentlesson.finishlesson + +import com.krzykrucz.elesson.currentlesson.Database +import com.krzykrucz.elesson.currentlesson.shared.Finished +import com.krzykrucz.elesson.currentlesson.shared.LessonIdentifier + +internal val storeLessonAsFinishedAdapter: StoreLessonAsFinished = { lessonId: LessonIdentifier -> + Database.LESSON_DATABASE.compute(lessonId) { _, lesson -> + lesson?.copy(status = Finished) + } +} diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/finishlesson/Types.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/finishlesson/Types.kt similarity index 71% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/finishlesson/Types.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/finishlesson/Types.kt index 8d30bdc..bb170df 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/finishlesson/Types.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/finishlesson/Types.kt @@ -1,7 +1,7 @@ -package com.krzykrucz.elesson.currentlesson.domain.finishlesson +package com.krzykrucz.elesson.currentlesson.finishlesson -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonOrdinalInSemester -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonTopic +import com.krzykrucz.elesson.currentlesson.shared.LessonOrdinalInSemester +import com.krzykrucz.elesson.currentlesson.shared.LessonTopic import java.time.LocalTime data class FinishedLesson private constructor(val lessonTopic: LessonTopic, val lessonOrdinalInSemester: LessonOrdinalInSemester) { diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/finishlesson/Workflows.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/finishlesson/Workflows.kt similarity index 78% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/finishlesson/Workflows.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/finishlesson/Workflows.kt index fb2a26d..befb192 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/finishlesson/Workflows.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/finishlesson/Workflows.kt @@ -1,9 +1,9 @@ -package com.krzykrucz.elesson.currentlesson.domain.finishlesson +package com.krzykrucz.elesson.currentlesson.finishlesson import arrow.core.Either import arrow.core.maybe -import com.krzykrucz.elesson.currentlesson.domain.shared.InProgressLesson -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonHourNumber +import com.krzykrucz.elesson.currentlesson.shared.InProgressLesson +import com.krzykrucz.elesson.currentlesson.shared.LessonHourNumber typealias CheckIfBellRang = (LessonHourNumber, FinishLessonTime) -> Boolean diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/LessonProgressApi.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/lessonprogress/LessonProgressApi.kt similarity index 68% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/LessonProgressApi.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/lessonprogress/LessonProgressApi.kt index a4d96cb..8628c35 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/LessonProgressApi.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/lessonprogress/LessonProgressApi.kt @@ -1,14 +1,14 @@ -package com.krzykrucz.elesson.currentlesson.adapters.lessonprogress +package com.krzykrucz.elesson.currentlesson.lessonprogress import arrow.core.Option import arrow.core.extensions.fx -import com.krzykrucz.elesson.currentlesson.adapters.RestApi -import com.krzykrucz.elesson.currentlesson.adapters.asyncFlatMap -import com.krzykrucz.elesson.currentlesson.adapters.toServerResponse -import com.krzykrucz.elesson.currentlesson.domain.shared.ClassName -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonHourNumber -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier -import com.krzykrucz.elesson.currentlesson.domain.shared.NonEmptyText +import com.krzykrucz.elesson.currentlesson.shared.ClassName +import com.krzykrucz.elesson.currentlesson.shared.LessonHourNumber +import com.krzykrucz.elesson.currentlesson.shared.LessonIdentifier +import com.krzykrucz.elesson.currentlesson.shared.NonEmptyText +import com.krzykrucz.elesson.currentlesson.shared.RestApi +import com.krzykrucz.elesson.currentlesson.shared.asyncFlatMap +import com.krzykrucz.elesson.currentlesson.shared.toServerResponse import java.time.LocalDate import java.util.Optional diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/LessonProgressDatabaseAdapter.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/lessonprogress/LessonProgressDatabaseAdapter.kt similarity index 93% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/LessonProgressDatabaseAdapter.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/lessonprogress/LessonProgressDatabaseAdapter.kt index 3b26ff3..7cc75eb 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/LessonProgressDatabaseAdapter.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/lessonprogress/LessonProgressDatabaseAdapter.kt @@ -1,4 +1,4 @@ -package com.krzykrucz.elesson.currentlesson.adapters.lessonprogress +package com.krzykrucz.elesson.currentlesson.lessonprogress import arrow.core.toOption import com.krzykrucz.elesson.currentlesson.Database diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/LessonProgressRestAdapter.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/lessonprogress/LessonProgressRestAdapter.kt similarity index 89% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/LessonProgressRestAdapter.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/lessonprogress/LessonProgressRestAdapter.kt index c58c2d8..fa25979 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/LessonProgressRestAdapter.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/lessonprogress/LessonProgressRestAdapter.kt @@ -1,6 +1,6 @@ -package com.krzykrucz.elesson.currentlesson.adapters.lessonprogress +package com.krzykrucz.elesson.currentlesson.lessonprogress -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonTopic +import com.krzykrucz.elesson.currentlesson.shared.LessonTopic import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import org.springframework.web.reactive.function.server.coRouter diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/Persistence.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/lessonprogress/Persistence.kt similarity index 65% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/Persistence.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/lessonprogress/Persistence.kt index 403a442..5db6513 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/Persistence.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/lessonprogress/Persistence.kt @@ -1,7 +1,7 @@ -package com.krzykrucz.elesson.currentlesson.adapters.lessonprogress +package com.krzykrucz.elesson.currentlesson.lessonprogress import arrow.core.Either -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier +import com.krzykrucz.elesson.currentlesson.shared.LessonIdentifier sealed class LessonProgressError { data class LessonNotFound(val error: String = "Could not find lesson") : LessonProgressError() diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/lessonprogress/Types.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/lessonprogress/Types.kt new file mode 100644 index 0000000..9b1a074 --- /dev/null +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/lessonprogress/Types.kt @@ -0,0 +1,21 @@ +package com.krzykrucz.elesson.currentlesson.lessonprogress + +import arrow.core.Option +import com.krzykrucz.elesson.currentlesson.shared.ClassName +import com.krzykrucz.elesson.currentlesson.shared.LessonStatus +import com.krzykrucz.elesson.currentlesson.shared.LessonSubject +import com.krzykrucz.elesson.currentlesson.shared.LessonTopic +import com.krzykrucz.elesson.currentlesson.shared.Semester +import java.time.LocalDate + + +typealias LessonDate = LocalDate + +data class LessonProgress( + val semester: Semester, + val className: ClassName, + val subject: LessonSubject, + val date: LessonDate, + val topic: Option, + val status: LessonStatus +) diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/Api.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/preparedness/Api.kt similarity index 78% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/Api.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/preparedness/Api.kt index 299ee0f..2ceafa5 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/Api.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/preparedness/Api.kt @@ -1,9 +1,9 @@ -package com.krzykrucz.elesson.currentlesson.domain.preparedness +package com.krzykrucz.elesson.currentlesson.preparedness import arrow.core.Either -import com.krzykrucz.elesson.currentlesson.adapters.asyncDoIfRight -import com.krzykrucz.elesson.currentlesson.adapters.asyncFlatMap -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier +import com.krzykrucz.elesson.currentlesson.shared.LessonIdentifier +import com.krzykrucz.elesson.currentlesson.shared.asyncDoIfRight +import com.krzykrucz.elesson.currentlesson.shared.asyncFlatMap typealias ReportUnpreparedStudentApi = diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/CurrentLessonDatabaseAdapter.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/preparedness/CurrentLessonDatabaseAdapter.kt similarity index 77% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/CurrentLessonDatabaseAdapter.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/preparedness/CurrentLessonDatabaseAdapter.kt index 6780a00..c6c8e71 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/CurrentLessonDatabaseAdapter.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/preparedness/CurrentLessonDatabaseAdapter.kt @@ -1,11 +1,9 @@ -package com.krzykrucz.elesson.currentlesson.adapters.preparedness +package com.krzykrucz.elesson.currentlesson.preparedness import arrow.core.orElse import arrow.core.toOption import com.krzykrucz.elesson.currentlesson.Database import com.krzykrucz.elesson.currentlesson.PersistentCurrentLesson -import com.krzykrucz.elesson.currentlesson.domain.preparedness.FindCurrentLesson -import com.krzykrucz.elesson.currentlesson.domain.preparedness.UnpreparednessError import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/EventPublisherAdapter.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/preparedness/EventPublisherAdapter.kt similarity index 79% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/EventPublisherAdapter.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/preparedness/EventPublisherAdapter.kt index 66468ba..5df7dd6 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/EventPublisherAdapter.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/preparedness/EventPublisherAdapter.kt @@ -1,6 +1,5 @@ -package com.krzykrucz.elesson.currentlesson.adapters.preparedness +package com.krzykrucz.elesson.currentlesson.preparedness -import com.krzykrucz.elesson.currentlesson.domain.preparedness.NotifyStudentMarkedUnprepared import org.springframework.context.ApplicationEventPublisher import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/Persistence.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/preparedness/Persistence.kt similarity index 61% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/Persistence.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/preparedness/Persistence.kt index 87b0579..c2e225e 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/Persistence.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/preparedness/Persistence.kt @@ -1,8 +1,8 @@ -package com.krzykrucz.elesson.currentlesson.domain.preparedness +package com.krzykrucz.elesson.currentlesson.preparedness import arrow.core.Either -import com.krzykrucz.elesson.currentlesson.domain.shared.CurrentLesson -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier +import com.krzykrucz.elesson.currentlesson.shared.CurrentLesson +import com.krzykrucz.elesson.currentlesson.shared.LessonIdentifier typealias PersistUnpreparedStudentToLesson = suspend (StudentMarkedUnprepared) -> LessonIdentifier diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/preparedness/PreparednessInSemesterReadModel.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/preparedness/PreparednessInSemesterReadModel.kt new file mode 100644 index 0000000..0b56411 --- /dev/null +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/preparedness/PreparednessInSemesterReadModel.kt @@ -0,0 +1,86 @@ +package com.krzykrucz.elesson.currentlesson.preparedness + +import arrow.core.Either +import arrow.core.Option +import arrow.core.getOrElse +import arrow.core.right +import com.krzykrucz.elesson.currentlesson.preparedness.StudentInSemesterReadModel.READ_MODEL +import com.krzykrucz.elesson.currentlesson.shared.ClassName +import com.krzykrucz.elesson.currentlesson.shared.FirstName +import com.krzykrucz.elesson.currentlesson.shared.SecondName +import com.krzykrucz.elesson.currentlesson.shared.WholeNumber +import kotlinx.coroutines.runBlocking +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration +import org.springframework.context.event.EventListener +import java.util.concurrent.ConcurrentHashMap + + +typealias WriteUnpreparednessInTheRegister = suspend (StudentMarkedUnprepared) -> StudentSubjectUnpreparednessInASemester + +typealias GetStudentSubjectUnpreparednessInASemester = suspend (StudentInSemester) -> Either + +data class StudentInSemester(val className: ClassName, val firstName: FirstName, val secondName: SecondName) // todo add subject + +typealias StudentInSemesterReadError = String + +data class StudentSubjectUnpreparednessInASemester private constructor( + val student: StudentInSemester, val count: WholeNumber +) { + companion object { + fun createEmpty(student: StudentInSemester) = + StudentSubjectUnpreparednessInASemester( + student, + WholeNumber.ZERO + ) + + fun create(number: Int, student: StudentInSemester): Option = + WholeNumber.of(number) + ?.let { + StudentSubjectUnpreparednessInASemester( + student, + it + ) + } + .let { Option.fromNullable(it) } + } +} + + +val writeUnpreparednessInTheRegister: WriteUnpreparednessInTheRegister = { + StudentInSemester( + it.lessonId.className, + it.unpreparedStudent.firstName, + it.unpreparedStudent.secondName + ) + .let { READ_MODEL[it] ?: StudentSubjectUnpreparednessInASemester.createEmpty(it) } + .let { it.copy(count = it.count.inc()) } + .apply { READ_MODEL[this.student] = this } +} + +private val getStudentSubjectUnpreparednessInASemester: GetStudentSubjectUnpreparednessInASemester = { student -> + READ_MODEL[student] + .let { Option.fromNullable(it) } + .getOrElse { StudentSubjectUnpreparednessInASemester.createEmpty(student) } + .right() +} + +object StudentInSemesterReadModel { + + val READ_MODEL: MutableMap = ConcurrentHashMap() + +} + +@Configuration +class ReadModelBeans { + @Bean + fun getBean() = + getStudentSubjectUnpreparednessInASemester + + @EventListener + fun eventListenerStudentMarkedUnprepared(event: StudentMarkedUnprepared) { + runBlocking { + writeUnpreparednessInTheRegister(event) + } + } +} diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/StudentUnpreparedDomainConfig.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/preparedness/StudentUnpreparedDomainConfig.kt similarity index 55% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/StudentUnpreparedDomainConfig.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/preparedness/StudentUnpreparedDomainConfig.kt index 9b32db7..07d5dba 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/StudentUnpreparedDomainConfig.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/preparedness/StudentUnpreparedDomainConfig.kt @@ -1,11 +1,5 @@ -package com.krzykrucz.elesson.currentlesson.adapters.preparedness +package com.krzykrucz.elesson.currentlesson.preparedness -import com.krzykrucz.elesson.currentlesson.domain.preparedness.FindCurrentLesson -import com.krzykrucz.elesson.currentlesson.domain.preparedness.GetStudentSubjectUnpreparednessInASemester -import com.krzykrucz.elesson.currentlesson.domain.preparedness.NotifyStudentMarkedUnprepared -import com.krzykrucz.elesson.currentlesson.domain.preparedness.PersistUnpreparedStudentToLesson -import com.krzykrucz.elesson.currentlesson.domain.preparedness.ReportUnpreparedStudentApi -import com.krzykrucz.elesson.currentlesson.domain.preparedness.reportUnpreparedStudentApi import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/Types.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/preparedness/Types.kt similarity index 76% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/Types.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/preparedness/Types.kt index b0a69cd..b72e61e 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/Types.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/preparedness/Types.kt @@ -1,8 +1,8 @@ -package com.krzykrucz.elesson.currentlesson.domain.preparedness +package com.krzykrucz.elesson.currentlesson.preparedness -import com.krzykrucz.elesson.currentlesson.domain.shared.FirstName -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier -import com.krzykrucz.elesson.currentlesson.domain.shared.SecondName +import com.krzykrucz.elesson.currentlesson.shared.FirstName +import com.krzykrucz.elesson.currentlesson.shared.LessonIdentifier +import com.krzykrucz.elesson.currentlesson.shared.SecondName import java.time.LocalDateTime diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/UnpreparedStudentDatabaseAdapter.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/preparedness/UnpreparedStudentDatabaseAdapter.kt similarity index 78% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/UnpreparedStudentDatabaseAdapter.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/preparedness/UnpreparedStudentDatabaseAdapter.kt index c0a1255..5551b65 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/UnpreparedStudentDatabaseAdapter.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/preparedness/UnpreparedStudentDatabaseAdapter.kt @@ -1,7 +1,6 @@ -package com.krzykrucz.elesson.currentlesson.adapters.preparedness +package com.krzykrucz.elesson.currentlesson.preparedness import com.krzykrucz.elesson.currentlesson.Database -import com.krzykrucz.elesson.currentlesson.domain.preparedness.PersistUnpreparedStudentToLesson import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/UnpreparedStudentRestAdapter.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/preparedness/UnpreparedStudentRestAdapter.kt similarity index 80% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/UnpreparedStudentRestAdapter.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/preparedness/UnpreparedStudentRestAdapter.kt index 5678952..9a75aa1 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/preparedness/UnpreparedStudentRestAdapter.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/preparedness/UnpreparedStudentRestAdapter.kt @@ -1,8 +1,6 @@ -package com.krzykrucz.elesson.currentlesson.adapters.preparedness +package com.krzykrucz.elesson.currentlesson.preparedness -import com.krzykrucz.elesson.currentlesson.domain.preparedness.ReportUnpreparedStudentApi -import com.krzykrucz.elesson.currentlesson.domain.preparedness.StudentReportingUnpreparedness -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier +import com.krzykrucz.elesson.currentlesson.shared.LessonIdentifier import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import org.springframework.http.HttpStatus diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/Workflows.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/preparedness/Workflows.kt similarity index 88% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/Workflows.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/preparedness/Workflows.kt index 9986d29..361e15b 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/Workflows.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/preparedness/Workflows.kt @@ -1,19 +1,19 @@ -package com.krzykrucz.elesson.currentlesson.domain.preparedness +package com.krzykrucz.elesson.currentlesson.preparedness import arrow.core.Either import arrow.core.extensions.either.applicativeError.handleError import arrow.core.extensions.list.foldable.find import arrow.core.left import arrow.core.maybe -import com.krzykrucz.elesson.currentlesson.adapters.asyncFlatMap -import com.krzykrucz.elesson.currentlesson.adapters.asyncMap -import com.krzykrucz.elesson.currentlesson.domain.attendance.CheckedAttendanceList -import com.krzykrucz.elesson.currentlesson.domain.attendance.PresentStudent -import com.krzykrucz.elesson.currentlesson.domain.shared.ClassName -import com.krzykrucz.elesson.currentlesson.domain.shared.CurrentLesson -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonAfterAttendance -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier -import com.krzykrucz.elesson.currentlesson.domain.shared.failIf +import com.krzykrucz.elesson.currentlesson.attendance.CheckedAttendanceList +import com.krzykrucz.elesson.currentlesson.attendance.PresentStudent +import com.krzykrucz.elesson.currentlesson.shared.ClassName +import com.krzykrucz.elesson.currentlesson.shared.CurrentLesson +import com.krzykrucz.elesson.currentlesson.shared.LessonAfterAttendance +import com.krzykrucz.elesson.currentlesson.shared.LessonIdentifier +import com.krzykrucz.elesson.currentlesson.shared.asyncFlatMap +import com.krzykrucz.elesson.currentlesson.shared.asyncMap +import com.krzykrucz.elesson.currentlesson.shared.failIf private typealias CheckNumberOfTimesStudentWasUnpreparedInSemester = suspend (PresentStudent, ClassName) -> Either diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/shared/Base.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/shared/Base.kt similarity index 96% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/shared/Base.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/shared/Base.kt index 6e3b9a3..fd059c9 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/shared/Base.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/shared/Base.kt @@ -1,4 +1,4 @@ -package com.krzykrucz.elesson.currentlesson.domain.shared +package com.krzykrucz.elesson.currentlesson.shared import arrow.core.Either import arrow.core.None diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/shared/CurrentLessonSharedKernel.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/shared/CurrentLessonSharedKernel.kt similarity index 94% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/shared/CurrentLessonSharedKernel.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/shared/CurrentLessonSharedKernel.kt index dd094d4..9367f5e 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/shared/CurrentLessonSharedKernel.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/shared/CurrentLessonSharedKernel.kt @@ -1,11 +1,11 @@ -package com.krzykrucz.elesson.currentlesson.domain.shared +package com.krzykrucz.elesson.currentlesson.shared import arrow.core.Either import arrow.core.None import arrow.core.Option import arrow.core.Some -import com.krzykrucz.elesson.currentlesson.domain.attendance.CheckedAttendanceList -import com.krzykrucz.elesson.currentlesson.domain.preparedness.StudentsUnpreparedForLesson +import com.krzykrucz.elesson.currentlesson.attendance.CheckedAttendanceList +import com.krzykrucz.elesson.currentlesson.preparedness.StudentsUnpreparedForLesson import java.time.LocalDate import java.time.LocalTime diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/CoroutineExtensions.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/shared/Extensions.kt similarity index 95% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/CoroutineExtensions.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/shared/Extensions.kt index d7eca08..c121304 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/CoroutineExtensions.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/shared/Extensions.kt @@ -1,4 +1,4 @@ -package com.krzykrucz.elesson.currentlesson.adapters +package com.krzykrucz.elesson.currentlesson.shared import arrow.core.Either import arrow.core.EitherOf diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/startlesson/CheckScheduledLessonAdapter.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/startlesson/CheckScheduledLessonAdapter.kt new file mode 100644 index 0000000..5a05db3 --- /dev/null +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/startlesson/CheckScheduledLessonAdapter.kt @@ -0,0 +1,33 @@ +package com.krzykrucz.elesson.currentlesson.startlesson + +import com.krzykrucz.elesson.currentlesson.shared.ClassName +import com.krzykrucz.elesson.currentlesson.shared.LessonHourNumber +import com.krzykrucz.elesson.currentlesson.shared.LessonSubject +import com.krzykrucz.elesson.currentlesson.shared.NaturalNumber +import com.krzykrucz.elesson.currentlesson.shared.NonEmptyText +import com.krzykrucz.elesson.currentlesson.shared.Teacher +import java.time.LocalDateTime + + +internal val checkScheduledLessonAdapter: FetchScheduledLesson = { teacher: Teacher, time: LocalDateTime -> + LessonHourNumber.of(NaturalNumber.THREE) + .map { + ScheduledLesson( + time, + it, + teacher, + ClassName( + NonEmptyText.of( + "Gryffindor" + )!! + ), + LessonSubject( + NonEmptyText( + "Elixirs" + ) + ) + ) + } + .toEither { StartLessonError.NotScheduledLesson() } +} + diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/FetchClassRegistryAdapter.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/startlesson/FetchClassRegistryAdapter.kt similarity index 56% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/FetchClassRegistryAdapter.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/startlesson/FetchClassRegistryAdapter.kt index 5a95a41..e4ff7ad 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/FetchClassRegistryAdapter.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/startlesson/FetchClassRegistryAdapter.kt @@ -1,14 +1,13 @@ -package com.krzykrucz.elesson.currentlesson.adapters.startlesson +package com.krzykrucz.elesson.currentlesson.startlesson import arrow.core.right -import com.krzykrucz.elesson.currentlesson.domain.shared.ClassRegistry -import com.krzykrucz.elesson.currentlesson.domain.shared.FirstName -import com.krzykrucz.elesson.currentlesson.domain.shared.NaturalNumber -import com.krzykrucz.elesson.currentlesson.domain.shared.NonEmptyText -import com.krzykrucz.elesson.currentlesson.domain.shared.NumberInRegister -import com.krzykrucz.elesson.currentlesson.domain.shared.SecondName -import com.krzykrucz.elesson.currentlesson.domain.shared.StudentRecord -import com.krzykrucz.elesson.currentlesson.domain.startlesson.FetchClassRegistry +import com.krzykrucz.elesson.currentlesson.shared.ClassRegistry +import com.krzykrucz.elesson.currentlesson.shared.FirstName +import com.krzykrucz.elesson.currentlesson.shared.NaturalNumber +import com.krzykrucz.elesson.currentlesson.shared.NonEmptyText +import com.krzykrucz.elesson.currentlesson.shared.NumberInRegister +import com.krzykrucz.elesson.currentlesson.shared.SecondName +import com.krzykrucz.elesson.currentlesson.shared.StudentRecord internal val fetchClassRegistryAdapter: FetchClassRegistry = { className -> diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/startlesson/Persistence.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/startlesson/Persistence.kt new file mode 100644 index 0000000..12fc1e2 --- /dev/null +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/startlesson/Persistence.kt @@ -0,0 +1,7 @@ +package com.krzykrucz.elesson.currentlesson.startlesson + +import com.krzykrucz.elesson.currentlesson.shared.LessonIdentifier +import com.krzykrucz.elesson.currentlesson.shared.StartedLesson + + +typealias PersistStartedLesson = suspend (StartedLesson) -> LessonIdentifier diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartLessonAdapters.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/startlesson/StartLessonAdapters.kt similarity index 63% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartLessonAdapters.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/startlesson/StartLessonAdapters.kt index f801dab..5bf6694 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartLessonAdapters.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/startlesson/StartLessonAdapters.kt @@ -1,6 +1,6 @@ -package com.krzykrucz.elesson.currentlesson.adapters.startlesson +package com.krzykrucz.elesson.currentlesson.startlesson -import com.krzykrucz.elesson.currentlesson.adapters.startlesson.rest.startLessonRestAdapter +import com.krzykrucz.elesson.currentlesson.startlesson.rest.startLessonRestAdapter import org.springframework.context.support.beans val startLessonAdapters = beans { diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartLessonApi.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/startlesson/StartLessonApi.kt similarity index 55% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartLessonApi.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/startlesson/StartLessonApi.kt index 11e3a84..8c73bd2 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartLessonApi.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/startlesson/StartLessonApi.kt @@ -1,19 +1,14 @@ -package com.krzykrucz.elesson.currentlesson.adapters.startlesson +package com.krzykrucz.elesson.currentlesson.startlesson -import com.krzykrucz.elesson.currentlesson.adapters.RestApi -import com.krzykrucz.elesson.currentlesson.adapters.asyncDoIfRight -import com.krzykrucz.elesson.currentlesson.adapters.toServerResponse -import com.krzykrucz.elesson.currentlesson.domain.shared.FirstName -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier -import com.krzykrucz.elesson.currentlesson.domain.shared.NonEmptyText -import com.krzykrucz.elesson.currentlesson.domain.shared.SecondName -import com.krzykrucz.elesson.currentlesson.domain.shared.StartedLesson -import com.krzykrucz.elesson.currentlesson.domain.shared.Teacher -import com.krzykrucz.elesson.currentlesson.domain.startlesson.FetchClassRegistry -import com.krzykrucz.elesson.currentlesson.domain.startlesson.FetchScheduledLesson -import com.krzykrucz.elesson.currentlesson.domain.startlesson.PersistStartedLesson -import com.krzykrucz.elesson.currentlesson.domain.startlesson.StartLesson -import com.krzykrucz.elesson.currentlesson.domain.startlesson.startLessonWorkflow +import com.krzykrucz.elesson.currentlesson.shared.FirstName +import com.krzykrucz.elesson.currentlesson.shared.LessonIdentifier +import com.krzykrucz.elesson.currentlesson.shared.NonEmptyText +import com.krzykrucz.elesson.currentlesson.shared.RestApi +import com.krzykrucz.elesson.currentlesson.shared.SecondName +import com.krzykrucz.elesson.currentlesson.shared.StartedLesson +import com.krzykrucz.elesson.currentlesson.shared.Teacher +import com.krzykrucz.elesson.currentlesson.shared.asyncDoIfRight +import com.krzykrucz.elesson.currentlesson.shared.toServerResponse import org.springframework.web.reactive.function.server.awaitBody import java.time.LocalDateTime import javax.validation.constraints.NotEmpty diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/startlesson/StartLessonRestAdapter.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/startlesson/StartLessonRestAdapter.kt new file mode 100644 index 0000000..4e40f71 --- /dev/null +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/startlesson/StartLessonRestAdapter.kt @@ -0,0 +1,18 @@ +package com.krzykrucz.elesson.currentlesson.startlesson.rest + +import com.krzykrucz.elesson.currentlesson.startlesson.FetchClassRegistry +import com.krzykrucz.elesson.currentlesson.startlesson.FetchScheduledLesson +import com.krzykrucz.elesson.currentlesson.startlesson.PersistStartedLesson +import com.krzykrucz.elesson.currentlesson.startlesson.startLessonApi +import org.springframework.web.reactive.function.server.coRouter + + +internal fun startLessonRestAdapter( + fetchScheduledLesson: FetchScheduledLesson, + fetchClassRegistry: FetchClassRegistry, + persistStartedLesson: PersistStartedLesson +) = + coRouter { + POST("/startlesson", startLessonApi(fetchScheduledLesson, fetchClassRegistry, persistStartedLesson)) + } + diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartedLessonPersistenceAdapter.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/startlesson/StartedLessonPersistenceAdapter.kt similarity index 78% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartedLessonPersistenceAdapter.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/startlesson/StartedLessonPersistenceAdapter.kt index a0ecc43..1f7dc1d 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartedLessonPersistenceAdapter.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/startlesson/StartedLessonPersistenceAdapter.kt @@ -1,12 +1,11 @@ -package com.krzykrucz.elesson.currentlesson.adapters.startlesson +package com.krzykrucz.elesson.currentlesson.startlesson import arrow.core.Option import com.krzykrucz.elesson.currentlesson.Database.LESSON_DATABASE import com.krzykrucz.elesson.currentlesson.PersistentCurrentLesson -import com.krzykrucz.elesson.currentlesson.domain.shared.InProgress -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier -import com.krzykrucz.elesson.currentlesson.domain.shared.StartedLesson -import com.krzykrucz.elesson.currentlesson.domain.startlesson.PersistStartedLesson +import com.krzykrucz.elesson.currentlesson.shared.InProgress +import com.krzykrucz.elesson.currentlesson.shared.LessonIdentifier +import com.krzykrucz.elesson.currentlesson.shared.StartedLesson // TODO maybe check if lesson not started somewhere else diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/startlesson/Types.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/startlesson/Types.kt similarity index 86% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/startlesson/Types.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/startlesson/Types.kt index 38d0cbe..feac525 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/startlesson/Types.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/startlesson/Types.kt @@ -1,9 +1,9 @@ -package com.krzykrucz.elesson.currentlesson.domain.startlesson +package com.krzykrucz.elesson.currentlesson.startlesson -import com.krzykrucz.elesson.currentlesson.domain.shared.ClassName -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonHourNumber -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonSubject -import com.krzykrucz.elesson.currentlesson.domain.shared.Teacher +import com.krzykrucz.elesson.currentlesson.shared.ClassName +import com.krzykrucz.elesson.currentlesson.shared.LessonHourNumber +import com.krzykrucz.elesson.currentlesson.shared.LessonSubject +import com.krzykrucz.elesson.currentlesson.shared.Teacher import java.time.LocalDateTime typealias ScheduledLessonStartTime = LocalDateTime diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/startlesson/Workflows.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/startlesson/Workflows.kt similarity index 81% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/startlesson/Workflows.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/startlesson/Workflows.kt index 899e881..085f5ca 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/startlesson/Workflows.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/startlesson/Workflows.kt @@ -1,13 +1,13 @@ -package com.krzykrucz.elesson.currentlesson.domain.startlesson +package com.krzykrucz.elesson.currentlesson.startlesson import arrow.core.Either import arrow.core.flatMap -import com.krzykrucz.elesson.currentlesson.adapters.asyncFlatMap -import com.krzykrucz.elesson.currentlesson.domain.shared.ClassName -import com.krzykrucz.elesson.currentlesson.domain.shared.ClassRegistry -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier -import com.krzykrucz.elesson.currentlesson.domain.shared.StartedLesson -import com.krzykrucz.elesson.currentlesson.domain.shared.Teacher +import com.krzykrucz.elesson.currentlesson.shared.ClassName +import com.krzykrucz.elesson.currentlesson.shared.ClassRegistry +import com.krzykrucz.elesson.currentlesson.shared.LessonIdentifier +import com.krzykrucz.elesson.currentlesson.shared.StartedLesson +import com.krzykrucz.elesson.currentlesson.shared.Teacher +import com.krzykrucz.elesson.currentlesson.shared.asyncFlatMap import java.time.LocalDateTime diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/topic/Persistence.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/topic/Persistence.kt new file mode 100644 index 0000000..e2f0649 --- /dev/null +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/topic/Persistence.kt @@ -0,0 +1,7 @@ +package com.krzykrucz.elesson.currentlesson.topic + +import com.krzykrucz.elesson.currentlesson.shared.InProgressLesson +import com.krzykrucz.elesson.currentlesson.shared.LessonIdentifier + + +typealias PersistInProgressLesson = suspend (LessonIdentifier, InProgressLesson) -> Unit diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/topic/TopicAdapters.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/topic/TopicAdapters.kt similarity index 69% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/topic/TopicAdapters.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/topic/TopicAdapters.kt index f671df1..74a619c 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/topic/TopicAdapters.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/topic/TopicAdapters.kt @@ -1,6 +1,5 @@ -package com.krzykrucz.elesson.currentlesson.adapters.topic +package com.krzykrucz.elesson.currentlesson.topic -import com.krzykrucz.elesson.currentlesson.domain.topic.chooseTopicWorkflow import org.springframework.context.support.beans val topicAdapters = beans { diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/topic/TopicPersistenceAdapter.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/topic/TopicPersistenceAdapter.kt similarity index 62% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/topic/TopicPersistenceAdapter.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/topic/TopicPersistenceAdapter.kt index a341cac..0a93a6e 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/topic/TopicPersistenceAdapter.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/topic/TopicPersistenceAdapter.kt @@ -1,16 +1,12 @@ -package com.krzykrucz.elesson.currentlesson.adapters.topic +package com.krzykrucz.elesson.currentlesson.topic import arrow.core.getOrElse import arrow.core.some import arrow.core.toOption import arrow.fx.IO import com.krzykrucz.elesson.currentlesson.Database -import com.krzykrucz.elesson.currentlesson.domain.attendance.CheckedAttendanceList -import com.krzykrucz.elesson.currentlesson.domain.shared.Finished -import com.krzykrucz.elesson.currentlesson.domain.topic.CheckIfAttendanceIsChecked -import com.krzykrucz.elesson.currentlesson.domain.topic.CountFinishedLessons -import com.krzykrucz.elesson.currentlesson.domain.topic.FinishedLessonsCount -import com.krzykrucz.elesson.currentlesson.domain.topic.PersistInProgressLesson +import com.krzykrucz.elesson.currentlesson.attendance.CheckedAttendanceList +import com.krzykrucz.elesson.currentlesson.shared.Finished internal val fetchFinishedLessonsCount: CountFinishedLessons = { diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/topic/TopicRestAdapter.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/topic/TopicRestAdapter.kt similarity index 56% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/topic/TopicRestAdapter.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/topic/TopicRestAdapter.kt index f1fe917..4d8950a 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/adapters/topic/TopicRestAdapter.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/topic/TopicRestAdapter.kt @@ -1,12 +1,10 @@ -package com.krzykrucz.elesson.currentlesson.adapters.topic +package com.krzykrucz.elesson.currentlesson.topic -import com.krzykrucz.elesson.currentlesson.adapters.asyncDoIfRight -import com.krzykrucz.elesson.currentlesson.adapters.toServerResponse -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier -import com.krzykrucz.elesson.currentlesson.domain.shared.TopicTitle -import com.krzykrucz.elesson.currentlesson.domain.topic.ChooseTopic -import com.krzykrucz.elesson.currentlesson.domain.topic.PersistInProgressLesson +import com.krzykrucz.elesson.currentlesson.shared.LessonIdentifier +import com.krzykrucz.elesson.currentlesson.shared.TopicTitle +import com.krzykrucz.elesson.currentlesson.shared.asyncDoIfRight +import com.krzykrucz.elesson.currentlesson.shared.toServerResponse import org.springframework.web.reactive.function.server.awaitBody import org.springframework.web.reactive.function.server.coRouter diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/topic/Types.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/topic/Types.kt similarity index 80% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/topic/Types.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/topic/Types.kt index 099f59a..88f7d83 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/topic/Types.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/topic/Types.kt @@ -1,4 +1,4 @@ -package com.krzykrucz.elesson.currentlesson.domain.topic +package com.krzykrucz.elesson.currentlesson.topic data class FinishedLessonsCount(val count: Int) diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/topic/Workflows.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/topic/Workflows.kt similarity index 70% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/topic/Workflows.kt rename to src/main/kotlin/com/krzykrucz/elesson/currentlesson/topic/Workflows.kt index a3338b4..e633ff8 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/domain/topic/Workflows.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/topic/Workflows.kt @@ -1,14 +1,14 @@ -package com.krzykrucz.elesson.currentlesson.domain.topic +package com.krzykrucz.elesson.currentlesson.topic import arrow.core.Either import arrow.core.getOrElse import arrow.core.maybe -import com.krzykrucz.elesson.currentlesson.domain.shared.InProgressLesson -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonOrdinalInSemester -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonTopic -import com.krzykrucz.elesson.currentlesson.domain.shared.NaturalNumber -import com.krzykrucz.elesson.currentlesson.domain.shared.TopicTitle +import com.krzykrucz.elesson.currentlesson.shared.InProgressLesson +import com.krzykrucz.elesson.currentlesson.shared.LessonIdentifier +import com.krzykrucz.elesson.currentlesson.shared.LessonOrdinalInSemester +import com.krzykrucz.elesson.currentlesson.shared.LessonTopic +import com.krzykrucz.elesson.currentlesson.shared.NaturalNumber +import com.krzykrucz.elesson.currentlesson.shared.TopicTitle typealias CountFinishedLessons = suspend () -> FinishedLessonsCount diff --git a/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/AcceptanceSpec.groovy b/src/test/groovy/com/krzykrucz/elesson/currentlesson/AcceptanceSpec.groovy similarity index 65% rename from src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/AcceptanceSpec.groovy rename to src/test/groovy/com/krzykrucz/elesson/currentlesson/AcceptanceSpec.groovy index c843310..931dd18 100644 --- a/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/AcceptanceSpec.groovy +++ b/src/test/groovy/com/krzykrucz/elesson/currentlesson/AcceptanceSpec.groovy @@ -1,7 +1,17 @@ -package com.krzykrucz.elesson.currentlesson.adapters - -import com.krzykrucz.elesson.currentlesson.domain.attendance.PresentStudent -import com.krzykrucz.elesson.currentlesson.domain.shared.* +package com.krzykrucz.elesson.currentlesson + +import com.krzykrucz.elesson.currentlesson.attendance.PresentStudent +import com.krzykrucz.elesson.currentlesson.shared.ClassName +import com.krzykrucz.elesson.currentlesson.shared.ClassRegistry +import com.krzykrucz.elesson.currentlesson.shared.FirstName +import com.krzykrucz.elesson.currentlesson.shared.LessonHourNumber +import com.krzykrucz.elesson.currentlesson.shared.LessonIdentifier +import com.krzykrucz.elesson.currentlesson.shared.NaturalNumber +import com.krzykrucz.elesson.currentlesson.shared.NonEmptyText +import com.krzykrucz.elesson.currentlesson.shared.NumberInRegister +import com.krzykrucz.elesson.currentlesson.shared.SecondName +import com.krzykrucz.elesson.currentlesson.shared.StudentRecord +import com.krzykrucz.elesson.currentlesson.shared.WholeNumber import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.context.SpringBootTest import org.springframework.boot.test.web.client.TestRestTemplate diff --git a/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/attendance/AttendanceAcceptanceSpec.groovy b/src/test/groovy/com/krzykrucz/elesson/currentlesson/AttendanceAcceptanceSpec.groovy similarity index 54% rename from src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/attendance/AttendanceAcceptanceSpec.groovy rename to src/test/groovy/com/krzykrucz/elesson/currentlesson/AttendanceAcceptanceSpec.groovy index 36a858b..5258931 100644 --- a/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/attendance/AttendanceAcceptanceSpec.groovy +++ b/src/test/groovy/com/krzykrucz/elesson/currentlesson/AttendanceAcceptanceSpec.groovy @@ -1,11 +1,20 @@ -package com.krzykrucz.elesson.currentlesson.adapters.attendance +package com.krzykrucz.elesson.currentlesson - -import com.krzykrucz.elesson.currentlesson.Database +import com.krzykrucz.elesson.currentlesson.attendance.AbsentStudent +import com.krzykrucz.elesson.currentlesson.attendance.AttendanceDto +import com.krzykrucz.elesson.currentlesson.attendance.AttendanceResponseDto +import com.krzykrucz.elesson.currentlesson.attendance.LateAttendanceDto +import com.krzykrucz.elesson.currentlesson.attendance.PresentStudent +import com.krzykrucz.elesson.currentlesson.attendance.UncheckedStudent +import com.krzykrucz.elesson.currentlesson.shared.FirstName +import com.krzykrucz.elesson.currentlesson.shared.NaturalNumber +import com.krzykrucz.elesson.currentlesson.shared.NonEmptyText +import com.krzykrucz.elesson.currentlesson.shared.NumberInRegister +import com.krzykrucz.elesson.currentlesson.shared.SecondName import org.springframework.http.HttpEntity import org.springframework.http.HttpMethod -class AttendanceAcceptanceSpec extends AttendanceBaseSpec { +class AttendanceAcceptanceSpec extends AcceptanceSpec { def "attendance acceptance spec"() { given: @@ -65,4 +74,28 @@ class AttendanceAcceptanceSpec extends AttendanceBaseSpec { } + private static UncheckedStudent uncheckedStudentOf(String name, String surname, int number) { + new UncheckedStudent( + new FirstName(new NonEmptyText(name)), + new SecondName(new NonEmptyText(surname)), + new NumberInRegister(new NaturalNumber(number)) + ) + } + + private static PresentStudent presentStudentOf(String name, String surname, int number) { + new PresentStudent( + new FirstName(new NonEmptyText(name)), + new SecondName(new NonEmptyText(surname)), + new NumberInRegister(new NaturalNumber(number)) + ) + } + + private static AbsentStudent absentStudentOf(String name, String surname, int number) { + new AbsentStudent( + new FirstName(new NonEmptyText(name)), + new SecondName(new NonEmptyText(surname)), + new NumberInRegister(new NaturalNumber(number)) + ) + } + } diff --git a/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/finishlesson/FinishLessonAcceptanceSpec.groovy b/src/test/groovy/com/krzykrucz/elesson/currentlesson/FinishLessonAcceptanceSpec.groovy similarity index 61% rename from src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/finishlesson/FinishLessonAcceptanceSpec.groovy rename to src/test/groovy/com/krzykrucz/elesson/currentlesson/FinishLessonAcceptanceSpec.groovy index e721ef3..4f3d944 100644 --- a/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/finishlesson/FinishLessonAcceptanceSpec.groovy +++ b/src/test/groovy/com/krzykrucz/elesson/currentlesson/FinishLessonAcceptanceSpec.groovy @@ -1,22 +1,22 @@ -package com.krzykrucz.elesson.currentlesson.adapters.finishlesson +package com.krzykrucz.elesson.currentlesson import arrow.core.Some import com.krzykrucz.elesson.currentlesson.Database import com.krzykrucz.elesson.currentlesson.PersistentCurrentLesson -import com.krzykrucz.elesson.currentlesson.adapters.AcceptanceSpec -import com.krzykrucz.elesson.currentlesson.domain.attendance.AbsentStudent -import com.krzykrucz.elesson.currentlesson.domain.attendance.CheckedAttendanceList -import com.krzykrucz.elesson.currentlesson.domain.attendance.PresentStudent -import com.krzykrucz.elesson.currentlesson.domain.preparedness.StudentsUnpreparedForLesson -import com.krzykrucz.elesson.currentlesson.domain.shared.Finished -import com.krzykrucz.elesson.currentlesson.domain.shared.InProgress -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonOrdinalInSemester -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonSubject -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonTopic -import com.krzykrucz.elesson.currentlesson.domain.shared.NaturalNumber -import com.krzykrucz.elesson.currentlesson.domain.shared.NonEmptyText -import com.krzykrucz.elesson.currentlesson.domain.shared.TopicTitle -import com.krzykrucz.elesson.currentlesson.domain.shared.WinterSemester +import com.krzykrucz.elesson.currentlesson.attendance.AbsentStudent +import com.krzykrucz.elesson.currentlesson.attendance.CheckedAttendanceList +import com.krzykrucz.elesson.currentlesson.attendance.PresentStudent +import com.krzykrucz.elesson.currentlesson.finishlesson.FinishLessonDto +import com.krzykrucz.elesson.currentlesson.preparedness.StudentsUnpreparedForLesson +import com.krzykrucz.elesson.currentlesson.shared.Finished +import com.krzykrucz.elesson.currentlesson.shared.InProgress +import com.krzykrucz.elesson.currentlesson.shared.LessonOrdinalInSemester +import com.krzykrucz.elesson.currentlesson.shared.LessonSubject +import com.krzykrucz.elesson.currentlesson.shared.LessonTopic +import com.krzykrucz.elesson.currentlesson.shared.NaturalNumber +import com.krzykrucz.elesson.currentlesson.shared.NonEmptyText +import com.krzykrucz.elesson.currentlesson.shared.TopicTitle +import com.krzykrucz.elesson.currentlesson.shared.WinterSemester import org.springframework.http.HttpEntity import org.springframework.http.HttpMethod import org.springframework.http.HttpStatus diff --git a/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/LessonProgressAcceptanceSpec.groovy b/src/test/groovy/com/krzykrucz/elesson/currentlesson/LessonProgressAcceptanceSpec.groovy similarity index 71% rename from src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/LessonProgressAcceptanceSpec.groovy rename to src/test/groovy/com/krzykrucz/elesson/currentlesson/LessonProgressAcceptanceSpec.groovy index b60a281..341d91f 100644 --- a/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/lessonprogress/LessonProgressAcceptanceSpec.groovy +++ b/src/test/groovy/com/krzykrucz/elesson/currentlesson/LessonProgressAcceptanceSpec.groovy @@ -1,17 +1,17 @@ -package com.krzykrucz.elesson.currentlesson.adapters.lessonprogress +package com.krzykrucz.elesson.currentlesson import arrow.core.None import com.krzykrucz.elesson.currentlesson.Database import com.krzykrucz.elesson.currentlesson.PersistentCurrentLesson -import com.krzykrucz.elesson.currentlesson.adapters.AcceptanceSpec -import com.krzykrucz.elesson.currentlesson.domain.attendance.AbsentStudent -import com.krzykrucz.elesson.currentlesson.domain.attendance.CheckedAttendanceList -import com.krzykrucz.elesson.currentlesson.domain.attendance.PresentStudent -import com.krzykrucz.elesson.currentlesson.domain.preparedness.StudentsUnpreparedForLesson -import com.krzykrucz.elesson.currentlesson.domain.shared.InProgress -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonSubject -import com.krzykrucz.elesson.currentlesson.domain.shared.NonEmptyText -import com.krzykrucz.elesson.currentlesson.domain.shared.WinterSemester +import com.krzykrucz.elesson.currentlesson.attendance.AbsentStudent +import com.krzykrucz.elesson.currentlesson.attendance.CheckedAttendanceList +import com.krzykrucz.elesson.currentlesson.attendance.PresentStudent +import com.krzykrucz.elesson.currentlesson.lessonprogress.LessonProgressDto +import com.krzykrucz.elesson.currentlesson.preparedness.StudentsUnpreparedForLesson +import com.krzykrucz.elesson.currentlesson.shared.InProgress +import com.krzykrucz.elesson.currentlesson.shared.LessonSubject +import com.krzykrucz.elesson.currentlesson.shared.NonEmptyText +import com.krzykrucz.elesson.currentlesson.shared.WinterSemester import org.springframework.http.HttpEntity import org.springframework.http.HttpMethod diff --git a/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartLessonAcceptanceSpec.groovy b/src/test/groovy/com/krzykrucz/elesson/currentlesson/StartLessonAcceptanceSpec.groovy similarity index 81% rename from src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartLessonAcceptanceSpec.groovy rename to src/test/groovy/com/krzykrucz/elesson/currentlesson/StartLessonAcceptanceSpec.groovy index f29b3fc..0cc899a 100644 --- a/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/startlesson/StartLessonAcceptanceSpec.groovy +++ b/src/test/groovy/com/krzykrucz/elesson/currentlesson/StartLessonAcceptanceSpec.groovy @@ -1,7 +1,8 @@ -package com.krzykrucz.elesson.currentlesson.adapters.startlesson +package com.krzykrucz.elesson.currentlesson import com.krzykrucz.elesson.currentlesson.Database -import com.krzykrucz.elesson.currentlesson.adapters.AcceptanceSpec +import com.krzykrucz.elesson.currentlesson.startlesson.ClassRegistryResponse +import com.krzykrucz.elesson.currentlesson.startlesson.StartLessonRequest import java.time.LocalDate diff --git a/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/topic/TopicAcceptanceSpec.groovy b/src/test/groovy/com/krzykrucz/elesson/currentlesson/TopicAcceptanceSpec.groovy similarity index 60% rename from src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/topic/TopicAcceptanceSpec.groovy rename to src/test/groovy/com/krzykrucz/elesson/currentlesson/TopicAcceptanceSpec.groovy index 002c386..2d633db 100644 --- a/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/topic/TopicAcceptanceSpec.groovy +++ b/src/test/groovy/com/krzykrucz/elesson/currentlesson/TopicAcceptanceSpec.groovy @@ -1,23 +1,22 @@ -package com.krzykrucz.elesson.currentlesson.adapters.topic +package com.krzykrucz.elesson.currentlesson import arrow.core.None import com.krzykrucz.elesson.currentlesson.Database import com.krzykrucz.elesson.currentlesson.PersistentCurrentLesson -import com.krzykrucz.elesson.currentlesson.adapters.AcceptanceSpec -import com.krzykrucz.elesson.currentlesson.domain.attendance.AbsentStudent -import com.krzykrucz.elesson.currentlesson.domain.attendance.CheckedAttendanceList -import com.krzykrucz.elesson.currentlesson.domain.attendance.PresentStudent -import com.krzykrucz.elesson.currentlesson.domain.preparedness.StudentsUnpreparedForLesson -import com.krzykrucz.elesson.currentlesson.domain.shared.InProgress -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonHourNumber -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonOrdinalInSemester -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonSubject -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonTopic -import com.krzykrucz.elesson.currentlesson.domain.shared.NaturalNumber -import com.krzykrucz.elesson.currentlesson.domain.shared.NonEmptyText -import com.krzykrucz.elesson.currentlesson.domain.shared.TopicTitle -import com.krzykrucz.elesson.currentlesson.domain.shared.WinterSemester +import com.krzykrucz.elesson.currentlesson.attendance.AbsentStudent +import com.krzykrucz.elesson.currentlesson.attendance.CheckedAttendanceList +import com.krzykrucz.elesson.currentlesson.attendance.PresentStudent +import com.krzykrucz.elesson.currentlesson.preparedness.StudentsUnpreparedForLesson +import com.krzykrucz.elesson.currentlesson.shared.InProgress +import com.krzykrucz.elesson.currentlesson.shared.LessonHourNumber +import com.krzykrucz.elesson.currentlesson.shared.LessonIdentifier +import com.krzykrucz.elesson.currentlesson.shared.LessonOrdinalInSemester +import com.krzykrucz.elesson.currentlesson.shared.LessonSubject +import com.krzykrucz.elesson.currentlesson.shared.LessonTopic +import com.krzykrucz.elesson.currentlesson.shared.NaturalNumber +import com.krzykrucz.elesson.currentlesson.shared.NonEmptyText +import com.krzykrucz.elesson.currentlesson.shared.TopicTitle +import com.krzykrucz.elesson.currentlesson.shared.WinterSemester import org.springframework.http.HttpEntity import org.springframework.http.HttpMethod import org.springframework.http.HttpStatus @@ -44,7 +43,7 @@ class TopicAcceptanceSpec extends AcceptanceSpec { ) Database.LESSON_DATABASE.put(lessonId, lessonWithAttendanceChecked) def title = new TopicTitle(new NonEmptyText("Three unforgivable curses")) - def chooseTopicDto = new com.krzykrucz.elesson.currentlesson.adapters.topic.ChooseTopicDto(lessonId, title) + def chooseTopicDto = new com.krzykrucz.elesson.currentlesson.topic.ChooseTopicDto(lessonId, title) when: 'choosing topic for current lesson' def inProgressLesson = rest.exchange( diff --git a/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/preparedness/UnpreparedStudentAcceptanceSpec.groovy b/src/test/groovy/com/krzykrucz/elesson/currentlesson/UnpreparedStudentAcceptanceSpec.groovy similarity index 71% rename from src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/preparedness/UnpreparedStudentAcceptanceSpec.groovy rename to src/test/groovy/com/krzykrucz/elesson/currentlesson/UnpreparedStudentAcceptanceSpec.groovy index 02817a5..29d792d 100644 --- a/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/preparedness/UnpreparedStudentAcceptanceSpec.groovy +++ b/src/test/groovy/com/krzykrucz/elesson/currentlesson/UnpreparedStudentAcceptanceSpec.groovy @@ -1,18 +1,19 @@ -package com.krzykrucz.elesson.currentlesson.adapters.preparedness +package com.krzykrucz.elesson.currentlesson import arrow.core.None import com.krzykrucz.elesson.currentlesson.Database import com.krzykrucz.elesson.currentlesson.PersistentCurrentLesson -import com.krzykrucz.elesson.currentlesson.adapters.AcceptanceSpec -import com.krzykrucz.elesson.currentlesson.domain.attendance.CheckedAttendanceList -import com.krzykrucz.elesson.currentlesson.domain.preparedness.StudentInSemester -import com.krzykrucz.elesson.currentlesson.domain.preparedness.StudentReportingUnpreparedness -import com.krzykrucz.elesson.currentlesson.domain.preparedness.StudentSubjectUnpreparednessInASemester -import com.krzykrucz.elesson.currentlesson.domain.preparedness.StudentsUnpreparedForLesson -import com.krzykrucz.elesson.currentlesson.domain.shared.InProgress -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonSubject -import com.krzykrucz.elesson.currentlesson.domain.shared.NonEmptyText -import com.krzykrucz.elesson.currentlesson.domain.shared.WinterSemester +import com.krzykrucz.elesson.currentlesson.attendance.CheckedAttendanceList +import com.krzykrucz.elesson.currentlesson.preparedness.ReportUnpreparedRequest +import com.krzykrucz.elesson.currentlesson.preparedness.StudentInSemester +import com.krzykrucz.elesson.currentlesson.preparedness.StudentInSemesterReadModel +import com.krzykrucz.elesson.currentlesson.preparedness.StudentReportingUnpreparedness +import com.krzykrucz.elesson.currentlesson.preparedness.StudentSubjectUnpreparednessInASemester +import com.krzykrucz.elesson.currentlesson.preparedness.StudentsUnpreparedForLesson +import com.krzykrucz.elesson.currentlesson.shared.InProgress +import com.krzykrucz.elesson.currentlesson.shared.LessonSubject +import com.krzykrucz.elesson.currentlesson.shared.NonEmptyText +import com.krzykrucz.elesson.currentlesson.shared.WinterSemester import org.springframework.http.HttpEntity import org.springframework.http.HttpMethod import org.springframework.http.HttpStatus diff --git a/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/attendance/AttendanceBaseSpec.groovy b/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/attendance/AttendanceBaseSpec.groovy deleted file mode 100644 index 178a65d..0000000 --- a/src/test/groovy/com/krzykrucz/elesson/currentlesson/adapters/attendance/AttendanceBaseSpec.groovy +++ /dev/null @@ -1,35 +0,0 @@ -package com.krzykrucz.elesson.currentlesson.adapters.attendance - -import com.krzykrucz.elesson.currentlesson.adapters.AcceptanceSpec -import com.krzykrucz.elesson.currentlesson.domain.attendance.AbsentStudent -import com.krzykrucz.elesson.currentlesson.domain.attendance.PresentStudent -import com.krzykrucz.elesson.currentlesson.domain.attendance.UncheckedStudent -import com.krzykrucz.elesson.currentlesson.domain.shared.* - -class AttendanceBaseSpec extends AcceptanceSpec { - - protected static UncheckedStudent uncheckedStudentOf(String name, String surname, int number) { - new UncheckedStudent( - new FirstName(new NonEmptyText(name)), - new SecondName(new NonEmptyText(surname)), - new NumberInRegister(new NaturalNumber(number)) - ) - } - - protected static PresentStudent presentStudentOf(String name, String surname, int number) { - new PresentStudent( - new FirstName(new NonEmptyText(name)), - new SecondName(new NonEmptyText(surname)), - new NumberInRegister(new NaturalNumber(number)) - ) - } - - protected static AbsentStudent absentStudentOf(String name, String surname, int number) { - new AbsentStudent( - new FirstName(new NonEmptyText(name)), - new SecondName(new NonEmptyText(surname)), - new NumberInRegister(new NaturalNumber(number)) - ) - } - -} diff --git a/src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/attendance/CheckAttendanceSteps.kt b/src/test/kotlin/com/krzykrucz/elesson/currentlesson/CheckAttendanceSteps.kt similarity index 82% rename from src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/attendance/CheckAttendanceSteps.kt rename to src/test/kotlin/com/krzykrucz/elesson/currentlesson/CheckAttendanceSteps.kt index f690758..e4f9ac9 100644 --- a/src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/attendance/CheckAttendanceSteps.kt +++ b/src/test/kotlin/com/krzykrucz/elesson/currentlesson/CheckAttendanceSteps.kt @@ -1,19 +1,29 @@ -package com.krzykrucz.elesson.currentlesson.domain.attendance +package com.krzykrucz.elesson.currentlesson import arrow.core.Either -import com.krzykrucz.elesson.currentlesson.domain.getError -import com.krzykrucz.elesson.currentlesson.domain.getSuccess -import com.krzykrucz.elesson.currentlesson.domain.newClassName -import com.krzykrucz.elesson.currentlesson.domain.newStudent -import com.krzykrucz.elesson.currentlesson.domain.shared.ClassRegistry -import com.krzykrucz.elesson.currentlesson.domain.shared.FirstName -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonHourNumber -import com.krzykrucz.elesson.currentlesson.domain.shared.NaturalNumber -import com.krzykrucz.elesson.currentlesson.domain.shared.NonEmptyText -import com.krzykrucz.elesson.currentlesson.domain.shared.NumberInRegister -import com.krzykrucz.elesson.currentlesson.domain.shared.SecondName -import com.krzykrucz.elesson.currentlesson.domain.shared.isError -import com.krzykrucz.elesson.currentlesson.domain.shared.isSuccess +import com.krzykrucz.elesson.currentlesson.attendance.AbsentStudent +import com.krzykrucz.elesson.currentlesson.attendance.Attendance +import com.krzykrucz.elesson.currentlesson.attendance.AttendanceError +import com.krzykrucz.elesson.currentlesson.attendance.CheckedAttendanceList +import com.krzykrucz.elesson.currentlesson.attendance.IncompleteAttendanceList +import com.krzykrucz.elesson.currentlesson.attendance.NoteAbsence +import com.krzykrucz.elesson.currentlesson.attendance.NoteLate +import com.krzykrucz.elesson.currentlesson.attendance.NotePresence +import com.krzykrucz.elesson.currentlesson.attendance.PresentStudent +import com.krzykrucz.elesson.currentlesson.attendance.Student +import com.krzykrucz.elesson.currentlesson.attendance.UncheckedStudent +import com.krzykrucz.elesson.currentlesson.attendance.noteAbsenceWorkflow +import com.krzykrucz.elesson.currentlesson.attendance.noteLateWorkflow +import com.krzykrucz.elesson.currentlesson.attendance.notePresenceWorkflow +import com.krzykrucz.elesson.currentlesson.shared.ClassRegistry +import com.krzykrucz.elesson.currentlesson.shared.FirstName +import com.krzykrucz.elesson.currentlesson.shared.LessonHourNumber +import com.krzykrucz.elesson.currentlesson.shared.NaturalNumber +import com.krzykrucz.elesson.currentlesson.shared.NonEmptyText +import com.krzykrucz.elesson.currentlesson.shared.NumberInRegister +import com.krzykrucz.elesson.currentlesson.shared.SecondName +import com.krzykrucz.elesson.currentlesson.shared.isError +import com.krzykrucz.elesson.currentlesson.shared.isSuccess import io.cucumber.java8.En import org.assertj.core.api.Assertions.assertThat import java.time.LocalDateTime diff --git a/src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/topic/ChooseTopicSteps.kt b/src/test/kotlin/com/krzykrucz/elesson/currentlesson/ChooseTopicSteps.kt similarity index 68% rename from src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/topic/ChooseTopicSteps.kt rename to src/test/kotlin/com/krzykrucz/elesson/currentlesson/ChooseTopicSteps.kt index 6d0f353..8bee433 100644 --- a/src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/topic/ChooseTopicSteps.kt +++ b/src/test/kotlin/com/krzykrucz/elesson/currentlesson/ChooseTopicSteps.kt @@ -1,17 +1,19 @@ -package com.krzykrucz.elesson.currentlesson.domain.topic +package com.krzykrucz.elesson.currentlesson import arrow.core.Either -import com.krzykrucz.elesson.currentlesson.domain.getSuccess -import com.krzykrucz.elesson.currentlesson.domain.lessonHourNumberOf -import com.krzykrucz.elesson.currentlesson.domain.newClassName -import com.krzykrucz.elesson.currentlesson.domain.shared.InProgressLesson -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonOrdinalInSemester -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonTopic -import com.krzykrucz.elesson.currentlesson.domain.shared.NaturalNumber -import com.krzykrucz.elesson.currentlesson.domain.shared.NonEmptyText -import com.krzykrucz.elesson.currentlesson.domain.shared.TopicTitle +import com.krzykrucz.elesson.currentlesson.shared.InProgressLesson +import com.krzykrucz.elesson.currentlesson.shared.LessonIdentifier +import com.krzykrucz.elesson.currentlesson.shared.LessonOrdinalInSemester +import com.krzykrucz.elesson.currentlesson.shared.LessonTopic +import com.krzykrucz.elesson.currentlesson.shared.NaturalNumber +import com.krzykrucz.elesson.currentlesson.shared.NonEmptyText +import com.krzykrucz.elesson.currentlesson.shared.TopicTitle +import com.krzykrucz.elesson.currentlesson.topic.CheckIfAttendanceIsChecked +import com.krzykrucz.elesson.currentlesson.topic.ChooseTopicError +import com.krzykrucz.elesson.currentlesson.topic.CountFinishedLessons +import com.krzykrucz.elesson.currentlesson.topic.FinishedLessonsCount +import com.krzykrucz.elesson.currentlesson.topic.chooseTopicWorkflow import io.cucumber.java8.En import kotlinx.coroutines.runBlocking import org.assertj.core.api.Assertions.assertThat diff --git a/src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/DomainHelper.kt b/src/test/kotlin/com/krzykrucz/elesson/currentlesson/DomainHelper.kt similarity index 61% rename from src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/DomainHelper.kt rename to src/test/kotlin/com/krzykrucz/elesson/currentlesson/DomainHelper.kt index e060ca7..b5a2067 100644 --- a/src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/DomainHelper.kt +++ b/src/test/kotlin/com/krzykrucz/elesson/currentlesson/DomainHelper.kt @@ -1,16 +1,16 @@ -package com.krzykrucz.elesson.currentlesson.domain +package com.krzykrucz.elesson.currentlesson import arrow.core.Either import arrow.core.orNull -import com.krzykrucz.elesson.currentlesson.domain.shared.ClassName -import com.krzykrucz.elesson.currentlesson.domain.shared.FirstName -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonHourNumber -import com.krzykrucz.elesson.currentlesson.domain.shared.NaturalNumber -import com.krzykrucz.elesson.currentlesson.domain.shared.NonEmptyText -import com.krzykrucz.elesson.currentlesson.domain.shared.NumberInRegister -import com.krzykrucz.elesson.currentlesson.domain.shared.SecondName -import com.krzykrucz.elesson.currentlesson.domain.shared.StudentRecord -import com.krzykrucz.elesson.currentlesson.domain.shared.Teacher +import com.krzykrucz.elesson.currentlesson.shared.ClassName +import com.krzykrucz.elesson.currentlesson.shared.FirstName +import com.krzykrucz.elesson.currentlesson.shared.LessonHourNumber +import com.krzykrucz.elesson.currentlesson.shared.NaturalNumber +import com.krzykrucz.elesson.currentlesson.shared.NonEmptyText +import com.krzykrucz.elesson.currentlesson.shared.NumberInRegister +import com.krzykrucz.elesson.currentlesson.shared.SecondName +import com.krzykrucz.elesson.currentlesson.shared.StudentRecord +import com.krzykrucz.elesson.currentlesson.shared.Teacher fun newTeacher(firstName: String, secondName: String): Teacher = Teacher( diff --git a/src/test/kotlin/com/krzykrucz/elesson/currentlesson/adapters/ELessonApplicationTest.kt b/src/test/kotlin/com/krzykrucz/elesson/currentlesson/ELessonApplicationTest.kt similarity index 84% rename from src/test/kotlin/com/krzykrucz/elesson/currentlesson/adapters/ELessonApplicationTest.kt rename to src/test/kotlin/com/krzykrucz/elesson/currentlesson/ELessonApplicationTest.kt index 22786d8..bfd3446 100644 --- a/src/test/kotlin/com/krzykrucz/elesson/currentlesson/adapters/ELessonApplicationTest.kt +++ b/src/test/kotlin/com/krzykrucz/elesson/currentlesson/ELessonApplicationTest.kt @@ -1,4 +1,4 @@ -package com.krzykrucz.elesson.currentlesson.adapters +package com.krzykrucz.elesson.currentlesson import org.junit.Test import org.junit.runner.RunWith diff --git a/src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/finishlesson/FinishLessonSteps.kt b/src/test/kotlin/com/krzykrucz/elesson/currentlesson/FinishLessonSteps.kt similarity index 65% rename from src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/finishlesson/FinishLessonSteps.kt rename to src/test/kotlin/com/krzykrucz/elesson/currentlesson/FinishLessonSteps.kt index 4834b7c..98343d0 100644 --- a/src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/finishlesson/FinishLessonSteps.kt +++ b/src/test/kotlin/com/krzykrucz/elesson/currentlesson/FinishLessonSteps.kt @@ -1,15 +1,18 @@ -package com.krzykrucz.elesson.currentlesson.domain.finishlesson +package com.krzykrucz.elesson.currentlesson import arrow.core.Either -import com.krzykrucz.elesson.currentlesson.domain.lessonHourNumberOf -import com.krzykrucz.elesson.currentlesson.domain.newClassName -import com.krzykrucz.elesson.currentlesson.domain.shared.InProgressLesson -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonOrdinalInSemester -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonTopic -import com.krzykrucz.elesson.currentlesson.domain.shared.NaturalNumber -import com.krzykrucz.elesson.currentlesson.domain.shared.NonEmptyText -import com.krzykrucz.elesson.currentlesson.domain.shared.TopicTitle +import com.krzykrucz.elesson.currentlesson.finishlesson.FinishLessonError +import com.krzykrucz.elesson.currentlesson.finishlesson.FinishLessonTime +import com.krzykrucz.elesson.currentlesson.finishlesson.FinishedLesson +import com.krzykrucz.elesson.currentlesson.finishlesson.MatchFinishLessonResult +import com.krzykrucz.elesson.currentlesson.finishlesson.finishLessonWorkflow +import com.krzykrucz.elesson.currentlesson.shared.InProgressLesson +import com.krzykrucz.elesson.currentlesson.shared.LessonIdentifier +import com.krzykrucz.elesson.currentlesson.shared.LessonOrdinalInSemester +import com.krzykrucz.elesson.currentlesson.shared.LessonTopic +import com.krzykrucz.elesson.currentlesson.shared.NaturalNumber +import com.krzykrucz.elesson.currentlesson.shared.NonEmptyText +import com.krzykrucz.elesson.currentlesson.shared.TopicTitle import io.cucumber.java8.En import java.time.LocalDate import kotlin.test.assertTrue diff --git a/src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/attendance/IsNotTooLateSteps.kt b/src/test/kotlin/com/krzykrucz/elesson/currentlesson/IsNotTooLateSteps.kt similarity index 85% rename from src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/attendance/IsNotTooLateSteps.kt rename to src/test/kotlin/com/krzykrucz/elesson/currentlesson/IsNotTooLateSteps.kt index 16de0a6..ab452df 100644 --- a/src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/attendance/IsNotTooLateSteps.kt +++ b/src/test/kotlin/com/krzykrucz/elesson/currentlesson/IsNotTooLateSteps.kt @@ -1,6 +1,7 @@ -package com.krzykrucz.elesson.currentlesson.domain.attendance +package com.krzykrucz.elesson.currentlesson -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonHourNumber +import com.krzykrucz.elesson.currentlesson.attendance.CurrentTime +import com.krzykrucz.elesson.currentlesson.shared.LessonHourNumber import io.cucumber.java8.En import java.time.LocalDateTime diff --git a/src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/RunCukesTest.kt b/src/test/kotlin/com/krzykrucz/elesson/currentlesson/RunCukesTest.kt similarity index 57% rename from src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/RunCukesTest.kt rename to src/test/kotlin/com/krzykrucz/elesson/currentlesson/RunCukesTest.kt index 96f717d..e562927 100644 --- a/src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/RunCukesTest.kt +++ b/src/test/kotlin/com/krzykrucz/elesson/currentlesson/RunCukesTest.kt @@ -1,7 +1,7 @@ -package com.krzykrucz.elesson.currentlesson.domain +package com.krzykrucz.elesson.currentlesson import io.cucumber.junit.Cucumber import org.junit.runner.RunWith @RunWith(Cucumber::class) -class RunCukesTest \ No newline at end of file +class RunCukesTest diff --git a/src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/startlesson/StartLessonSteps.kt b/src/test/kotlin/com/krzykrucz/elesson/currentlesson/StartLessonSteps.kt similarity index 82% rename from src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/startlesson/StartLessonSteps.kt rename to src/test/kotlin/com/krzykrucz/elesson/currentlesson/StartLessonSteps.kt index e37328a..302d855 100644 --- a/src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/startlesson/StartLessonSteps.kt +++ b/src/test/kotlin/com/krzykrucz/elesson/currentlesson/StartLessonSteps.kt @@ -1,24 +1,23 @@ -package com.krzykrucz.elesson.currentlesson.domain.startlesson +package com.krzykrucz.elesson.currentlesson import arrow.core.Either import arrow.core.left import arrow.core.orNull import arrow.core.right -import com.krzykrucz.elesson.currentlesson.domain.getError -import com.krzykrucz.elesson.currentlesson.domain.getSuccess -import com.krzykrucz.elesson.currentlesson.domain.lessonHourNumberOf -import com.krzykrucz.elesson.currentlesson.domain.newClassName -import com.krzykrucz.elesson.currentlesson.domain.newStudent -import com.krzykrucz.elesson.currentlesson.domain.newTeacher -import com.krzykrucz.elesson.currentlesson.domain.shared.ClassName -import com.krzykrucz.elesson.currentlesson.domain.shared.ClassRegistry -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonSubject -import com.krzykrucz.elesson.currentlesson.domain.shared.NonEmptyText -import com.krzykrucz.elesson.currentlesson.domain.shared.StartedLesson -import com.krzykrucz.elesson.currentlesson.domain.shared.Teacher -import com.krzykrucz.elesson.currentlesson.domain.shared.isError -import com.krzykrucz.elesson.currentlesson.domain.shared.isSuccess +import com.krzykrucz.elesson.currentlesson.shared.ClassName +import com.krzykrucz.elesson.currentlesson.shared.ClassRegistry +import com.krzykrucz.elesson.currentlesson.shared.LessonSubject +import com.krzykrucz.elesson.currentlesson.shared.NonEmptyText +import com.krzykrucz.elesson.currentlesson.shared.StartedLesson +import com.krzykrucz.elesson.currentlesson.shared.Teacher +import com.krzykrucz.elesson.currentlesson.shared.isError +import com.krzykrucz.elesson.currentlesson.shared.isSuccess +import com.krzykrucz.elesson.currentlesson.startlesson.FetchClassRegistry +import com.krzykrucz.elesson.currentlesson.startlesson.FetchScheduledLesson +import com.krzykrucz.elesson.currentlesson.startlesson.ScheduledLesson +import com.krzykrucz.elesson.currentlesson.startlesson.StartLessonError +import com.krzykrucz.elesson.currentlesson.startlesson.startLessonWorkflow import io.cucumber.java8.En import kotlinx.coroutines.runBlocking import org.hamcrest.CoreMatchers.instanceOf diff --git a/src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/StudentUnpreparedSteps.kt b/src/test/kotlin/com/krzykrucz/elesson/currentlesson/StudentUnpreparedSteps.kt similarity index 74% rename from src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/StudentUnpreparedSteps.kt rename to src/test/kotlin/com/krzykrucz/elesson/currentlesson/StudentUnpreparedSteps.kt index c1357ea..2967fed 100644 --- a/src/test/kotlin/com/krzykrucz/elesson/currentlesson/domain/preparedness/StudentUnpreparedSteps.kt +++ b/src/test/kotlin/com/krzykrucz/elesson/currentlesson/StudentUnpreparedSteps.kt @@ -1,25 +1,34 @@ -package com.krzykrucz.elesson.currentlesson.domain.preparedness +package com.krzykrucz.elesson.currentlesson import arrow.core.Either import arrow.core.orNull import arrow.core.right -import com.krzykrucz.elesson.currentlesson.domain.attendance.CheckedAttendanceList -import com.krzykrucz.elesson.currentlesson.domain.attendance.PresentStudent -import com.krzykrucz.elesson.currentlesson.domain.shared.ClassName -import com.krzykrucz.elesson.currentlesson.domain.shared.CurrentLesson -import com.krzykrucz.elesson.currentlesson.domain.shared.FirstName -import com.krzykrucz.elesson.currentlesson.domain.shared.InProgressLesson -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonAfterAttendance -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonHourNumber -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonIdentifier -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonOrdinalInSemester -import com.krzykrucz.elesson.currentlesson.domain.shared.LessonTopic -import com.krzykrucz.elesson.currentlesson.domain.shared.NaturalNumber -import com.krzykrucz.elesson.currentlesson.domain.shared.NonEmptyText -import com.krzykrucz.elesson.currentlesson.domain.shared.NumberInRegister -import com.krzykrucz.elesson.currentlesson.domain.shared.SecondName -import com.krzykrucz.elesson.currentlesson.domain.shared.TopicTitle +import com.krzykrucz.elesson.currentlesson.attendance.CheckedAttendanceList +import com.krzykrucz.elesson.currentlesson.attendance.PresentStudent +import com.krzykrucz.elesson.currentlesson.preparedness.ReportUnpreparedness +import com.krzykrucz.elesson.currentlesson.preparedness.StudentInSemester +import com.krzykrucz.elesson.currentlesson.preparedness.StudentMarkedUnprepared +import com.krzykrucz.elesson.currentlesson.preparedness.StudentReportingUnpreparedness +import com.krzykrucz.elesson.currentlesson.preparedness.StudentSubjectUnpreparednessInASemester +import com.krzykrucz.elesson.currentlesson.preparedness.StudentsUnpreparedForLesson +import com.krzykrucz.elesson.currentlesson.preparedness.UnpreparedStudent +import com.krzykrucz.elesson.currentlesson.preparedness.UnpreparednessError +import com.krzykrucz.elesson.currentlesson.preparedness.reportUnpreparednessWorkflow +import com.krzykrucz.elesson.currentlesson.shared.ClassName +import com.krzykrucz.elesson.currentlesson.shared.CurrentLesson +import com.krzykrucz.elesson.currentlesson.shared.FirstName +import com.krzykrucz.elesson.currentlesson.shared.InProgressLesson +import com.krzykrucz.elesson.currentlesson.shared.LessonAfterAttendance +import com.krzykrucz.elesson.currentlesson.shared.LessonHourNumber +import com.krzykrucz.elesson.currentlesson.shared.LessonIdentifier +import com.krzykrucz.elesson.currentlesson.shared.LessonOrdinalInSemester +import com.krzykrucz.elesson.currentlesson.shared.LessonTopic +import com.krzykrucz.elesson.currentlesson.shared.NaturalNumber +import com.krzykrucz.elesson.currentlesson.shared.NonEmptyText +import com.krzykrucz.elesson.currentlesson.shared.NumberInRegister +import com.krzykrucz.elesson.currentlesson.shared.SecondName +import com.krzykrucz.elesson.currentlesson.shared.TopicTitle import io.cucumber.java8.En import kotlinx.coroutines.runBlocking import java.time.LocalDate diff --git a/src/test/kotlin/com/krzykrucz/elesson/currentlesson/adapters/ArchitectureTest.kt b/src/test/kotlin/com/krzykrucz/elesson/currentlesson/adapters/ArchitectureTest.kt deleted file mode 100644 index 1b40807..0000000 --- a/src/test/kotlin/com/krzykrucz/elesson/currentlesson/adapters/ArchitectureTest.kt +++ /dev/null @@ -1,38 +0,0 @@ -package com.krzykrucz.elesson.currentlesson.adapters - -import com.tngtech.archunit.core.importer.ImportOption.DoNotIncludeTests -import com.tngtech.archunit.junit.AnalyzeClasses -import com.tngtech.archunit.junit.ArchTest -import com.tngtech.archunit.junit.ArchUnitRunner -import com.tngtech.archunit.lang.syntax.ArchRuleDefinition -import com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClasses -import com.tngtech.archunit.library.Architectures -import com.tngtech.archunit.library.dependencies.SlicesRuleDefinition.slices -import org.junit.runner.RunWith - -@RunWith(ArchUnitRunner::class) -@AnalyzeClasses(packagesOf = [ArchitectureTest::class], importOptions = [DoNotIncludeTests::class]) -class ArchitectureTest { - - @ArchTest - val `one adapter should not access another adapter` = - slices() - .matching("..adapters.(*)") - .should().notDependOnEachOther() - - @ArchTest - val `domain should not access adapters` = - noClasses() - .that().resideInAPackage("..domain..") - .should() - .accessClassesThat().resideInAPackage("..adapters..") - - - @ArchTest - val `domain should not access infrastructure` = - noClasses() - .that().resideInAPackage("..domain..") - .should() - .accessClassesThat().resideInAPackage("..infrastructure..") - -} \ No newline at end of file diff --git a/src/test/resources/com/krzykrucz/elesson/currentlesson/domain/attendance/CheckAttendance.feature b/src/test/resources/com/krzykrucz/elesson/currentlesson/features/CheckAttendance.feature similarity index 100% rename from src/test/resources/com/krzykrucz/elesson/currentlesson/domain/attendance/CheckAttendance.feature rename to src/test/resources/com/krzykrucz/elesson/currentlesson/features/CheckAttendance.feature diff --git a/src/test/resources/com/krzykrucz/elesson/currentlesson/domain/topic/ChooseTopic.feature b/src/test/resources/com/krzykrucz/elesson/currentlesson/features/ChooseTopic.feature similarity index 100% rename from src/test/resources/com/krzykrucz/elesson/currentlesson/domain/topic/ChooseTopic.feature rename to src/test/resources/com/krzykrucz/elesson/currentlesson/features/ChooseTopic.feature diff --git a/src/test/resources/com/krzykrucz/elesson/currentlesson/domain/finishlesson/FinishLesson.feature b/src/test/resources/com/krzykrucz/elesson/currentlesson/features/FinishLesson.feature similarity index 100% rename from src/test/resources/com/krzykrucz/elesson/currentlesson/domain/finishlesson/FinishLesson.feature rename to src/test/resources/com/krzykrucz/elesson/currentlesson/features/FinishLesson.feature diff --git a/src/test/resources/com/krzykrucz/elesson/currentlesson/domain/attendance/IsNotTooLate.feature b/src/test/resources/com/krzykrucz/elesson/currentlesson/features/IsNotTooLate.feature similarity index 100% rename from src/test/resources/com/krzykrucz/elesson/currentlesson/domain/attendance/IsNotTooLate.feature rename to src/test/resources/com/krzykrucz/elesson/currentlesson/features/IsNotTooLate.feature diff --git a/src/test/resources/com/krzykrucz/elesson/currentlesson/domain/StartLesson.feature b/src/test/resources/com/krzykrucz/elesson/currentlesson/features/StartLesson.feature similarity index 100% rename from src/test/resources/com/krzykrucz/elesson/currentlesson/domain/StartLesson.feature rename to src/test/resources/com/krzykrucz/elesson/currentlesson/features/StartLesson.feature diff --git a/src/test/resources/com/krzykrucz/elesson/currentlesson/domain/StudentUnprepared.feature b/src/test/resources/com/krzykrucz/elesson/currentlesson/features/StudentUnprepared.feature similarity index 100% rename from src/test/resources/com/krzykrucz/elesson/currentlesson/domain/StudentUnprepared.feature rename to src/test/resources/com/krzykrucz/elesson/currentlesson/features/StudentUnprepared.feature From 591b0755b51ffeaf9726d986a8f628b6f4682263 Mon Sep 17 00:00:00 2001 From: krzykrucz Date: Tue, 16 Jun 2020 21:07:03 +0200 Subject: [PATCH 9/9] more functional beans definitions --- .../currentlesson/ELessonApplication.kt | 4 + .../attendance/AttendanceAdapters.kt | 22 ++++ .../currentlesson/attendance/AttendanceApi.kt | 122 +++++++++--------- .../AttendancePersistenceAdapter.kt | 56 ++++---- .../attendance/AttendanceRestAdapter.kt | 33 ++--- .../finishlesson/FinishLessonRestAdapter.kt | 2 +- .../lessonprogress/LessonProgressAdapters.kt | 7 + .../LessonProgressDatabaseAdapter.kt | 34 ++--- .../LessonProgressRestAdapter.kt | 11 +- .../elesson/currentlesson/shared/Base.kt | 29 +++++ .../currentlesson/shared/Extensions.kt | 36 ------ .../elesson/currentlesson/shared/RestApi.kt | 6 + .../currentlesson/FinishLessonSteps.kt | 1 - .../FinishLessonTypesConfiguration.kt | 5 +- 14 files changed, 183 insertions(+), 185 deletions(-) create mode 100644 src/main/kotlin/com/krzykrucz/elesson/currentlesson/attendance/AttendanceAdapters.kt create mode 100644 src/main/kotlin/com/krzykrucz/elesson/currentlesson/lessonprogress/LessonProgressAdapters.kt delete mode 100644 src/main/kotlin/com/krzykrucz/elesson/currentlesson/shared/Extensions.kt create mode 100644 src/main/kotlin/com/krzykrucz/elesson/currentlesson/shared/RestApi.kt rename src/{main/kotlin/com/krzykrucz/elesson/currentlesson/finishlesson => test/kotlin/com/krzykrucz/elesson/currentlesson}/FinishLessonTypesConfiguration.kt (90%) diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/ELessonApplication.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/ELessonApplication.kt index eeb574d..686863b 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/ELessonApplication.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/ELessonApplication.kt @@ -1,6 +1,8 @@ package com.krzykrucz.elesson.currentlesson +import com.krzykrucz.elesson.currentlesson.attendance.attendanceAdapters import com.krzykrucz.elesson.currentlesson.finishlesson.finishLessonAdapters +import com.krzykrucz.elesson.currentlesson.lessonprogress.lessonProgressAdapters import com.krzykrucz.elesson.currentlesson.startlesson.startLessonAdapters import com.krzykrucz.elesson.currentlesson.topic.topicAdapters import org.springframework.boot.autoconfigure.SpringBootApplication @@ -20,5 +22,7 @@ object BeansInitializer : ApplicationContextInitializer Either Either typealias HandleNoteLate = suspend (LateAttendanceDto) -> Either -@Configuration -class AttendanceHandler( - val persistAttendance: PersistAttendance, - val fetchIncompleteAttendance: FetchIncompleteAttendance, - val fetchCheckedAttendance: FetchCheckedAttendance -) { - - @Bean("notePresent") - fun handleNotePresentDto(): NotePresentApi = { attendanceDto -> - val incompleteAttendanceDtoOpt = fetchIncompleteAttendance(attendanceDto.lessonId) - - val notePresenceResult = Option.fx { - val (incompleteAttendance) = incompleteAttendanceDtoOpt - notePresenceWorkflow()( - attendanceDto.uncheckedStudent, - incompleteAttendance.incompleteAttendanceList, - incompleteAttendance.classRegistry - ) - }.toEither { AttendanceError.LessonNotFound() } - .flatten() - .fix() +fun handleNotePresentDto( + persistAttendance: PersistAttendance, + fetchIncompleteAttendance: FetchIncompleteAttendance +): NotePresentApi = { attendanceDto -> + val incompleteAttendanceDtoOpt = fetchIncompleteAttendance(attendanceDto.lessonId) + + val notePresenceResult = Option.fx { + val (incompleteAttendance) = incompleteAttendanceDtoOpt + notePresenceWorkflow()( + attendanceDto.uncheckedStudent, + incompleteAttendance.incompleteAttendanceList, + incompleteAttendance.classRegistry + ) + }.toEither { AttendanceError.LessonNotFound() } + .flatten() + .fix() + + notePresenceResult + .asyncMap { persistAttendance(attendanceDto.lessonId, it) } +} - notePresenceResult +fun handleNoteAbsentDto( + persistAttendance: PersistAttendance, + fetchIncompleteAttendance: FetchIncompleteAttendance +): NoteAbsentApi = { attendanceDto -> + val incompleteAttendanceDtoOpt = fetchIncompleteAttendance(attendanceDto.lessonId) + + val noteAbsenceResult = Option.fx { + val (incompleteAttendance) = incompleteAttendanceDtoOpt + noteAbsenceWorkflow()( + attendanceDto.uncheckedStudent, + incompleteAttendance.incompleteAttendanceList, + incompleteAttendance.classRegistry + ) + }.toEither { AttendanceError.LessonNotFound() }.flatten().fix() + + val persistResult = + noteAbsenceResult .asyncMap { persistAttendance(attendanceDto.lessonId, it) } - } - - @Bean("noteAbsent") - fun handleNoteAbsentDto(): NoteAbsentApi = { attendanceDto -> - val incompleteAttendanceDtoOpt = fetchIncompleteAttendance(attendanceDto.lessonId) - - val noteAbsenceResult = Option.fx { - val (incompleteAttendance) = incompleteAttendanceDtoOpt - noteAbsenceWorkflow()( - attendanceDto.uncheckedStudent, - incompleteAttendance.incompleteAttendanceList, - incompleteAttendance.classRegistry - ) - }.toEither { AttendanceError.LessonNotFound() }.flatten().fix() - val persistResult = - noteAbsenceResult - .asyncMap { persistAttendance(attendanceDto.lessonId, it) } + persistResult +} - persistResult - } - - - @Bean - fun handleLateAttendanceDto(): HandleNoteLate = { lateAttendanceDto -> - val checkedAttendanceOpt = fetchCheckedAttendance(lateAttendanceDto.lessonId) - val noteLateResult = Option.fx { - val (checkedAttendance) = checkedAttendanceOpt - noteLateWorkflow()( - lateAttendanceDto.lessonId.lessonHourNumber, - lateAttendanceDto.absentStudent, - checkedAttendance, - LocalDateTime.parse(lateAttendanceDto.currentTime) - ) - }.toEither { AttendanceError.LessonNotFound() } - - val persistResultAfterNoteLate = - noteLateResult - .asyncMap { persistAttendance(lateAttendanceDto.lessonId, it) } - persistResultAfterNoteLate - } +fun handleLateAttendanceDto( + persistAttendance: PersistAttendance, + fetchCheckedAttendance: FetchCheckedAttendance +): HandleNoteLate = { lateAttendanceDto -> + val checkedAttendanceOpt = fetchCheckedAttendance(lateAttendanceDto.lessonId) + val noteLateResult = Option.fx { + val (checkedAttendance) = checkedAttendanceOpt + noteLateWorkflow()( + lateAttendanceDto.lessonId.lessonHourNumber, + lateAttendanceDto.absentStudent, + checkedAttendance, + LocalDateTime.parse(lateAttendanceDto.currentTime) + ) + }.toEither { AttendanceError.LessonNotFound() } + + val persistResultAfterNoteLate = + noteLateResult + .asyncMap { persistAttendance(lateAttendanceDto.lessonId, it) } + + persistResultAfterNoteLate } diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/attendance/AttendancePersistenceAdapter.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/attendance/AttendancePersistenceAdapter.kt index e019688..7e59656 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/attendance/AttendancePersistenceAdapter.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/attendance/AttendancePersistenceAdapter.kt @@ -2,42 +2,32 @@ package com.krzykrucz.elesson.currentlesson.attendance import arrow.core.toOption import com.krzykrucz.elesson.currentlesson.Database -import org.springframework.context.annotation.Bean -import org.springframework.context.annotation.Configuration -@Configuration -class AttendancePersistenceAdapter { - - @Bean - fun fetchCheckedAttendance(): FetchCheckedAttendance = { lessonId -> - Database.LESSON_DATABASE[lessonId].toOption() - .flatMap { (it.attendance as? CheckedAttendanceList).toOption() } - } +val fetchCheckedAttendance: FetchCheckedAttendance = { lessonId -> + Database.LESSON_DATABASE[lessonId].toOption() + .flatMap { (it.attendance as? CheckedAttendanceList).toOption() } +} - @Bean - fun persistAttendance(): PersistAttendance = { lessonId, attendance -> - Database.LESSON_DATABASE.compute(lessonId) { _, lesson -> - lesson?.copy(attendance = attendance) - }.let { - when (attendance) { - is IncompleteAttendanceList -> false - is CheckedAttendanceList -> true - } +val persistAttendance: PersistAttendance = { lessonId, attendance -> + Database.LESSON_DATABASE.compute(lessonId) { _, lesson -> + lesson?.copy(attendance = attendance) + }.let { + when (attendance) { + is IncompleteAttendanceList -> false + is CheckedAttendanceList -> true } } - - @Bean - fun fetchIncompleteAttendance(): FetchIncompleteAttendance = { lessonId -> - Database.LESSON_DATABASE[lessonId].toOption() - .flatMap { - (it.attendance as? IncompleteAttendanceList).toOption() - .map { incompleteAttendance -> - IncompleteAttendanceDto( - incompleteAttendance, - it.classRegistry - ) - } - } - } } +val fetchIncompleteAttendance: FetchIncompleteAttendance = { lessonId -> + Database.LESSON_DATABASE[lessonId].toOption() + .flatMap { + (it.attendance as? IncompleteAttendanceList).toOption() + .map { incompleteAttendance -> + IncompleteAttendanceDto( + incompleteAttendance, + it.classRegistry + ) + } + } +} diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/attendance/AttendanceRestAdapter.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/attendance/AttendanceRestAdapter.kt index c28b756..7ca9c75 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/attendance/AttendanceRestAdapter.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/attendance/AttendanceRestAdapter.kt @@ -3,44 +3,37 @@ package com.krzykrucz.elesson.currentlesson.attendance import com.krzykrucz.elesson.currentlesson.shared.LessonIdentifier import com.krzykrucz.elesson.currentlesson.shared.RestApi import com.krzykrucz.elesson.currentlesson.shared.toServerResponse -import org.springframework.beans.factory.annotation.Qualifier -import org.springframework.context.annotation.Bean -import org.springframework.context.annotation.Configuration import org.springframework.web.reactive.function.server.awaitBody import org.springframework.web.reactive.function.server.coRouter -@Configuration -class AttendanceRouterConfig { - - @Bean - fun attendanceRouter(@Qualifier("noteAbsent") noteAbsentApiDto: NoteAbsentApi, - @Qualifier("notePresent") notePresentApi: NotePresentApi, - handleNoteLateDto: HandleNoteLate - ) = coRouter { - "/attendance".nest { - POST("/absent", handleAttentanceAbsent(noteAbsentApiDto)) - POST("/present", handleAttentancePresent(notePresentApi)) - POST("/late", handleAttentanceLate(handleNoteLateDto)) - } +fun attendanceRouter( + noteAbsentApiDto: NoteAbsentApi, + notePresentApi: NotePresentApi, + handleNoteLateDto: HandleNoteLate +) = coRouter { + "/attendance".nest { + POST("/absent", handleAttentanceAbsent(noteAbsentApiDto)) + POST("/present", handleAttentancePresent(notePresentApi)) + POST("/late", handleAttentanceLate(handleNoteLateDto)) } - } -fun handleAttentanceAbsent(noteAbsentApiDto: NoteAbsentApi): RestApi = { request -> + +private fun handleAttentanceAbsent(noteAbsentApiDto: NoteAbsentApi): RestApi = { request -> val dto = request.awaitBody() noteAbsentApiDto(dto) .map { AttendanceResponseDto(it) } .toServerResponse() } -fun handleAttentancePresent(notePresentApi: NotePresentApi): RestApi = { request -> +private fun handleAttentancePresent(notePresentApi: NotePresentApi): RestApi = { request -> val dto = request.awaitBody() notePresentApi(dto) .map { AttendanceResponseDto(it) } .toServerResponse() } -fun handleAttentanceLate(handleNoteLateDto: HandleNoteLate): RestApi = { request -> +private fun handleAttentanceLate(handleNoteLateDto: HandleNoteLate): RestApi = { request -> val dto = request.awaitBody() handleNoteLateDto(dto) .map { AttendanceResponseDto(it) } diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/finishlesson/FinishLessonRestAdapter.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/finishlesson/FinishLessonRestAdapter.kt index c6345a9..16f50f5 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/finishlesson/FinishLessonRestAdapter.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/finishlesson/FinishLessonRestAdapter.kt @@ -7,7 +7,7 @@ import org.springframework.web.reactive.function.server.awaitBody import org.springframework.web.reactive.function.server.coRouter -fun finishLessonRestAdapter( +internal fun finishLessonRestAdapter( finishLesson: FinishLesson, storeLessonAsFinished: StoreLessonAsFinished ) = coRouter { diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/lessonprogress/LessonProgressAdapters.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/lessonprogress/LessonProgressAdapters.kt new file mode 100644 index 0000000..6dd9ef2 --- /dev/null +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/lessonprogress/LessonProgressAdapters.kt @@ -0,0 +1,7 @@ +package com.krzykrucz.elesson.currentlesson.lessonprogress + +import org.springframework.context.support.beans + +val lessonProgressAdapters = beans { + bean { lessonProgressRouter(loadLessonProgressAdapter()) } +} diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/lessonprogress/LessonProgressDatabaseAdapter.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/lessonprogress/LessonProgressDatabaseAdapter.kt index 7cc75eb..a961c55 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/lessonprogress/LessonProgressDatabaseAdapter.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/lessonprogress/LessonProgressDatabaseAdapter.kt @@ -2,26 +2,18 @@ package com.krzykrucz.elesson.currentlesson.lessonprogress import arrow.core.toOption import com.krzykrucz.elesson.currentlesson.Database -import org.springframework.context.annotation.Bean -import org.springframework.context.annotation.Configuration - -@Configuration -class LessonProgressDatabaseAdapter { - - @Bean - fun loadLessonProgress(): LoadLessonProgress = { lessonIdentifier -> - Database.LESSON_DATABASE[lessonIdentifier].toOption() - .map { currentLesson -> - LessonProgress( - semester = currentLesson.semester, - className = currentLesson.classRegistry.className, - date = currentLesson.lessonId.date, - subject = currentLesson.subject, - topic = currentLesson.lessonTopic, - status = currentLesson.status - ) - } - .toEither(ifEmpty = { LessonProgressError.LessonNotFound() }) - } +internal fun loadLessonProgressAdapter(): LoadLessonProgress = { lessonIdentifier -> + Database.LESSON_DATABASE[lessonIdentifier].toOption() + .map { currentLesson -> + LessonProgress( + semester = currentLesson.semester, + className = currentLesson.classRegistry.className, + date = currentLesson.lessonId.date, + subject = currentLesson.subject, + topic = currentLesson.lessonTopic, + status = currentLesson.status + ) + } + .toEither(ifEmpty = { LessonProgressError.LessonNotFound() }) } diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/lessonprogress/LessonProgressRestAdapter.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/lessonprogress/LessonProgressRestAdapter.kt index fa25979..7f7f901 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/lessonprogress/LessonProgressRestAdapter.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/lessonprogress/LessonProgressRestAdapter.kt @@ -1,17 +1,10 @@ package com.krzykrucz.elesson.currentlesson.lessonprogress import com.krzykrucz.elesson.currentlesson.shared.LessonTopic -import org.springframework.context.annotation.Bean -import org.springframework.context.annotation.Configuration import org.springframework.web.reactive.function.server.coRouter -@Configuration -class LessonProgressRestAdapter { - - @Bean - fun lessonProgressRouter(loadLessonProgress: LoadLessonProgress) = coRouter { - GET("/progress", handleLessonProgressViewRequest(loadLessonProgress)) - } +internal fun lessonProgressRouter(loadLessonProgress: LoadLessonProgress) = coRouter { + GET("/progress", handleLessonProgressViewRequest(loadLessonProgress)) } data class LessonProgressDto( diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/shared/Base.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/shared/Base.kt index fd059c9..553713a 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/shared/Base.kt +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/shared/Base.kt @@ -1,12 +1,17 @@ package com.krzykrucz.elesson.currentlesson.shared import arrow.core.Either +import arrow.core.EitherOf import arrow.core.None import arrow.core.Option import arrow.core.Some +import arrow.core.fix import arrow.core.flatMap import arrow.core.left import arrow.core.right +import org.springframework.http.HttpStatus +import org.springframework.web.reactive.function.server.ServerResponse +import org.springframework.web.reactive.function.server.bodyValueAndAwait data class NonEmptyText(val text: String) { companion object { @@ -47,6 +52,7 @@ data class NaturalNumber private constructor(val number: Int) { if (int > 0) Some(NaturalNumber(int)) else None } + operator fun plus(that: NaturalNumber): NaturalNumber = NaturalNumber(this.number + that.number) } @@ -56,3 +62,26 @@ fun Either.failIf(predicate: (R) -> Boolean, defaultLeft: L): Eithe fun Either.isSuccess() = this.isRight() fun Either.isError() = this.isLeft() + +suspend fun EitherOf.asyncFlatMap(f: suspend (B) -> Either): Either = + fix().let { + when (it) { + is Either.Right -> f(it.b) + is Either.Left -> it + } + } + +suspend fun EitherOf.asyncMap(f: suspend (B) -> C): Either = + asyncFlatMap { arrow.core.Either.Right(f(it)) } + +suspend fun EitherOf.asyncDoIfRight(f: suspend (B) -> Unit): Either = + asyncMap { + f(it) + it + } + +suspend fun Either.toServerResponse(statusHandler: (L) -> HttpStatus = { HttpStatus.BAD_REQUEST }): ServerResponse = + this.fold( + ifLeft = { ServerResponse.status(statusHandler(it)).bodyValueAndAwait(it as Any) }, + ifRight = { ServerResponse.ok().bodyValueAndAwait(it as Any) } + ) diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/shared/Extensions.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/shared/Extensions.kt deleted file mode 100644 index c121304..0000000 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/shared/Extensions.kt +++ /dev/null @@ -1,36 +0,0 @@ -package com.krzykrucz.elesson.currentlesson.shared - -import arrow.core.Either -import arrow.core.EitherOf -import arrow.core.fix -import org.springframework.http.HttpStatus -import org.springframework.http.HttpStatus.BAD_REQUEST -import org.springframework.web.reactive.function.server.ServerRequest -import org.springframework.web.reactive.function.server.ServerResponse -import org.springframework.web.reactive.function.server.bodyValueAndAwait - - -suspend fun EitherOf.asyncFlatMap(f: suspend (B) -> Either): Either = - fix().let { - when (it) { - is Either.Right -> f(it.b) - is Either.Left -> it - } - } - -suspend fun EitherOf.asyncMap(f: suspend (B) -> C): Either = - asyncFlatMap { Either.Right(f(it)) } - -suspend fun EitherOf.asyncDoIfRight(f: suspend (B) -> Unit): Either = - asyncMap { - f(it) - it - } - -suspend fun Either.toServerResponse(statusHandler: (L) -> HttpStatus = { BAD_REQUEST }): ServerResponse = - this.fold( - ifLeft = { ServerResponse.status(statusHandler(it)).bodyValueAndAwait(it as Any) }, - ifRight = { ServerResponse.ok().bodyValueAndAwait(it as Any) } - ) - -typealias RestApi = suspend (ServerRequest) -> ServerResponse diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/shared/RestApi.kt b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/shared/RestApi.kt new file mode 100644 index 0000000..3a7bd4e --- /dev/null +++ b/src/main/kotlin/com/krzykrucz/elesson/currentlesson/shared/RestApi.kt @@ -0,0 +1,6 @@ +package com.krzykrucz.elesson.currentlesson.shared + +import org.springframework.web.reactive.function.server.ServerRequest +import org.springframework.web.reactive.function.server.ServerResponse + +typealias RestApi = suspend (ServerRequest) -> ServerResponse diff --git a/src/test/kotlin/com/krzykrucz/elesson/currentlesson/FinishLessonSteps.kt b/src/test/kotlin/com/krzykrucz/elesson/currentlesson/FinishLessonSteps.kt index 98343d0..9efa6d0 100644 --- a/src/test/kotlin/com/krzykrucz/elesson/currentlesson/FinishLessonSteps.kt +++ b/src/test/kotlin/com/krzykrucz/elesson/currentlesson/FinishLessonSteps.kt @@ -4,7 +4,6 @@ import arrow.core.Either import com.krzykrucz.elesson.currentlesson.finishlesson.FinishLessonError import com.krzykrucz.elesson.currentlesson.finishlesson.FinishLessonTime import com.krzykrucz.elesson.currentlesson.finishlesson.FinishedLesson -import com.krzykrucz.elesson.currentlesson.finishlesson.MatchFinishLessonResult import com.krzykrucz.elesson.currentlesson.finishlesson.finishLessonWorkflow import com.krzykrucz.elesson.currentlesson.shared.InProgressLesson import com.krzykrucz.elesson.currentlesson.shared.LessonIdentifier diff --git a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/finishlesson/FinishLessonTypesConfiguration.kt b/src/test/kotlin/com/krzykrucz/elesson/currentlesson/FinishLessonTypesConfiguration.kt similarity index 90% rename from src/main/kotlin/com/krzykrucz/elesson/currentlesson/finishlesson/FinishLessonTypesConfiguration.kt rename to src/test/kotlin/com/krzykrucz/elesson/currentlesson/FinishLessonTypesConfiguration.kt index e51bf6b..7208f12 100644 --- a/src/main/kotlin/com/krzykrucz/elesson/currentlesson/finishlesson/FinishLessonTypesConfiguration.kt +++ b/src/test/kotlin/com/krzykrucz/elesson/currentlesson/FinishLessonTypesConfiguration.kt @@ -1,7 +1,10 @@ -package com.krzykrucz.elesson.currentlesson.finishlesson +package com.krzykrucz.elesson.currentlesson import arrow.core.Either import arrow.core.getOrElse +import com.krzykrucz.elesson.currentlesson.finishlesson.FinishLessonError +import com.krzykrucz.elesson.currentlesson.finishlesson.FinishLessonTime +import com.krzykrucz.elesson.currentlesson.finishlesson.FinishedLesson import com.krzykrucz.elesson.currentlesson.shared.InProgressLesson import com.krzykrucz.elesson.currentlesson.shared.isError import io.cucumber.core.api.TypeRegistry