Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

merge: (#788) 외출 내역 조회 API 변경 #790

Merged
merged 11 commits into from
Oct 16, 2024
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package team.aliens.dms.domain.outing.dto.response
import com.fasterxml.jackson.annotation.JsonInclude
import team.aliens.dms.domain.outing.model.OutingApplication
import team.aliens.dms.domain.outing.model.OutingAvailableTime
import team.aliens.dms.domain.outing.model.OutingStatus
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
Expand All @@ -25,7 +24,6 @@ data class GetCurrentOutingApplicationResponse(
val id: UUID,
val outingDate: LocalDate,
val outingTypeTitle: String,
val status: OutingStatus,
val outingTime: LocalTime,
val arrivalTime: LocalTime,
@field:JsonInclude(JsonInclude.Include.ALWAYS)
Expand All @@ -39,7 +37,6 @@ data class GetCurrentOutingApplicationResponse(
id = id,
outingDate = outingDate,
outingTypeTitle = outingTypeTitle,
status = status,
outingTime = outingTime,
arrivalTime = arrivalTime,
reason = reason,
Expand All @@ -63,7 +60,6 @@ data class OutingHistoryDetailsResponse(
val studentRoomNumber: String,
val outingTime: LocalTime,
val arrivalTime: LocalTime,
val outingStatus: OutingStatus,
@field:JsonInclude(JsonInclude.Include.ALWAYS)
val reason: String?,
val outingType: String,
Expand All @@ -81,7 +77,6 @@ data class OutingHistoryDetailsResponse(
studentRoomNumber = student.roomNumber,
outingTime = outingHistory.outingTime,
arrivalTime = outingHistory.arrivalTime,
outingStatus = outingHistory.status,
reason = outingHistory.reason,
outingType = outingHistory.outingTypeTitle,
students = outingCompanions.map {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,9 @@ data class OutingApplication(

val arrivalTime: LocalTime,

val status: OutingStatus,
val isApproved: Boolean,

val isReturned: Boolean,

val reason: String?,

Expand All @@ -35,8 +37,8 @@ data class OutingApplication(

) : SchoolIdDomain {

fun checkCancelable(status: OutingStatus) {
if (status != OutingStatus.APPROVED) {
fun checkCancelable(isApproved: Boolean) {
if (isApproved) {
throw OutingTypeMismatchException
}
}
Expand Down

This file was deleted.

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 @@ -19,12 +18,10 @@ interface GetOutingService {

fun getOutingApplicationById(outingApplicationId: UUID): OutingApplication

fun getAllOutingApplicationVOsBetweenStartAndEnd(start: LocalDate, end: LocalDate): List<OutingApplicationVO>
fun getAllOutingApplicationVOsBetweenStartAndEnd(name: String?, start: LocalDate, end: LocalDate): List<OutingApplicationVO>

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 All @@ -36,19 +35,14 @@ class GetOutingServiceImpl(
queryOutingApplicationPort.queryOutingApplicationById(outingApplicationId)
?: throw OutingApplicationNotFoundException

override fun getAllOutingApplicationVOsBetweenStartAndEnd(start: LocalDate, end: LocalDate) =
override fun getAllOutingApplicationVOsBetweenStartAndEnd(name: String?, start: LocalDate, end: LocalDate) =
queryOutingApplicationPort.queryAllOutingApplicationVOsBetweenStartAndEnd(start, end)

ilyoil2 marked this conversation as resolved.
Show resolved Hide resolved
override fun getCurrentOutingApplication(studentId: UUID): CurrentOutingApplicationVO {
return queryOutingApplicationPort.queryCurrentOutingApplicationVO(studentId)
?: 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 @@ -13,11 +12,9 @@ interface QueryOutingApplicationPort {

fun queryOutingApplicationById(outingApplicationId: UUID): OutingApplication?

fun queryAllOutingApplicationVOsBetweenStartAndEnd(start: LocalDate, end: LocalDate): List<OutingApplicationVO>
fun queryAllOutingApplicationVOsBetweenStartAndEnd(name: String?, start: LocalDate, end: LocalDate): List<OutingApplicationVO>

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,
ilyoil2 marked this conversation as resolved.
Show resolved Hide resolved
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 isReturned: 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 @@ -20,7 +20,7 @@ class ExportAllOutingApplicationsUseCase(

fun execute(start: LocalDate, end: LocalDate): ExportAllOutingApplicationsResponse {

val outingApplicationExcelVOs = outingService.getAllOutingApplicationVOsBetweenStartAndEnd(start, end)
val outingApplicationExcelVOs = outingService.getAllOutingApplicationVOsBetweenStartAndEnd(null, start, end)

val file = fileService.writeOutingApplicationExcelFile(outingApplicationExcelVOs)

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 {
ilyoil2 marked this conversation as resolved.
Show resolved Hide resolved

val outings = outingService.getOutingHistoriesByStudentNameAndDate(studentName = studentName, date = date)
val outingApplications = outingService.getAllOutingApplicationVOsBetweenStartAndEnd(studentName, 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
ilyoil2 marked this conversation as resolved.
Show resolved Hide resolved
)
)
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, isReturned: Boolean) {
val outingApplication = outingService.getOutingApplicationById(outingApplicationId)

outingService.saveOutingApplication(
outingApplication.copy(status = outingStatus)
outingApplication.copy(isApproved = isApproved, isComeback = isReturned)
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,21 +10,21 @@ class OutingApplicationTest : DescribeSpec({

describe("checkCancelable") {
context("외출 신청 상태가 REQUESTED이면") {
val outingApplication = createOutingApplicationStub(outingStatus = OutingStatus.APPROVED)
val outingApplication = createOutingApplicationStub(isApproved = false)

it("외출 취소가 가능하다") {
shouldNotThrowAny {
outingApplication.checkCancelable(OutingStatus.APPROVED)
outingApplication.checkCancelable(false)
}
}
}

context("외출 신청 상태가 REQUESTED가 아니면") {
val outingApplication = createOutingApplicationStub(outingStatus = OutingStatus.APPROVED)
val outingApplication = createOutingApplicationStub(isApproved = true)

it("외출 취소가 불가능하다") {
shouldThrow<OutingTypeMismatchException> {
outingApplication.checkCancelable(OutingStatus.DONE)
outingApplication.checkCancelable(true)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package team.aliens.dms.domain.outing.stub

import team.aliens.dms.domain.outing.model.OutingApplication
import team.aliens.dms.domain.outing.model.OutingAvailableTime
import team.aliens.dms.domain.outing.model.OutingStatus
import java.time.DayOfWeek
import java.time.LocalDate
import java.time.LocalDateTime
Expand All @@ -16,7 +15,8 @@ internal fun createOutingApplicationStub(
outingDate: LocalDate = LocalDate.now(),
outingTime: LocalTime = LocalTime.now(),
arrivalTime: LocalTime = LocalTime.now(),
outingStatus: OutingStatus = OutingStatus.REQUESTED,
isApproved: Boolean = false,
isComeback: Boolean = false,
reason: String? = null,
outingTypeTitle: String = "식사 외출",
schoolId: UUID = UUID.randomUUID(),
Expand All @@ -28,7 +28,8 @@ internal fun createOutingApplicationStub(
outingDate = outingDate,
outingTime = outingTime,
arrivalTime = arrivalTime,
status = outingStatus,
isApproved = isApproved,
isComeback = isComeback,
reason = reason,
outingTypeTitle = outingTypeTitle,
schoolId = schoolId
Expand Down
ilyoil2 marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
alter table tbl_outing_application
drop column status,
add column is_approved bit(1) not null default b'0',
add column is_returned bit(1) not null default b'0';
Loading
Loading