diff --git a/src/main/java/konkuk/thip/common/exception/code/ErrorCode.java b/src/main/java/konkuk/thip/common/exception/code/ErrorCode.java index ef76ea025..2fe07d275 100644 --- a/src/main/java/konkuk/thip/common/exception/code/ErrorCode.java +++ b/src/main/java/konkuk/thip/common/exception/code/ErrorCode.java @@ -197,6 +197,7 @@ public enum ErrorCode implements ResponseCode { * 195000 : AttendanceCheck error */ ATTENDANCE_CHECK_WRITE_LIMIT_EXCEEDED(HttpStatus.BAD_REQUEST, 195000, "오늘의 한마디 작성 가능 횟수를 초과하였습니다."), + ATTENDANCE_CHECK_NOT_FOUND(HttpStatus.NOT_FOUND, 195001, "존재하지 않는 ATTENDANCE CHECK 입니다."), ; diff --git a/src/main/java/konkuk/thip/common/swagger/SwaggerResponseDescription.java b/src/main/java/konkuk/thip/common/swagger/SwaggerResponseDescription.java index cc4ad261b..291dd5b68 100644 --- a/src/main/java/konkuk/thip/common/swagger/SwaggerResponseDescription.java +++ b/src/main/java/konkuk/thip/common/swagger/SwaggerResponseDescription.java @@ -294,7 +294,8 @@ public enum SwaggerResponseDescription { ROOM_ACCESS_FORBIDDEN, ROOM_NOT_FOUND, USER_NOT_FOUND, - ATTENDANCE_CHECK_WRITE_LIMIT_EXCEEDED + ATTENDANCE_CHECK_WRITE_LIMIT_EXCEEDED, + ATTENDANCE_CHECK_NOT_FOUND ))), ATTENDANCE_CHECK_SHOW(new LinkedHashSet<>(Set.of( diff --git a/src/main/java/konkuk/thip/roompost/adapter/in/web/response/AttendanceCheckCreateResponse.java b/src/main/java/konkuk/thip/roompost/adapter/in/web/response/AttendanceCheckCreateResponse.java index 68be54e3a..fb6117a86 100644 --- a/src/main/java/konkuk/thip/roompost/adapter/in/web/response/AttendanceCheckCreateResponse.java +++ b/src/main/java/konkuk/thip/roompost/adapter/in/web/response/AttendanceCheckCreateResponse.java @@ -1,20 +1,40 @@ package konkuk.thip.roompost.adapter.in.web.response; +import io.swagger.v3.oas.annotations.media.Schema; import konkuk.thip.roompost.application.port.in.dto.attendancecheck.AttendanceCheckCreateResult; +import java.time.LocalDate; + public record AttendanceCheckCreateResponse( - Long attendanceCheckId, Long roomId, - boolean isFirstWrite + Long attendanceCheckId, + Long creatorId, + String creatorNickname, + String creatorProfileImageUrl, + String todayComment, + @Schema(description = "작성 시각(상대 시간 등 가공된 문자열)", example = "5분 전") + String postDate, + @Schema(description = "작성 날짜(yyyy-MM-dd)", example = "2025-08-17") + LocalDate date, // 해당 오늘의 한마디 데이터의 작성 날짜 + boolean isFirstWrite, + boolean isWriter ) { public static AttendanceCheckCreateResponse of(AttendanceCheckCreateResult result) { boolean isFirstWrite = false; if (result.todayWriteCountOfUser() == 1) isFirstWrite = true; return new AttendanceCheckCreateResponse( - result.attendanceCheckId(), result.roomId(), - isFirstWrite + result.attendanceCheckId(), + result.creatorId(), + result.creatorNickname(), + result.creatorProfileImageUrl(), + result.todayComment(), + result.postDate(), + result.date(), + isFirstWrite, + result.isWriter() ); } } + diff --git a/src/main/java/konkuk/thip/roompost/adapter/out/persistence/AttendanceCheckCommandPersistenceAdapter.java b/src/main/java/konkuk/thip/roompost/adapter/out/persistence/AttendanceCheckCommandPersistenceAdapter.java index 33d36ca41..90dcb5824 100644 --- a/src/main/java/konkuk/thip/roompost/adapter/out/persistence/AttendanceCheckCommandPersistenceAdapter.java +++ b/src/main/java/konkuk/thip/roompost/adapter/out/persistence/AttendanceCheckCommandPersistenceAdapter.java @@ -12,6 +12,8 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; +import java.util.Optional; + import static konkuk.thip.common.exception.code.ErrorCode.ROOM_NOT_FOUND; import static konkuk.thip.common.exception.code.ErrorCode.USER_NOT_FOUND; @@ -38,4 +40,10 @@ public Long save(AttendanceCheck attendanceCheck) { attendanceCheckMapper.toJpaEntity(attendanceCheck, roomJpaEntity, userJpaEntity) ).getAttendanceCheckId(); } + + @Override + public Optional findById(Long id) { + return attendanceCheckJpaRepository.findById(id) + .map(attendanceCheckMapper::toDomainEntity); + } } diff --git a/src/main/java/konkuk/thip/roompost/application/port/in/dto/attendancecheck/AttendanceCheckCreateResult.java b/src/main/java/konkuk/thip/roompost/application/port/in/dto/attendancecheck/AttendanceCheckCreateResult.java index dc87fddec..9fa729ce5 100644 --- a/src/main/java/konkuk/thip/roompost/application/port/in/dto/attendancecheck/AttendanceCheckCreateResult.java +++ b/src/main/java/konkuk/thip/roompost/application/port/in/dto/attendancecheck/AttendanceCheckCreateResult.java @@ -2,9 +2,18 @@ import lombok.Builder; +import java.time.LocalDate; + @Builder public record AttendanceCheckCreateResult( - Long attendanceCheckId, Long roomId, - int todayWriteCountOfUser + Long attendanceCheckId, + Long creatorId, + String creatorNickname, + String creatorProfileImageUrl, + String todayComment, + String postDate, + LocalDate date, // 해당 오늘의 한마디 데이터의 작성 날짜 + int todayWriteCountOfUser, + boolean isWriter ) { } diff --git a/src/main/java/konkuk/thip/roompost/application/port/out/AttendanceCheckCommandPort.java b/src/main/java/konkuk/thip/roompost/application/port/out/AttendanceCheckCommandPort.java index 68f974a97..5fc2c2559 100644 --- a/src/main/java/konkuk/thip/roompost/application/port/out/AttendanceCheckCommandPort.java +++ b/src/main/java/konkuk/thip/roompost/application/port/out/AttendanceCheckCommandPort.java @@ -1,8 +1,20 @@ package konkuk.thip.roompost.application.port.out; +import konkuk.thip.common.exception.EntityNotFoundException; import konkuk.thip.roompost.domain.AttendanceCheck; +import java.util.Optional; + +import static konkuk.thip.common.exception.code.ErrorCode.ATTENDANCE_CHECK_NOT_FOUND; + public interface AttendanceCheckCommandPort { Long save(AttendanceCheck attendanceCheck); + + Optional findById(Long id); + + default AttendanceCheck getByIdOrThrow(Long id) { + return findById(id) + .orElseThrow(() -> new EntityNotFoundException(ATTENDANCE_CHECK_NOT_FOUND)); + } } diff --git a/src/main/java/konkuk/thip/roompost/application/service/AttendanceCheckCreateService.java b/src/main/java/konkuk/thip/roompost/application/service/AttendanceCheckCreateService.java index 44d97b3b4..1fa93c9ca 100644 --- a/src/main/java/konkuk/thip/roompost/application/service/AttendanceCheckCreateService.java +++ b/src/main/java/konkuk/thip/roompost/application/service/AttendanceCheckCreateService.java @@ -1,5 +1,6 @@ package konkuk.thip.roompost.application.service; +import konkuk.thip.common.util.DateUtil; import konkuk.thip.roompost.application.port.in.AttendanceCheckCreateUseCase; import konkuk.thip.roompost.application.port.in.dto.attendancecheck.AttendanceCheckCreateCommand; import konkuk.thip.roompost.application.port.in.dto.attendancecheck.AttendanceCheckCreateResult; @@ -7,6 +8,8 @@ import konkuk.thip.roompost.application.port.out.AttendanceCheckQueryPort; import konkuk.thip.roompost.domain.AttendanceCheck; import konkuk.thip.room.application.service.validator.RoomParticipantValidator; +import konkuk.thip.user.application.port.out.UserCommandPort; +import konkuk.thip.user.domain.User; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -17,12 +20,16 @@ public class AttendanceCheckCreateService implements AttendanceCheckCreateUseCas private final RoomParticipantValidator roomParticipantValidator; private final AttendanceCheckCommandPort attendanceCheckCommandPort; + private final UserCommandPort userCommandPort; private final AttendanceCheckQueryPort attendanceCheckQueryPort; @Transactional @Override public AttendanceCheckCreateResult create(AttendanceCheckCreateCommand command) { - // 1. 유저가 해당 방에 오늘의 한마디를 작성할 수 있는지 검증 + + // 1. 유저 검증 및 조회 + User user = userCommandPort.findById(command.creatorId()); + // 1-1. 유저가 해당 방에 오늘의 한마디를 작성할 수 있는지 검증 roomParticipantValidator.validateUserIsRoomMember(command.roomId(), command.creatorId()); // 2. 유저가 해당 방에서 오늘 이미 작성한 오늘의 한마디 개수 조회 @@ -30,12 +37,19 @@ public AttendanceCheckCreateResult create(AttendanceCheckCreateCommand command) // 3. 출석체크 도메인 생성 및 저장 AttendanceCheck attendanceCheck = AttendanceCheck.withoutId(command.roomId(), command.creatorId(), command.content(), alreadyWrittenCountToday); - Long savedId = attendanceCheckCommandPort.save(attendanceCheck); + AttendanceCheck SavedattendanceCheck = attendanceCheckCommandPort.getByIdOrThrow(attendanceCheckCommandPort.save(attendanceCheck)); return AttendanceCheckCreateResult.builder() - .attendanceCheckId(savedId) .roomId(command.roomId()) + .attendanceCheckId(SavedattendanceCheck.getId()) + .creatorId(command.creatorId()) + .creatorNickname(user.getNickname()) + .creatorProfileImageUrl(user.getAlias().getImageUrl()) + .todayComment(command.content()) + .postDate(DateUtil.formatBeforeTime(SavedattendanceCheck.getCreatedAt())) + .date(SavedattendanceCheck.getCreatedAt().toLocalDate()) .todayWriteCountOfUser(alreadyWrittenCountToday + 1) + .isWriter(true) .build(); } }