Skip to content

Commit

Permalink
feat: (#788) 외출 조회 API 수정
Browse files Browse the repository at this point in the history
  • Loading branch information
ilyoil2 committed Oct 13, 2024
1 parent 6ca9d06 commit 32554b1
Show file tree
Hide file tree
Showing 15 changed files with 74 additions and 80 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import team.aliens.dms.domain.outing.model.OutingType
import team.aliens.dms.domain.outing.spi.vo.CurrentOutingApplicationVO
import team.aliens.dms.domain.outing.spi.vo.OutingApplicationVO
import team.aliens.dms.domain.outing.spi.vo.OutingCompanionDetailsVO
import team.aliens.dms.domain.outing.spi.vo.OutingHistoryVO
import java.time.DayOfWeek
import java.time.LocalDate
import java.util.UUID
Expand All @@ -23,8 +22,6 @@ interface GetOutingService {

fun getCurrentOutingApplication(studentId: UUID): CurrentOutingApplicationVO

fun getOutingHistoriesByStudentNameAndDate(studentName: String?, date: LocalDate): List<OutingHistoryVO>

fun getOutingAvailableTimesByDayOfWeek(dayOfWeek: DayOfWeek): List<OutingAvailableTime>

fun getOutingCompanionsByApplicationId(outingApplicationId: UUID): List<OutingCompanionDetailsVO>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ import team.aliens.dms.domain.outing.spi.QueryOutingCompanionPort
import team.aliens.dms.domain.outing.spi.QueryOutingTypePort
import team.aliens.dms.domain.outing.spi.vo.CurrentOutingApplicationVO
import team.aliens.dms.domain.outing.spi.vo.OutingCompanionDetailsVO
import team.aliens.dms.domain.outing.spi.vo.OutingHistoryVO
import java.time.DayOfWeek
import java.time.LocalDate
import java.util.UUID
Expand Down Expand Up @@ -44,11 +43,6 @@ class GetOutingServiceImpl(
?: throw OutingApplicationNotFoundException
}

override fun getOutingHistoriesByStudentNameAndDate(
studentName: String?,
date: LocalDate
): List<OutingHistoryVO> = queryOutingApplicationPort.queryOutingHistoriesByStudentNameAndDate(studentName, date)

override fun getOutingAvailableTimesByDayOfWeek(
dayOfWeek: DayOfWeek
) = queryOutingAvailableTimePort.queryOutingAvailableTimesByDayOfWeek(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package team.aliens.dms.domain.outing.spi
import team.aliens.dms.domain.outing.model.OutingApplication
import team.aliens.dms.domain.outing.spi.vo.CurrentOutingApplicationVO
import team.aliens.dms.domain.outing.spi.vo.OutingApplicationVO
import team.aliens.dms.domain.outing.spi.vo.OutingHistoryVO
import java.time.LocalDate
import java.util.UUID

Expand All @@ -17,7 +16,5 @@ interface QueryOutingApplicationPort {

fun queryCurrentOutingApplicationVO(studentId: UUID): CurrentOutingApplicationVO?

fun queryOutingHistoriesByStudentNameAndDate(studentName: String?, date: LocalDate): List<OutingHistoryVO>

fun isApplicant(studentId: UUID): Boolean
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package team.aliens.dms.domain.outing.spi.vo

import team.aliens.dms.domain.outing.model.OutingStatus
import java.time.LocalDate
import java.time.LocalTime
import java.util.UUID
Expand All @@ -9,7 +8,6 @@ open class CurrentOutingApplicationVO(
val id: UUID,
val outingDate: LocalDate,
val outingTypeTitle: String,
val status: OutingStatus,
val outingTime: LocalTime,
val arrivalTime: LocalTime,
val reason: String?,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,10 @@ package team.aliens.dms.domain.outing.spi.vo
import team.aliens.dms.domain.student.model.Student
import java.time.LocalDate
import java.time.LocalTime
import java.util.UUID

open class OutingApplicationVO(
val id: UUID,
val studentName: String,
val studentGrade: Int,
val studentClassRoom: Int,
Expand All @@ -13,6 +15,8 @@ open class OutingApplicationVO(
val outingDate: LocalDate,
val outingTime: LocalTime,
val arrivalTime: LocalTime,
val isApproved: Boolean,
val isComeback: Boolean,
val outingCompanionVOs: List<OutingCompanionVO>
) {
val studentGcn = Student.processGcn(studentGrade, studentClassRoom, studentNumber)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
package team.aliens.dms.domain.outing.spi.vo

import team.aliens.dms.domain.outing.model.OutingStatus
import java.time.LocalTime
import java.util.UUID

open class OutingHistoryVO(
val outingApplicationId: UUID,
val id: UUID,
val studentGcn: String,
val studentName: String,
val outingType: String,
val outingCompanionCount: Int,
val outingStatus: OutingStatus,
val outingTime: LocalTime,
val arrivalTime: LocalTime
val arrivalTime: LocalTime,
val isApproved: Boolean,
val isComeback: Boolean
)
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import team.aliens.dms.common.service.security.SecurityService
import team.aliens.dms.domain.outing.dto.request.ApplyOutingRequest
import team.aliens.dms.domain.outing.dto.response.ApplyOutingResponse
import team.aliens.dms.domain.outing.model.OutingApplication
import team.aliens.dms.domain.outing.model.OutingStatus
import team.aliens.dms.domain.outing.service.OutingService
import team.aliens.dms.domain.student.service.StudentService
import java.time.LocalDateTime
Expand Down Expand Up @@ -34,7 +33,8 @@ class ApplyOutingUseCase(
outingDate = request.outingDate,
outingTime = request.outingTime,
arrivalTime = request.arrivalTime,
status = OutingStatus.APPROVED,
isApproved = false,
isComeback = false,
reason = request.reason,
outingTypeTitle = request.outingTypeTitle,
schoolId = securityService.getCurrentSchoolId(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package team.aliens.dms.domain.outing.usecase
import team.aliens.dms.common.annotation.ReadOnlyUseCase
import team.aliens.dms.domain.outing.dto.response.OutingApplicationHistoriesResponse
import team.aliens.dms.domain.outing.service.OutingService
import team.aliens.dms.domain.outing.spi.vo.OutingHistoryVO
import java.time.LocalDate

@ReadOnlyUseCase
Expand All @@ -12,8 +13,39 @@ class GetOutingApplicationHistoriesUseCase(

fun execute(studentName: String?, date: LocalDate): OutingApplicationHistoriesResponse {

val outings = outingService.getOutingHistoriesByStudentNameAndDate(studentName = studentName, date = date)
val outingApplications = outingService.getAllOutingApplicationVOsBetweenStartAndEnd(date, date)

return OutingApplicationHistoriesResponse(outings)
val outingApplicationInfoSet = outingApplications.flatMap { outingApplication ->
val outingApplicationInfoList = mutableListOf(
OutingHistoryVO(
outingApplication.id,
outingApplication.studentGcn,
outingApplication.studentName,
outingApplication.outingType,
outingApplication.outingTime,
outingApplication.arrivalTime,
outingApplication.isApproved,
outingApplication.isComeback
)
)

for (outingCompanions in outingApplication.outingCompanionVOs)
if (outingCompanions.studentGcn.isNotBlank())
outingApplicationInfoList.add(
OutingHistoryVO(
outingApplication.id,
outingCompanions.studentGcn,
outingCompanions.studentName,
outingApplication.outingType,
outingApplication.outingTime,
outingApplication.arrivalTime,
outingApplication.isApproved,
outingApplication.isComeback
)
)
outingApplicationInfoList
}

return OutingApplicationHistoriesResponse(outingApplicationInfoSet)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ class UnApplyOutingUseCase(

outingService.getOutingApplicationById(outingApplicationId)
.apply {
checkCancelable(outing.status)
checkCancelable(outing.isApproved)
}

outingService.deleteOutingApplication(outing)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package team.aliens.dms.domain.outing.usecase

import team.aliens.dms.common.annotation.UseCase
import team.aliens.dms.domain.outing.model.OutingStatus
import team.aliens.dms.domain.outing.service.OutingService
import java.util.UUID

Expand All @@ -10,11 +9,11 @@ class UpdateOutingStatusUseCase(
private val outingService: OutingService
) {

fun execute(outingApplicationId: UUID, outingStatus: OutingStatus) {
fun execute(outingApplicationId: UUID, isApproved: Boolean, isComeback: Boolean) {
val outingApplication = outingService.getOutingApplicationById(outingApplicationId)

outingService.saveOutingApplication(
outingApplication.copy(status = outingStatus)
outingApplication.copy(isApproved = isApproved, isComeback = isComeback)
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,9 @@ import com.querydsl.jpa.impl.JPAQueryFactory
import org.springframework.data.repository.findByIdOrNull
import org.springframework.stereotype.Component
import team.aliens.dms.domain.outing.model.OutingApplication
import team.aliens.dms.domain.outing.model.OutingStatus
import team.aliens.dms.domain.outing.spi.OutingApplicationPort
import team.aliens.dms.domain.outing.spi.vo.CurrentOutingApplicationVO
import team.aliens.dms.domain.outing.spi.vo.OutingApplicationVO
import team.aliens.dms.domain.outing.spi.vo.OutingHistoryVO
import team.aliens.dms.persistence.outing.entity.QOutingApplicationJpaEntity.outingApplicationJpaEntity
import team.aliens.dms.persistence.outing.entity.QOutingCompanionJpaEntity.outingCompanionJpaEntity
import team.aliens.dms.persistence.outing.entity.QOutingTypeJpaEntity.outingTypeJpaEntity
Expand All @@ -21,7 +19,6 @@ import team.aliens.dms.persistence.outing.repository.OutingCompanionJpaRepositor
import team.aliens.dms.persistence.outing.repository.vo.QQueryCurrentOutingApplicationVO
import team.aliens.dms.persistence.outing.repository.vo.QQueryOutingApplicationVO
import team.aliens.dms.persistence.outing.repository.vo.QQueryOutingCompanionVO
import team.aliens.dms.persistence.outing.repository.vo.QQueryOutingHistoryVO
import team.aliens.dms.persistence.student.entity.QStudentJpaEntity
import java.time.LocalDate
import java.util.UUID
Expand Down Expand Up @@ -61,6 +58,7 @@ class OutingApplicationPersistenceAdapter(
groupBy(outingApplicationJpaEntity.id)
.list(
QQueryOutingApplicationVO(
outingApplicationJpaEntity.id,
studentJpaEntity.name,
studentJpaEntity.grade,
studentJpaEntity.classRoom,
Expand All @@ -69,6 +67,8 @@ class OutingApplicationPersistenceAdapter(
outingApplicationJpaEntity.outingDate,
outingApplicationJpaEntity.outingTime,
outingApplicationJpaEntity.arrivalTime,
outingApplicationJpaEntity.isApproved,
outingApplicationJpaEntity.isComeback,
list(
QQueryOutingCompanionVO(
outingCompanionStudentJpaEntity.name,
Expand Down Expand Up @@ -102,11 +102,11 @@ class OutingApplicationPersistenceAdapter(
.where(
outingCompanionJpaEntity.student.id.eq(studentId),
outingApplicationJpaEntity.student.id.eq(studentJpaEntity.id),
outingApplicationJpaEntity.status.ne(OutingStatus.DONE)
outingApplicationJpaEntity.isComeback.eq(false)
)
.exists()
),
outingApplicationJpaEntity.status.ne(OutingStatus.DONE)
outingApplicationJpaEntity.isComeback.eq(false)
)
.transform(
groupBy(outingApplicationJpaEntity.id)
Expand All @@ -115,7 +115,6 @@ class OutingApplicationPersistenceAdapter(
outingApplicationJpaEntity.id,
outingApplicationJpaEntity.outingDate,
outingTypeJpaEntity.id.title,
outingApplicationJpaEntity.status,
outingApplicationJpaEntity.outingTime,
outingApplicationJpaEntity.arrivalTime,
outingApplicationJpaEntity.reason,
Expand All @@ -126,37 +125,6 @@ class OutingApplicationPersistenceAdapter(
).firstOrNull()
}

override fun queryOutingHistoriesByStudentNameAndDate(studentName: String?, date: LocalDate): List<OutingHistoryVO> {
val studentJpaEntity = QStudentJpaEntity("studentJpaEntity")
val outingCompanionStudentJpaEntity = QStudentJpaEntity("outingCompanionStudentJpaEntity")

return queryFactory
.select(
QQueryOutingHistoryVO(
outingApplicationJpaEntity.id,
studentJpaEntity.name,
outingTypeJpaEntity.id.title,
outingCompanionJpaEntity.count().intValue(),
outingApplicationJpaEntity.status,
outingApplicationJpaEntity.outingTime,
outingApplicationJpaEntity.arrivalTime
)
)
.from(outingApplicationJpaEntity)
.join(outingApplicationJpaEntity.student, studentJpaEntity)
.join(outingApplicationJpaEntity.outingType, outingTypeJpaEntity)
.leftJoin(outingCompanionJpaEntity)
.on(outingApplicationJpaEntity.id.eq(outingCompanionJpaEntity.outingApplication.id))
.leftJoin(outingCompanionJpaEntity.student, outingCompanionStudentJpaEntity)
.where(
studentName?.let { studentJpaEntity.name.contains(it) },
outingApplicationJpaEntity.outingDate.eq(date)
)
.groupBy(outingApplicationJpaEntity.id)
.orderBy(outingApplicationJpaEntity.arrivalTime.asc())
.fetch()
}

override fun saveOutingApplication(outingApplication: OutingApplication) =
outingApplicationMapper.toDomain(
outingApplicationRepository.save(
Expand All @@ -183,7 +151,7 @@ class OutingApplicationPersistenceAdapter(
.join(outingApplicationJpaEntity.student, studentJpaEntity)
.where(
studentJpaEntity.id.eq(studentId),
outingApplicationJpaEntity.status.ne(OutingStatus.DONE)
outingApplicationJpaEntity.isComeback.eq(false)
)
.fetchOne()

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package team.aliens.dms.persistence.outing.repository.vo

import com.querydsl.core.annotations.QueryProjection
import team.aliens.dms.domain.outing.model.OutingStatus
import team.aliens.dms.domain.outing.spi.vo.CurrentOutingApplicationVO
import java.time.LocalDate
import java.time.LocalTime
Expand All @@ -11,7 +10,6 @@ class QueryCurrentOutingApplicationVO @QueryProjection constructor(
id: UUID,
outingDate: LocalDate,
outingTypeTitle: String,
status: OutingStatus,
outingTime: LocalTime,
arrivalTime: LocalTime,
reason: String?,
Expand All @@ -21,7 +19,6 @@ class QueryCurrentOutingApplicationVO @QueryProjection constructor(
id = id,
outingDate = outingDate,
outingTypeTitle = outingTypeTitle,
status = status,
outingTime = outingTime,
arrivalTime = arrivalTime,
reason = reason,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,10 @@ import team.aliens.dms.domain.outing.spi.vo.OutingApplicationVO
import team.aliens.dms.domain.outing.spi.vo.OutingCompanionVO
import java.time.LocalDate
import java.time.LocalTime
import java.util.UUID

class QueryOutingApplicationVO @QueryProjection constructor(
id: UUID,
studentName: String,
studentGrade: Int,
studentClassRoom: Int,
Expand All @@ -15,8 +17,11 @@ class QueryOutingApplicationVO @QueryProjection constructor(
outingDate: LocalDate,
outingTime: LocalTime,
arrivalTime: LocalTime,
isApproved: Boolean,
isComeback: Boolean,
outingCompanionVOs: List<OutingCompanionVO>
) : OutingApplicationVO(
id = id,
studentName = studentName,
studentGrade = studentGrade,
studentClassRoom = studentClassRoom,
Expand All @@ -25,5 +30,7 @@ class QueryOutingApplicationVO @QueryProjection constructor(
outingDate = outingDate,
outingTime = outingTime,
arrivalTime = arrivalTime,
isApproved = isApproved,
isComeback = isComeback,
outingCompanionVOs = outingCompanionVOs
)
Loading

0 comments on commit 32554b1

Please sign in to comment.