diff --git a/src/main/java/com/moabam/api/application/RoomService.java b/src/main/java/com/moabam/api/application/RoomService.java index 5425f829..9c35148f 100644 --- a/src/main/java/com/moabam/api/application/RoomService.java +++ b/src/main/java/com/moabam/api/application/RoomService.java @@ -21,7 +21,6 @@ import com.moabam.api.domain.entity.Room; import com.moabam.api.domain.entity.Routine; import com.moabam.api.domain.entity.enums.RoomType; -import com.moabam.api.domain.repository.CertificationsMapper; import com.moabam.api.domain.repository.CertificationsSearchRepository; import com.moabam.api.domain.repository.ParticipantRepository; import com.moabam.api.domain.repository.ParticipantSearchRepository; @@ -29,6 +28,7 @@ import com.moabam.api.domain.repository.RoutineRepository; import com.moabam.api.domain.repository.RoutineSearchRepository; import com.moabam.api.dto.CertificationImageResponse; +import com.moabam.api.dto.CertificationsMapper; import com.moabam.api.dto.CreateRoomRequest; import com.moabam.api.dto.EnterRoomRequest; import com.moabam.api.dto.ModifyRoomRequest; @@ -57,7 +57,7 @@ public class RoomService { private final MemberService memberService; @Transactional - public void createRoom(Long memberId, CreateRoomRequest createRoomRequest) { + public Long createRoom(Long memberId, CreateRoomRequest createRoomRequest) { Room room = RoomMapper.toRoomEntity(createRoomRequest); List routines = RoutineMapper.toRoutineEntities(room, createRoomRequest.routines()); Participant participant = Participant.builder() @@ -66,9 +66,11 @@ public void createRoom(Long memberId, CreateRoomRequest createRoomRequest) { .build(); participant.enableManager(); - roomRepository.save(room); + Room savedRoom = roomRepository.save(room); routineRepository.saveAll(routines); participantRepository.save(participant); + + return savedRoom.getId(); } @Transactional @@ -85,6 +87,12 @@ public void modifyRoom(Long memberId, Long roomId, ModifyRoomRequest modifyRoomR room.changePassword(modifyRoomRequest.password()); room.changeCertifyTime(modifyRoomRequest.certifyTime()); room.changeMaxCount(modifyRoomRequest.maxUserCount()); + + List routines = routineSearchRepository.findByRoomId(roomId); + routineRepository.deleteAll(routines); + + List newRoutines = RoutineMapper.toRoutineEntities(room, modifyRoomRequest.routines()); + routineRepository.saveAll(newRoutines); } @Transactional @@ -134,7 +142,7 @@ public RoomDetailsResponse getRoomDetails(Long memberId, Long roomId) { certificationsSearchRepository.findSortedDailyMemberCertifications(roomId, today); List routineResponses = getRoutineResponses(roomId); List todayCertificateRankResponses = getTodayCertificateRankResponses(roomId, - routineResponses, dailyMemberCertifications, today); + dailyMemberCertifications, today); List certifiedDates = getCertifiedDates(roomId, today); double completePercentage = calculateCompletePercentage(dailyMemberCertifications.size(), room.getCurrentUserCount()); @@ -208,15 +216,10 @@ private List getRoutineResponses(Long roomId) { } private List getTodayCertificateRankResponses(Long roomId, - List routines, List dailyMemberCertifications, LocalDate today) { + List dailyMemberCertifications, LocalDate today) { List responses = new ArrayList<>(); - List routineIds = routines.stream() - .map(RoutineResponse::routineId) - .toList(); - List certifications = certificationsSearchRepository.findCertifications( - routineIds, - today); + List certifications = certificationsSearchRepository.findCertifications(roomId, today); List participants = participantSearchRepository.findParticipants(roomId); List members = memberService.getRoomMembers(participants.stream() .map(Participant::getMemberId) diff --git a/src/main/java/com/moabam/api/domain/entity/Room.java b/src/main/java/com/moabam/api/domain/entity/Room.java index acdd2896..b80d708f 100644 --- a/src/main/java/com/moabam/api/domain/entity/Room.java +++ b/src/main/java/com/moabam/api/domain/entity/Room.java @@ -43,7 +43,7 @@ public class Room extends BaseTimeEntity { @Column(name = "id") private Long id; - @Column(name = "title", nullable = false, length = 30) + @Column(name = "title", nullable = false, length = 20) private String title; @Column(name = "password", length = 8) diff --git a/src/main/java/com/moabam/api/domain/entity/Routine.java b/src/main/java/com/moabam/api/domain/entity/Routine.java index 23dd4773..e370388f 100644 --- a/src/main/java/com/moabam/api/domain/entity/Routine.java +++ b/src/main/java/com/moabam/api/domain/entity/Routine.java @@ -1,8 +1,12 @@ package com.moabam.api.domain.entity; +import static com.moabam.global.error.model.ErrorMessage.*; import static java.util.Objects.*; +import org.apache.commons.lang3.StringUtils; + import com.moabam.global.common.entity.BaseTimeEntity; +import com.moabam.global.error.exception.BadRequestException; import jakarta.persistence.Column; import jakarta.persistence.Entity; @@ -33,17 +37,25 @@ public class Routine extends BaseTimeEntity { @JoinColumn(name = "room_id", updatable = false) private Room room; - @Column(name = "content", nullable = false, length = 60) + @Column(name = "content", nullable = false, length = 20) private String content; @Builder private Routine(Long id, Room room, String content) { this.id = id; this.room = requireNonNull(room); - this.content = requireNonNull(content); + this.content = validateContent(content); } public void changeContent(String content) { this.content = content; } + + private String validateContent(String content) { + if (StringUtils.isBlank(content) || content.length() > 20) { + throw new BadRequestException(ROUTINE_LENGTH_ERROR); + } + + return content; + } } diff --git a/src/main/java/com/moabam/api/domain/repository/CertificationsSearchRepository.java b/src/main/java/com/moabam/api/domain/repository/CertificationsSearchRepository.java index 70c8a8cf..ee921314 100644 --- a/src/main/java/com/moabam/api/domain/repository/CertificationsSearchRepository.java +++ b/src/main/java/com/moabam/api/domain/repository/CertificationsSearchRepository.java @@ -14,7 +14,6 @@ import com.moabam.api.domain.entity.Certification; import com.moabam.api.domain.entity.DailyMemberCertification; import com.moabam.api.domain.entity.DailyRoomCertification; -import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.jpa.impl.JPAQueryFactory; import lombok.RequiredArgsConstructor; @@ -25,18 +24,10 @@ public class CertificationsSearchRepository { private final JPAQueryFactory jpaQueryFactory; - public List findCertifications(List routineIds, LocalDate date) { - BooleanExpression expression = null; - - for (Long routineId : routineIds) { - BooleanExpression routineExpression = certification.routine.id.eq(routineId); - expression = expression == null ? routineExpression : expression.or(routineExpression); - } - - return jpaQueryFactory - .selectFrom(certification) + public List findCertifications(Long roomId, LocalDate date) { + return jpaQueryFactory.selectFrom(certification) .where( - expression, + certification.routine.room.id.eq(roomId), certification.createdAt.between(date.atStartOfDay(), date.atTime(LocalTime.MAX)) ) .fetch(); diff --git a/src/main/java/com/moabam/api/domain/repository/CertificationsMapper.java b/src/main/java/com/moabam/api/dto/CertificationsMapper.java similarity index 97% rename from src/main/java/com/moabam/api/domain/repository/CertificationsMapper.java rename to src/main/java/com/moabam/api/dto/CertificationsMapper.java index 0bba80ec..866ecf40 100644 --- a/src/main/java/com/moabam/api/domain/repository/CertificationsMapper.java +++ b/src/main/java/com/moabam/api/dto/CertificationsMapper.java @@ -1,4 +1,4 @@ -package com.moabam.api.domain.repository; +package com.moabam.api.dto; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/com/moabam/api/dto/CreateRoomRequest.java b/src/main/java/com/moabam/api/dto/CreateRoomRequest.java index 516564ea..a239943f 100644 --- a/src/main/java/com/moabam/api/dto/CreateRoomRequest.java +++ b/src/main/java/com/moabam/api/dto/CreateRoomRequest.java @@ -2,6 +2,7 @@ import java.util.List; +import org.hibernate.validator.constraints.Length; import org.hibernate.validator.constraints.Range; import com.moabam.api.domain.entity.enums.RoomType; @@ -12,7 +13,7 @@ import jakarta.validation.constraints.Size; public record CreateRoomRequest( - @NotBlank String title, + @NotBlank @Length(max = 20) String title, @Pattern(regexp = "^(|[0-9]{4,8})$") String password, @NotNull @Size(min = 1, max = 4) List routines, @NotNull RoomType roomType, diff --git a/src/main/java/com/moabam/api/dto/ModifyRoomRequest.java b/src/main/java/com/moabam/api/dto/ModifyRoomRequest.java index ec44c1b5..017fc877 100644 --- a/src/main/java/com/moabam/api/dto/ModifyRoomRequest.java +++ b/src/main/java/com/moabam/api/dto/ModifyRoomRequest.java @@ -11,7 +11,7 @@ import jakarta.validation.constraints.Size; public record ModifyRoomRequest( - @NotBlank String title, + @NotBlank @Length(max = 20) String title, @Length(max = 255, message = "방 공지의 길이가 너무 깁니다.") String announcement, @NotNull @Size(min = 1, max = 4) List routines, @Pattern(regexp = "^(|\\d{4,8})$") String password, diff --git a/src/main/java/com/moabam/api/presentation/RoomController.java b/src/main/java/com/moabam/api/presentation/RoomController.java index 8eba8cc3..f7489136 100644 --- a/src/main/java/com/moabam/api/presentation/RoomController.java +++ b/src/main/java/com/moabam/api/presentation/RoomController.java @@ -29,8 +29,8 @@ public class RoomController { @PostMapping @ResponseStatus(HttpStatus.CREATED) - public void createRoom(@Valid @RequestBody CreateRoomRequest createRoomRequest) { - roomService.createRoom(1L, createRoomRequest); + public Long createRoom(@Valid @RequestBody CreateRoomRequest createRoomRequest) { + return roomService.createRoom(1L, createRoomRequest); } @PutMapping("/{roomId}") diff --git a/src/main/java/com/moabam/global/error/model/ErrorMessage.java b/src/main/java/com/moabam/global/error/model/ErrorMessage.java index 6572021a..6205b4ae 100644 --- a/src/main/java/com/moabam/global/error/model/ErrorMessage.java +++ b/src/main/java/com/moabam/global/error/model/ErrorMessage.java @@ -21,6 +21,7 @@ public enum ErrorMessage { WRONG_ROOM_PASSWORD("방의 비밀번호가 일치하지 않습니다."), ROOM_MAX_USER_REACHED("방의 인원수가 찼습니다."), ROOM_DETAILS_ERROR("방 정보를 불러오는데 실패했습니다."), + ROUTINE_LENGTH_ERROR("루틴의 길이가 잘못 되었습니다."), LOGIN_FAILED("로그인에 실패했습니다."), REQUEST_FAILED("네트워크 접근 실패입니다."), diff --git a/src/test/java/com/moabam/api/application/RoomServiceTest.java b/src/test/java/com/moabam/api/application/RoomServiceTest.java index 400d5cbb..dd626f18 100644 --- a/src/test/java/com/moabam/api/application/RoomServiceTest.java +++ b/src/test/java/com/moabam/api/application/RoomServiceTest.java @@ -1,6 +1,7 @@ package com.moabam.api.application; import static com.moabam.api.domain.entity.enums.RoomType.*; +import static org.assertj.core.api.Assertions.*; import static org.mockito.BDDMockito.*; import java.util.ArrayList; @@ -22,6 +23,7 @@ import com.moabam.api.domain.repository.RoomRepository; import com.moabam.api.domain.repository.RoutineRepository; import com.moabam.api.dto.CreateRoomRequest; +import com.moabam.api.dto.RoomMapper; @ExtendWith(MockitoExtension.class) class RoomServiceTest { @@ -52,13 +54,18 @@ void create_room_no_password_success() { CreateRoomRequest createRoomRequest = new CreateRoomRequest( "재윤과 앵맹이의 방임", null, routines, MORNING, 10, 4); + Room expectedRoom = RoomMapper.toRoomEntity(createRoomRequest); + given(roomRepository.save(any(Room.class))).willReturn(expectedRoom); + // when - roomService.createRoom(1L, createRoomRequest); + Long result = roomService.createRoom(1L, createRoomRequest); // then verify(roomRepository).save(any(Room.class)); verify(routineRepository).saveAll(ArgumentMatchers.anyList()); verify(participantRepository).save(any(Participant.class)); + assertThat(result).isEqualTo(expectedRoom.getId()); + assertThat(expectedRoom.getPassword()).isNull(); } @DisplayName("비밀번호 있는 방 생성 성공") @@ -72,12 +79,17 @@ void create_room_with_password_success() { CreateRoomRequest createRoomRequest = new CreateRoomRequest( "재윤과 앵맹이의 방임", "1234", routines, MORNING, 10, 4); + Room expectedRoom = RoomMapper.toRoomEntity(createRoomRequest); + given(roomRepository.save(any(Room.class))).willReturn(expectedRoom); + // when - roomService.createRoom(1L, createRoomRequest); + Long result = roomService.createRoom(1L, createRoomRequest); // then verify(roomRepository).save(any(Room.class)); verify(routineRepository).saveAll(ArgumentMatchers.anyList()); verify(participantRepository).save(any(Participant.class)); + assertThat(result).isEqualTo(expectedRoom.getId()); + assertThat(expectedRoom.getPassword()).isEqualTo("1234"); } } diff --git a/src/test/java/com/moabam/api/presentation/RoomControllerTest.java b/src/test/java/com/moabam/api/presentation/RoomControllerTest.java index ebcc4622..8857073e 100644 --- a/src/test/java/com/moabam/api/presentation/RoomControllerTest.java +++ b/src/test/java/com/moabam/api/presentation/RoomControllerTest.java @@ -131,7 +131,7 @@ void create_room_with_password_success(String password) throws Exception { routines.add("물 마시기"); routines.add("코테 풀기"); CreateRoomRequest createRoomRequest = new CreateRoomRequest( - "비번 있는 재윤과 앵맹이의 방임", password, routines, MORNING, 10, 4); + "비번 있는 재맹의 방임", password, routines, MORNING, 10, 4); String json = objectMapper.writeValueAsString(createRoomRequest); // expected @@ -141,7 +141,7 @@ void create_room_with_password_success(String password) throws Exception { .andExpect(status().isCreated()) .andDo(print()); assertThat(roomRepository.findAll()).hasSize(1); - assertThat(roomRepository.findAll().get(0).getTitle()).isEqualTo("비번 있는 재윤과 앵맹이의 방임"); + assertThat(roomRepository.findAll().get(0).getTitle()).isEqualTo("비번 있는 재맹의 방임"); assertThat(roomRepository.findAll().get(0).getPassword()).isEqualTo(password); }