diff --git a/application/src/main/java/org/depromeet/spot/application/team/CreateBaseballTeamController.java b/application/src/main/java/org/depromeet/spot/application/team/CreateBaseballTeamController.java index b5ccdeb2..b6029092 100644 --- a/application/src/main/java/org/depromeet/spot/application/team/CreateBaseballTeamController.java +++ b/application/src/main/java/org/depromeet/spot/application/team/CreateBaseballTeamController.java @@ -4,11 +4,16 @@ import jakarta.validation.Valid; import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Positive; import org.depromeet.spot.application.team.dto.request.CreateBaseballTeamReq; +import org.depromeet.spot.application.team.dto.request.CreateHomeTeamReq; import org.depromeet.spot.domain.team.BaseballTeam; import org.depromeet.spot.usecase.port.in.team.CreateBaseballTeamUsecase; +import org.depromeet.spot.usecase.port.in.team.CreateHomeTeamUsecase; import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -26,6 +31,7 @@ public class CreateBaseballTeamController { private final CreateBaseballTeamUsecase createBaseballTeamUsecase; + private final CreateHomeTeamUsecase createHomeTeamUsecase; @PostMapping("/baseball-teams") @ResponseStatus(HttpStatus.CREATED) @@ -34,4 +40,13 @@ public void create(@RequestBody @Valid @NotEmpty List req List teams = requests.stream().map(CreateBaseballTeamReq::toDomain).toList(); createBaseballTeamUsecase.saveAll(teams); } + + @PostMapping("/stadiums/{stadiumId}/baseball-teams") + @ResponseStatus(HttpStatus.CREATED) + @Operation(summary = "특정 경기장에 홈 팀을 등록한다.") + public void createHomeTeam( + @PathVariable @Positive @NotNull final Long stadiumId, + @RequestBody @Valid CreateHomeTeamReq req) { + createHomeTeamUsecase.createHomeTeams(stadiumId, req.teamIds()); + } } diff --git a/application/src/main/java/org/depromeet/spot/application/team/dto/request/CreateHomeTeamReq.java b/application/src/main/java/org/depromeet/spot/application/team/dto/request/CreateHomeTeamReq.java new file mode 100644 index 00000000..5fa1c8b4 --- /dev/null +++ b/application/src/main/java/org/depromeet/spot/application/team/dto/request/CreateHomeTeamReq.java @@ -0,0 +1,9 @@ +package org.depromeet.spot.application.team.dto.request; + +import java.util.Set; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Positive; + +public record CreateHomeTeamReq(@NotEmpty @NotNull Set<@Positive @NotNull Long> teamIds) {} diff --git a/common/src/main/java/org/depromeet/spot/common/exception/team/TeamException.java b/common/src/main/java/org/depromeet/spot/common/exception/team/TeamException.java index b217581e..8944a31e 100644 --- a/common/src/main/java/org/depromeet/spot/common/exception/team/TeamException.java +++ b/common/src/main/java/org/depromeet/spot/common/exception/team/TeamException.java @@ -12,6 +12,10 @@ public static class BaseballTeamNotFoundException extends TeamException { public BaseballTeamNotFoundException() { super(TeamErrorCode.BASEBALL_TEAM_NOT_FOUND); } + + public BaseballTeamNotFoundException(Long id) { + super(TeamErrorCode.BASEBALL_TEAM_NOT_FOUND.appended(" : " + id)); + } } public static class InvalidBaseballTeamNameException extends TeamException { diff --git a/domain/src/main/java/org/depromeet/spot/domain/team/StadiumHomeTeam.java b/domain/src/main/java/org/depromeet/spot/domain/team/StadiumHomeTeam.java index 885de611..637f6069 100644 --- a/domain/src/main/java/org/depromeet/spot/domain/team/StadiumHomeTeam.java +++ b/domain/src/main/java/org/depromeet/spot/domain/team/StadiumHomeTeam.java @@ -1,9 +1,11 @@ package org.depromeet.spot.domain.team; import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Getter; @Getter +@Builder @AllArgsConstructor public class StadiumHomeTeam { diff --git a/infrastructure/jpa/src/main/java/org/depromeet/spot/jpa/team/repository/BaseballTeamJpaRepository.java b/infrastructure/jpa/src/main/java/org/depromeet/spot/jpa/team/repository/BaseballTeamJpaRepository.java index 242c3837..1a1f2cb1 100644 --- a/infrastructure/jpa/src/main/java/org/depromeet/spot/jpa/team/repository/BaseballTeamJpaRepository.java +++ b/infrastructure/jpa/src/main/java/org/depromeet/spot/jpa/team/repository/BaseballTeamJpaRepository.java @@ -7,4 +7,6 @@ public interface BaseballTeamJpaRepository extends JpaRepository { boolean existsByNameIn(List names); + + boolean existsById(Long teamId); } diff --git a/infrastructure/jpa/src/main/java/org/depromeet/spot/jpa/team/repository/BaseballTeamRepositoryImpl.java b/infrastructure/jpa/src/main/java/org/depromeet/spot/jpa/team/repository/BaseballTeamRepositoryImpl.java index 13cb6db4..e323c7ea 100644 --- a/infrastructure/jpa/src/main/java/org/depromeet/spot/jpa/team/repository/BaseballTeamRepositoryImpl.java +++ b/infrastructure/jpa/src/main/java/org/depromeet/spot/jpa/team/repository/BaseballTeamRepositoryImpl.java @@ -1,13 +1,9 @@ package org.depromeet.spot.jpa.team.repository; import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; import org.depromeet.spot.common.exception.team.TeamException.BaseballTeamNotFoundException; -import org.depromeet.spot.domain.stadium.Stadium; import org.depromeet.spot.domain.team.BaseballTeam; -import org.depromeet.spot.jpa.stadium.entity.StadiumEntity; import org.depromeet.spot.jpa.team.entity.BaseballTeamEntity; import org.depromeet.spot.usecase.port.out.team.BaseballTeamRepository; import org.springframework.stereotype.Repository; @@ -18,7 +14,6 @@ @RequiredArgsConstructor public class BaseballTeamRepositoryImpl implements BaseballTeamRepository { - private final StadiumHomeTeamCustomRepository stadiumHomeTeamCustomRepository; private final BaseballTeamJpaRepository baseballTeamJpaRepository; private final BaseballTeamJdbcRepository baseballTeamJdbcRepository; @@ -37,39 +32,18 @@ public List findAll() { return entities.stream().map(BaseballTeamEntity::toDomain).toList(); } - @Override - public List findAllHomeTeamByStadium(final Long stadiumId) { - List homeTeamEntities = - stadiumHomeTeamCustomRepository.findAllHomeTeamByStadium(stadiumId); - return homeTeamEntities.stream().map(BaseballTeamEntity::toDomain).toList(); - } - - @Override - public Map> findAllStadiumHomeTeam() { - Map> stadiumHomeTeamMap = - stadiumHomeTeamCustomRepository.findAllStadiumHomeTeam(); - return stadiumHomeTeamMap.entrySet().stream() - .collect( - Collectors.toMap( - entry -> entry.getKey().toDomain(), - entry -> - entry.getValue().stream() - .map(BaseballTeamEntity::toDomain) - .toList())); - } - @Override public void saveAll(List teams) { baseballTeamJdbcRepository.createBaseballTeams(teams); } @Override - public void createHomeTeam(Long stadiumId, List teamIds) { - // TODO: 홈 팀 등록할 때 구현 예정 + public boolean existsByNameIn(List names) { + return baseballTeamJpaRepository.existsByNameIn(names); } @Override - public boolean existsByNameIn(List names) { - return baseballTeamJpaRepository.existsByNameIn(names); + public boolean existsById(Long id) { + return baseballTeamJpaRepository.existsById(id); } } diff --git a/infrastructure/jpa/src/main/java/org/depromeet/spot/jpa/team/repository/hometeam/HomeTeamJpaRepository.java b/infrastructure/jpa/src/main/java/org/depromeet/spot/jpa/team/repository/hometeam/HomeTeamJpaRepository.java new file mode 100644 index 00000000..5bb24b61 --- /dev/null +++ b/infrastructure/jpa/src/main/java/org/depromeet/spot/jpa/team/repository/hometeam/HomeTeamJpaRepository.java @@ -0,0 +1,6 @@ +package org.depromeet.spot.jpa.team.repository.hometeam; + +import org.depromeet.spot.jpa.team.entity.StadiumHomeTeamEntity; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface HomeTeamJpaRepository extends JpaRepository {} diff --git a/infrastructure/jpa/src/main/java/org/depromeet/spot/jpa/team/repository/hometeam/HomeTeamRepositoryImpl.java b/infrastructure/jpa/src/main/java/org/depromeet/spot/jpa/team/repository/hometeam/HomeTeamRepositoryImpl.java new file mode 100644 index 00000000..d874e85b --- /dev/null +++ b/infrastructure/jpa/src/main/java/org/depromeet/spot/jpa/team/repository/hometeam/HomeTeamRepositoryImpl.java @@ -0,0 +1,52 @@ +package org.depromeet.spot.jpa.team.repository.hometeam; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.depromeet.spot.domain.stadium.Stadium; +import org.depromeet.spot.domain.team.BaseballTeam; +import org.depromeet.spot.domain.team.StadiumHomeTeam; +import org.depromeet.spot.jpa.stadium.entity.StadiumEntity; +import org.depromeet.spot.jpa.team.entity.BaseballTeamEntity; +import org.depromeet.spot.jpa.team.entity.StadiumHomeTeamEntity; +import org.depromeet.spot.usecase.port.out.team.HomeTeamRepository; +import org.springframework.stereotype.Repository; + +import lombok.RequiredArgsConstructor; + +@Repository +@RequiredArgsConstructor +public class HomeTeamRepositoryImpl implements HomeTeamRepository { + + private final StadiumHomeTeamCustomRepository stadiumHomeTeamCustomRepository; + private final HomeTeamJpaRepository homeTeamJpaRepository; + + @Override + public List findAllHomeTeamByStadium(final Long stadiumId) { + List homeTeamEntities = + stadiumHomeTeamCustomRepository.findAllHomeTeamByStadium(stadiumId); + return homeTeamEntities.stream().map(BaseballTeamEntity::toDomain).toList(); + } + + @Override + public Map> findAllStadiumHomeTeam() { + Map> stadiumHomeTeamMap = + stadiumHomeTeamCustomRepository.findAllStadiumHomeTeam(); + return stadiumHomeTeamMap.entrySet().stream() + .collect( + Collectors.toMap( + entry -> entry.getKey().toDomain(), + entry -> + entry.getValue().stream() + .map(BaseballTeamEntity::toDomain) + .toList())); + } + + @Override + public void saveAll(List homeTeams) { + List entities = + homeTeams.stream().map(StadiumHomeTeamEntity::from).toList(); + homeTeamJpaRepository.saveAll(entities); + } +} diff --git a/infrastructure/jpa/src/main/java/org/depromeet/spot/jpa/team/repository/StadiumHomeTeamCustomRepository.java b/infrastructure/jpa/src/main/java/org/depromeet/spot/jpa/team/repository/hometeam/StadiumHomeTeamCustomRepository.java similarity index 96% rename from infrastructure/jpa/src/main/java/org/depromeet/spot/jpa/team/repository/StadiumHomeTeamCustomRepository.java rename to infrastructure/jpa/src/main/java/org/depromeet/spot/jpa/team/repository/hometeam/StadiumHomeTeamCustomRepository.java index de841ed5..5fa61daf 100644 --- a/infrastructure/jpa/src/main/java/org/depromeet/spot/jpa/team/repository/StadiumHomeTeamCustomRepository.java +++ b/infrastructure/jpa/src/main/java/org/depromeet/spot/jpa/team/repository/hometeam/StadiumHomeTeamCustomRepository.java @@ -1,4 +1,4 @@ -package org.depromeet.spot.jpa.team.repository; +package org.depromeet.spot.jpa.team.repository.hometeam; import static com.querydsl.core.group.GroupBy.groupBy; import static com.querydsl.core.group.GroupBy.list; diff --git a/usecase/src/main/java/org/depromeet/spot/usecase/port/in/team/CreateHomeTeamUsecase.java b/usecase/src/main/java/org/depromeet/spot/usecase/port/in/team/CreateHomeTeamUsecase.java new file mode 100644 index 00000000..c813db08 --- /dev/null +++ b/usecase/src/main/java/org/depromeet/spot/usecase/port/in/team/CreateHomeTeamUsecase.java @@ -0,0 +1,8 @@ +package org.depromeet.spot.usecase.port.in.team; + +import java.util.Set; + +public interface CreateHomeTeamUsecase { + + void createHomeTeams(Long stadiumId, Set teamIds); +} diff --git a/usecase/src/main/java/org/depromeet/spot/usecase/port/in/team/ReadBaseballTeamUsecase.java b/usecase/src/main/java/org/depromeet/spot/usecase/port/in/team/ReadBaseballTeamUsecase.java index 700045de..ffa2cbaf 100644 --- a/usecase/src/main/java/org/depromeet/spot/usecase/port/in/team/ReadBaseballTeamUsecase.java +++ b/usecase/src/main/java/org/depromeet/spot/usecase/port/in/team/ReadBaseballTeamUsecase.java @@ -1,10 +1,15 @@ package org.depromeet.spot.usecase.port.in.team; import java.util.List; +import java.util.Set; import org.depromeet.spot.domain.team.BaseballTeam; public interface ReadBaseballTeamUsecase { + BaseballTeam findById(Long id); + List findAll(); + + void areAllTeamIdsExist(Set teamIds); } diff --git a/usecase/src/main/java/org/depromeet/spot/usecase/port/out/team/BaseballTeamRepository.java b/usecase/src/main/java/org/depromeet/spot/usecase/port/out/team/BaseballTeamRepository.java index f578e032..318f93d7 100644 --- a/usecase/src/main/java/org/depromeet/spot/usecase/port/out/team/BaseballTeamRepository.java +++ b/usecase/src/main/java/org/depromeet/spot/usecase/port/out/team/BaseballTeamRepository.java @@ -1,9 +1,7 @@ package org.depromeet.spot.usecase.port.out.team; import java.util.List; -import java.util.Map; -import org.depromeet.spot.domain.stadium.Stadium; import org.depromeet.spot.domain.team.BaseballTeam; public interface BaseballTeamRepository { @@ -11,13 +9,9 @@ public interface BaseballTeamRepository { List findAll(); - List findAllHomeTeamByStadium(Long stadiumId); - - Map> findAllStadiumHomeTeam(); - void saveAll(List teams); - void createHomeTeam(Long stadiumId, List teamIds); - boolean existsByNameIn(List names); + + boolean existsById(Long id); } diff --git a/usecase/src/main/java/org/depromeet/spot/usecase/port/out/team/HomeTeamRepository.java b/usecase/src/main/java/org/depromeet/spot/usecase/port/out/team/HomeTeamRepository.java new file mode 100644 index 00000000..9ea81ecc --- /dev/null +++ b/usecase/src/main/java/org/depromeet/spot/usecase/port/out/team/HomeTeamRepository.java @@ -0,0 +1,17 @@ +package org.depromeet.spot.usecase.port.out.team; + +import java.util.List; +import java.util.Map; + +import org.depromeet.spot.domain.stadium.Stadium; +import org.depromeet.spot.domain.team.BaseballTeam; +import org.depromeet.spot.domain.team.StadiumHomeTeam; + +public interface HomeTeamRepository { + + List findAllHomeTeamByStadium(Long stadiumId); + + Map> findAllStadiumHomeTeam(); + + void saveAll(List homeTeams); +} diff --git a/usecase/src/main/java/org/depromeet/spot/usecase/service/team/CreateHomeTeamService.java b/usecase/src/main/java/org/depromeet/spot/usecase/service/team/CreateHomeTeamService.java new file mode 100644 index 00000000..c47ef649 --- /dev/null +++ b/usecase/src/main/java/org/depromeet/spot/usecase/service/team/CreateHomeTeamService.java @@ -0,0 +1,38 @@ +package org.depromeet.spot.usecase.service.team; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +import org.depromeet.spot.domain.team.StadiumHomeTeam; +import org.depromeet.spot.usecase.port.in.stadium.StadiumReadUsecase; +import org.depromeet.spot.usecase.port.in.team.CreateHomeTeamUsecase; +import org.depromeet.spot.usecase.port.in.team.ReadBaseballTeamUsecase; +import org.depromeet.spot.usecase.port.out.team.HomeTeamRepository; +import org.springframework.stereotype.Service; + +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +public class CreateHomeTeamService implements CreateHomeTeamUsecase { + + private final HomeTeamRepository homeTeamRepository; + private final StadiumReadUsecase stadiumReadUsecase; + private final ReadBaseballTeamUsecase readBaseballTeamUsecase; + + @Override + public void createHomeTeams(final Long stadiumId, Set teamIds) { + stadiumReadUsecase.checkIsExistsBy(stadiumId); + readBaseballTeamUsecase.areAllTeamIdsExist(teamIds); + List homeTeams = new ArrayList<>(); + teamIds.forEach( + teamId -> + homeTeams.add( + StadiumHomeTeam.builder() + .stadiumId(stadiumId) + .teamId(teamId) + .build())); + homeTeamRepository.saveAll(homeTeams); + } +} diff --git a/usecase/src/main/java/org/depromeet/spot/usecase/service/team/ReadBaseballTeamService.java b/usecase/src/main/java/org/depromeet/spot/usecase/service/team/ReadBaseballTeamService.java index c7e69932..96bdabb4 100644 --- a/usecase/src/main/java/org/depromeet/spot/usecase/service/team/ReadBaseballTeamService.java +++ b/usecase/src/main/java/org/depromeet/spot/usecase/service/team/ReadBaseballTeamService.java @@ -1,7 +1,9 @@ package org.depromeet.spot.usecase.service.team; import java.util.List; +import java.util.Set; +import org.depromeet.spot.common.exception.team.TeamException.BaseballTeamNotFoundException; import org.depromeet.spot.domain.team.BaseballTeam; import org.depromeet.spot.usecase.port.in.team.ReadBaseballTeamUsecase; import org.depromeet.spot.usecase.port.out.team.BaseballTeamRepository; @@ -17,8 +19,22 @@ public class ReadBaseballTeamService implements ReadBaseballTeamUsecase { private final BaseballTeamRepository baseballTeamRepository; + @Override + public BaseballTeam findById(final Long id) { + return baseballTeamRepository.findById(id); + } + @Override public List findAll() { return baseballTeamRepository.findAll(); } + + @Override + public void areAllTeamIdsExist(Set teamIds) { + for (Long teamId : teamIds) { + if (!baseballTeamRepository.existsById(teamId)) { + throw new BaseballTeamNotFoundException(teamId); + } + } + } } diff --git a/usecase/src/main/java/org/depromeet/spot/usecase/service/team/ReadStadiumHomeTeamService.java b/usecase/src/main/java/org/depromeet/spot/usecase/service/team/ReadStadiumHomeTeamService.java index 1ad2dbc4..da12d596 100644 --- a/usecase/src/main/java/org/depromeet/spot/usecase/service/team/ReadStadiumHomeTeamService.java +++ b/usecase/src/main/java/org/depromeet/spot/usecase/service/team/ReadStadiumHomeTeamService.java @@ -6,7 +6,7 @@ import org.depromeet.spot.domain.stadium.Stadium; import org.depromeet.spot.domain.team.BaseballTeam; import org.depromeet.spot.usecase.port.in.team.ReadStadiumHomeTeamUsecase; -import org.depromeet.spot.usecase.port.out.team.BaseballTeamRepository; +import org.depromeet.spot.usecase.port.out.team.HomeTeamRepository; import org.springframework.stereotype.Service; import lombok.RequiredArgsConstructor; @@ -15,11 +15,11 @@ @RequiredArgsConstructor public class ReadStadiumHomeTeamService implements ReadStadiumHomeTeamUsecase { - private final BaseballTeamRepository baseballTeamRepository; + private final HomeTeamRepository homeTeamRepository; @Override public List findByStadium(final Long stadiumId) { - List teams = baseballTeamRepository.findAllHomeTeamByStadium(stadiumId); + List teams = homeTeamRepository.findAllHomeTeamByStadium(stadiumId); return teams.stream() .map(t -> new HomeTeamInfo(t.getId(), t.getAlias(), t.getLabelRgbCode())) .toList(); @@ -27,6 +27,6 @@ public List findByStadium(final Long stadiumId) { @Override public Map> findAllStadiumHomeTeam() { - return baseballTeamRepository.findAllStadiumHomeTeam(); + return homeTeamRepository.findAllStadiumHomeTeam(); } } diff --git a/usecase/src/test/java/org/depromeet/spot/usecase/service/fake/FakeBaseballTeamRepository.java b/usecase/src/test/java/org/depromeet/spot/usecase/service/fake/FakeBaseballTeamRepository.java index 5db0b739..15d5299c 100644 --- a/usecase/src/test/java/org/depromeet/spot/usecase/service/fake/FakeBaseballTeamRepository.java +++ b/usecase/src/test/java/org/depromeet/spot/usecase/service/fake/FakeBaseballTeamRepository.java @@ -2,16 +2,12 @@ import java.util.ArrayList; import java.util.Collections; -import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.concurrent.atomic.AtomicLong; -import java.util.stream.Collectors; import org.depromeet.spot.common.exception.team.TeamException.BaseballTeamNotFoundException; -import org.depromeet.spot.domain.stadium.Stadium; import org.depromeet.spot.domain.team.BaseballTeam; import org.depromeet.spot.usecase.port.out.team.BaseballTeamRepository; @@ -19,8 +15,6 @@ public class FakeBaseballTeamRepository implements BaseballTeamRepository { private final AtomicLong autoGeneratedId = new AtomicLong(0); private final List data = Collections.synchronizedList(new ArrayList<>()); - private final Map> homeTeamMap = - Collections.synchronizedMap(new HashMap<>()); @Override public BaseballTeam findById(Long id) { @@ -36,19 +30,6 @@ public List findAll() { return data; } - @Override - public List findAllHomeTeamByStadium(Long stadiumId) { - return homeTeamMap.entrySet().stream() - .filter(entry -> stadiumId.equals(entry.getKey().getId())) - .flatMap(entry -> entry.getValue().stream()) - .collect(Collectors.toList()); - } - - @Override - public Map> findAllStadiumHomeTeam() { - return homeTeamMap; - } - public BaseballTeam save(BaseballTeam team) { if (team.getId() == null || team.getId() == 0) { BaseballTeam newTeam = @@ -74,22 +55,12 @@ public void saveAll(List teams) { } @Override - public void createHomeTeam(Long stadiumId, List teamIds) { - Stadium stadium = Stadium.builder().id(stadiumId).build(); - List newTeams = - teamIds.stream().map(t -> BaseballTeam.builder().id(t).build()).toList(); - - homeTeamMap.merge( - stadium, - newTeams, - (existingTeams, teams) -> { - existingTeams.addAll(teams); - return existingTeams; - }); + public boolean existsByNameIn(List names) { + return data.stream().map(BaseballTeam::getName).anyMatch(names::contains); } @Override - public boolean existsByNameIn(List names) { - return data.stream().map(BaseballTeam::getName).anyMatch(names::contains); + public boolean existsById(Long id) { + return data.stream().anyMatch(team -> team.getId().equals(id)); } } diff --git a/usecase/src/test/java/org/depromeet/spot/usecase/service/fake/FakeHomeTeamRepository.java b/usecase/src/test/java/org/depromeet/spot/usecase/service/fake/FakeHomeTeamRepository.java new file mode 100644 index 00000000..4e331a95 --- /dev/null +++ b/usecase/src/test/java/org/depromeet/spot/usecase/service/fake/FakeHomeTeamRepository.java @@ -0,0 +1,59 @@ +package org.depromeet.spot.usecase.service.fake; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.atomic.AtomicLong; +import java.util.stream.Collectors; + +import org.depromeet.spot.domain.stadium.Stadium; +import org.depromeet.spot.domain.team.BaseballTeam; +import org.depromeet.spot.domain.team.StadiumHomeTeam; +import org.depromeet.spot.usecase.port.out.team.HomeTeamRepository; + +public class FakeHomeTeamRepository implements HomeTeamRepository { + + private final AtomicLong autoGeneratedId = new AtomicLong(0); + private final List data = Collections.synchronizedList(new ArrayList<>()); + + private final Map> homeTeamMap = + Collections.synchronizedMap(new HashMap<>()); + + @Override + public List findAllHomeTeamByStadium(Long stadiumId) { + return homeTeamMap.entrySet().stream() + .filter(entry -> stadiumId.equals(entry.getKey().getId())) + .flatMap(entry -> entry.getValue().stream()) + .collect(Collectors.toList()); + } + + @Override + public Map> findAllStadiumHomeTeam() { + return homeTeamMap; + } + + @Override + public void saveAll(List homeTeams) { + homeTeams.forEach(this::save); + } + + private StadiumHomeTeam save(StadiumHomeTeam homeTeam) { + if (homeTeam.getId() == null || homeTeam.getId() == 0) { + StadiumHomeTeam newHomeTeam = + StadiumHomeTeam.builder() + .id(autoGeneratedId.incrementAndGet()) + .stadiumId(homeTeam.getStadiumId()) + .teamId(homeTeam.getTeamId()) + .build(); + data.add(newHomeTeam); + return newHomeTeam; + } else { + data.removeIf(item -> Objects.equals(item.getId(), homeTeam.getId())); + data.add(homeTeam); + return homeTeam; + } + } +}