Skip to content

Commit

Permalink
Merge pull request #214 from MaeumGaGym/Routine-한-요일에-다수-등록-가능하도록-수정
Browse files Browse the repository at this point in the history
PR :: 루틴의 요일이 겹쳐도 되도록 변경
  • Loading branch information
maeumgagym-ci-robot-app[bot] authored May 8, 2024
2 parents 972b8a6 + 6c2bc19 commit 8491059
Show file tree
Hide file tree
Showing 19 changed files with 98 additions and 167 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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,
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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<Routine> =
routineNativeRepository.findByUserIdAndDayOfWeekAndIsArchivedFalse(userId, dayOfWeek.name).map {
routineMapper.toDomain(
this,
exerciseInfoRepository.findAllByRoutineId(this.id!!)
it,
exerciseInfoRepository.findAllByRoutineId(it.id!!)
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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"
)
]
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,17 +20,5 @@ interface RoutineNativeRepository : Repository<RoutineJpaEntity, Long?> {
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<RoutineJpaEntity>
}
Original file line number Diff line number Diff line change
Expand Up @@ -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")
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,5 @@ data class RoutineResponse(
val routineName: String,
val exerciseInfoResponseList: List<ExerciseInfoResponse>,
val dayOfWeeks: List<String>?,
val routineStatus: RoutineStatusDto,
val isCompleted: Boolean? = null
val routineStatus: RoutineStatusDto
)
22 changes: 0 additions & 22 deletions src/main/kotlin/com/info/maeumgagym/core/routine/model/Routine.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.info.maeumgagym.core.routine.port.`in`

interface CompleteRoutineUseCase {
fun completeFromId(id: Long)
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -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
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@ import java.util.*

interface ReadRoutineHistoryPort {

fun readByUserIdAndDate(userId: UUID, date: LocalDate): RoutineHistory?

fun readByUserIdAndDateBetweenOrderByDate(
userId: UUID,
startDate: LocalDate,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,5 @@ interface ReadRoutinePort {

fun readAllByUserIdPaged(userId: UUID, index: Int): List<Routine>

fun readByUserIdAndDayOfWeekAndIsArchivedFalse(userId: UUID, dayOfWeek: DayOfWeek): Routine?

fun readByUserIdAndDayOfWeek(userId: UUID, dayOfWeek: DayOfWeek): Routine?
fun readByUserIdAndDayOfWeekAndIsArchivedFalse(userId: UUID, dayOfWeek: DayOfWeek): List<Routine>
}
Original file line number Diff line number Diff line change
@@ -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
)
)
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,38 +1,27 @@
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 {

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)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,31 +1,38 @@
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() }
)
}
}
Loading

0 comments on commit 8491059

Please sign in to comment.