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 @@ -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;
Expand Down Expand Up @@ -55,8 +58,27 @@ public List<CustomizeTimeBox> getCustomizeTimeBoxes(long tableId, Member member)
CustomizeTableEntity tableEntity = tableRepository.getByIdAndMember(tableId, member);
List<CustomizeTimeBoxEntity> timeBoxEntityList = timeBoxRepository.findAllByCustomizeTable(tableEntity);
List<BellEntity> bellEntityList = bellRepository.findAllByCustomizeTimeBoxIn(timeBoxEntityList);
CustomizeTimeBoxEntities timeBoxEntities = new CustomizeTimeBoxEntities(timeBoxEntityList, bellEntityList);
return timeBoxEntities.toDomain();
return toCustomizeTimeBoxes(timeBoxEntityList, bellEntityList);
}

private List<CustomizeTimeBox> toCustomizeTimeBoxes(
List<CustomizeTimeBoxEntity> timeBoxEntities,
List<BellEntity> bellEntities
) {
Map<Long, List<BellEntity>> 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<BellEntity> bellEntities) {
return bellEntities.stream()
.map(BellEntity::toDomain)
.collect(Collectors.collectingAndThen(Collectors.toList(), timeBoxEntity::toDomain));
}

@Transactional
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[제안]

isContained로 O(N)으로 계속 탐색하는게 마음에 들지 않아서 + 해석해야 할 로직이 많은 것 같아 스트림 최대한 활용해본 건데 커찬 기호에 맞게 도입해도 좋을 것 같아요. 지금 커찬 로직도 좋은 것 같아요.

    private List<CustomizeTimeBox> toCustomizeTimeBoxes2(
            List<CustomizeTimeBoxEntity> timeBoxEntities,
            List<BellEntity> bellEntities
    ) {
        Map<Long, List<BellEntity>> groupingBellEntities =  bellEntities.stream()
                .collect(Collectors.groupingBy(bellEntity -> bellEntity.getCustomizeTimeBox().getId()));
        return timeBoxEntities.stream()
                .map(timeBox -> toTimeBox(timeBox, groupingBellEntities.get(timeBox.getId())))
                .toList();
    }
    
    private CustomizeTimeBox toTimeBox(CustomizeTimeBoxEntity timeBoxEntity, List<BellEntity> bellEntities) {
        return bellEntities.stream()
                .map(BellEntity::toDomain)
                .collect(Collectors.collectingAndThen(Collectors.toList(), timeBoxEntity::toDomain));
    }

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

반영했습니다~

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<CustomizeTimeBoxResponse> table) {

public CustomizeTableResponse(
CustomizeTable customizeTable,
CustomizeTimeBoxEntities customizeTimeBoxes
) {
this(customizeTable.getId(), new CustomizeTableInfoResponse(customizeTable),
toTimeBoxResponses(customizeTimeBoxes));
}

private static List<CustomizeTimeBoxResponse> toTimeBoxResponses(CustomizeTimeBoxEntities timeBoxes) {
List<CustomizeTimeBoxEntity> customizeTimeBoxes = timeBoxes.getTimeBoxes();
return customizeTimeBoxes
.stream()
.map(CustomizeTimeBoxResponse::new)
.toList();
}

public CustomizeTableResponse(CustomizeTable customizeTable,
List<CustomizeTimeBox> customizeTimeBoxes) {
this(customizeTable.getId(),
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -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, Long> {

CustomizeTimeBoxEntity save(CustomizeTimeBoxEntity timeBox);

@Transactional
default List<CustomizeTimeBoxEntity> saveAll(List<CustomizeTimeBoxEntity> timeBoxes) {
return timeBoxes.stream()
.map(this::save)
.toList();
}

List<CustomizeTimeBoxEntity> findAllByCustomizeTable(CustomizeTableEntity table);

default CustomizeTimeBoxEntities findTableTimeBoxes(CustomizeTableEntity table) {
List<CustomizeTimeBoxEntity> 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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<CustomizeTimeBox> 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<CustomizeTimeBox> 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)
);
}
}

Expand Down

This file was deleted.

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