From 884904a51f51139112699898f828b54f5058e6d4 Mon Sep 17 00:00:00 2001 From: youth Date: Thu, 12 Sep 2024 09:42:27 +0900 Subject: [PATCH 01/17] =?UTF-8?q?feat:=20=EB=8C=80=EB=A9=B4=20=EC=B6=9C?= =?UTF-8?q?=EA=B2=B0=20=EA=B8=B0=EC=A4=80=20=EA=B0=92=20=ED=99=98=EA=B2=BD?= =?UTF-8?q?=20=EB=B3=80=EC=88=98=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/deploy.yml | 1 + .github/workflows/release.yml | 1 + .../domain/attendance/service/OfflineAttendClient.java | 9 ++++++--- src/main/resources/application.yml | 3 +++ 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index bc73cd96..d3e7304a 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -50,6 +50,7 @@ jobs: aes.secret.salt: ${{ secrets.AES_SECRET_SALT }} spring.mail.username: ${{ secrets.SENDER_EMAIL }} spring.mail.password: ${{ secrets.SENDER_PASSWORD }} + location.distance: ${{ secrets.STANDARD_DISTANCE }} # [2] 실행 권한 부여 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 31d71939..9c3706f3 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -51,6 +51,7 @@ jobs: aes.secret.salt: ${{ secrets.AES_SECRET_SALT }} spring.mail.username: ${{ secrets.SENDER_EMAIL }} spring.mail.password: ${{ secrets.SENDER_PASSWORD }} + location.distance: ${{ secrets.STANDARD_DISTANCE }} # [2] 실행 권한 부여 diff --git a/src/main/java/org/cotato/csquiz/domain/attendance/service/OfflineAttendClient.java b/src/main/java/org/cotato/csquiz/domain/attendance/service/OfflineAttendClient.java index 04ddcd24..ac08a009 100644 --- a/src/main/java/org/cotato/csquiz/domain/attendance/service/OfflineAttendClient.java +++ b/src/main/java/org/cotato/csquiz/domain/attendance/service/OfflineAttendClient.java @@ -13,6 +13,7 @@ import org.cotato.csquiz.domain.attendance.enums.AttendanceType; import org.cotato.csquiz.domain.attendance.repository.AttendanceRecordRepository; import org.cotato.csquiz.domain.attendance.util.AttendanceUtil; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Slf4j @@ -20,7 +21,8 @@ @RequiredArgsConstructor public class OfflineAttendClient implements AttendClient { - private static final Double ACCURACY_STANDARD = 0.1; + @Value("${location.distance}") + private Double standardDistance; private final AttendanceRecordRepository attendanceRecordRepository; @Override @@ -40,7 +42,8 @@ public AttendResponse request(AttendanceParams params, Long memberId, Attendance AttendanceRecord attendanceRecord = attendanceRecordRepository.findByMemberIdAndAttendanceId(memberId, request.getAttendanceId()) - .orElseGet(() -> AttendanceRecord.offlineRecord(attendance, memberId, accuracy, attendanceResult, request.getRequestTime())); + .orElseGet(() -> AttendanceRecord.offlineRecord(attendance, memberId, accuracy, attendanceResult, + request.getRequestTime())); attendanceRecord.updateAttendanceType(request.attendanceType()); attendanceRecord.updateLocationAccuracy(accuracy); @@ -52,7 +55,7 @@ public AttendResponse request(AttendanceParams params, Long memberId, Attendance private void validateAccuracy(Double accuracy) { log.info("[위치 정확도] : {}", accuracy); - if (accuracy >= ACCURACY_STANDARD) { + if (accuracy >= standardDistance) { throw new AppException(ErrorCode.OFFLINE_ATTEND_FAIL); } } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index b609b164..4a3ddbb2 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -66,3 +66,6 @@ aes: secret: key: ${AES_SECRET_KEY} salt: ${AES_SECRET_SALT} + +location: + distance: ${STANDARD_DISTANCE} \ No newline at end of file From 18d0db2a2b72c6cec21de629de8e062034a7e1bf Mon Sep 17 00:00:00 2001 From: youth Date: Thu, 12 Sep 2024 22:33:38 +0900 Subject: [PATCH 02/17] =?UTF-8?q?refactor:=20=EC=B6=9C=EC=84=9D=20?= =?UTF-8?q?=EA=B2=B0=EA=B3=BC=20=EB=B3=80=EA=B2=BD=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=EB=AA=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../csquiz/domain/attendance/entity/AttendanceRecord.java | 2 +- .../domain/attendance/service/AttendanceRecordService.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/cotato/csquiz/domain/attendance/entity/AttendanceRecord.java b/src/main/java/org/cotato/csquiz/domain/attendance/entity/AttendanceRecord.java index a6abff08..45050d39 100644 --- a/src/main/java/org/cotato/csquiz/domain/attendance/entity/AttendanceRecord.java +++ b/src/main/java/org/cotato/csquiz/domain/attendance/entity/AttendanceRecord.java @@ -98,7 +98,7 @@ public void updateLocationAccuracy(Double accuracy) { this.locationAccuracy = accuracy; } - public void updateAttendanceStatus(AttendanceResult attendanceResult) { + public void updateAttendanceResult(AttendanceResult attendanceResult) { this.attendanceResult = attendanceResult; } } diff --git a/src/main/java/org/cotato/csquiz/domain/attendance/service/AttendanceRecordService.java b/src/main/java/org/cotato/csquiz/domain/attendance/service/AttendanceRecordService.java index f18a0fe9..8bae3f12 100644 --- a/src/main/java/org/cotato/csquiz/domain/attendance/service/AttendanceRecordService.java +++ b/src/main/java/org/cotato/csquiz/domain/attendance/service/AttendanceRecordService.java @@ -120,6 +120,7 @@ public void updateAttendanceStatus(Attendance attendance) { for (AttendanceRecord attendanceRecord : attendanceRecords) { AttendanceResult attendanceResult = AttendanceUtil.calculateAttendanceStatus(attendance, attendanceRecord.getAttendTime()); attendanceRecord.updateAttendanceStatus(attendanceResult); + attendanceRecord.updateAttendanceResult(attendanceResult); } attendanceRecordRepository.saveAll(attendanceRecords); From 5f4e0ffb18e48ac0aed1bcb5ec5805e7bafa43ae Mon Sep 17 00:00:00 2001 From: youth Date: Thu, 12 Sep 2024 23:02:31 +0900 Subject: [PATCH 03/17] =?UTF-8?q?style:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EC=97=94=EB=93=9C=ED=8F=AC=EC=9D=B8=ED=8A=B8=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cotato/csquiz/api/session/controller/SessionController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/cotato/csquiz/api/session/controller/SessionController.java b/src/main/java/org/cotato/csquiz/api/session/controller/SessionController.java index 561df15f..ef14f33c 100644 --- a/src/main/java/org/cotato/csquiz/api/session/controller/SessionController.java +++ b/src/main/java/org/cotato/csquiz/api/session/controller/SessionController.java @@ -42,7 +42,7 @@ public class SessionController { private final SessionImageService sessionImageService; @Operation(summary = "세션 목록 반환 API") - @GetMapping("") + @GetMapping public ResponseEntity> findSessionsByGenerationId(@RequestParam Long generationId) { return ResponseEntity.status(HttpStatus.OK).body(sessionService.findSessionsByGenerationId(generationId)); } From 1e870886fe17d952ed4d3dc9a990d562dff64b25 Mon Sep 17 00:00:00 2001 From: youth Date: Thu, 12 Sep 2024 23:04:41 +0900 Subject: [PATCH 04/17] =?UTF-8?q?refactor:=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/session/controller/SessionController.java | 8 -------- .../api/session/dto/UpdateSessionNumberRequest.java | 11 ----------- .../domain/generation/service/SessionService.java | 7 ------- 3 files changed, 26 deletions(-) delete mode 100644 src/main/java/org/cotato/csquiz/api/session/dto/UpdateSessionNumberRequest.java diff --git a/src/main/java/org/cotato/csquiz/api/session/controller/SessionController.java b/src/main/java/org/cotato/csquiz/api/session/controller/SessionController.java index ef14f33c..0db3819a 100644 --- a/src/main/java/org/cotato/csquiz/api/session/controller/SessionController.java +++ b/src/main/java/org/cotato/csquiz/api/session/controller/SessionController.java @@ -13,7 +13,6 @@ import org.cotato.csquiz.api.session.dto.CsEducationOnSessionNumberResponse; import org.cotato.csquiz.api.session.dto.DeleteSessionImageRequest; import org.cotato.csquiz.api.session.dto.SessionListResponse; -import org.cotato.csquiz.api.session.dto.UpdateSessionNumberRequest; import org.cotato.csquiz.api.session.dto.UpdateSessionImageOrderRequest; import org.cotato.csquiz.api.session.dto.UpdateSessionRequest; import org.cotato.csquiz.domain.generation.service.SessionImageService; @@ -69,13 +68,6 @@ public ResponseEntity updateSession(@RequestBody @Valid UpdateSessionReque return ResponseEntity.noContent().build(); } - @Operation(summary = "세션 숫자 변경 API") - @PatchMapping("/number") - public ResponseEntity updateSessionNumber(@RequestBody @Valid UpdateSessionNumberRequest request) { - sessionService.updateSessionNumber(request); - return ResponseEntity.noContent().build(); - } - @Operation(summary = "세션 사진 순서 변경 API") @PatchMapping("/image/order") public ResponseEntity updateSessionImageOrder(@RequestBody UpdateSessionImageOrderRequest request) { diff --git a/src/main/java/org/cotato/csquiz/api/session/dto/UpdateSessionNumberRequest.java b/src/main/java/org/cotato/csquiz/api/session/dto/UpdateSessionNumberRequest.java deleted file mode 100644 index e1c5c53a..00000000 --- a/src/main/java/org/cotato/csquiz/api/session/dto/UpdateSessionNumberRequest.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.cotato.csquiz.api.session.dto; - -import jakarta.validation.constraints.NotNull; - -public record UpdateSessionNumberRequest( - @NotNull - Long sessionId, - @NotNull - Integer sessionNum -) { -} diff --git a/src/main/java/org/cotato/csquiz/domain/generation/service/SessionService.java b/src/main/java/org/cotato/csquiz/domain/generation/service/SessionService.java index be101392..4071943e 100644 --- a/src/main/java/org/cotato/csquiz/domain/generation/service/SessionService.java +++ b/src/main/java/org/cotato/csquiz/domain/generation/service/SessionService.java @@ -13,7 +13,6 @@ import org.cotato.csquiz.api.session.dto.AddSessionResponse; import org.cotato.csquiz.api.session.dto.CsEducationOnSessionNumberResponse; import org.cotato.csquiz.api.session.dto.SessionListResponse; -import org.cotato.csquiz.api.session.dto.UpdateSessionNumberRequest; import org.cotato.csquiz.api.session.dto.UpdateSessionRequest; import org.cotato.csquiz.common.error.exception.ImageException; import org.cotato.csquiz.common.schedule.SchedulerService; @@ -102,12 +101,6 @@ private int calculateLastSessionNumber(Generation generation) { .orElse(-1); } - @Transactional - public void updateSessionNumber(UpdateSessionNumberRequest request) { - Session session = findSessionById(request.sessionId()); - session.changeSessionNumber(session.getNumber()); - } - @Transactional public void updateSession(UpdateSessionRequest request) { Session session = findSessionById(request.sessionId()); From 65a049ff03cefdf482dcbeba1d9646a4903a6ca5 Mon Sep 17 00:00:00 2001 From: youth Date: Thu, 12 Sep 2024 23:12:07 +0900 Subject: [PATCH 05/17] =?UTF-8?q?feat:=20=EC=84=B8=EC=85=98=20=EB=82=A0?= =?UTF-8?q?=EC=A7=9C=20=EC=BB=AC=EB=9F=BC=EC=9D=84=20=EC=84=B8=EC=85=98=20?= =?UTF-8?q?=EC=8B=9C=EC=9E=91=20=EC=8B=9C=EA=B0=84=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/session/dto/AddSessionRequest.java | 9 +++++---- .../api/session/dto/UpdateSessionRequest.java | 4 ++-- .../domain/generation/entity/Session.java | 18 +++++++----------- .../generation/service/SessionService.java | 4 ++-- 4 files changed, 16 insertions(+), 19 deletions(-) diff --git a/src/main/java/org/cotato/csquiz/api/session/dto/AddSessionRequest.java b/src/main/java/org/cotato/csquiz/api/session/dto/AddSessionRequest.java index 3b119d59..7dee8445 100644 --- a/src/main/java/org/cotato/csquiz/api/session/dto/AddSessionRequest.java +++ b/src/main/java/org/cotato/csquiz/api/session/dto/AddSessionRequest.java @@ -3,7 +3,7 @@ import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotNull; -import java.time.LocalDate; +import java.time.LocalDateTime; import java.time.LocalTime; import java.util.List; import org.cotato.csquiz.domain.generation.enums.CSEducation; @@ -23,14 +23,15 @@ public record AddSessionRequest( Double latitude, Double longitude, String placeName, + @Schema(description = "세션 날짜 및 시작 시간") @NotNull - LocalDate sessionDate, + LocalDateTime sessionDateTime, - @Schema(example = "19:05:00") + @Schema(example = "19:10:00", description = "출석 마감 시간, 해당 시간 이후 지각 처리") @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "HH:mm:ss") LocalTime attendanceDeadLine, - @Schema(example = "19:20:00") + @Schema(example = "19:20:00", description = "지각 마감 시간, 해당 시간 이후 결석 처리") @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "HH:mm:ss") LocalTime lateDeadLine, diff --git a/src/main/java/org/cotato/csquiz/api/session/dto/UpdateSessionRequest.java b/src/main/java/org/cotato/csquiz/api/session/dto/UpdateSessionRequest.java index c1608383..ac1db4c3 100644 --- a/src/main/java/org/cotato/csquiz/api/session/dto/UpdateSessionRequest.java +++ b/src/main/java/org/cotato/csquiz/api/session/dto/UpdateSessionRequest.java @@ -3,7 +3,7 @@ import static org.cotato.csquiz.domain.attendance.enums.DeadLine.DEFAULT_ATTENDANCE_DEADLINE; import static org.cotato.csquiz.domain.attendance.enums.DeadLine.DEFAULT_LATE_DEADLINE; -import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.Objects; import org.cotato.csquiz.api.attendance.dto.AttendanceDeadLineDto; import org.cotato.csquiz.domain.attendance.embedded.Location; @@ -19,7 +19,7 @@ public record UpdateSessionRequest( String title, String description, @NotNull - LocalDate sessionDate, + LocalDateTime sessionDateTime, String placeName, Location location, AttendanceDeadLineDto attendTime, diff --git a/src/main/java/org/cotato/csquiz/domain/generation/entity/Session.java b/src/main/java/org/cotato/csquiz/domain/generation/entity/Session.java index b6525dda..cd5b786a 100644 --- a/src/main/java/org/cotato/csquiz/domain/generation/entity/Session.java +++ b/src/main/java/org/cotato/csquiz/domain/generation/entity/Session.java @@ -11,7 +11,7 @@ import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; -import java.time.LocalDate; +import java.time.LocalDateTime; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; @@ -56,28 +56,24 @@ public class Session extends BaseTimeEntity { }) private SessionContents sessionContents; - @Column(name = "session_date") - private LocalDate sessionDate; + @Column(name = "session_start_time") + private LocalDateTime sessionDateTime; @Column(name = "session_place_name") private String placeName; @Builder - public Session(Integer number, String title, String description, String placeName, LocalDate sessionDate, + public Session(Integer number, String title, String description, String placeName, LocalDateTime sessionDateTime, Generation generation, SessionContents sessionContents) { this.number = number; this.title = title; this.description = description; this.placeName = placeName; - this.sessionDate = sessionDate; + this.sessionDateTime = sessionDateTime; this.generation = generation; this.sessionContents = sessionContents; } - public void changeSessionNumber(Integer sessionNumber) { - this.number = sessionNumber; - } - public void updateDescription(String description) { this.description = description; } @@ -90,8 +86,8 @@ public void updateSessionTitle(String title) { this.title = title; } - public void updateSessionDate(LocalDate sessionDate) { - this.sessionDate = sessionDate; + public void updateSessionDateTime(LocalDateTime sessionDateTime) { + this.sessionDateTime = sessionDateTime; } public void updateSessionPlace(String placeName) { diff --git a/src/main/java/org/cotato/csquiz/domain/generation/service/SessionService.java b/src/main/java/org/cotato/csquiz/domain/generation/service/SessionService.java index 4071943e..eb460082 100644 --- a/src/main/java/org/cotato/csquiz/domain/generation/service/SessionService.java +++ b/src/main/java/org/cotato/csquiz/domain/generation/service/SessionService.java @@ -1,8 +1,8 @@ package org.cotato.csquiz.domain.generation.service; import jakarta.persistence.EntityNotFoundException; -import java.time.LocalDate; import java.time.LocalDateTime; +import java.time.LocalTime; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -64,7 +64,7 @@ public AddSessionResponse addSession(AddSessionRequest request) throws ImageExce .generation(findGeneration) .title(request.title()) .placeName(request.placeName()) - .sessionDate(request.sessionDate()) + .sessionDateTime(request.sessionDateTime()) .sessionContents(SessionContents.builder() .csEducation(request.csEducation()) .devTalk(request.devTalk()) From 162d56b337284dee5c768f493855db4af1d5b979 Mon Sep 17 00:00:00 2001 From: youth Date: Thu, 12 Sep 2024 23:26:33 +0900 Subject: [PATCH 06/17] =?UTF-8?q?refactor:=20=EC=B6=9C=EA=B2=B0=20?= =?UTF-8?q?=EC=83=81=ED=83=9C=20=EA=B2=B0=EC=A0=95=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=ED=8C=8C=EB=9D=BC=EB=AF=B8=ED=84=B0=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 세션 시작 시간을 기준으로 구분 --- .../cotato/csquiz/common/error/ErrorCode.java | 2 +- .../attendance/service/AttendClient.java | 3 ++- .../service/AttendanceAdminService.java | 2 +- .../service/AttendanceRecordService.java | 18 +++++++++++------- .../service/OfflineAttendClient.java | 5 +++-- .../attendance/service/OnlineAttendClient.java | 5 +++-- .../service/RequestAttendanceService.java | 5 +++-- .../domain/attendance/util/AttendanceUtil.java | 14 ++++++++++---- 8 files changed, 34 insertions(+), 20 deletions(-) diff --git a/src/main/java/org/cotato/csquiz/common/error/ErrorCode.java b/src/main/java/org/cotato/csquiz/common/error/ErrorCode.java index 11fc980e..15d6a88c 100644 --- a/src/main/java/org/cotato/csquiz/common/error/ErrorCode.java +++ b/src/main/java/org/cotato/csquiz/common/error/ErrorCode.java @@ -82,7 +82,7 @@ public enum ErrorCode { OFFLINE_ATTEND_FAIL(HttpStatus.BAD_REQUEST, "AT-101", "거리 부적합으로 인한 대면 출석 실패"), INVALID_ATTEND_TIME(HttpStatus.BAD_REQUEST, "AT-102", "시간 입력 범위가 잘못되었습니다."), ALREADY_ATTEND(HttpStatus.CONFLICT, "AT-301", "이미 해당 타입으로 출석한 기록이 있습니다."), - ATTENDANCE_CLOSED(HttpStatus.BAD_REQUEST, "AT-401", "아직 출석 시간이 아닙니다."), + ATTENDANCE_NOT_OPEN(HttpStatus.BAD_REQUEST, "AT-401", "출석 시간이 아닙니다."), // 500 오류 -> 서버측에서 처리가 실패한 부분들 WEBSOCKET_SEND_EXCEPTION(HttpStatus.INTERNAL_SERVER_ERROR, "S-001", "소캣 메세지 전송 실패"), diff --git a/src/main/java/org/cotato/csquiz/domain/attendance/service/AttendClient.java b/src/main/java/org/cotato/csquiz/domain/attendance/service/AttendClient.java index d304dea9..02a4fc79 100644 --- a/src/main/java/org/cotato/csquiz/domain/attendance/service/AttendClient.java +++ b/src/main/java/org/cotato/csquiz/domain/attendance/service/AttendClient.java @@ -1,5 +1,6 @@ package org.cotato.csquiz.domain.attendance.service; +import java.time.LocalDateTime; import org.cotato.csquiz.api.attendance.dto.AttendResponse; import org.cotato.csquiz.api.attendance.dto.AttendanceParams; import org.cotato.csquiz.domain.attendance.entity.Attendance; @@ -8,5 +9,5 @@ public interface AttendClient { AttendanceType attendanceType(); - AttendResponse request(AttendanceParams params, Long memberId, Attendance attendance); + AttendResponse request(AttendanceParams params, LocalDateTime sessionStartTime, Long memberId, Attendance attendance); } diff --git a/src/main/java/org/cotato/csquiz/domain/attendance/service/AttendanceAdminService.java b/src/main/java/org/cotato/csquiz/domain/attendance/service/AttendanceAdminService.java index 324fd891..bafaa401 100644 --- a/src/main/java/org/cotato/csquiz/domain/attendance/service/AttendanceAdminService.java +++ b/src/main/java/org/cotato/csquiz/domain/attendance/service/AttendanceAdminService.java @@ -76,7 +76,7 @@ public void updateAttendance(Session attendanceSession, Attendance attendance, .plusSeconds(DEFAULT_ATTEND_SECOND)); attendance.updateLocation(location); - attendanceRecordService.updateAttendanceStatus(attendance); + attendanceRecordService.updateAttendanceStatus(attendanceSession.getSessionDateTime(), attendance); } public List findAttendanceRecords(Long generationId, Integer month) { diff --git a/src/main/java/org/cotato/csquiz/domain/attendance/service/AttendanceRecordService.java b/src/main/java/org/cotato/csquiz/domain/attendance/service/AttendanceRecordService.java index 8bae3f12..b0bfbd39 100644 --- a/src/main/java/org/cotato/csquiz/domain/attendance/service/AttendanceRecordService.java +++ b/src/main/java/org/cotato/csquiz/domain/attendance/service/AttendanceRecordService.java @@ -66,9 +66,13 @@ public AttendResponse submitRecord(AttendanceParams request, final Long memberId Attendance attendance = attendanceRepository.findById(request.attendanceId()) .orElseThrow(() -> new EntityNotFoundException("해당 출석이 존재하지 않습니다.")); - // 해당 출석이 열려있는지 확인, 닫혀있으면 제외 - if (getAttendanceOpenStatus(attendance, request.requestTime()) == AttendanceOpenStatus.CLOSED) { - throw new AppException(ErrorCode.ATTENDANCE_CLOSED); + Session session = sessionRepository.findById(attendance.getSessionId()) + .orElseThrow(() -> new EntityNotFoundException("해당 출석에 대한 세션이 존재하지 않습니다.")); + + // 해당 출석에 출결 입력이 가능한지 확인하는 과정 + if (getAttendanceOpenStatus(session.getSessionDateTime(), attendance, request.requestTime()) + == AttendanceOpenStatus.CLOSED) { + throw new AppException(ErrorCode.ATTENDANCE_NOT_OPEN); } // 기존 출결 데이터가 존재하는지 확인 @@ -77,7 +81,7 @@ public AttendResponse submitRecord(AttendanceParams request, final Long memberId throw new AppException(ErrorCode.ALREADY_ATTEND); } - return requestAttendanceService.attend(request, memberId, attendance); + return requestAttendanceService.attend(request, session.getSessionDateTime(), memberId, attendance); } public MemberAttendanceRecordsResponse findAllRecordsBy(final Long generationId, final Long memberId) { @@ -114,12 +118,12 @@ public MemberAttendanceRecordsResponse findAllRecordsBy(final Long generationId, } @Transactional - public void updateAttendanceStatus(Attendance attendance) { + public void updateAttendanceStatus(LocalDateTime sessionStartTime, Attendance attendance) { List attendanceRecords = attendanceRecordRepository.findAllByAttendanceId(attendance.getId()); for (AttendanceRecord attendanceRecord : attendanceRecords) { - AttendanceResult attendanceResult = AttendanceUtil.calculateAttendanceStatus(attendance, attendanceRecord.getAttendTime()); - attendanceRecord.updateAttendanceStatus(attendanceResult); + AttendanceResult attendanceResult = AttendanceUtil.calculateAttendanceStatus(sessionStartTime, attendance, + attendanceRecord.getAttendTime()); attendanceRecord.updateAttendanceResult(attendanceResult); } diff --git a/src/main/java/org/cotato/csquiz/domain/attendance/service/OfflineAttendClient.java b/src/main/java/org/cotato/csquiz/domain/attendance/service/OfflineAttendClient.java index ac08a009..3e833cd1 100644 --- a/src/main/java/org/cotato/csquiz/domain/attendance/service/OfflineAttendClient.java +++ b/src/main/java/org/cotato/csquiz/domain/attendance/service/OfflineAttendClient.java @@ -1,5 +1,6 @@ package org.cotato.csquiz.domain.attendance.service; +import java.time.LocalDateTime; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.cotato.csquiz.api.attendance.dto.AttendResponse; @@ -31,10 +32,10 @@ public AttendanceType attendanceType() { } @Override - public AttendResponse request(AttendanceParams params, Long memberId, Attendance attendance) { + public AttendResponse request(AttendanceParams params, LocalDateTime sessionStartTime, Long memberId, Attendance attendance) { OfflineAttendanceRequest request = (OfflineAttendanceRequest) params; - AttendanceResult attendanceResult = AttendanceUtil.calculateAttendanceStatus(attendance, params.requestTime()); + AttendanceResult attendanceResult = AttendanceUtil.calculateAttendanceStatus(sessionStartTime, attendance, params.requestTime()); log.info("[출결 위치 로그: 위도 {}, 경도 {}]", request.getLocation().getLatitude(), request.getLocation().getLongitude()); Double accuracy = attendance.getLocation().calculateAccuracy(request.getLocation()); diff --git a/src/main/java/org/cotato/csquiz/domain/attendance/service/OnlineAttendClient.java b/src/main/java/org/cotato/csquiz/domain/attendance/service/OnlineAttendClient.java index 28dbd912..f1c08e0f 100644 --- a/src/main/java/org/cotato/csquiz/domain/attendance/service/OnlineAttendClient.java +++ b/src/main/java/org/cotato/csquiz/domain/attendance/service/OnlineAttendClient.java @@ -1,5 +1,6 @@ package org.cotato.csquiz.domain.attendance.service; +import java.time.LocalDateTime; import lombok.RequiredArgsConstructor; import org.cotato.csquiz.api.attendance.dto.AttendResponse; import org.cotato.csquiz.api.attendance.dto.AttendanceParams; @@ -23,8 +24,8 @@ public AttendanceType attendanceType() { } @Override - public AttendResponse request(AttendanceParams params, Long memberId, Attendance attendance) { - AttendanceResult attendanceResult = AttendanceUtil.calculateAttendanceStatus(attendance, params.requestTime()); + public AttendResponse request(AttendanceParams params, LocalDateTime sessionStartTime, Long memberId, Attendance attendance) { + AttendanceResult attendanceResult = AttendanceUtil.calculateAttendanceStatus(sessionStartTime, attendance, params.requestTime()); attendanceRecordRepository.save(AttendanceRecord.onLineRecord(attendance, memberId, attendanceResult, params.requestTime())); diff --git a/src/main/java/org/cotato/csquiz/domain/attendance/service/RequestAttendanceService.java b/src/main/java/org/cotato/csquiz/domain/attendance/service/RequestAttendanceService.java index 1639becf..e347e5af 100644 --- a/src/main/java/org/cotato/csquiz/domain/attendance/service/RequestAttendanceService.java +++ b/src/main/java/org/cotato/csquiz/domain/attendance/service/RequestAttendanceService.java @@ -1,5 +1,6 @@ package org.cotato.csquiz.domain.attendance.service; +import java.time.LocalDateTime; import java.util.List; import java.util.Map; import java.util.function.Function; @@ -23,8 +24,8 @@ public RequestAttendanceService(List clients) { ); } - public AttendResponse attend(AttendanceParams params, Long memberId, Attendance attendance) { + public AttendResponse attend(AttendanceParams params, LocalDateTime sessionStartTime, Long memberId, Attendance attendance) { AttendClient attendClient = clients.get(params.attendanceType()); - return attendClient.request(params, memberId, attendance); + return attendClient.request(params, sessionStartTime, memberId, attendance); } } diff --git a/src/main/java/org/cotato/csquiz/domain/attendance/util/AttendanceUtil.java b/src/main/java/org/cotato/csquiz/domain/attendance/util/AttendanceUtil.java index 3a61ff08..b1e5a971 100644 --- a/src/main/java/org/cotato/csquiz/domain/attendance/util/AttendanceUtil.java +++ b/src/main/java/org/cotato/csquiz/domain/attendance/util/AttendanceUtil.java @@ -10,12 +10,18 @@ import org.cotato.csquiz.domain.attendance.enums.DeadLine; public class AttendanceUtil { - // 출석 시간에 따른 지각 여부 구분하기 - public static AttendanceResult calculateAttendanceStatus(Attendance attendance, LocalDateTime attendTime){ - if (attendTime.isBefore(attendance.getAttendanceDeadLine())) { + public static AttendanceResult calculateAttendanceStatus(LocalDateTime sessionDateTime, Attendance attendance, + LocalDateTime attendTime) { + // 입력한 날짜와 세션 날짜가 다르거나, 시작 전이라면 + if (!attendTime.toLocalDate().equals(sessionDateTime.toLocalDate()) || attendTime.isBefore(sessionDateTime)) { + throw new AppException(ErrorCode.ATTENDANCE_NOT_OPEN); + } + + if (attendTime.isAfter(sessionDateTime) && attendTime.isBefore(attendance.getAttendanceDeadLine())) { return AttendanceResult.PRESENT; - } if (attendTime.isBefore(attendance.getLateDeadLine())) { + } + if (attendTime.isBefore(attendance.getLateDeadLine())) { return AttendanceResult.LATE; } return AttendanceResult.ABSENT; From e2c4b7daa39fe4abfadae4c19e965d1cf899a52a Mon Sep 17 00:00:00 2001 From: youth Date: Thu, 12 Sep 2024 23:34:08 +0900 Subject: [PATCH 07/17] =?UTF-8?q?refactor:=20=EC=B6=9C=EA=B2=B0=20?= =?UTF-8?q?=EA=B0=80=EB=8A=A5=20=EC=83=81=ED=83=9C=20=EB=B0=98=ED=99=98=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 세션 시작 시간을 기준으로 변경 --- .../attendance/dto/MemberAttendResponse.java | 9 ++++----- .../org/cotato/csquiz/common/sse/SseSender.java | 11 +++++++++-- .../service/AttendanceRecordService.java | 11 +++++++---- .../attendance/service/AttendanceService.java | 2 +- .../domain/attendance/util/AttendanceUtil.java | 17 ++++++----------- 5 files changed, 27 insertions(+), 23 deletions(-) diff --git a/src/main/java/org/cotato/csquiz/api/attendance/dto/MemberAttendResponse.java b/src/main/java/org/cotato/csquiz/api/attendance/dto/MemberAttendResponse.java index 9f8b30eb..c1fb67cc 100644 --- a/src/main/java/org/cotato/csquiz/api/attendance/dto/MemberAttendResponse.java +++ b/src/main/java/org/cotato/csquiz/api/attendance/dto/MemberAttendResponse.java @@ -1,7 +1,6 @@ package org.cotato.csquiz.api.attendance.dto; import io.swagger.v3.oas.annotations.media.Schema; -import java.time.LocalDate; import java.time.LocalDateTime; import org.cotato.csquiz.domain.attendance.entity.Attendance; import org.cotato.csquiz.domain.attendance.entity.AttendanceRecord; @@ -21,7 +20,7 @@ public record MemberAttendResponse( @Schema(description = "세션 타이틀", example = "3주차 세션") String sessionTitle, @Schema(description = "세션 날짜") - LocalDate sessionDate, + LocalDateTime sessionDateTime, @Schema(description = "출결 진행 여부", examples = { "CLOSED", "OPEN" }) @@ -37,7 +36,7 @@ public static MemberAttendResponse closedAttendanceResponse(Session session, Att attendanceRecord.getAttendance().getId(), attendanceRecord.getMemberId(), session.getTitle(), - session.getSessionDate(), + session.getSessionDateTime(), AttendanceOpenStatus.CLOSED, attendanceRecord.getAttendanceType(), attendanceRecord.getAttendanceResult() @@ -50,8 +49,8 @@ public static MemberAttendResponse openedAttendanceResponse(Attendance attendanc attendance.getId(), memberId, session.getTitle(), - session.getSessionDate(), - AttendanceUtil.getAttendanceOpenStatus(attendance, LocalDateTime.now()), + session.getSessionDateTime(), + AttendanceUtil.getAttendanceOpenStatus(session.getSessionDateTime(), attendance, LocalDateTime.now()), null, null ); diff --git a/src/main/java/org/cotato/csquiz/common/sse/SseSender.java b/src/main/java/org/cotato/csquiz/common/sse/SseSender.java index b98fe1a3..4bf4e8f9 100644 --- a/src/main/java/org/cotato/csquiz/common/sse/SseSender.java +++ b/src/main/java/org/cotato/csquiz/common/sse/SseSender.java @@ -13,6 +13,8 @@ import org.cotato.csquiz.domain.attendance.enums.AttendanceOpenStatus; import org.cotato.csquiz.domain.attendance.repository.AttendanceRepository; import org.cotato.csquiz.domain.attendance.util.AttendanceUtil; +import org.cotato.csquiz.domain.generation.entity.Session; +import org.cotato.csquiz.domain.generation.repository.SessionRepository; import org.springframework.stereotype.Component; import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter.DataWithMediaType; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; @@ -23,7 +25,7 @@ public class SseSender { private static final String ATTENDANCE_STATUS = "AttendanceStatus"; private final SseAttendanceRepository sseAttendanceRepository; - + private final SessionRepository sessionRepository; private final AttendanceRepository attendanceRepository; public void sendInitialAttendanceStatus(SseEmitter sseEmitter) { @@ -39,11 +41,16 @@ public void sendInitialAttendanceStatus(SseEmitter sseEmitter) { return; } + Attendance attendance = maybeAttendance.get(); + Session session = sessionRepository.findById(attendance.getSessionId()) + .orElseThrow(() -> new EntityNotFoundException("해당 출석에 대한 세션이 존재하지 않습니다.")); + send(sseEmitter, SseEmitter.event() .name(ATTENDANCE_STATUS) .data(AttendanceStatusInfo.builder() .attendanceId(maybeAttendance.get().getId()) - .openStatus(AttendanceUtil.getAttendanceOpenStatus(maybeAttendance.get(), LocalDateTime.now())) + .openStatus(AttendanceUtil.getAttendanceOpenStatus(session.getSessionDateTime(), attendance, + LocalDateTime.now())) .build()) .build()); } diff --git a/src/main/java/org/cotato/csquiz/domain/attendance/service/AttendanceRecordService.java b/src/main/java/org/cotato/csquiz/domain/attendance/service/AttendanceRecordService.java index b0bfbd39..4eb1e12c 100644 --- a/src/main/java/org/cotato/csquiz/domain/attendance/service/AttendanceRecordService.java +++ b/src/main/java/org/cotato/csquiz/domain/attendance/service/AttendanceRecordService.java @@ -99,14 +99,17 @@ public MemberAttendanceRecordsResponse findAllRecordsBy(final Long generationId, Map> isClosedAttendance = attendanceRepository.findAllBySessionIdsInQuery(sessionIds) .stream() .collect(Collectors.partitioningBy(attendance -> - getAttendanceOpenStatus(attendance, currentTime) == AttendanceOpenStatus.CLOSED)); + getAttendanceOpenStatus(sessionMap.get(attendance.getSessionId()).getSessionDateTime(), + attendance, currentTime) == AttendanceOpenStatus.CLOSED)); List closedAttendanceIds = isClosedAttendance.get(true).stream() .map(Attendance::getId) .toList(); - List responses = attendanceRecordRepository.findAllByAttendanceIdsInQueryAndMemberId(closedAttendanceIds, memberId).stream() - .map(ar -> MemberAttendResponse.closedAttendanceResponse(sessionMap.get(ar.getAttendance().getSessionId()), ar)) + List responses = attendanceRecordRepository.findAllByAttendanceIdsInQueryAndMemberId( + closedAttendanceIds, memberId).stream() + .map(ar -> MemberAttendResponse.closedAttendanceResponse( + sessionMap.get(ar.getAttendance().getSessionId()), ar)) .collect(Collectors.toList()); responses.addAll(isClosedAttendance.get(false).stream() @@ -116,7 +119,7 @@ public MemberAttendanceRecordsResponse findAllRecordsBy(final Long generationId, return MemberAttendanceRecordsResponse.of(generationId, responses); } - + @Transactional public void updateAttendanceStatus(LocalDateTime sessionStartTime, Attendance attendance) { List attendanceRecords = attendanceRecordRepository.findAllByAttendanceId(attendance.getId()); diff --git a/src/main/java/org/cotato/csquiz/domain/attendance/service/AttendanceService.java b/src/main/java/org/cotato/csquiz/domain/attendance/service/AttendanceService.java index a22d790e..1f370dc1 100644 --- a/src/main/java/org/cotato/csquiz/domain/attendance/service/AttendanceService.java +++ b/src/main/java/org/cotato/csquiz/domain/attendance/service/AttendanceService.java @@ -50,7 +50,7 @@ public AttendancesResponse findAttendancesByGenerationId(final Long generationId .sessionId(at.getSessionId()) .sessionTitle(sessionMap.get(at.getSessionId()).getTitle()) .sessionDate(at.getAttendanceDeadLine().toLocalDate()) - .openStatus(AttendanceUtil.getAttendanceOpenStatus(at, currentTime)) + .openStatus(AttendanceUtil.getAttendanceOpenStatus(sessionMap.get(at.getSessionId()).getSessionDateTime(), at, currentTime)) .build()) .toList(); diff --git a/src/main/java/org/cotato/csquiz/domain/attendance/util/AttendanceUtil.java b/src/main/java/org/cotato/csquiz/domain/attendance/util/AttendanceUtil.java index b1e5a971..ed63bac5 100644 --- a/src/main/java/org/cotato/csquiz/domain/attendance/util/AttendanceUtil.java +++ b/src/main/java/org/cotato/csquiz/domain/attendance/util/AttendanceUtil.java @@ -27,28 +27,23 @@ public static AttendanceResult calculateAttendanceStatus(LocalDateTime sessionDa return AttendanceResult.ABSENT; } - // 현재 시간을 기준으로 출석 open 상태를 반환한다. - public static AttendanceOpenStatus getAttendanceOpenStatus(Attendance attendance, LocalDateTime currentDateTime) { - if (currentDateTime.isBefore(DeadLine.sessionStartTime(attendance.getAttendanceDeadLine().toLocalDate()))) { + // 현재 시간을 기준으로 출석이 열려있는지를 반환한다. + public static AttendanceOpenStatus getAttendanceOpenStatus(LocalDateTime sessionStartTime, Attendance attendance, LocalDateTime currentDateTime) { + if (currentDateTime.isBefore(sessionStartTime)) { return AttendanceOpenStatus.BEFORE; } - if (currentDateTime.isAfter(DeadLine.sessionEndTime(attendance.getLateDeadLine().toLocalDate()))) { + if (currentDateTime.toLocalDate().isAfter(sessionStartTime.toLocalDate())) { return AttendanceOpenStatus.CLOSED; } - LocalTime currentTime = currentDateTime.toLocalTime(); - - if (currentTime.isAfter(DeadLine.ATTENDANCE_START_TIME.getTime()) - && currentTime.isBefore(attendance.getAttendanceDeadLine().toLocalTime())) { + if (currentDateTime.isAfter(sessionStartTime) && currentDateTime.isBefore(attendance.getAttendanceDeadLine())) { return AttendanceOpenStatus.OPEN; } - if (currentTime.isAfter(attendance.getAttendanceDeadLine().toLocalTime()) - && currentTime.isBefore(attendance.getLateDeadLine().toLocalTime())) { + if (currentDateTime.isAfter(attendance.getAttendanceDeadLine()) && currentDateTime.isBefore(attendance.getLateDeadLine())) { return AttendanceOpenStatus.LATE; } - return AttendanceOpenStatus.ABSENT; } From 0cf2008bfe8fee4196a7b199389eaaa8b29b5f9a Mon Sep 17 00:00:00 2001 From: youth Date: Thu, 12 Sep 2024 23:36:13 +0900 Subject: [PATCH 08/17] =?UTF-8?q?refactor:=20=EC=B6=9C=EA=B2=B0=20?= =?UTF-8?q?=EC=8B=9C=EC=9E=91=20=EC=95=8C=EB=A6=BC=20=EB=93=B1=EB=A1=9D=20?= =?UTF-8?q?=EC=8A=A4=EC=BC=80=EC=A4=84=EB=9F=AC=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/cotato/csquiz/common/schedule/SchedulerService.java | 5 +---- .../csquiz/domain/generation/service/SessionService.java | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/cotato/csquiz/common/schedule/SchedulerService.java b/src/main/java/org/cotato/csquiz/common/schedule/SchedulerService.java index e16d978e..84ecf0c5 100644 --- a/src/main/java/org/cotato/csquiz/common/schedule/SchedulerService.java +++ b/src/main/java/org/cotato/csquiz/common/schedule/SchedulerService.java @@ -55,10 +55,7 @@ public void closeAllCsQuiz() { log.info("[ CS 퀴즈 모두 닫기 Scheduler 완료 ]"); } - // sessionDate 18시 50분에 출결을 구독 중인 부원들에게 출결 입력 시작 알림을 전송하는 스케줄러 - public void scheduleSessionNotification(LocalDate sessionDate) { - LocalDateTime notificationTime = LocalDateTime.of(sessionDate, DeadLine.ATTENDANCE_START_TIME.getTime()); - + public void scheduleSessionNotification(LocalDateTime notificationTime) { ZonedDateTime zonedDateTime = notificationTime.atZone(ZoneId.of("Asia/Seoul")); taskScheduler.schedule(() -> sseSender.sendNotification(notificationTime), zonedDateTime.toInstant()); diff --git a/src/main/java/org/cotato/csquiz/domain/generation/service/SessionService.java b/src/main/java/org/cotato/csquiz/domain/generation/service/SessionService.java index eb460082..16a9fb10 100644 --- a/src/main/java/org/cotato/csquiz/domain/generation/service/SessionService.java +++ b/src/main/java/org/cotato/csquiz/domain/generation/service/SessionService.java @@ -90,7 +90,7 @@ public AddSessionResponse addSession(AddSessionRequest request) throws ImageExce .build(); attendanceAdminService.addAttendance(session, location, attendanceDeadLine); - schedulerService.scheduleSessionNotification(savedSession.getSessionDate()); + schedulerService.scheduleSessionNotification(savedSession.getSessionDateTime()); return AddSessionResponse.from(savedSession); } From c3aed3db2d1386431c8998bddfadd87a9a98c3e8 Mon Sep 17 00:00:00 2001 From: youth Date: Thu, 12 Sep 2024 23:37:32 +0900 Subject: [PATCH 09/17] =?UTF-8?q?refactor:=20=EC=B6=9C=EC=84=9D=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20=EB=93=B1=EB=A1=9D=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 불필요한 dto 삭제 - 비즈니스 로직 상 59초 더하는 로직 제거 --- .../csquiz/domain/attendance/embedded/Location.java | 4 ++++ .../attendance/service/AttendanceAdminService.java | 12 +++++------- .../domain/generation/service/SessionService.java | 13 ++----------- 3 files changed, 11 insertions(+), 18 deletions(-) diff --git a/src/main/java/org/cotato/csquiz/domain/attendance/embedded/Location.java b/src/main/java/org/cotato/csquiz/domain/attendance/embedded/Location.java index d693b503..7807bd7c 100644 --- a/src/main/java/org/cotato/csquiz/domain/attendance/embedded/Location.java +++ b/src/main/java/org/cotato/csquiz/domain/attendance/embedded/Location.java @@ -20,6 +20,10 @@ private Location(Double latitude, Double longitude) { this.longitude = longitude; } + public static Location location(Double latitude, Double longitude){ + return new Location(latitude, longitude); + } + public Double calculateAccuracy(Location location) { return Math.pow(this.latitude - location.latitude, 2) + Math.pow(this.longitude - location.longitude, 2); } diff --git a/src/main/java/org/cotato/csquiz/domain/attendance/service/AttendanceAdminService.java b/src/main/java/org/cotato/csquiz/domain/attendance/service/AttendanceAdminService.java index bafaa401..876646f3 100644 --- a/src/main/java/org/cotato/csquiz/domain/attendance/service/AttendanceAdminService.java +++ b/src/main/java/org/cotato/csquiz/domain/attendance/service/AttendanceAdminService.java @@ -3,6 +3,7 @@ import jakarta.persistence.EntityNotFoundException; import java.time.LocalDateTime; +import java.time.LocalTime; import java.util.List; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -32,17 +33,14 @@ public class AttendanceAdminService { private final SessionRepository sessionRepository; @Transactional - public void addAttendance(Session session, Location location, AttendanceDeadLineDto attendanceDeadLine) { - AttendanceUtil.validateAttendanceTime(attendanceDeadLine.attendanceDeadLine(), - attendanceDeadLine.lateDeadLine()); + public void addAttendance(Session session, Location location, LocalTime attendanceDeadline, LocalTime lateDeadline) { + AttendanceUtil.validateAttendanceTime(attendanceDeadline, lateDeadline); Attendance attendance = Attendance.builder() .session(session) .location(location) - .attendanceDeadLine(LocalDateTime.of(session.getSessionDate(), attendanceDeadLine.attendanceDeadLine()) - .plusSeconds(DEFAULT_ATTEND_SECOND)) - .lateDeadLine(LocalDateTime.of(session.getSessionDate(), attendanceDeadLine.lateDeadLine()) - .plusSeconds(DEFAULT_ATTEND_SECOND)) + .attendanceDeadLine(LocalDateTime.of(session.getSessionDateTime().toLocalDate(), attendanceDeadline)) + .lateDeadLine(LocalDateTime.of(session.getSessionDateTime().toLocalDate(), lateDeadline)) .build(); attendanceRepository.save(attendance); diff --git a/src/main/java/org/cotato/csquiz/domain/generation/service/SessionService.java b/src/main/java/org/cotato/csquiz/domain/generation/service/SessionService.java index 16a9fb10..8a20d652 100644 --- a/src/main/java/org/cotato/csquiz/domain/generation/service/SessionService.java +++ b/src/main/java/org/cotato/csquiz/domain/generation/service/SessionService.java @@ -79,17 +79,8 @@ public AddSessionResponse addSession(AddSessionRequest request) throws ImageExce sessionImageService.addSessionImages(request.images(), savedSession); } - Location location = Location.builder() - .latitude(request.latitude()) - .longitude(request.longitude()) - .build(); - - AttendanceDeadLineDto attendanceDeadLine = AttendanceDeadLineDto.builder() - .attendanceDeadLine(request.attendanceDeadLine()) - .lateDeadLine(request.lateDeadLine()) - .build(); - - attendanceAdminService.addAttendance(session, location, attendanceDeadLine); + attendanceAdminService.addAttendance(session, Location.location(request.latitude(), request.longitude()), + request.attendanceDeadLine(), request.lateDeadLine()); schedulerService.scheduleSessionNotification(savedSession.getSessionDateTime()); return AddSessionResponse.from(savedSession); From 8e2fdda15552e082e12de69d70ec76dc9f8299c3 Mon Sep 17 00:00:00 2001 From: youth Date: Thu, 12 Sep 2024 23:42:31 +0900 Subject: [PATCH 10/17] =?UTF-8?q?refactor:=20=EC=B6=9C=EC=84=9D=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20=EC=88=98=EC=A0=95=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../attendance/service/AttendanceAdminService.java | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/cotato/csquiz/domain/attendance/service/AttendanceAdminService.java b/src/main/java/org/cotato/csquiz/domain/attendance/service/AttendanceAdminService.java index 876646f3..cf8e912e 100644 --- a/src/main/java/org/cotato/csquiz/domain/attendance/service/AttendanceAdminService.java +++ b/src/main/java/org/cotato/csquiz/domain/attendance/service/AttendanceAdminService.java @@ -27,7 +27,6 @@ @Slf4j public class AttendanceAdminService { - private static final int DEFAULT_ATTEND_SECOND = 59; private final AttendanceRepository attendanceRepository; private final AttendanceRecordService attendanceRecordService; private final SessionRepository sessionRepository; @@ -53,8 +52,7 @@ public void updateAttendanceByAttendanceId(UpdateAttendanceRequest request) { Session attendanceSession = sessionRepository.findById(attendance.getSessionId()) .orElseThrow(() -> new EntityNotFoundException("출석과 연결된 세션을 찾을 수 없습니다")); - updateAttendance(attendanceSession, attendance, request - .attendTime(), request.location()); + updateAttendance(attendanceSession, attendance, request.attendTime(), request.location()); } @Transactional @@ -63,15 +61,13 @@ public void updateAttendance(Session attendanceSession, Attendance attendance, AttendanceUtil.validateAttendanceTime(attendanceDeadLine.attendanceDeadLine(), attendanceDeadLine.lateDeadLine()); - if (attendanceSession.getSessionDate() == null) { + // 세션 날짜가 존재하지 않는 경우 예외 발생 + if (attendanceSession.getSessionDateTime() == null) { throw new AppException(ErrorCode.SESSION_DATE_NOT_FOUND); } - attendance.updateDeadLine( - LocalDateTime.of(attendanceSession.getSessionDate(), attendanceDeadLine.attendanceDeadLine()) - .plusSeconds(DEFAULT_ATTEND_SECOND), - LocalDateTime.of(attendanceSession.getSessionDate(), attendanceDeadLine.lateDeadLine()) - .plusSeconds(DEFAULT_ATTEND_SECOND)); + attendance.updateDeadLine(LocalDateTime.of(attendanceSession.getSessionDateTime().toLocalDate(), attendanceDeadLine.attendanceDeadLine()), + LocalDateTime.of(attendanceSession.getSessionDateTime().toLocalDate(), attendanceDeadLine.lateDeadLine())); attendance.updateLocation(location); attendanceRecordService.updateAttendanceStatus(attendanceSession.getSessionDateTime(), attendance); From 07722e04ec50ce835d2d4f85a82b7bdc86b16d6f Mon Sep 17 00:00:00 2001 From: youth Date: Thu, 12 Sep 2024 23:43:20 +0900 Subject: [PATCH 11/17] =?UTF-8?q?refactor:=20=EC=84=B8=EC=85=98=20?= =?UTF-8?q?=EB=82=A0=EC=A7=9C=20=EB=B3=80=EA=B2=BD=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../generation/service/SessionService.java | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/src/main/java/org/cotato/csquiz/domain/generation/service/SessionService.java b/src/main/java/org/cotato/csquiz/domain/generation/service/SessionService.java index 8a20d652..76642b6c 100644 --- a/src/main/java/org/cotato/csquiz/domain/generation/service/SessionService.java +++ b/src/main/java/org/cotato/csquiz/domain/generation/service/SessionService.java @@ -8,7 +8,6 @@ import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.cotato.csquiz.api.attendance.dto.AttendanceDeadLineDto; import org.cotato.csquiz.api.session.dto.AddSessionRequest; import org.cotato.csquiz.api.session.dto.AddSessionResponse; import org.cotato.csquiz.api.session.dto.CsEducationOnSessionNumberResponse; @@ -107,31 +106,31 @@ public void updateSession(UpdateSessionRequest request) { .networking(request.networking()) .build()); - updateSessionDate(session, request.sessionDate(), request.attendTime()); + updateSessionDateTime(session, request.sessionDateTime(), request.attendTime().attendanceDeadLine(), request.attendTime().lateDeadLine()); sessionRepository.save(session); } - public void updateSessionDate(Session session, LocalDate newDate, AttendanceDeadLineDto newDeadline) { - Attendance findAttendance = attendanceRepository.findBySessionId(session.getId()) + @Transactional + public void updateSessionDateTime(Session session, LocalDateTime newDateTime, LocalTime attendanceDeadline, LocalTime lateDeadline) { + Attendance attendance = attendanceRepository.findBySessionId(session.getId()) .orElseGet(() -> Attendance.builder() .session(session) .build()); - // 날짜가 바뀌지 않았고, 출결 시간이 모두 동일한 경우 - if (newDate.equals(session.getSessionDate()) && - findAttendance.getAttendanceDeadLine().toLocalTime().equals(newDeadline.attendanceDeadLine()) && - findAttendance.getLateDeadLine().toLocalTime().equals(newDeadline.lateDeadLine())) { + if (newDateTime.equals(session.getSessionDateTime()) && + attendance.getAttendanceDeadLine().toLocalTime().equals(attendanceDeadline) && + attendance.getLateDeadLine().toLocalTime().equals(lateDeadline)) { return; } - session.updateSessionDate(newDate); + session.updateSessionDateTime(newDateTime); - LocalDateTime newAttendanceDeadline = LocalDateTime.of(newDate, newDeadline.attendanceDeadLine()); - LocalDateTime newLateDeadline = LocalDateTime.of(newDate, newDeadline.lateDeadLine()); - findAttendance.updateDeadLine(newAttendanceDeadline, newLateDeadline); + LocalDateTime newAttendanceDeadline = LocalDateTime.of(newDateTime.toLocalDate(), attendanceDeadline); + LocalDateTime newLateDeadline = LocalDateTime.of(newDateTime.toLocalDate(), lateDeadline); + attendance.updateDeadLine(newAttendanceDeadline, newLateDeadline); - attendanceRepository.save(findAttendance); - attendanceRecordService.updateAttendanceStatus(findAttendance); + attendanceRepository.save(attendance); + attendanceRecordService.updateAttendanceStatus(newDateTime, attendance); } public List findSessionsByGenerationId(Long generationId) { From 22c0af3f8b96396d4452f5b59da8ec6505d12aad Mon Sep 17 00:00:00 2001 From: youth Date: Thu, 12 Sep 2024 23:45:29 +0900 Subject: [PATCH 12/17] =?UTF-8?q?refactor:=20=EC=84=B8=EC=85=98=20?= =?UTF-8?q?=EC=8B=9C=EC=9E=91=20=EC=8B=9C=EA=B0=84=20=EB=B3=80=EA=B2=BD?= =?UTF-8?q?=EC=97=90=20=EB=94=B0=EB=A5=B8=20=EB=B3=80=EC=88=98=EB=AA=85=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cotato/csquiz/api/session/dto/SessionListResponse.java | 6 +++--- .../domain/attendance/service/AttendanceAdminService.java | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/cotato/csquiz/api/session/dto/SessionListResponse.java b/src/main/java/org/cotato/csquiz/api/session/dto/SessionListResponse.java index 775b2bb0..1624fb61 100644 --- a/src/main/java/org/cotato/csquiz/api/session/dto/SessionListResponse.java +++ b/src/main/java/org/cotato/csquiz/api/session/dto/SessionListResponse.java @@ -1,6 +1,6 @@ package org.cotato.csquiz.api.session.dto; -import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.List; import org.cotato.csquiz.domain.generation.embedded.SessionContents; import org.cotato.csquiz.domain.generation.entity.Session; @@ -14,7 +14,7 @@ public record SessionListResponse( String description, Long generationId, String placeName, - LocalDate sessionDate, + LocalDateTime sessionDateTime, SessionContents sessionContents ) { public static SessionListResponse of(Session session, List sessionImages) { @@ -28,7 +28,7 @@ public static SessionListResponse of(Session session, List session session.getDescription(), session.getGeneration().getId(), session.getPlaceName(), - session.getSessionDate(), + session.getSessionDateTime(), session.getSessionContents() ); } diff --git a/src/main/java/org/cotato/csquiz/domain/attendance/service/AttendanceAdminService.java b/src/main/java/org/cotato/csquiz/domain/attendance/service/AttendanceAdminService.java index cf8e912e..b385dc01 100644 --- a/src/main/java/org/cotato/csquiz/domain/attendance/service/AttendanceAdminService.java +++ b/src/main/java/org/cotato/csquiz/domain/attendance/service/AttendanceAdminService.java @@ -77,7 +77,7 @@ public List findAttendanceRecords(Long generationId, I List sessions = sessionRepository.findAllByGenerationId(generationId); if (month != null) { sessions = sessions.stream() - .filter(session -> session.getSessionDate().getMonthValue() == month) + .filter(session -> session.getSessionDateTime().getMonthValue() == month) .toList(); } List sessionIds = sessions.stream() From 657bc0256ead5fec52efb93f12569cb7ed272a76 Mon Sep 17 00:00:00 2001 From: youth Date: Thu, 12 Sep 2024 23:45:38 +0900 Subject: [PATCH 13/17] =?UTF-8?q?chore:=20=EC=A3=BC=EC=84=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/org/cotato/csquiz/common/sse/SseSender.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/cotato/csquiz/common/sse/SseSender.java b/src/main/java/org/cotato/csquiz/common/sse/SseSender.java index 4bf4e8f9..4de18225 100644 --- a/src/main/java/org/cotato/csquiz/common/sse/SseSender.java +++ b/src/main/java/org/cotato/csquiz/common/sse/SseSender.java @@ -55,7 +55,7 @@ public void sendInitialAttendanceStatus(SseEmitter sseEmitter) { .build()); } - // sessionDate 6시 50분에 출결을 구독 중인 부원들에게 출결 입력 시작 알림을 전송한다. + // sessionDateTime 7시에 출결을 구독 중인 부원들에게 출결 입력 시작 알림을 전송한다. public void sendNotification(LocalDateTime notificationDate) { Attendance attendance = attendanceRepository.findByAttendanceDeadLineDate(notificationDate) .orElseThrow(() -> new EntityNotFoundException("해당 날짜에 진행하는 출석이 없습니다.")); From 44553a2025d0d0030e2256e12456ce88db4a69f1 Mon Sep 17 00:00:00 2001 From: youth Date: Thu, 12 Sep 2024 23:47:36 +0900 Subject: [PATCH 14/17] =?UTF-8?q?test:=20=EC=9C=A0=ED=8B=B8=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EB=B3=80=EA=B2=BD=EC=97=90=20=EB=94=B0?= =?UTF-8?q?=EB=A5=B8=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../csquiz/domain/attendance/util/AttendanceUtilTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/org/cotato/csquiz/domain/attendance/util/AttendanceUtilTest.java b/src/test/java/org/cotato/csquiz/domain/attendance/util/AttendanceUtilTest.java index 4caf6dcf..9f0077d8 100644 --- a/src/test/java/org/cotato/csquiz/domain/attendance/util/AttendanceUtilTest.java +++ b/src/test/java/org/cotato/csquiz/domain/attendance/util/AttendanceUtilTest.java @@ -29,7 +29,7 @@ class AttendanceUtilTest { .build(); //when - AttendanceOpenStatus attendanceStatus = AttendanceUtil.getAttendanceOpenStatus(attendance, + AttendanceOpenStatus attendanceStatus = AttendanceUtil.getAttendanceOpenStatus(LocalDateTime.now(), attendance, LocalDateTime.now().plusDays(1)); //then @@ -51,7 +51,7 @@ class AttendanceUtilTest { LocalDateTime beforeTime = LocalDateTime.of(LocalDate.of(2024, Month.AUGUST, 9),DeadLine.ATTENDANCE_START_TIME.getTime().minusMinutes(10)); //when - AttendanceOpenStatus attendanceStatus = AttendanceUtil.getAttendanceOpenStatus(attendance, beforeTime); + AttendanceOpenStatus attendanceStatus = AttendanceUtil.getAttendanceOpenStatus(LocalDateTime.of(2024, Month.AUGUST, 9, 19, 0, 0), attendance, beforeTime); //then assertEquals(attendanceStatus, AttendanceOpenStatus.BEFORE); From 023bf5bf573bb86b23c7ffc650a55eb3c20a5a0a Mon Sep 17 00:00:00 2001 From: youth Date: Thu, 12 Sep 2024 23:51:46 +0900 Subject: [PATCH 15/17] =?UTF-8?q?refactor:=20=EC=B6=9C=EA=B2=B0=20?= =?UTF-8?q?=EC=8B=9C=EA=B0=84=20=EA=B2=80=EC=A6=9D=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/AttendanceAdminService.java | 4 ++-- .../attendance/util/AttendanceUtil.java | 8 ++----- .../attendance/util/AttendanceUtilTest.java | 22 +++++-------------- 3 files changed, 9 insertions(+), 25 deletions(-) diff --git a/src/main/java/org/cotato/csquiz/domain/attendance/service/AttendanceAdminService.java b/src/main/java/org/cotato/csquiz/domain/attendance/service/AttendanceAdminService.java index b385dc01..b720fe7d 100644 --- a/src/main/java/org/cotato/csquiz/domain/attendance/service/AttendanceAdminService.java +++ b/src/main/java/org/cotato/csquiz/domain/attendance/service/AttendanceAdminService.java @@ -33,7 +33,7 @@ public class AttendanceAdminService { @Transactional public void addAttendance(Session session, Location location, LocalTime attendanceDeadline, LocalTime lateDeadline) { - AttendanceUtil.validateAttendanceTime(attendanceDeadline, lateDeadline); + AttendanceUtil.validateAttendanceTime(session.getSessionDateTime(), attendanceDeadline, lateDeadline); Attendance attendance = Attendance.builder() .session(session) @@ -58,7 +58,7 @@ public void updateAttendanceByAttendanceId(UpdateAttendanceRequest request) { @Transactional public void updateAttendance(Session attendanceSession, Attendance attendance, AttendanceDeadLineDto attendanceDeadLine, Location location) { - AttendanceUtil.validateAttendanceTime(attendanceDeadLine.attendanceDeadLine(), + AttendanceUtil.validateAttendanceTime(attendanceSession.getSessionDateTime(), attendanceDeadLine.attendanceDeadLine(), attendanceDeadLine.lateDeadLine()); // 세션 날짜가 존재하지 않는 경우 예외 발생 diff --git a/src/main/java/org/cotato/csquiz/domain/attendance/util/AttendanceUtil.java b/src/main/java/org/cotato/csquiz/domain/attendance/util/AttendanceUtil.java index ed63bac5..7ef9e9a5 100644 --- a/src/main/java/org/cotato/csquiz/domain/attendance/util/AttendanceUtil.java +++ b/src/main/java/org/cotato/csquiz/domain/attendance/util/AttendanceUtil.java @@ -47,17 +47,13 @@ public static AttendanceOpenStatus getAttendanceOpenStatus(LocalDateTime session return AttendanceOpenStatus.ABSENT; } - public static void validateAttendanceTime(LocalTime attendDeadLine, LocalTime lateDeadLine) { - if (!DeadLine.ATTENDANCE_START_TIME.getTime().isBefore(attendDeadLine)) { + public static void validateAttendanceTime(LocalDateTime sessionStartTime, LocalTime attendDeadLine, LocalTime lateDeadLine) { + if (!sessionStartTime.toLocalTime().isBefore(attendDeadLine)) { throw new AppException(ErrorCode.INVALID_ATTEND_TIME); } if (!attendDeadLine.isBefore(lateDeadLine)) { throw new AppException(ErrorCode.INVALID_ATTEND_TIME); } - - if (!lateDeadLine.isBefore(DeadLine.ATTENDANCE_END_TIME.getTime())) { - throw new AppException(ErrorCode.INVALID_ATTEND_TIME); - } } } diff --git a/src/test/java/org/cotato/csquiz/domain/attendance/util/AttendanceUtilTest.java b/src/test/java/org/cotato/csquiz/domain/attendance/util/AttendanceUtilTest.java index 9f0077d8..d0a154be 100644 --- a/src/test/java/org/cotato/csquiz/domain/attendance/util/AttendanceUtilTest.java +++ b/src/test/java/org/cotato/csquiz/domain/attendance/util/AttendanceUtilTest.java @@ -60,11 +60,12 @@ class AttendanceUtilTest { @Test void 지각마감이_세션시작보다_빠를_수_없다() { //given - LocalTime attendDeadline = LocalTime.of(18, 40, 0); + LocalDateTime sessionStartTime = LocalDateTime.of(LocalDate.now(), LocalTime.of(15, 0)); + LocalTime attendDeadline = LocalTime.of(19, 40, 0); LocalTime lateDeadline = LocalTime.of(19, 20, 0); //when, then - assertThatThrownBy(() -> AttendanceUtil.validateAttendanceTime(attendDeadline, lateDeadline)) + assertThatThrownBy(() -> AttendanceUtil.validateAttendanceTime(sessionStartTime, attendDeadline, lateDeadline)) .isInstanceOf(AppException.class) .extracting("errorCode") .isEqualTo(ErrorCode.INVALID_ATTEND_TIME); @@ -74,25 +75,12 @@ class AttendanceUtilTest { @Test void 지각마감보다_출석마감이_빠르다() { //given + LocalDateTime sessionStartTime = LocalDateTime.of(LocalDate.now(), LocalTime.of(15, 0)); LocalTime attendDeadline = LocalTime.of(19, 40, 0); LocalTime lateDeadline = LocalTime.of(19, 20, 0); //when, then - assertThatThrownBy(() -> AttendanceUtil.validateAttendanceTime(attendDeadline, lateDeadline)) - .isInstanceOf(AppException.class) - .extracting("errorCode") - .isEqualTo(ErrorCode.INVALID_ATTEND_TIME); - } - - @DisplayName(value = "지각 마감이 세션 종료보다 늦으면 예외를 발생한다.") - @Test - void 지각마감시간_검증_기능() { - //given - LocalTime attendDeadline = LocalTime.of(19, 40, 0); - LocalTime lateDeadline = LocalTime.of(20, 20, 0); - - //when, then - assertThatThrownBy(() -> AttendanceUtil.validateAttendanceTime(attendDeadline, lateDeadline)) + assertThatThrownBy(() -> AttendanceUtil.validateAttendanceTime(sessionStartTime, attendDeadline, lateDeadline)) .isInstanceOf(AppException.class) .extracting("errorCode") .isEqualTo(ErrorCode.INVALID_ATTEND_TIME); From eda09115ba29061456de3b326451639167fcc007 Mon Sep 17 00:00:00 2001 From: youth Date: Fri, 13 Sep 2024 01:59:53 +0900 Subject: [PATCH 16/17] =?UTF-8?q?chore:=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20deadline=20=EA=B0=92=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../csquiz/domain/attendance/enums/DeadLine.java | 12 ------------ .../domain/attendance/util/AttendanceUtil.java | 1 - 2 files changed, 13 deletions(-) diff --git a/src/main/java/org/cotato/csquiz/domain/attendance/enums/DeadLine.java b/src/main/java/org/cotato/csquiz/domain/attendance/enums/DeadLine.java index e1a5b28d..f2bc1955 100644 --- a/src/main/java/org/cotato/csquiz/domain/attendance/enums/DeadLine.java +++ b/src/main/java/org/cotato/csquiz/domain/attendance/enums/DeadLine.java @@ -1,7 +1,5 @@ package org.cotato.csquiz.domain.attendance.enums; -import java.time.LocalDate; -import java.time.LocalDateTime; import java.time.LocalTime; import lombok.AllArgsConstructor; import lombok.Getter; @@ -10,20 +8,10 @@ @AllArgsConstructor public enum DeadLine { - ATTENDANCE_START_TIME(LocalTime.of(18, 50, 0), "고정 출석 시작 시간"), DEFAULT_ATTENDANCE_DEADLINE(LocalTime.of(19, 5, 0), "기본 출석 마감 시간"), DEFAULT_LATE_DEADLINE(LocalTime.of(19,20,0),"기본 지각 마감 시간"), - ATTENDANCE_END_TIME(LocalTime.of(20, 0,0), "고정 세션 종료 시간") ; private final LocalTime time; private final String description; - - public static LocalDateTime sessionStartTime(LocalDate date) { - return LocalDateTime.of(date, ATTENDANCE_START_TIME.getTime()); - } - - public static LocalDateTime sessionEndTime(LocalDate date) { - return LocalDateTime.of(date, ATTENDANCE_END_TIME.getTime()); - } } diff --git a/src/main/java/org/cotato/csquiz/domain/attendance/util/AttendanceUtil.java b/src/main/java/org/cotato/csquiz/domain/attendance/util/AttendanceUtil.java index 7ef9e9a5..2da22a79 100644 --- a/src/main/java/org/cotato/csquiz/domain/attendance/util/AttendanceUtil.java +++ b/src/main/java/org/cotato/csquiz/domain/attendance/util/AttendanceUtil.java @@ -7,7 +7,6 @@ import org.cotato.csquiz.domain.attendance.entity.Attendance; import org.cotato.csquiz.domain.attendance.enums.AttendanceOpenStatus; import org.cotato.csquiz.domain.attendance.enums.AttendanceResult; -import org.cotato.csquiz.domain.attendance.enums.DeadLine; public class AttendanceUtil { // 출석 시간에 따른 지각 여부 구분하기 From eb2df9327d4a159e12183f1f209132215779b974 Mon Sep 17 00:00:00 2001 From: youth Date: Fri, 13 Sep 2024 02:00:08 +0900 Subject: [PATCH 17/17] =?UTF-8?q?test:=20=EA=B8=B0=EC=A1=B4=20=EC=8B=9C?= =?UTF-8?q?=EA=B0=84=20=EC=A0=84=EC=97=90=20=EC=B6=9C=EC=84=9D=EC=9D=B4=20?= =?UTF-8?q?=EB=8B=AB=ED=98=80=EC=9E=88=EB=8A=94=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/attendance/util/AttendanceUtilTest.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/test/java/org/cotato/csquiz/domain/attendance/util/AttendanceUtilTest.java b/src/test/java/org/cotato/csquiz/domain/attendance/util/AttendanceUtilTest.java index d0a154be..69f94399 100644 --- a/src/test/java/org/cotato/csquiz/domain/attendance/util/AttendanceUtilTest.java +++ b/src/test/java/org/cotato/csquiz/domain/attendance/util/AttendanceUtilTest.java @@ -1,7 +1,7 @@ package org.cotato.csquiz.domain.attendance.util; import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; import java.time.LocalDate; import java.time.LocalDateTime; @@ -11,7 +11,6 @@ import org.cotato.csquiz.common.error.exception.AppException; import org.cotato.csquiz.domain.attendance.entity.Attendance; import org.cotato.csquiz.domain.attendance.enums.AttendanceOpenStatus; -import org.cotato.csquiz.domain.attendance.enums.DeadLine; import org.cotato.csquiz.domain.generation.entity.Session; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -40,15 +39,16 @@ class AttendanceUtilTest { void 기준시간_전이면_출석이_닫혀있다() { //given LocalDateTime attendanceDeadLine = LocalDateTime.of(2024, Month.AUGUST, 9, 19, 10, 0); - + Session session = Session.builder() + .sessionDateTime(attendanceDeadLine.minusMinutes(10)) + .build(); Attendance attendance = Attendance.builder() .attendanceDeadLine(attendanceDeadLine) .lateDeadLine(attendanceDeadLine.plusMinutes(10)) - .session(Session.builder() - .build()) + .session(session) .build(); - LocalDateTime beforeTime = LocalDateTime.of(LocalDate.of(2024, Month.AUGUST, 9),DeadLine.ATTENDANCE_START_TIME.getTime().minusMinutes(10)); + LocalDateTime beforeTime = session.getSessionDateTime().minusMinutes(10); //when AttendanceOpenStatus attendanceStatus = AttendanceUtil.getAttendanceOpenStatus(LocalDateTime.of(2024, Month.AUGUST, 9, 19, 0, 0), attendance, beforeTime);