Skip to content

Commit

Permalink
refactor: 정책 변경에 따른 출석 플로팅 응답값 변경, 출석 관련 로직 리팩토링
Browse files Browse the repository at this point in the history
  • Loading branch information
ddingmin committed May 26, 2024
1 parent 8d00e23 commit 456927e
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 54 deletions.
56 changes: 24 additions & 32 deletions src/main/kotlin/com/depromeet/makers/domain/model/Attendance.kt
Original file line number Diff line number Diff line change
Expand Up @@ -15,18 +15,34 @@ data class Attendance(
val attendanceStatus: AttendanceStatus,
val attendanceTime: LocalDateTime?
) {
fun checkIn(attendanceTime: LocalDateTime, sessionStartTime: LocalDateTime): Attendance {
if (!isAttendanceOnHold()) {
throw AttendanceAlreadyExistsException()
}
sessionStartTime.isAvailableCheckInTime(attendanceTime)

fun checkIn(now: LocalDateTime, attendanceStatus: AttendanceStatus): Attendance {
return this.copy(
attendanceStatus = attendanceTime.checkIn(sessionStartTime),
attendanceTime = LocalDateTime.now()
attendanceStatus = attendanceStatus,
attendanceTime = now
)
}

fun expectAttendanceStatus(sessionStartTime: LocalDateTime, now: LocalDateTime): AttendanceStatus {
return when {
// [출석] 출석 대기 상태이며, 세션 시작 시간의 15분 전부터 15분 전까지 입니다. (정책에 따라 수정 필요)
isAttendanceOnHold() && now.isAfter(sessionStartTime.minusMinutes(15)) && now.isBefore(sessionStartTime.plusMinutes(15)) -> AttendanceStatus.ATTENDANCE
// [지각] 출석 대기 상태이며, 세션 시작 시간의 15분 후부터 30분 전까지 입니다. (정책에 따라 수정 필요)
isAttendanceOnHold() && now.isAfter(sessionStartTime.plusMinutes(15)) && now.isBefore(sessionStartTime.plusMinutes(30)) -> AttendanceStatus.TARDY
// [결석] 출석 대기 상태이며, 세션 시작 시간의 30분 후 입니다. (정책에 따라 수정 필요)
isAttendanceOnHold() && now.isAfter(sessionStartTime.plusMinutes(30)) -> AttendanceStatus.ABSENCE
else -> AttendanceStatus.ATTENDANCE_ON_HOLD
}
}

fun isAvailableCheckInRequest(sessionStartTime: LocalDateTime, now: LocalDateTime): Boolean {
when {
attendanceStatus.isAttendanceOnHold().not() -> throw AttendanceAlreadyExistsException()
now.isBefore(sessionStartTime.minusMinutes(15)) -> throw AttendanceBeforeTimeException()
now.isAfter(sessionStartTime.plusMinutes(30)) -> throw AttendanceAfterTimeException()
else -> return true
}
}

fun isAttendanceOnHold() = attendanceStatus.isAttendanceOnHold()

fun isAttendance() = attendanceStatus.isAttendance()
Expand All @@ -35,30 +51,6 @@ data class Attendance(

fun isTardy() = attendanceStatus.isTardy()

private fun LocalDateTime.isAvailableCheckInTime(attendanceTime: LocalDateTime): Boolean {
// 출석 요청 가능 시간은 세션 시작 시간의 30분 전부터 120분 후까지 입니다. (정책에 따라 수정 필요)
if (attendanceTime.isBefore(this.minusMinutes(15))) {
throw AttendanceBeforeTimeException()
}
if (attendanceTime.isAfter(this.plusMinutes(120))) {
throw AttendanceAfterTimeException()
}
return true
}

private fun LocalDateTime.checkIn(sessionStartTime: LocalDateTime): AttendanceStatus {
return when {
// 출석 가능 시간은 세션 시작 시간의 15분 전부터 15분 후까지 입니다. (정책에 따라 수정 필요)
this.isAfter(sessionStartTime.minusMinutes(15)) && this.isBefore(sessionStartTime.plusMinutes(15)) -> AttendanceStatus.ATTENDANCE
// 지각은 세션 시작 시간의 15분 후부터 30분 후까지 입니다. (정책에 따라 수정 필요)
this.isAfter(sessionStartTime.plusMinutes(15)) && this.isBefore(sessionStartTime.plusMinutes(30)) -> AttendanceStatus.TARDY
// 결석은 세션 시작 시간의 30분 후 입니다. (정책에 따라 수정 필요)
this.isAfter(sessionStartTime.plusMinutes(30)) -> AttendanceStatus.ABSENCE
else -> throw AttendanceAfterTimeException()
}

}

fun update(
attendanceId: String = this.attendanceId,
generation: Int = this.generation,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,7 @@ class CheckInSession(
)
)

logger().info(thisWeekSession.toString())
logger().info(input.longitude.toString() + " " + input.latitude.toString())
attendance.isAvailableCheckInRequest(thisWeekSession.startTime, input.now)

// 오프라인 세션의 경우 거리 확인 로직
if (thisWeekSession.isOffline()) {
Expand All @@ -68,12 +67,13 @@ class CheckInSession(

logger().info(distance.toString())

if (!inRange(distance, 500.0)) { // 100m 기준 (임시 설정)
if (inRange(distance, 1000.0).not()) { // 1000m 기준 (임시 설정)
throw InvalidCheckInDistanceException()
}
}

return attendanceGateway.save(attendance.checkIn(input.now, thisWeekSession.startTime))
val expectAttendanceStatus = attendance.expectAttendanceStatus(thisWeekSession.startTime, input.now)
return attendanceGateway.save(attendance.checkIn(input.now, expectAttendanceStatus))
}

private fun LocalDateTime.getMonday() = this.toLocalDate().with(DayOfWeek.MONDAY).atStartOfDay()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,25 +54,10 @@ class GetCheckInStatus(
val isBeforeSession15minutes = input.now.isAfter(thisWeekSession.startTime.minusMinutes(15)) &&
input.now.isBefore(thisWeekSession.startTime)

// 현재 시간이 출석 요청 가능 시간 사이 && 출석 상태가 ON_HOLD인 경우 -> 플로팅 버튼 띄우기 여부
val needFloatingButton = attendance.isAttendanceOnHold() &&
input.now.isAfter(thisWeekSession.startTime.minusMinutes(15)) && input.now.isBefore(thisWeekSession.startTime.plusMinutes(120))
// 현재 시간이 출석 요청 가능 시간 사이 && 출석 상태가 ON_HOLD(출석 대기) 인 경우 -> 플로팅 버튼 띄우기 여부
val needFloatingButton = attendance.isAvailableCheckInRequest(thisWeekSession.startTime, input.now)

val expectAttendanceStatus = when {
// 세션 시작전 15분 ~ 15분 사이 -> 출석으로 인정될 상태
input.now.isAfter(thisWeekSession.startTime.minusMinutes(15)) &&
input.now.isBefore(thisWeekSession.startTime.plusMinutes(15)) -> AttendanceStatus.ATTENDANCE

// 세션 시작 15분 ~ 30분 사이 -> 지각으로 인정될 상태
input.now.isAfter(thisWeekSession.startTime.plusMinutes(15)) &&
input.now.isBefore(thisWeekSession.startTime.plusMinutes(30)) -> AttendanceStatus.TARDY

// 세션 시작 30분 이후 ~ 240분 -> 결석으로 인정될 상태
input.now.isAfter(thisWeekSession.startTime.plusMinutes(30)) &&
input.now.isBefore(thisWeekSession.startTime.plusMinutes(240)) -> AttendanceStatus.ABSENCE

else -> AttendanceStatus.ATTENDANCE_ON_HOLD
}
val expectAttendanceStatus = attendance.expectAttendanceStatus(thisWeekSession.startTime, input.now)

return GetCheckInStatusOutput(
generation = attendance.generation,
Expand Down

0 comments on commit 456927e

Please sign in to comment.