diff --git a/src/main/java/com/debatetimer/domainrepository/customize/CustomizeTableDomainRepository.java b/src/main/java/com/debatetimer/domainrepository/customize/CustomizeTableDomainRepository.java index de3705b8..2c2e96e7 100644 --- a/src/main/java/com/debatetimer/domainrepository/customize/CustomizeTableDomainRepository.java +++ b/src/main/java/com/debatetimer/domainrepository/customize/CustomizeTableDomainRepository.java @@ -5,12 +5,15 @@ import com.debatetimer.domain.member.Member; import com.debatetimer.entity.customize.BellEntity; import com.debatetimer.entity.customize.CustomizeTableEntity; -import com.debatetimer.entity.customize.CustomizeTimeBoxEntities; import com.debatetimer.entity.customize.CustomizeTimeBoxEntity; import com.debatetimer.repository.customize.BellRepository; import com.debatetimer.repository.customize.CustomizeTableRepository; import com.debatetimer.repository.customize.CustomizeTimeBoxRepository; +import java.util.Collections; +import java.util.Comparator; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; import java.util.stream.IntStream; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; @@ -55,8 +58,27 @@ public List getCustomizeTimeBoxes(long tableId, Member member) CustomizeTableEntity tableEntity = tableRepository.getByIdAndMember(tableId, member); List timeBoxEntityList = timeBoxRepository.findAllByCustomizeTable(tableEntity); List bellEntityList = bellRepository.findAllByCustomizeTimeBoxIn(timeBoxEntityList); - CustomizeTimeBoxEntities timeBoxEntities = new CustomizeTimeBoxEntities(timeBoxEntityList, bellEntityList); - return timeBoxEntities.toDomain(); + return toCustomizeTimeBoxes(timeBoxEntityList, bellEntityList); + } + + private List toCustomizeTimeBoxes( + List timeBoxEntities, + List bellEntities + ) { + Map> timeBoxIdToBellEntities = bellEntities.stream() + .collect(Collectors.groupingBy(bellEntity -> bellEntity.getCustomizeTimeBox().getId())); + return timeBoxEntities.stream() + .sorted(Comparator.comparing(CustomizeTimeBoxEntity::getSequence)) + .map(timeBoxEntity -> toTimeBox( + timeBoxEntity, + timeBoxIdToBellEntities.getOrDefault(timeBoxEntity.getId(), Collections.emptyList())) + ).toList(); + } + + private CustomizeTimeBox toTimeBox(CustomizeTimeBoxEntity timeBoxEntity, List bellEntities) { + return bellEntities.stream() + .map(BellEntity::toDomain) + .collect(Collectors.collectingAndThen(Collectors.toList(), timeBoxEntity::toDomain)); } @Transactional diff --git a/src/main/java/com/debatetimer/dto/customize/response/CustomizeTableResponse.java b/src/main/java/com/debatetimer/dto/customize/response/CustomizeTableResponse.java index 2309b490..366939d6 100644 --- a/src/main/java/com/debatetimer/dto/customize/response/CustomizeTableResponse.java +++ b/src/main/java/com/debatetimer/dto/customize/response/CustomizeTableResponse.java @@ -2,28 +2,10 @@ import com.debatetimer.domain.customize.CustomizeTable; import com.debatetimer.domain.customize.CustomizeTimeBox; -import com.debatetimer.entity.customize.CustomizeTimeBoxEntities; -import com.debatetimer.entity.customize.CustomizeTimeBoxEntity; import java.util.List; public record CustomizeTableResponse(long id, CustomizeTableInfoResponse info, List table) { - public CustomizeTableResponse( - CustomizeTable customizeTable, - CustomizeTimeBoxEntities customizeTimeBoxes - ) { - this(customizeTable.getId(), new CustomizeTableInfoResponse(customizeTable), - toTimeBoxResponses(customizeTimeBoxes)); - } - - private static List toTimeBoxResponses(CustomizeTimeBoxEntities timeBoxes) { - List customizeTimeBoxes = timeBoxes.getTimeBoxes(); - return customizeTimeBoxes - .stream() - .map(CustomizeTimeBoxResponse::new) - .toList(); - } - public CustomizeTableResponse(CustomizeTable customizeTable, List customizeTimeBoxes) { this(customizeTable.getId(), diff --git a/src/main/java/com/debatetimer/entity/customize/CustomizeTimeBoxEntities.java b/src/main/java/com/debatetimer/entity/customize/CustomizeTimeBoxEntities.java deleted file mode 100644 index 32f5c383..00000000 --- a/src/main/java/com/debatetimer/entity/customize/CustomizeTimeBoxEntities.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.debatetimer.entity.customize; - -import com.debatetimer.domain.customize.Bell; -import com.debatetimer.domain.customize.CustomizeTimeBox; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; -import lombok.Getter; - -public class CustomizeTimeBoxEntities { - - private static final Comparator TIME_BOX_COMPARATOR = Comparator - .comparing(CustomizeTimeBoxEntity::getSequence); - - @Getter - private final List timeBoxes; - - private final List bells; - - public CustomizeTimeBoxEntities(List timeBoxes) { - this.timeBoxes = timeBoxes.stream() - .sorted(TIME_BOX_COMPARATOR) - .toList(); - this.bells = Collections.emptyList(); - } - - public CustomizeTimeBoxEntities(List timeBoxes, List bells) { - this.timeBoxes = timeBoxes.stream() - .sorted(TIME_BOX_COMPARATOR) - .toList(); - this.bells = bells; - } - - public List toDomain() { - return timeBoxes.stream() - .map(timebox -> timebox.toDomain(getBells(timebox))) - .toList(); - } - - private List getBells(CustomizeTimeBoxEntity timeBox) { - return bells.stream() - .filter(bell -> bell.isContained(timeBox)) - .map(BellEntity::toDomain) - .toList(); - } -} diff --git a/src/main/java/com/debatetimer/repository/customize/CustomizeTimeBoxRepository.java b/src/main/java/com/debatetimer/repository/customize/CustomizeTimeBoxRepository.java index 680391f6..1a0e524d 100644 --- a/src/main/java/com/debatetimer/repository/customize/CustomizeTimeBoxRepository.java +++ b/src/main/java/com/debatetimer/repository/customize/CustomizeTimeBoxRepository.java @@ -1,32 +1,18 @@ package com.debatetimer.repository.customize; import com.debatetimer.entity.customize.CustomizeTableEntity; -import com.debatetimer.entity.customize.CustomizeTimeBoxEntities; import com.debatetimer.entity.customize.CustomizeTimeBoxEntity; import java.util.List; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.Repository; -import org.springframework.transaction.annotation.Transactional; public interface CustomizeTimeBoxRepository extends Repository { CustomizeTimeBoxEntity save(CustomizeTimeBoxEntity timeBox); - @Transactional - default List saveAll(List timeBoxes) { - return timeBoxes.stream() - .map(this::save) - .toList(); - } - List findAllByCustomizeTable(CustomizeTableEntity table); - default CustomizeTimeBoxEntities findTableTimeBoxes(CustomizeTableEntity table) { - List timeBoxes = findAllByCustomizeTable(table); - return new CustomizeTimeBoxEntities(timeBoxes); - } - @Query("DELETE FROM CustomizeTimeBoxEntity ctb WHERE ctb.customizeTable.id = :tableId") @Modifying(clearAutomatically = true, flushAutomatically = true) void deleteAllByTable(long tableId); diff --git a/src/test/java/com/debatetimer/domainrepository/customize/CustomizeTableDomainRepositoryTest.java b/src/test/java/com/debatetimer/domainrepository/customize/CustomizeTableDomainRepositoryTest.java index e9108935..e1dbbf53 100644 --- a/src/test/java/com/debatetimer/domainrepository/customize/CustomizeTableDomainRepositoryTest.java +++ b/src/test/java/com/debatetimer/domainrepository/customize/CustomizeTableDomainRepositoryTest.java @@ -68,16 +68,45 @@ class GetByIdAndMember { class GetCustomizeTimeBoxes { @Test - void 테이블의_시간박스를_가져온다() { + void 테이블의_시간박스는_순서대로_가져온다() { Member member = memberGenerator.generate("email@email.com"); CustomizeTableEntity tableEntity = tableEntityGenerator.generate(member); - timeBoxEntityGenerator.generate(tableEntity, CustomizeBoxType.NORMAL, 1); - timeBoxEntityGenerator.generate(tableEntity, CustomizeBoxType.NORMAL, 2); + timeBoxEntityGenerator.generate(tableEntity, CustomizeBoxType.NORMAL, 1, 60); + timeBoxEntityGenerator.generate(tableEntity, CustomizeBoxType.NORMAL, 2, 180); + timeBoxEntityGenerator.generate(tableEntity, CustomizeBoxType.NORMAL, 3, 120); List timeBoxes = customizeTableDomainRepository.getCustomizeTimeBoxes( tableEntity.getId(), member); - assertThat(timeBoxes).hasSize(2); + assertThat(timeBoxes).hasSize(3) + .extracting(CustomizeTimeBox::getTime) + .containsExactly(60, 180, 120); + } + + @Test + void 테이블의_시간박스와_벨을_가져온다() { + Member member = memberGenerator.generate("email@email.com"); + CustomizeTableEntity tableEntity = tableEntityGenerator.generate(member); + CustomizeTimeBoxEntity timeBoxEntity1 = timeBoxEntityGenerator.generate(tableEntity, + CustomizeBoxType.NORMAL, 1); + CustomizeTimeBoxEntity timeBoxEntity2 = timeBoxEntityGenerator.generate(tableEntity, + CustomizeBoxType.NORMAL, 2); + bellEntityGenerator.generate(timeBoxEntity1, BellType.BEFORE_END, 20, 1); + bellEntityGenerator.generate(timeBoxEntity1, BellType.BEFORE_END, 30, 1); + bellEntityGenerator.generate(timeBoxEntity2, BellType.BEFORE_END, 10, 1); + + List timeBoxes = customizeTableDomainRepository.getCustomizeTimeBoxes( + tableEntity.getId(), member); + + assertAll( + () -> assertThat(timeBoxes).hasSize(2), + () -> assertThat(timeBoxes.get(0).getBells()).hasSize(2) + .extracting(Bell::getTime) + .containsExactly(20, 30), + () -> assertThat(timeBoxes.get(1).getBells()).hasSize(1) + .extracting(Bell::getTime) + .containsExactlyInAnyOrder(10) + ); } } diff --git a/src/test/java/com/debatetimer/entity/customize/CustomizeTimeBoxEntitiesTest.java b/src/test/java/com/debatetimer/entity/customize/CustomizeTimeBoxEntitiesTest.java deleted file mode 100644 index 48d0fb16..00000000 --- a/src/test/java/com/debatetimer/entity/customize/CustomizeTimeBoxEntitiesTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.debatetimer.entity.customize; - -import static org.assertj.core.api.Assertions.assertThat; - -import com.debatetimer.domain.customize.CustomizeBoxType; -import com.debatetimer.domain.customize.CustomizeTable; -import com.debatetimer.domain.customize.Stance; -import com.debatetimer.domain.member.Member; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; - -class CustomizeTimeBoxEntitiesTest { - - @Nested - class SortedBySequence { - - @Test - void 타임박스의_순서에_따라_정렬된다() { - Member member = new Member("default@gmail.com"); - CustomizeTable table = new CustomizeTable(member, "토론 테이블", "주제", "찬성", - "반대", true, true, LocalDateTime.now()); - CustomizeTableEntity testTable = new CustomizeTableEntity(table); - CustomizeTimeBoxEntity firstBox = new CustomizeTimeBoxEntity(testTable, 1, Stance.PROS, "입론", - CustomizeBoxType.NORMAL, 300, "콜리"); - CustomizeTimeBoxEntity secondBox = new CustomizeTimeBoxEntity(testTable, 2, Stance.PROS, "입론", - CustomizeBoxType.NORMAL, 300, "콜리2"); - List timeBoxes = new ArrayList<>(Arrays.asList(secondBox, firstBox)); - - CustomizeTimeBoxEntities actual = new CustomizeTimeBoxEntities(timeBoxes); - - assertThat(actual.getTimeBoxes()).containsExactly(firstBox, secondBox); - } - } -} diff --git a/src/test/java/com/debatetimer/fixture/entity/CustomizeTimeBoxEntityGenerator.java b/src/test/java/com/debatetimer/fixture/entity/CustomizeTimeBoxEntityGenerator.java index 7b2ca578..fd0d8bf6 100644 --- a/src/test/java/com/debatetimer/fixture/entity/CustomizeTimeBoxEntityGenerator.java +++ b/src/test/java/com/debatetimer/fixture/entity/CustomizeTimeBoxEntityGenerator.java @@ -29,6 +29,22 @@ public CustomizeTimeBoxEntity generate(CustomizeTableEntity testTable, Customize return customizeTimeBoxRepository.save(timeBox); } + public CustomizeTimeBoxEntity generate(CustomizeTableEntity testTable, + CustomizeBoxType boxType, + int sequence, + int time) { + CustomizeTimeBoxEntity timeBox = new CustomizeTimeBoxEntity( + testTable, + sequence, + Stance.PROS, + "입론", + boxType, + time, + "콜리" + ); + return customizeTimeBoxRepository.save(timeBox); + } + public CustomizeTimeBoxEntity generateNotExistSpeaker(CustomizeTableEntity testTable, CustomizeBoxType boxType, int sequence) { CustomizeTimeBoxEntity timeBox = new CustomizeTimeBoxEntity(