From e5266441f29def93faa08012543d4c1612ecebd2 Mon Sep 17 00:00:00 2001 From: Daybreak312 Date: Fri, 3 May 2024 08:58:21 +0900 Subject: [PATCH 1/3] =?UTF-8?q?REFACT=20::=20=EC=9A=94=EC=9D=BC=EC=9D=B4?= =?UTF-8?q?=20=EA=B2=B9=EC=B9=98=EB=8A=94=20=EB=A3=A8=ED=8B=B4=EC=9D=B4=20?= =?UTF-8?q?=EC=97=86=EB=8F=84=EB=A1=9D=20=EA=B2=80=EC=A6=9D=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EB=A1=9C=EC=A7=81=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../info/maeumgagym/common/exception/Exceptions.kt | 2 -- .../core/routine/service/CreateRoutineService.kt | 13 +------------ .../core/routine/service/UpdateRoutineService.kt | 13 +------------ 3 files changed, 2 insertions(+), 26 deletions(-) diff --git a/src/main/kotlin/com/info/maeumgagym/common/exception/Exceptions.kt b/src/main/kotlin/com/info/maeumgagym/common/exception/Exceptions.kt index c43a0028..094b4317 100644 --- a/src/main/kotlin/com/info/maeumgagym/common/exception/Exceptions.kt +++ b/src/main/kotlin/com/info/maeumgagym/common/exception/Exceptions.kt @@ -135,8 +135,6 @@ class BusinessLogicException( get() = BusinessLogicException(ErrorCodePrefixSuffix.ALREADY_EXISTS_XXX, DomainNames.USER) val ALREADY_EXIST_PICKLE get() = BusinessLogicException(ErrorCodePrefixSuffix.ALREADY_EXISTS_XXX, DomainNames.PICKLE) - val OTHER_ROUTINE_ALREADY_USING_AT_DAY_OF_WEEK - get() = BusinessLogicException(409, "Other Routine Already Using At Day of week") } } diff --git a/src/main/kotlin/com/info/maeumgagym/core/routine/service/CreateRoutineService.kt b/src/main/kotlin/com/info/maeumgagym/core/routine/service/CreateRoutineService.kt index 9ec301bd..8f0010f2 100644 --- a/src/main/kotlin/com/info/maeumgagym/core/routine/service/CreateRoutineService.kt +++ b/src/main/kotlin/com/info/maeumgagym/core/routine/service/CreateRoutineService.kt @@ -1,22 +1,20 @@ package com.info.maeumgagym.core.routine.service import com.info.maeumgagym.common.annotation.responsibility.UseCase -import com.info.maeumgagym.core.auth.port.out.ReadCurrentUserPort import com.info.maeumgagym.common.dto.LocationSubjectDto import com.info.maeumgagym.common.exception.BusinessLogicException +import com.info.maeumgagym.core.auth.port.out.ReadCurrentUserPort import com.info.maeumgagym.core.pose.port.out.ReadPosePort import com.info.maeumgagym.core.routine.dto.request.CreateRoutineRequest import com.info.maeumgagym.core.routine.model.ExerciseInfoModel import com.info.maeumgagym.core.routine.model.Routine import com.info.maeumgagym.core.routine.model.RoutineStatusModel import com.info.maeumgagym.core.routine.port.`in`.CreateRoutineUseCase -import com.info.maeumgagym.core.routine.port.out.ReadRoutinePort import com.info.maeumgagym.core.routine.port.out.SaveRoutinePort @UseCase internal class CreateRoutineService( private val saveRoutinePort: SaveRoutinePort, - private val readRoutinePort: ReadRoutinePort, private val readPosePort: ReadPosePort, private val readCurrentUserPort: ReadCurrentUserPort ) : CreateRoutineUseCase { @@ -24,15 +22,6 @@ internal class CreateRoutineService( override fun createRoutine(req: CreateRoutineRequest): LocationSubjectDto { val user = readCurrentUserPort.readCurrentUser() - // 이미 사용 중인 루틴들과 겹치는 요일이 있는지 확인하는 과정 - if (!req.isArchived) { // 추가하려는 루틴이 사용되지 않을 예정이라면 이 과정에서 제외 - req.dayOfWeeks?.forEach { - if (readRoutinePort.readByUserIdAndDayOfWeekAndIsArchivedFalse(user.id!!, it) != null) { - throw BusinessLogicException.OTHER_ROUTINE_ALREADY_USING_AT_DAY_OF_WEEK - } - } - } - val poses = req.exerciseInfoRequestList.associate { Pair(it.id, readPosePort.readById(it.id) ?: throw BusinessLogicException.POSE_NOT_FOUND) } diff --git a/src/main/kotlin/com/info/maeumgagym/core/routine/service/UpdateRoutineService.kt b/src/main/kotlin/com/info/maeumgagym/core/routine/service/UpdateRoutineService.kt index d1484bc2..ac8b435a 100644 --- a/src/main/kotlin/com/info/maeumgagym/core/routine/service/UpdateRoutineService.kt +++ b/src/main/kotlin/com/info/maeumgagym/core/routine/service/UpdateRoutineService.kt @@ -1,9 +1,9 @@ package com.info.maeumgagym.core.routine.service import com.info.maeumgagym.common.annotation.responsibility.UseCase -import com.info.maeumgagym.core.auth.port.out.ReadCurrentUserPort import com.info.maeumgagym.common.exception.BusinessLogicException import com.info.maeumgagym.common.exception.SecurityException +import com.info.maeumgagym.core.auth.port.out.ReadCurrentUserPort import com.info.maeumgagym.core.pose.port.out.ReadPosePort import com.info.maeumgagym.core.routine.dto.request.UpdateRoutineRequest import com.info.maeumgagym.core.routine.model.ExerciseInfoModel @@ -30,17 +30,6 @@ internal class UpdateRoutineService( // 루틴을 만든 이가 토큰의 유저가 맞는지 검증, 아닐시 -> 예외처리 if (user.id != routine.userId) throw SecurityException.PERMISSION_DENIED - // 이미 사용 중인 루틴들과 겹치는 요일이 있는지 확인하는 과정 - if (!req.isArchived) { // 추가하려는 루틴이 사용되지 않을 예정이라면 이 과정에서 제외 - req.dayOfWeeks?.forEach { - val found = readRoutinePort.readByUserIdAndDayOfWeekAndIsArchivedFalse(user.id, it) - - if (found != null && found.id != routine.id) { - throw BusinessLogicException.OTHER_ROUTINE_ALREADY_USING_AT_DAY_OF_WEEK - } - } - } - val poses = req.exerciseInfoResponseList.associate { Pair(it.id, readPosePort.readById(it.id) ?: throw BusinessLogicException.POSE_NOT_FOUND) } From 146ba1c540a997f3d38706722fc3d12f0902cacb Mon Sep 17 00:00:00 2001 From: Daybreak312 Date: Fri, 3 May 2024 11:50:41 +0900 Subject: [PATCH 2/3] =?UTF-8?q?REFACT=20::=20=ED=95=98=EB=A3=A8=EC=97=90?= =?UTF-8?q?=20=EB=A3=A8=ED=8B=B4=EC=9D=98=20=EB=8B=A4=EC=A4=91=20=ED=95=A0?= =?UTF-8?q?=EB=8B=B9=EC=9D=B4=20=EA=B0=80=EB=8A=A5=ED=95=B4=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../info/maeumgagym/application/TableNames.kt | 2 +- .../RoutineHistoryPersistenceAdapter.kt | 10 +---- .../routine/RoutinePersistenceAdapter.kt | 18 +++----- .../entity/history/RoutineHistoryJpaEntity.kt | 10 ++--- .../current/RoutineNativeRepository.kt | 14 +----- .../routine/dto/response/RoutineResponse.kt | 3 +- .../maeumgagym/core/routine/model/Routine.kt | 22 ---------- .../routine/port/in/CompleteRoutineUseCase.kt | 5 +++ .../port/in/CompleteTodayRoutineUseCase.kt | 5 --- .../port/in/ReadTodayRoutineUseCase.kt | 4 +- .../port/out/ReadRoutineHistoryPort.kt | 2 - .../core/routine/port/out/ReadRoutinePort.kt | 4 +- .../routine/service/CompleteRoutineService.kt | 42 ++++++++++++++++++ .../service/CompleteTodayRoutineService.kt | 43 ------------------- .../service/ReadTodayRoutineService.kt | 34 +++++++++------ .../controller/routine/RoutineController.kt | 18 +++++--- 16 files changed, 95 insertions(+), 141 deletions(-) create mode 100644 src/main/kotlin/com/info/maeumgagym/core/routine/port/in/CompleteRoutineUseCase.kt delete mode 100644 src/main/kotlin/com/info/maeumgagym/core/routine/port/in/CompleteTodayRoutineUseCase.kt create mode 100644 src/main/kotlin/com/info/maeumgagym/core/routine/service/CompleteRoutineService.kt delete mode 100644 src/main/kotlin/com/info/maeumgagym/core/routine/service/CompleteTodayRoutineService.kt diff --git a/src/main/kotlin/com/info/maeumgagym/application/TableNames.kt b/src/main/kotlin/com/info/maeumgagym/application/TableNames.kt index 37d79bd1..3e2c17e6 100644 --- a/src/main/kotlin/com/info/maeumgagym/application/TableNames.kt +++ b/src/main/kotlin/com/info/maeumgagym/application/TableNames.kt @@ -14,7 +14,7 @@ object TableNames { const val ROUTINE_EXERCISE_TABLE = "${TABLE_PREFIX}routine_exercise" const val ROUTINE_HISTORY_TABLE = "${TABLE_PREFIX}routine_history" - const val ROUTINE_HISTORY_DATE_USER_UNIQUE = UNIQUE_PREFIX + "date_user" + const val ROUTINE_HISTORY_DATE_USER = INDEX_PREFIX + "date_user" const val ROUTINE_EXERCISE_HISTORY_TABLE = "${TABLE_PREFIX}routine_exercise_history" const val PICKLE_TABLE = "${TABLE_PREFIX}pickle" diff --git a/src/main/kotlin/com/info/maeumgagym/application/domain/routine/RoutineHistoryPersistenceAdapter.kt b/src/main/kotlin/com/info/maeumgagym/application/domain/routine/RoutineHistoryPersistenceAdapter.kt index e96bc655..62d42122 100644 --- a/src/main/kotlin/com/info/maeumgagym/application/domain/routine/RoutineHistoryPersistenceAdapter.kt +++ b/src/main/kotlin/com/info/maeumgagym/application/domain/routine/RoutineHistoryPersistenceAdapter.kt @@ -1,11 +1,11 @@ package com.info.maeumgagym.application.domain.routine -import com.info.maeumgagym.common.annotation.responsibility.PersistenceAdapter import com.info.maeumgagym.application.domain.routine.mapper.ExerciseInfoHistoryListMapper import com.info.maeumgagym.application.domain.routine.mapper.RoutineHistoryMapper import com.info.maeumgagym.application.domain.routine.repository.history.ExerciseInfoHistoryRepository import com.info.maeumgagym.application.domain.routine.repository.history.RoutineHistoryNativeRepository import com.info.maeumgagym.application.domain.routine.repository.history.RoutineHistoryRepository +import com.info.maeumgagym.common.annotation.responsibility.PersistenceAdapter import com.info.maeumgagym.core.routine.model.RoutineHistory import com.info.maeumgagym.core.routine.port.out.ExistsRoutineHistoryPort import com.info.maeumgagym.core.routine.port.out.ReadRoutineHistoryPort @@ -39,14 +39,6 @@ internal class RoutineHistoryPersistenceAdapter( return mapper.toDomain(saved, savedExerciseInfoHistories) } - override fun readByUserIdAndDate(userId: UUID, date: LocalDate): RoutineHistory? = - routineHistoryRepository.findByUserIdAndDate(userId, date)?.run { - mapper.toDomain( - this, - exerciseInfoHistoryRepository.findAllByRoutineHistoryId(this.id!!) - ) - } - override fun readByUserIdAndDateBetweenOrderByDate( userId: UUID, startDate: LocalDate, diff --git a/src/main/kotlin/com/info/maeumgagym/application/domain/routine/RoutinePersistenceAdapter.kt b/src/main/kotlin/com/info/maeumgagym/application/domain/routine/RoutinePersistenceAdapter.kt index cbff3521..dc60b862 100644 --- a/src/main/kotlin/com/info/maeumgagym/application/domain/routine/RoutinePersistenceAdapter.kt +++ b/src/main/kotlin/com/info/maeumgagym/application/domain/routine/RoutinePersistenceAdapter.kt @@ -1,11 +1,11 @@ package com.info.maeumgagym.application.domain.routine -import com.info.maeumgagym.common.annotation.responsibility.PersistenceAdapter import com.info.maeumgagym.application.domain.routine.mapper.ExerciseInfoListMapper import com.info.maeumgagym.application.domain.routine.mapper.RoutineMapper import com.info.maeumgagym.application.domain.routine.repository.current.ExerciseInfoRepository import com.info.maeumgagym.application.domain.routine.repository.current.RoutineNativeRepository import com.info.maeumgagym.application.domain.routine.repository.current.RoutineRepository +import com.info.maeumgagym.common.annotation.responsibility.PersistenceAdapter import com.info.maeumgagym.core.routine.model.Routine import com.info.maeumgagym.core.routine.port.out.DeleteRoutinePort import com.info.maeumgagym.core.routine.port.out.ReadRoutinePort @@ -68,19 +68,11 @@ internal class RoutinePersistenceAdapter( } } - override fun readByUserIdAndDayOfWeekAndIsArchivedFalse(userId: UUID, dayOfWeek: DayOfWeek): Routine? = - routineNativeRepository.findByUserIdAndDayOfWeekAndIsArchivedFalse(userId, dayOfWeek.name)?.run { - routineMapper.toDomain( - this, - exerciseInfoRepository.findAllByRoutineId(this.id!!) - ) - } - - override fun readByUserIdAndDayOfWeek(userId: UUID, dayOfWeek: DayOfWeek): Routine? = - routineNativeRepository.findByUserIdAndDayOfWeek(userId, dayOfWeek.name)?.run { + override fun readByUserIdAndDayOfWeekAndIsArchivedFalse(userId: UUID, dayOfWeek: DayOfWeek): List = + routineNativeRepository.findByUserIdAndDayOfWeekAndIsArchivedFalse(userId, dayOfWeek.name).map { routineMapper.toDomain( - this, - exerciseInfoRepository.findAllByRoutineId(this.id!!) + it, + exerciseInfoRepository.findAllByRoutineId(it.id!!) ) } diff --git a/src/main/kotlin/com/info/maeumgagym/application/domain/routine/entity/history/RoutineHistoryJpaEntity.kt b/src/main/kotlin/com/info/maeumgagym/application/domain/routine/entity/history/RoutineHistoryJpaEntity.kt index 6da3737b..9ade2b71 100644 --- a/src/main/kotlin/com/info/maeumgagym/application/domain/routine/entity/history/RoutineHistoryJpaEntity.kt +++ b/src/main/kotlin/com/info/maeumgagym/application/domain/routine/entity/history/RoutineHistoryJpaEntity.kt @@ -6,15 +6,15 @@ import java.time.LocalDate import java.util.* import javax.persistence.Column import javax.persistence.Entity +import javax.persistence.Index import javax.persistence.Table -import javax.persistence.UniqueConstraint @Entity(name = TableNames.ROUTINE_HISTORY_TABLE) @Table( - uniqueConstraints = [ - UniqueConstraint( - name = TableNames.ROUTINE_HISTORY_DATE_USER_UNIQUE, - columnNames = ["user_id", "date"] + indexes = [ + Index( + name = TableNames.ROUTINE_HISTORY_DATE_USER, + columnList = "user_id, date" ) ] ) diff --git a/src/main/kotlin/com/info/maeumgagym/application/domain/routine/repository/current/RoutineNativeRepository.kt b/src/main/kotlin/com/info/maeumgagym/application/domain/routine/repository/current/RoutineNativeRepository.kt index 67e08389..1acb4f01 100644 --- a/src/main/kotlin/com/info/maeumgagym/application/domain/routine/repository/current/RoutineNativeRepository.kt +++ b/src/main/kotlin/com/info/maeumgagym/application/domain/routine/repository/current/RoutineNativeRepository.kt @@ -20,17 +20,5 @@ interface RoutineNativeRepository : Repository { fun findByUserIdAndDayOfWeekAndIsArchivedFalse( @Param("userId") userId: UUID, @Param("dayOfWeek") dayOfWeek: String - ): RoutineJpaEntity? - - @Query( - value = "SELECT * FROM ${TableNames.ROUTINE_TABLE} r " + - "INNER JOIN ${TableNames.ROUTINE_TABLE}_day_of_weeks d " + - "ON r.id = d.${TableNames.ROUTINE_TABLE}_id " + - "WHERE r.user_id = :userId AND d.day_of_weeks LIKE :dayOfWeek", - nativeQuery = true - ) - fun findByUserIdAndDayOfWeek( - @Param("userId") userId: UUID, - @Param("dayOfWeek") dayOfWeek: String - ): RoutineJpaEntity? + ): List } diff --git a/src/main/kotlin/com/info/maeumgagym/core/routine/dto/response/RoutineResponse.kt b/src/main/kotlin/com/info/maeumgagym/core/routine/dto/response/RoutineResponse.kt index 9aefb080..edc9295b 100644 --- a/src/main/kotlin/com/info/maeumgagym/core/routine/dto/response/RoutineResponse.kt +++ b/src/main/kotlin/com/info/maeumgagym/core/routine/dto/response/RoutineResponse.kt @@ -7,6 +7,5 @@ data class RoutineResponse( val routineName: String, val exerciseInfoResponseList: List, val dayOfWeeks: List?, - val routineStatus: RoutineStatusDto, - val isCompleted: Boolean? = null + val routineStatus: RoutineStatusDto ) diff --git a/src/main/kotlin/com/info/maeumgagym/core/routine/model/Routine.kt b/src/main/kotlin/com/info/maeumgagym/core/routine/model/Routine.kt index 3c3cddf0..f7649317 100644 --- a/src/main/kotlin/com/info/maeumgagym/core/routine/model/Routine.kt +++ b/src/main/kotlin/com/info/maeumgagym/core/routine/model/Routine.kt @@ -34,26 +34,4 @@ data class Routine( ) } ) - - fun toResponse(isCompleted: Boolean): RoutineResponse = - RoutineResponse( - id = id!!, - routineName = routineName, - exerciseInfoResponseList = exerciseInfoModelList.map { - it.toResponse() - }, - dayOfWeeks = dayOfWeeks?.sorted()?.map { - it.getDisplayName( - TextStyle.SHORT, - Locale.KOREA - ) - }, - routineStatus = routineStatusModel.run { - RoutineStatusDto( - isArchived = isArchived, - isShared = isShared - ) - }, - isCompleted = isCompleted - ) } diff --git a/src/main/kotlin/com/info/maeumgagym/core/routine/port/in/CompleteRoutineUseCase.kt b/src/main/kotlin/com/info/maeumgagym/core/routine/port/in/CompleteRoutineUseCase.kt new file mode 100644 index 00000000..df435fb3 --- /dev/null +++ b/src/main/kotlin/com/info/maeumgagym/core/routine/port/in/CompleteRoutineUseCase.kt @@ -0,0 +1,5 @@ +package com.info.maeumgagym.core.routine.port.`in` + +interface CompleteRoutineUseCase { + fun completeFromId(id: Long) +} diff --git a/src/main/kotlin/com/info/maeumgagym/core/routine/port/in/CompleteTodayRoutineUseCase.kt b/src/main/kotlin/com/info/maeumgagym/core/routine/port/in/CompleteTodayRoutineUseCase.kt deleted file mode 100644 index 5042554a..00000000 --- a/src/main/kotlin/com/info/maeumgagym/core/routine/port/in/CompleteTodayRoutineUseCase.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.info.maeumgagym.core.routine.port.`in` - -interface CompleteTodayRoutineUseCase { - fun complete() -} diff --git a/src/main/kotlin/com/info/maeumgagym/core/routine/port/in/ReadTodayRoutineUseCase.kt b/src/main/kotlin/com/info/maeumgagym/core/routine/port/in/ReadTodayRoutineUseCase.kt index d34d2834..da854ec2 100644 --- a/src/main/kotlin/com/info/maeumgagym/core/routine/port/in/ReadTodayRoutineUseCase.kt +++ b/src/main/kotlin/com/info/maeumgagym/core/routine/port/in/ReadTodayRoutineUseCase.kt @@ -1,8 +1,8 @@ package com.info.maeumgagym.core.routine.port.`in` -import com.info.maeumgagym.core.routine.dto.response.RoutineResponse +import com.info.maeumgagym.core.routine.dto.response.RoutineListResponse interface ReadTodayRoutineUseCase { - fun readTodayRoutine(): RoutineResponse? + fun readTodayRoutine(): RoutineListResponse } diff --git a/src/main/kotlin/com/info/maeumgagym/core/routine/port/out/ReadRoutineHistoryPort.kt b/src/main/kotlin/com/info/maeumgagym/core/routine/port/out/ReadRoutineHistoryPort.kt index d384de47..7eaadfbb 100644 --- a/src/main/kotlin/com/info/maeumgagym/core/routine/port/out/ReadRoutineHistoryPort.kt +++ b/src/main/kotlin/com/info/maeumgagym/core/routine/port/out/ReadRoutineHistoryPort.kt @@ -6,8 +6,6 @@ import java.util.* interface ReadRoutineHistoryPort { - fun readByUserIdAndDate(userId: UUID, date: LocalDate): RoutineHistory? - fun readByUserIdAndDateBetweenOrderByDate( userId: UUID, startDate: LocalDate, diff --git a/src/main/kotlin/com/info/maeumgagym/core/routine/port/out/ReadRoutinePort.kt b/src/main/kotlin/com/info/maeumgagym/core/routine/port/out/ReadRoutinePort.kt index c88038d9..d31ab75f 100644 --- a/src/main/kotlin/com/info/maeumgagym/core/routine/port/out/ReadRoutinePort.kt +++ b/src/main/kotlin/com/info/maeumgagym/core/routine/port/out/ReadRoutinePort.kt @@ -10,7 +10,5 @@ interface ReadRoutinePort { fun readAllByUserIdPaged(userId: UUID, index: Int): List - fun readByUserIdAndDayOfWeekAndIsArchivedFalse(userId: UUID, dayOfWeek: DayOfWeek): Routine? - - fun readByUserIdAndDayOfWeek(userId: UUID, dayOfWeek: DayOfWeek): Routine? + fun readByUserIdAndDayOfWeekAndIsArchivedFalse(userId: UUID, dayOfWeek: DayOfWeek): List } diff --git a/src/main/kotlin/com/info/maeumgagym/core/routine/service/CompleteRoutineService.kt b/src/main/kotlin/com/info/maeumgagym/core/routine/service/CompleteRoutineService.kt new file mode 100644 index 00000000..c5d91d28 --- /dev/null +++ b/src/main/kotlin/com/info/maeumgagym/core/routine/service/CompleteRoutineService.kt @@ -0,0 +1,42 @@ +package com.info.maeumgagym.core.routine.service + +import com.info.maeumgagym.common.annotation.responsibility.UseCase +import com.info.maeumgagym.common.exception.BusinessLogicException +import com.info.maeumgagym.core.auth.port.out.ReadCurrentUserPort +import com.info.maeumgagym.core.routine.model.ExerciseInfoHistoryModel.Companion.toHistory +import com.info.maeumgagym.core.routine.model.RoutineHistory +import com.info.maeumgagym.core.routine.port.`in`.CompleteRoutineUseCase +import com.info.maeumgagym.core.routine.port.out.ReadRoutinePort +import com.info.maeumgagym.core.routine.port.out.SaveRoutineHistoryPort +import java.time.LocalDate + +@UseCase +class CompleteRoutineService( + private val readCurrentUserPort: ReadCurrentUserPort, + private val readRoutinePort: ReadRoutinePort, + private val saveRoutineHistoryPort: SaveRoutineHistoryPort +) : CompleteRoutineUseCase { + + override fun completeFromId(id: Long) { + val user = readCurrentUserPort.readCurrentUser() + + val routine = readRoutinePort.readById(id) + ?: throw BusinessLogicException.ROUTINE_NOT_FOUND + + val now = LocalDate.now() + + if (!routine.dayOfWeeks!!.contains(now.dayOfWeek)) { + throw BusinessLogicException(400, "It's Not Today's Routine") + } + + saveRoutineHistoryPort.save( + RoutineHistory( + id = null, + date = now, + exerciseInfoHistoryList = routine.exerciseInfoModelList.map { it.toHistory() }, + userId = user.id!!, + routineName = routine.routineName + ) + ) + } +} diff --git a/src/main/kotlin/com/info/maeumgagym/core/routine/service/CompleteTodayRoutineService.kt b/src/main/kotlin/com/info/maeumgagym/core/routine/service/CompleteTodayRoutineService.kt deleted file mode 100644 index a127635e..00000000 --- a/src/main/kotlin/com/info/maeumgagym/core/routine/service/CompleteTodayRoutineService.kt +++ /dev/null @@ -1,43 +0,0 @@ -package com.info.maeumgagym.core.routine.service - -import com.info.maeumgagym.common.annotation.responsibility.UseCase -import com.info.maeumgagym.core.auth.port.out.ReadCurrentUserPort -import com.info.maeumgagym.common.exception.BusinessLogicException -import com.info.maeumgagym.core.routine.model.ExerciseInfoHistoryModel.Companion.toHistory -import com.info.maeumgagym.core.routine.model.RoutineHistory -import com.info.maeumgagym.core.routine.port.`in`.CompleteTodayRoutineUseCase -import com.info.maeumgagym.core.routine.port.out.ExistsRoutineHistoryPort -import com.info.maeumgagym.core.routine.port.out.ReadRoutinePort -import com.info.maeumgagym.core.routine.port.out.SaveRoutineHistoryPort -import java.time.LocalDate - -@UseCase -class CompleteTodayRoutineService( - private val readCurrentUserPort: ReadCurrentUserPort, - private val readRoutinePort: ReadRoutinePort, - private val saveRoutineHistoryPort: SaveRoutineHistoryPort, - private val existsRoutineHistoryPort: ExistsRoutineHistoryPort -) : CompleteTodayRoutineUseCase { - override fun complete() { - val user = readCurrentUserPort.readCurrentUser() - - val now = LocalDate.now() - - val routine = readRoutinePort.readByUserIdAndDayOfWeek(user.id!!, now.dayOfWeek) - ?: throw BusinessLogicException.ROUTINE_NOT_FOUND - - if (existsRoutineHistoryPort.exsitsByUserIdAndDate(user.id, now)) { - throw BusinessLogicException(409, "Already Completed Routine") - } else { - saveRoutineHistoryPort.save( - RoutineHistory( - id = null, - date = now, - exerciseInfoHistoryList = routine.exerciseInfoModelList.map { it.toHistory() }, - userId = user.id, - routineName = routine.routineName - ) - ) - } - } -} diff --git a/src/main/kotlin/com/info/maeumgagym/core/routine/service/ReadTodayRoutineService.kt b/src/main/kotlin/com/info/maeumgagym/core/routine/service/ReadTodayRoutineService.kt index db4efb6f..b00170fb 100644 --- a/src/main/kotlin/com/info/maeumgagym/core/routine/service/ReadTodayRoutineService.kt +++ b/src/main/kotlin/com/info/maeumgagym/core/routine/service/ReadTodayRoutineService.kt @@ -1,31 +1,37 @@ package com.info.maeumgagym.core.routine.service import com.info.maeumgagym.common.annotation.responsibility.ReadOnlyUseCase +import com.info.maeumgagym.common.exception.MaeumGaGymException import com.info.maeumgagym.core.auth.port.out.ReadCurrentUserPort -import com.info.maeumgagym.common.exception.BusinessLogicException -import com.info.maeumgagym.core.routine.dto.response.RoutineResponse +import com.info.maeumgagym.core.routine.dto.response.RoutineListResponse import com.info.maeumgagym.core.routine.port.`in`.ReadTodayRoutineUseCase -import com.info.maeumgagym.core.routine.port.out.ExistsRoutineHistoryPort import com.info.maeumgagym.core.routine.port.out.ReadRoutinePort +import com.info.maeumgagym.core.user.dto.response.UserResponse import java.time.LocalDate @ReadOnlyUseCase class ReadTodayRoutineService( private val readRoutinePort: ReadRoutinePort, - private val readCurrentUserPort: ReadCurrentUserPort, - private val existsRoutineHistoryPort: ExistsRoutineHistoryPort + private val readCurrentUserPort: ReadCurrentUserPort ) : ReadTodayRoutineUseCase { - override fun readTodayRoutine(): RoutineResponse? { - val userId = readCurrentUserPort.readCurrentUser().id!! + override fun readTodayRoutine(): RoutineListResponse { + val user = readCurrentUserPort.readCurrentUser() - val now = LocalDate.now() + val routines = readRoutinePort.readByUserIdAndDayOfWeekAndIsArchivedFalse( + user.id!!, LocalDate.now().dayOfWeek + ) - return readRoutinePort.readByUserIdAndDayOfWeekAndIsArchivedFalse( - userId, - now.dayOfWeek - )?.run { - toResponse(existsRoutineHistoryPort.exsitsByUserIdAndDate(userId, now)) - } ?: throw BusinessLogicException(204, "There's No Content Left") + if (routines.isEmpty()) { + throw MaeumGaGymException.NO_CONTENT + } + + return RoutineListResponse( + UserResponse( + nickname = user.nickname, + profileImage = user.profileImage + ), + routines.map { it.toResponse() } + ) } } diff --git a/src/main/kotlin/com/info/maeumgagym/presentation/controller/routine/RoutineController.kt b/src/main/kotlin/com/info/maeumgagym/presentation/controller/routine/RoutineController.kt index 850432b1..5b3adc31 100644 --- a/src/main/kotlin/com/info/maeumgagym/presentation/controller/routine/RoutineController.kt +++ b/src/main/kotlin/com/info/maeumgagym/presentation/controller/routine/RoutineController.kt @@ -15,7 +15,6 @@ import org.springframework.http.HttpStatus import org.springframework.validation.annotation.Validated import org.springframework.web.bind.annotation.* import java.time.LocalDate -import javax.servlet.http.HttpServletResponse import javax.validation.Valid import javax.validation.constraints.NotNull import javax.validation.constraints.Positive @@ -33,7 +32,7 @@ private class RoutineController( private val updateRoutineUseCase: UpdateRoutineUseCase, private val readRoutineUseCase: ReadRoutineUseCase, private val locationHeaderManager: LocationHeaderManager, - private val completeTodayRoutineUseCase: CompleteTodayRoutineUseCase, + private val completeRoutineUseCase: CompleteRoutineUseCase, private val readRoutineHistoryUseCase: ReadRoutineHistoryUseCase ) { @Operation(summary = "루틴 생성 API") @@ -50,7 +49,7 @@ private class RoutineController( @Operation(summary = "오늘의 루틴 조회 API") @GetMapping("/today") - fun readTodayRoutine(httpServletResponse: HttpServletResponse): RoutineResponse? = + fun readTodayRoutine(): RoutineListResponse = readTodayRoutineUseCase.readTodayRoutine() @Operation(summary = "내 루틴 전체 조회 API") @@ -95,11 +94,16 @@ private class RoutineController( id: Long ): RoutineResponse = readRoutineUseCase.readFromId(id) - @Operation(summary = "오늘의 루틴 완료 API") + @Operation(summary = "루틴 완료 API") @ResponseStatus(HttpStatus.NO_CONTENT) - @PutMapping("/today/complete") - fun completeTodayRoutine() { - completeTodayRoutineUseCase.complete() + @PutMapping("/today/complete/{id}") + fun completeTodayRoutine( + @PathVariable + @Valid + @Positive(message = "0보다 커야 합니다.") + id: Long + ) { + completeRoutineUseCase.completeFromId(id) } @Operation(summary = "루틴 기록 조회 API") From 6c2bc196898b54ce0f162e98b4a9470a7111d81d Mon Sep 17 00:00:00 2001 From: Daybreak312 Date: Sat, 4 May 2024 20:41:26 +0900 Subject: [PATCH 3/3] REFACT :: ktlintFormat --- .../maeumgagym/core/routine/service/ReadTodayRoutineService.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/com/info/maeumgagym/core/routine/service/ReadTodayRoutineService.kt b/src/main/kotlin/com/info/maeumgagym/core/routine/service/ReadTodayRoutineService.kt index b00170fb..4baf62b5 100644 --- a/src/main/kotlin/com/info/maeumgagym/core/routine/service/ReadTodayRoutineService.kt +++ b/src/main/kotlin/com/info/maeumgagym/core/routine/service/ReadTodayRoutineService.kt @@ -19,7 +19,8 @@ class ReadTodayRoutineService( val user = readCurrentUserPort.readCurrentUser() val routines = readRoutinePort.readByUserIdAndDayOfWeekAndIsArchivedFalse( - user.id!!, LocalDate.now().dayOfWeek + user.id!!, + LocalDate.now().dayOfWeek ) if (routines.isEmpty()) {