Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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 입니다."),

;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
Original file line number Diff line number Diff line change
@@ -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()
);
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -38,4 +40,10 @@ public Long save(AttendanceCheck attendanceCheck) {
attendanceCheckMapper.toJpaEntity(attendanceCheck, roomJpaEntity, userJpaEntity)
).getAttendanceCheckId();
}

@Override
public Optional<AttendanceCheck> findById(Long id) {
return attendanceCheckJpaRepository.findById(id)
.map(attendanceCheckMapper::toDomainEntity);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
) { }
Original file line number Diff line number Diff line change
@@ -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<AttendanceCheck> findById(Long id);

default AttendanceCheck getByIdOrThrow(Long id) {
return findById(id)
.orElseThrow(() -> new EntityNotFoundException(ATTENDANCE_CHECK_NOT_FOUND));
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
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;
import konkuk.thip.roompost.application.port.out.AttendanceCheckCommandPort;
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;
Expand All @@ -17,25 +20,36 @@ 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. 유저가 해당 방에서 오늘 이미 작성한 오늘의 한마디 개수 조회
int alreadyWrittenCountToday = attendanceCheckQueryPort.countAttendanceChecksOnTodayByUser(command.creatorId(), command.roomId());

// 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();
}
}