diff --git a/application/src/main/java/org/depromeet/spot/application/block/BlockReadController.java b/application/src/main/java/org/depromeet/spot/application/block/BlockReadController.java index 81a293d1..514f44e4 100644 --- a/application/src/main/java/org/depromeet/spot/application/block/BlockReadController.java +++ b/application/src/main/java/org/depromeet/spot/application/block/BlockReadController.java @@ -67,15 +67,20 @@ public List findAllBlockInfoBy( } @ResponseStatus(HttpStatus.OK) - @GetMapping("blocks/{blockId}/rows") + @GetMapping("/stadiums/{stadiumId}/blocks/{blockCode}/rows") @Operation(summary = "특정 블록 내에 있는 열별 좌석 범위 정보를 조회한다.") public BlockInfoResponse findBlockInfoBy( - @PathVariable("blockId") + @PathVariable("stadiumId") + @NotNull + @Positive + @Parameter(name = "stadiumId", description = "경기장 PK", required = true) + final Long stadiumId, + @PathVariable("blockCode") @NotNull @Positive - @Parameter(name = "blockId", description = "블록 PK", required = true) - final Long blockId) { - BlockInfo infos = blockReadUsecase.findBlockInfoBy(blockId); + @Parameter(name = "blockCode", description = "블록 Code", required = true) + final String blockCode) { + BlockInfo infos = blockReadUsecase.findBlockInfoBy(stadiumId, blockCode); return BlockInfoResponse.from(infos); } } diff --git a/infrastructure/jpa/src/main/java/org/depromeet/spot/jpa/block/repository/BlockJpaRepository.java b/infrastructure/jpa/src/main/java/org/depromeet/spot/jpa/block/repository/BlockJpaRepository.java index 8e7aed5e..bf0a7e76 100644 --- a/infrastructure/jpa/src/main/java/org/depromeet/spot/jpa/block/repository/BlockJpaRepository.java +++ b/infrastructure/jpa/src/main/java/org/depromeet/spot/jpa/block/repository/BlockJpaRepository.java @@ -1,11 +1,13 @@ package org.depromeet.spot.jpa.block.repository; import java.util.List; +import java.util.Optional; import org.depromeet.spot.jpa.block.entity.BlockEntity; import org.springframework.data.jpa.repository.JpaRepository; public interface BlockJpaRepository extends JpaRepository { + Optional findByStadiumIdAndCode(Long stadiumId, String code); List findAllBySectionId(Long sectionId); } diff --git a/infrastructure/jpa/src/main/java/org/depromeet/spot/jpa/block/repository/BlockRepositoryImpl.java b/infrastructure/jpa/src/main/java/org/depromeet/spot/jpa/block/repository/BlockRepositoryImpl.java index e99f56d5..46d61788 100644 --- a/infrastructure/jpa/src/main/java/org/depromeet/spot/jpa/block/repository/BlockRepositoryImpl.java +++ b/infrastructure/jpa/src/main/java/org/depromeet/spot/jpa/block/repository/BlockRepositoryImpl.java @@ -49,6 +49,13 @@ public List findAllByBlock(final Long blockId) { return entities.stream().map(BlockRowEntity::toDomain).toList(); } + @Override + public List findAllByStadiumAndBlock(Long stadiumId, String blockCode) { + List entities = + blockRowJpaRepository.findAllByStadiumAndBlock(stadiumId, blockCode); + return entities.stream().map(BlockRowEntity::toDomain).toList(); + } + @Override public boolean existsById(final Long blockId) { return blockJpaRepository.existsById(blockId); @@ -60,4 +67,13 @@ public Block findById(final Long blockId) { blockJpaRepository.findById(blockId).orElseThrow(BlockNotFoundException::new); return entity.toDomain(); } + + @Override + public Block findByStadiumAndCode(final Long stadiumId, final String code) { + BlockEntity entity = + blockJpaRepository + .findByStadiumIdAndCode(stadiumId, code) + .orElseThrow(BlockNotFoundException::new); + return entity.toDomain(); + } } diff --git a/infrastructure/jpa/src/main/java/org/depromeet/spot/jpa/block/repository/BlockRowJpaRepository.java b/infrastructure/jpa/src/main/java/org/depromeet/spot/jpa/block/repository/BlockRowJpaRepository.java index 9257519b..57ea6848 100644 --- a/infrastructure/jpa/src/main/java/org/depromeet/spot/jpa/block/repository/BlockRowJpaRepository.java +++ b/infrastructure/jpa/src/main/java/org/depromeet/spot/jpa/block/repository/BlockRowJpaRepository.java @@ -4,8 +4,18 @@ import org.depromeet.spot.jpa.block.entity.BlockRowEntity; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; public interface BlockRowJpaRepository extends JpaRepository { List findAllByBlockIdOrderByNumberAsc(Long blockId); + + @Query( + "select r from BlockRowEntity r " + + "where r.block.stadiumId = :stadiumId " + + "and r.block.code = :code " + + "order by r.number asc") + List findAllByStadiumAndBlock( + @Param("stadiumId") Long stadiumId, @Param("code") String code); } diff --git a/usecase/src/main/java/org/depromeet/spot/usecase/port/in/block/BlockReadUsecase.java b/usecase/src/main/java/org/depromeet/spot/usecase/port/in/block/BlockReadUsecase.java index 0f0669d8..ac6d9583 100644 --- a/usecase/src/main/java/org/depromeet/spot/usecase/port/in/block/BlockReadUsecase.java +++ b/usecase/src/main/java/org/depromeet/spot/usecase/port/in/block/BlockReadUsecase.java @@ -14,10 +14,12 @@ public interface BlockReadUsecase { List findAllBlockInfoBy(final Long stadiumId, final Long sectionId); - BlockInfo findBlockInfoBy(final Long blockId); + BlockInfo findBlockInfoBy(final Long stadiumId, final String blockCode); Block findById(Long blockId); + Block findByStadiumAndCode(Long stadiumId, String code); + boolean existsById(Long blockId); void checkExistsById(Long blockId); diff --git a/usecase/src/main/java/org/depromeet/spot/usecase/port/out/block/BlockRepository.java b/usecase/src/main/java/org/depromeet/spot/usecase/port/out/block/BlockRepository.java index d33d356c..875b2c75 100644 --- a/usecase/src/main/java/org/depromeet/spot/usecase/port/out/block/BlockRepository.java +++ b/usecase/src/main/java/org/depromeet/spot/usecase/port/out/block/BlockRepository.java @@ -14,7 +14,11 @@ public interface BlockRepository { List findAllByBlock(Long blockId); + List findAllByStadiumAndBlock(Long stadiumId, String blockCode); + boolean existsById(Long blockId); Block findById(Long blockId); + + Block findByStadiumAndCode(Long stadiumId, String code); } diff --git a/usecase/src/main/java/org/depromeet/spot/usecase/service/block/BlockReadService.java b/usecase/src/main/java/org/depromeet/spot/usecase/service/block/BlockReadService.java index aee60ed4..8d8fdc36 100644 --- a/usecase/src/main/java/org/depromeet/spot/usecase/service/block/BlockReadService.java +++ b/usecase/src/main/java/org/depromeet/spot/usecase/service/block/BlockReadService.java @@ -59,11 +59,12 @@ public List findAllBlockInfoBy(final Long stadiumId, final Long secti } @Override - public BlockInfo findBlockInfoBy(final Long blockId) { - Block block = findById(blockId); - List infos = blockRepository.findAllByBlock(blockId); + public BlockInfo findBlockInfoBy(final Long stadiumId, final String blockCode) { + stadiumReadUsecase.checkIsExistsBy(stadiumId); + Block block = findByStadiumAndCode(stadiumId, blockCode); + List infos = blockRepository.findAllByStadiumAndBlock(stadiumId, blockCode); List rowInfos = getBlockRowInfos(infos); - return new BlockInfo(blockId, block.getCode(), rowInfos); + return new BlockInfo(block.getId(), block.getCode(), rowInfos); } @Override @@ -71,6 +72,11 @@ public Block findById(final Long blockId) { return blockRepository.findById(blockId); } + @Override + public Block findByStadiumAndCode(final Long stadiumId, final String code) { + return blockRepository.findByStadiumAndCode(stadiumId, code); + } + @Override public boolean existsById(final Long blockId) { return blockRepository.existsById(blockId); diff --git a/usecase/src/test/java/org/depromeet/spot/usecase/service/fake/FakeBlockRepository.java b/usecase/src/test/java/org/depromeet/spot/usecase/service/fake/FakeBlockRepository.java index 4911c269..1302c80d 100644 --- a/usecase/src/test/java/org/depromeet/spot/usecase/service/fake/FakeBlockRepository.java +++ b/usecase/src/test/java/org/depromeet/spot/usecase/service/fake/FakeBlockRepository.java @@ -34,6 +34,14 @@ public List findAllByBlock(Long blockId) { return rowData.stream().filter(row -> row.getBlock().getId().equals(blockId)).toList(); } + @Override + public List findAllByStadiumAndBlock(Long stadiumId, String blockCode) { + return rowData.stream() + .filter(row -> row.getBlock().getStadiumId().equals(stadiumId)) + .filter(row -> row.getBlock().getCode().equals(blockCode)) + .toList(); + } + @Override public boolean existsById(Long blockId) { return blockData.stream().anyMatch(block -> block.getId().equals(blockId)); @@ -44,7 +52,19 @@ public Block findById(Long blockId) { return getById(blockId).orElseThrow(BlockNotFoundException::new); } + @Override + public Block findByStadiumAndCode(Long stadiumId, String code) { + return getByStadiumAndCode(stadiumId, code).orElseThrow(BlockNotFoundException::new); + } + private Optional getById(Long id) { return blockData.stream().filter(block -> block.getId().equals(id)).findAny(); } + + private Optional getByStadiumAndCode(Long stadiumId, String code) { + return blockData.stream() + .filter(block -> block.getCode().equals(code)) + .filter(block -> block.getStadiumId().equals(stadiumId)) + .findAny(); + } }