Skip to content

Commit

Permalink
Add UseCase abstraction
Browse files Browse the repository at this point in the history
  • Loading branch information
michal-kowalcze committed Oct 24, 2021
1 parent 80d7b85 commit 006811b
Show file tree
Hide file tree
Showing 7 changed files with 18 additions and 14 deletions.
Expand Up @@ -16,7 +16,7 @@ class GetScheduleEndpoint(private val getScheduleUseCase: GetScheduleUseCase) {
// convert to domain model
val scheduleDay = LocalDate.parse(localDate)
// execute domain action
val daySchedule = getScheduleUseCase.getSchedule(scheduleDay)
val daySchedule = getScheduleUseCase.apply(scheduleDay)
// convert to API
val dayScheduleDto = daySchedule.toApi()

Expand Down
Expand Up @@ -16,7 +16,7 @@ class ReserveSlotEndpoint(private val reserveSlotUseCase: ReserveSlotUseCase) {
// convert to domain model
val slotId = SlotId(LocalDate.parse(localDate), index)
// execute domain action
val daySchedule = reserveSlotUseCase.reserve(slotId)
val daySchedule = reserveSlotUseCase.apply(slotId)
// convert to API
val dayScheduleDto = daySchedule.toApi()

Expand Down
Expand Up @@ -8,15 +8,15 @@ import java.time.LocalDate
class GetScheduleUseCase(
private val daySchedulerRepository: DayScheduleRepository,
private val dayScheduleCreator: DayScheduleCreator,
) {
) : UseCase<LocalDate, DaySchedule> {

fun getSchedule(scheduleDay: LocalDate): DaySchedule {
val daySchedule = daySchedulerRepository.get(scheduleDay)
override fun apply(input: LocalDate): DaySchedule {
val daySchedule = daySchedulerRepository.get(input)
if (daySchedule != null) {
return daySchedule
}

val newSchedule = dayScheduleCreator.create(scheduleDay)
val newSchedule = dayScheduleCreator.create(input)
return daySchedulerRepository.save(newSchedule)
}
}
Expand Down
Expand Up @@ -7,12 +7,12 @@ import eu.kowalcze.michal.arch.clean.example.domain.repository.DayScheduleReposi
class ReserveSlotUseCase(
private val dayScheduleRepository: DayScheduleRepository,
private val getScheduleUseCase: GetScheduleUseCase,
) {
) : UseCase<SlotId, DaySchedule> {

fun reserve(slotId: SlotId): DaySchedule {
val daySchedule = getScheduleUseCase.getSchedule(scheduleDay = slotId.day)
override fun apply(input: SlotId): DaySchedule {
val daySchedule = getScheduleUseCase.apply(input = input.day)

val modifiedSchedule = daySchedule.reserveSlot(slotId.index)
val modifiedSchedule = daySchedule.reserveSlot(input.index)

return dayScheduleRepository.save(modifiedSchedule)
}
Expand Down
@@ -0,0 +1,5 @@
package eu.kowalcze.michal.arch.clean.example.domain.usecase

interface UseCase<INPUT, OUTPUT> {
fun apply(input: INPUT): OUTPUT
}
Expand Up @@ -2,7 +2,6 @@ package eu.kowalcze.michal.arch.clean.example.domain.usecase

import eu.kowalcze.michal.arch.clean.example.domain.model.DaySchedule
import eu.kowalcze.michal.arch.clean.example.domain.model.DayScheduleCreator
import eu.kowalcze.michal.arch.clean.example.domain.repository.DayScheduleRepository
import eu.kowalcze.michal.arch.clean.example.infrastructure.InMemoryDayScheduleRepository
import io.kotest.matchers.shouldBe
import io.kotest.matchers.types.shouldBeSameInstanceAs
Expand Down Expand Up @@ -33,7 +32,7 @@ internal class GetScheduleUseCaseTest {
daySchedulerRepository.save(givenSchedule)

// when
val schedule = getScheduleUseCase.getSchedule(today)
val schedule = getScheduleUseCase.apply(today)

// then
schedule shouldBeSameInstanceAs givenSchedule
Expand All @@ -50,7 +49,7 @@ internal class GetScheduleUseCaseTest {
every { dayScheduleCreator.create(today) }.returns(givenSchedule)

// when
val schedule = getScheduleUseCase.getSchedule(today)
val schedule = getScheduleUseCase.apply(today)

// then
schedule shouldBeSameInstanceAs givenSchedule
Expand Down
Expand Up @@ -37,7 +37,7 @@ internal class ReserveSlotUseCaseTest {
every { dayScheduleCreator.create(today) }.returns(givenSchedule)

// when
val daySchedule = reserveSlotUseCase.reserve(SlotId(today, index = 0))
val daySchedule = reserveSlotUseCase.apply(SlotId(today, index = 0))

// then
daySchedule.slots[0].reserved shouldBe true
Expand Down

0 comments on commit 006811b

Please sign in to comment.