diff --git a/app-api/src/main/java/com/parkingcomestrue/parking/application/SearchConditionMapper.java b/app-api/src/main/java/com/parkingcomestrue/parking/application/SearchConditionMapper.java index 0b9f6208..6fa53a50 100644 --- a/app-api/src/main/java/com/parkingcomestrue/parking/application/SearchConditionMapper.java +++ b/app-api/src/main/java/com/parkingcomestrue/parking/application/SearchConditionMapper.java @@ -5,16 +5,18 @@ import com.parkingcomestrue.parking.support.exception.ClientExceptionInformation; import java.util.Arrays; import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; import org.springframework.stereotype.Component; @Component public class SearchConditionMapper { - public & SearchConditionAvailable> List toEnums(Class searchConditionAvailableClass, - List descriptions) { + public & SearchConditionAvailable> Set toEnums(Class searchConditionAvailableClass, + List descriptions) { return descriptions.stream() .map(description -> toEnum(searchConditionAvailableClass, description)) - .toList(); + .collect(Collectors.toSet()); } public & SearchConditionAvailable> E toEnum(Class searchConditionAvailableClass, diff --git a/app-api/src/main/java/com/parkingcomestrue/parking/application/parking/ParkingService.java b/app-api/src/main/java/com/parkingcomestrue/parking/application/parking/ParkingService.java index 2b2d54ed..78342840 100644 --- a/app-api/src/main/java/com/parkingcomestrue/parking/application/parking/ParkingService.java +++ b/app-api/src/main/java/com/parkingcomestrue/parking/application/parking/ParkingService.java @@ -89,10 +89,10 @@ private List findParkingLotsByOrderCondition(String priority, ParkingQu } private SearchingCondition toSearchingCondition(ParkingSearchConditionRequest request) { - List parkingTypes = searchConditionMapper.toEnums(ParkingType.class, request.getParkingTypes()); - List operationTypes = searchConditionMapper.toEnums(OperationType.class, + Set parkingTypes = searchConditionMapper.toEnums(ParkingType.class, request.getParkingTypes()); + Set operationTypes = searchConditionMapper.toEnums(OperationType.class, request.getOperationTypes()); - List payTypes = searchConditionMapper.toEnums(PayType.class, request.getPayTypes()); + Set payTypes = searchConditionMapper.toEnums(PayType.class, request.getPayTypes()); FeeType feeType = searchConditionMapper.toEnum(FeeType.class, request.getFeeType()); return new SearchingCondition(operationTypes, parkingTypes, payTypes, feeType, request.getHours()); diff --git a/app-api/src/main/java/com/parkingcomestrue/parking/application/review/dto/ReviewCreateRequest.java b/app-api/src/main/java/com/parkingcomestrue/parking/application/review/dto/ReviewCreateRequest.java index c14deb08..f6b4a976 100644 --- a/app-api/src/main/java/com/parkingcomestrue/parking/application/review/dto/ReviewCreateRequest.java +++ b/app-api/src/main/java/com/parkingcomestrue/parking/application/review/dto/ReviewCreateRequest.java @@ -2,12 +2,14 @@ import com.parkingcomestrue.common.domain.review.Content; import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; public record ReviewCreateRequest(List contents) { - public List toContents() { + public Set toContents() { return contents.stream() .map(Content::find) - .toList(); + .collect(Collectors.toSet()); } } diff --git a/app-api/src/main/java/com/parkingcomestrue/parking/application/searchcondition/SearchConditionService.java b/app-api/src/main/java/com/parkingcomestrue/parking/application/searchcondition/SearchConditionService.java index e4869e04..347c7d45 100644 --- a/app-api/src/main/java/com/parkingcomestrue/parking/application/searchcondition/SearchConditionService.java +++ b/app-api/src/main/java/com/parkingcomestrue/parking/application/searchcondition/SearchConditionService.java @@ -13,6 +13,7 @@ import com.parkingcomestrue.common.domain.searchcondition.repository.SearchConditionRepository; import com.parkingcomestrue.common.support.Association; import java.util.List; +import java.util.Set; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -41,9 +42,10 @@ private SearchConditionDto toSearchConditionDto(SearchCondition searchCondition) ); } - private List toDescriptions(List enums) { + private List toDescriptions(Set enums) { return enums.stream() .map(SearchConditionAvailable::getDescription) + .sorted() .toList(); } diff --git a/app-api/src/main/resources/application.yml b/app-api/src/main/resources/application.yml index 54337963..f52738c1 100644 --- a/app-api/src/main/resources/application.yml +++ b/app-api/src/main/resources/application.yml @@ -28,4 +28,4 @@ authcode: cors: allowedOrigins: ${ORIGIN:http://localhost:3000} -api-prefix: ${API_PREFIX:/api/} +api-prefix: ${API_PREFIX:/} diff --git a/app-api/src/test/java/com/parkingcomestrue/parking/application/SearchConditionMapperTest.java b/app-api/src/test/java/com/parkingcomestrue/parking/application/SearchConditionMapperTest.java index d3c93612..5ea4131c 100644 --- a/app-api/src/test/java/com/parkingcomestrue/parking/application/SearchConditionMapperTest.java +++ b/app-api/src/test/java/com/parkingcomestrue/parking/application/SearchConditionMapperTest.java @@ -14,6 +14,7 @@ import com.parkingcomestrue.common.domain.searchcondition.SearchConditionAvailable; import java.util.List; +import java.util.Set; import java.util.stream.Stream; import org.junit.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -63,7 +64,7 @@ static Stream parametersProvider1() { List descriptions, List expected) { //given, when - List actual = searchConditionMapper.toEnums(clazz, descriptions); + Set actual = searchConditionMapper.toEnums(clazz, descriptions); //then assertThat(actual).containsExactlyInAnyOrderElementsOf(expected); diff --git a/app-api/src/test/java/com/parkingcomestrue/parking/application/parking/ParkingServiceTest.java b/app-api/src/test/java/com/parkingcomestrue/parking/application/parking/ParkingServiceTest.java index 884f4d36..d1ddb3e6 100644 --- a/app-api/src/test/java/com/parkingcomestrue/parking/application/parking/ParkingServiceTest.java +++ b/app-api/src/test/java/com/parkingcomestrue/parking/application/parking/ParkingServiceTest.java @@ -25,6 +25,7 @@ import com.parkingcomestrue.parking.application.review.dto.ReviewCreateRequest; import java.time.LocalTime; import java.util.List; +import java.util.Set; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; @@ -64,7 +65,7 @@ class ParkingServiceTest extends ContainerTest { private Parking makeParking(String parkingName) { return new Parking ( - new BaseInformation(parkingName, "010", "부산", List.of(PayType.NO_INFO), ParkingType.MECHANICAL, + new BaseInformation(parkingName, "010", "부산", Set.of(PayType.NO_INFO), ParkingType.MECHANICAL, OperationType.PRIVATE), Location.of(30d, 30d), Space.of(100, 30), diff --git a/app-api/src/test/java/com/parkingcomestrue/parking/application/review/ReviewServiceTest.java b/app-api/src/test/java/com/parkingcomestrue/parking/application/review/ReviewServiceTest.java index 1d981c06..abc571bf 100644 --- a/app-api/src/test/java/com/parkingcomestrue/parking/application/review/ReviewServiceTest.java +++ b/app-api/src/test/java/com/parkingcomestrue/parking/application/review/ReviewServiceTest.java @@ -15,6 +15,7 @@ import com.parkingcomestrue.common.support.Association; import com.parkingcomestrue.common.support.exception.DomainException; import java.util.List; +import java.util.Set; import org.junit.jupiter.api.Test; import repository.BasicMemberRepository; import repository.BasicParkingRepository; @@ -65,9 +66,9 @@ class ReviewServiceTest { Association parkingId = Association.from(parking.getId()); List reviewers = memberRepository.saveAndGet(3); - List contents1 = List.of(Content.LOW_PRICE); - List contents2 = List.of(Content.LOW_PRICE, Content.EASY_TO_PAY); - List contents3 = List.of(Content.LOW_PRICE, Content.EASY_TO_PAY, Content.GOOD_ACCESSIBILITY); + Set contents1 = Set.of(Content.LOW_PRICE); + Set contents2 = Set.of(Content.LOW_PRICE, Content.EASY_TO_PAY); + Set contents3 = Set.of(Content.LOW_PRICE, Content.EASY_TO_PAY, Content.GOOD_ACCESSIBILITY); reviewRepository.save( new Review(parkingId, Association.from(reviewers.get(0).getId()), contents1) ); diff --git a/app-scheduler/src/main/java/com/parkingcomestrue/external/parkingapi/korea/KoreaParkingAdapter.java b/app-scheduler/src/main/java/com/parkingcomestrue/external/parkingapi/korea/KoreaParkingAdapter.java index cfb779e0..ea0f3730 100644 --- a/app-scheduler/src/main/java/com/parkingcomestrue/external/parkingapi/korea/KoreaParkingAdapter.java +++ b/app-scheduler/src/main/java/com/parkingcomestrue/external/parkingapi/korea/KoreaParkingAdapter.java @@ -10,15 +10,15 @@ import com.parkingcomestrue.common.domain.parking.Parking; import com.parkingcomestrue.common.domain.parking.ParkingType; import com.parkingcomestrue.common.domain.parking.PayType; -import com.parkingcomestrue.common.domain.parking.PayTypes; import com.parkingcomestrue.common.domain.parking.Space; import com.parkingcomestrue.common.domain.parking.TimeInfo; import com.parkingcomestrue.common.domain.parking.TimeUnit; import java.time.DateTimeException; import java.time.LocalTime; import java.time.format.DateTimeFormatter; -import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; import org.apache.logging.log4j.util.Strings; import org.springframework.stereotype.Component; @@ -66,14 +66,17 @@ private String filterAddress(KoreaParkingResponse.Response.Body.Item item) { return item.getOldAddress(); } - private PayTypes toPayTypes(KoreaParkingResponse.Response.Body.Item item) { - List payTypes = new ArrayList<>(); + private Set toPayTypes(KoreaParkingResponse.Response.Body.Item item) { + Set payTypes = new HashSet<>(); for (PayType payType : PayType.values()) { if (item.getPayType().contains(payType.getDescription())) { payTypes.add(payType); } } - return PayTypes.from(payTypes); + if (payTypes.isEmpty()) { + return Set.of(PayType.NO_INFO); + } + return payTypes; } private Location getLocation(KoreaParkingResponse.Response.Body.Item item) { diff --git a/app-scheduler/src/main/java/com/parkingcomestrue/external/parkingapi/pusan/PusanPublicParkingAdapter.java b/app-scheduler/src/main/java/com/parkingcomestrue/external/parkingapi/pusan/PusanPublicParkingAdapter.java index dfb6c718..70aa27c3 100644 --- a/app-scheduler/src/main/java/com/parkingcomestrue/external/parkingapi/pusan/PusanPublicParkingAdapter.java +++ b/app-scheduler/src/main/java/com/parkingcomestrue/external/parkingapi/pusan/PusanPublicParkingAdapter.java @@ -16,8 +16,9 @@ import java.time.DateTimeException; import java.time.LocalTime; import java.time.format.DateTimeFormatter; -import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; import org.springframework.stereotype.Component; @Component @@ -63,14 +64,17 @@ private String filterAddress(PusanPublicParkingResponse.ParkingInfo.Item respons return response.getOldAddress(); } - private PayTypes toPayTypes(PusanPublicParkingResponse.ParkingInfo.Item item) { - List payTypes = new ArrayList<>(); + private Set toPayTypes(PusanPublicParkingResponse.ParkingInfo.Item item) { + Set payTypes = new HashSet<>(); for (PayType payType : PayType.values()) { if (item.getPayType().contains(payType.getDescription())) { payTypes.add(payType); } } - return PayTypes.from(payTypes); + if (payTypes.isEmpty()) { + return Set.of(PayType.NO_INFO); + } + return payTypes; } private Location getLocation(final PusanPublicParkingResponse.ParkingInfo.Item response) { diff --git a/app-scheduler/src/main/java/com/parkingcomestrue/external/parkingapi/seoul/SeoulPublicParkingAdapter.java b/app-scheduler/src/main/java/com/parkingcomestrue/external/parkingapi/seoul/SeoulPublicParkingAdapter.java index c4eaf4c9..878760cf 100644 --- a/app-scheduler/src/main/java/com/parkingcomestrue/external/parkingapi/seoul/SeoulPublicParkingAdapter.java +++ b/app-scheduler/src/main/java/com/parkingcomestrue/external/parkingapi/seoul/SeoulPublicParkingAdapter.java @@ -79,7 +79,7 @@ private BaseInformation getBaseInformation(final SeoulPublicParkingResponse.Park response.getParkingName(), response.getTel(), response.getAddr(), - List.of(PayType.NO_INFO), + Set.of(PayType.NO_INFO), ParkingType.find(response.getParkingTypeNM()), OperationType.PUBLIC ); diff --git a/app-scheduler/src/test/java/com/parkingcomestrue/external/parkingapi/korea/KoreaParkingAdapterTest.java b/app-scheduler/src/test/java/com/parkingcomestrue/external/parkingapi/korea/KoreaParkingAdapterTest.java index 8077f408..4cdd1d80 100644 --- a/app-scheduler/src/test/java/com/parkingcomestrue/external/parkingapi/korea/KoreaParkingAdapterTest.java +++ b/app-scheduler/src/test/java/com/parkingcomestrue/external/parkingapi/korea/KoreaParkingAdapterTest.java @@ -72,14 +72,14 @@ class KoreaParkingAdapterTest { soft.assertThat(parking.getFeePolicy().getBaseFee()).isEqualTo(Fee.ZERO); soft.assertThat(parking.getFeePolicy().getBaseTimeUnit()).isEqualTo(TimeUnit.from(0)); soft.assertThat(parking.getFeePolicy().getExtraFee()).isEqualTo(Fee.NO_INFO); - soft.assertThat(parking.getFeePolicy().getExtraTimUnit()).isEqualTo(TimeUnit.NO_INFO); + soft.assertThat(parking.getFeePolicy().getExtraTimeUnit()).isEqualTo(TimeUnit.NO_INFO); soft.assertThat(parking.getFeePolicy().getDayMaximumFee()).isEqualTo(Fee.NO_INFO); soft.assertThat(parking.getOperatingTime().getWeekday()).isEqualTo(TimeInfo.ALL_DAY); soft.assertThat(parking.getOperatingTime().getSaturday()).isEqualTo(TimeInfo.ALL_DAY); soft.assertThat(parking.getOperatingTime().getHoliday()).isEqualTo(TimeInfo.ALL_DAY); - soft.assertThat(parking.getBaseInformation().getPayTypes().getDescription()).isEqualTo(PayType.CARD.getDescription()); + soft.assertThat(parking.getBaseInformation().getPayTypesDescription()).isEqualTo(PayType.CARD.getDescription()); } ); } diff --git a/app-scheduler/src/test/java/com/parkingcomestrue/external/parkingapi/pusan/PusanPublicParkingAdapterTest.java b/app-scheduler/src/test/java/com/parkingcomestrue/external/parkingapi/pusan/PusanPublicParkingAdapterTest.java index 9aa0ba64..e3120536 100644 --- a/app-scheduler/src/test/java/com/parkingcomestrue/external/parkingapi/pusan/PusanPublicParkingAdapterTest.java +++ b/app-scheduler/src/test/java/com/parkingcomestrue/external/parkingapi/pusan/PusanPublicParkingAdapterTest.java @@ -73,14 +73,14 @@ class PusanPublicParkingAdapterTest { soft.assertThat(parking.getFeePolicy().getBaseFee()).isEqualTo(Fee.ZERO); soft.assertThat(parking.getFeePolicy().getBaseTimeUnit()).isEqualTo(TimeUnit.from(10)); soft.assertThat(parking.getFeePolicy().getExtraFee()).isEqualTo(Fee.ZERO); - soft.assertThat(parking.getFeePolicy().getExtraTimUnit()).isEqualTo(TimeUnit.from(10)); + soft.assertThat(parking.getFeePolicy().getExtraTimeUnit()).isEqualTo(TimeUnit.from(10)); soft.assertThat(parking.getFeePolicy().getDayMaximumFee()).isEqualTo(Fee.ZERO); soft.assertThat(parking.getOperatingTime().getWeekday()).isEqualTo(TimeInfo.ALL_DAY); soft.assertThat(parking.getOperatingTime().getSaturday()).isEqualTo(TimeInfo.ALL_DAY); soft.assertThat(parking.getOperatingTime().getHoliday()).isEqualTo(TimeInfo.ALL_DAY); - soft.assertThat(parking.getBaseInformation().getPayTypes().getDescription()).isEqualTo(PayType.NO_INFO.getDescription()); + soft.assertThat(parking.getBaseInformation().getPayTypesDescription()).isEqualTo(PayType.NO_INFO.getDescription()); } ); } diff --git a/app-scheduler/src/test/java/com/parkingcomestrue/external/parkingapi/seoul/SeoulPublicParkingAdapterTest.java b/app-scheduler/src/test/java/com/parkingcomestrue/external/parkingapi/seoul/SeoulPublicParkingAdapterTest.java index 44e8878b..075fa109 100644 --- a/app-scheduler/src/test/java/com/parkingcomestrue/external/parkingapi/seoul/SeoulPublicParkingAdapterTest.java +++ b/app-scheduler/src/test/java/com/parkingcomestrue/external/parkingapi/seoul/SeoulPublicParkingAdapterTest.java @@ -73,14 +73,14 @@ class SeoulPublicParkingAdapterTest { soft.assertThat(parking.getFeePolicy().getBaseFee()).isEqualTo(Fee.from(220)); soft.assertThat(parking.getFeePolicy().getBaseTimeUnit()).isEqualTo(TimeUnit.from(5)); soft.assertThat(parking.getFeePolicy().getExtraFee()).isEqualTo(Fee.from(220)); - soft.assertThat(parking.getFeePolicy().getExtraTimUnit()).isEqualTo(TimeUnit.from(5)); + soft.assertThat(parking.getFeePolicy().getExtraTimeUnit()).isEqualTo(TimeUnit.from(5)); soft.assertThat(parking.getFeePolicy().getDayMaximumFee()).isEqualTo(Fee.ZERO); soft.assertThat(parking.getOperatingTime().getWeekday()).isEqualTo(new TimeInfo(LocalTime.of(9, 0), LocalTime.of(19, 0))); soft.assertThat(parking.getOperatingTime().getSaturday()).isEqualTo(new TimeInfo(LocalTime.of(9, 0), LocalTime.of(15, 0))); soft.assertThat(parking.getOperatingTime().getHoliday()).isEqualTo(new TimeInfo(LocalTime.of(0, 0), LocalTime.of(0, 0))); - soft.assertThat(parking.getBaseInformation().getPayTypes().getDescription()).isEqualTo(PayType.NO_INFO.getDescription()); + soft.assertThat(parking.getBaseInformation().getPayTypesDescription()).isEqualTo(PayType.NO_INFO.getDescription()); } ); } diff --git a/app-scheduler/src/test/java/com/parkingcomestrue/fake/NotOfferCurrentParkingApiService.java b/app-scheduler/src/test/java/com/parkingcomestrue/fake/NotOfferCurrentParkingApiService.java index 41079e07..20cbbf48 100644 --- a/app-scheduler/src/test/java/com/parkingcomestrue/fake/NotOfferCurrentParkingApiService.java +++ b/app-scheduler/src/test/java/com/parkingcomestrue/fake/NotOfferCurrentParkingApiService.java @@ -15,6 +15,7 @@ import com.parkingcomestrue.external.parkingapi.ParkingApiService; import java.util.LinkedList; import java.util.List; +import java.util.Set; public class NotOfferCurrentParkingApiService implements ParkingApiService { @@ -35,7 +36,7 @@ public List read() { for (int i = 0; i < readSize; i++) { Parking parking = new Parking( new BaseInformation("not offer parking" + i, "051-000" + i, "부산시 어딘가 " + i, - List.of(PayType.NO_INFO), + Set.of(PayType.NO_INFO), ParkingType.NO_INFO, OperationType.PUBLIC), Location.of("33.333" + i, "44.444" + i), diff --git a/app-scheduler/src/test/java/com/parkingcomestrue/fake/OfferCurrentParkingApiService.java b/app-scheduler/src/test/java/com/parkingcomestrue/fake/OfferCurrentParkingApiService.java index 0138d62b..364d55a1 100644 --- a/app-scheduler/src/test/java/com/parkingcomestrue/fake/OfferCurrentParkingApiService.java +++ b/app-scheduler/src/test/java/com/parkingcomestrue/fake/OfferCurrentParkingApiService.java @@ -15,6 +15,7 @@ import com.parkingcomestrue.external.parkingapi.ParkingApiService; import java.util.LinkedList; import java.util.List; +import java.util.Set; public class OfferCurrentParkingApiService implements ParkingApiService { @@ -34,7 +35,7 @@ public List read() { LinkedList result = new LinkedList<>(); for (int i = 0; i < readSize; i++) { Parking parking = new Parking( - new BaseInformation("offer parking" + i, "02-000" + i, "서울시 어딘가 " + i, List.of(PayType.NO_INFO), + new BaseInformation("offer parking" + i, "02-000" + i, "서울시 어딘가 " + i, Set.of(PayType.NO_INFO), ParkingType.NO_INFO, OperationType.PUBLIC), Location.of("11.111" + i, "22.222" + i), diff --git a/domain/src/main/java/com/parkingcomestrue/common/domain/parking/BaseInformation.java b/domain/src/main/java/com/parkingcomestrue/common/domain/parking/BaseInformation.java index a70e3e05..2fa71566 100644 --- a/domain/src/main/java/com/parkingcomestrue/common/domain/parking/BaseInformation.java +++ b/domain/src/main/java/com/parkingcomestrue/common/domain/parking/BaseInformation.java @@ -3,10 +3,12 @@ import static jakarta.persistence.EnumType.STRING; import com.parkingcomestrue.common.infra.converter.PayTypeConverter; +import com.parkingcomestrue.common.support.exception.DomainException; +import com.parkingcomestrue.common.support.exception.DomainExceptionInformation; import jakarta.persistence.Convert; import jakarta.persistence.Embeddable; import jakarta.persistence.Enumerated; -import java.util.List; +import java.util.Set; import java.util.stream.Collectors; import lombok.AccessLevel; import lombok.Getter; @@ -24,7 +26,7 @@ public class BaseInformation { private String address; @Convert(converter = PayTypeConverter.class) - private List payTypes; + private Set payTypes; @Enumerated(STRING) private ParkingType parkingType; @@ -32,8 +34,9 @@ public class BaseInformation { @Enumerated(STRING) private OperationType operationType; - public BaseInformation(String name, String tel, String address, List payTypes, ParkingType parkingType, + public BaseInformation(String name, String tel, String address, Set payTypes, ParkingType parkingType, OperationType operationType) { + validatePayTypes(payTypes); this.name = name; this.tel = tel; this.address = address; @@ -42,17 +45,23 @@ public BaseInformation(String name, String tel, String address, List pa this.operationType = operationType; } - public boolean containsOperationType(List operationTypes) { + private void validatePayTypes(Set payTypes) { + if (payTypes == null || payTypes.isEmpty() || payTypes.size() >= PayType.values().length) { + throw new DomainException(DomainExceptionInformation.INVALID_PAY_TYPES_SIZE); + } + } + + public boolean containsOperationType(Set operationTypes) { return operationTypes.stream() .anyMatch(operationType -> this.operationType == operationType); } - public boolean containsParkingType(List parkingTypes) { + public boolean containsParkingType(Set parkingTypes) { return parkingTypes.stream() .anyMatch(parkingType -> this.parkingType == parkingType); } - public boolean containsPayType(List memberPayTypes) { + public boolean containsPayType(Set memberPayTypes) { if (memberPayTypes.contains(PayType.NO_INFO)) { return true; } diff --git a/domain/src/main/java/com/parkingcomestrue/common/domain/parking/Location.java b/domain/src/main/java/com/parkingcomestrue/common/domain/parking/Location.java index f3ba4642..a1b86726 100644 --- a/domain/src/main/java/com/parkingcomestrue/common/domain/parking/Location.java +++ b/domain/src/main/java/com/parkingcomestrue/common/domain/parking/Location.java @@ -19,7 +19,7 @@ public class Location { private static final GeometryFactory geometryFactory = new GeometryFactory(new PrecisionModel(), 4326); - private static final Location NO_PROVIDE = new Location(-1.0, -1.0); + public static final Location NO_PROVIDE = new Location(-1.0, -1.0); private static final Double MAX_LONGITUDE = 180.0; private static final Double MIN_LONGITUDE = -180.0; diff --git a/domain/src/main/java/com/parkingcomestrue/common/domain/parking/Parking.java b/domain/src/main/java/com/parkingcomestrue/common/domain/parking/Parking.java index 15134c03..e50e74b6 100644 --- a/domain/src/main/java/com/parkingcomestrue/common/domain/parking/Parking.java +++ b/domain/src/main/java/com/parkingcomestrue/common/domain/parking/Parking.java @@ -10,8 +10,8 @@ import jakarta.persistence.Id; import java.time.Duration; import java.time.LocalDateTime; -import java.util.List; import java.util.Objects; +import java.util.Set; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; @@ -93,15 +93,15 @@ public void update(Location location) { this.location = location; } - public boolean containsOperationType(List operationTypes) { + public boolean containsOperationType(Set operationTypes) { return baseInformation.containsOperationType(operationTypes); } - public boolean containsParkingType(List parkingTypes) { + public boolean containsParkingType(Set parkingTypes) { return baseInformation.containsParkingType(parkingTypes); } - public boolean containsPayType(List memberPayTypes) { + public boolean containsPayType(Set memberPayTypes) { return baseInformation.containsPayType(memberPayTypes); } diff --git a/domain/src/main/java/com/parkingcomestrue/common/domain/parking/service/SearchingCondition.java b/domain/src/main/java/com/parkingcomestrue/common/domain/parking/service/SearchingCondition.java index 3edda91e..ef0fe344 100644 --- a/domain/src/main/java/com/parkingcomestrue/common/domain/parking/service/SearchingCondition.java +++ b/domain/src/main/java/com/parkingcomestrue/common/domain/parking/service/SearchingCondition.java @@ -4,20 +4,20 @@ import com.parkingcomestrue.common.domain.parking.ParkingType; import com.parkingcomestrue.common.domain.parking.PayType; import com.parkingcomestrue.common.domain.searchcondition.FeeType; -import java.util.List; +import java.util.Set; import lombok.Getter; @Getter public class SearchingCondition { - private final List operationTypes; - private final List parkingTypes; - private final List payTypes; + private final Set operationTypes; + private final Set parkingTypes; + private final Set payTypes; private final FeeType feeType; private final Integer hours; - public SearchingCondition(List operationTypes, List parkingTypes, - List payTypes, + public SearchingCondition(Set operationTypes, Set parkingTypes, + Set payTypes, FeeType feeType, Integer hours) { this.operationTypes = operationTypes; this.parkingTypes = parkingTypes; diff --git a/domain/src/main/java/com/parkingcomestrue/common/domain/review/Review.java b/domain/src/main/java/com/parkingcomestrue/common/domain/review/Review.java index 6e9d6396..0a7c0b45 100644 --- a/domain/src/main/java/com/parkingcomestrue/common/domain/review/Review.java +++ b/domain/src/main/java/com/parkingcomestrue/common/domain/review/Review.java @@ -14,7 +14,7 @@ import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import java.time.LocalDateTime; -import java.util.List; +import java.util.Set; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; @@ -37,12 +37,12 @@ public class Review { private Association reviewerId; @Convert(converter = ContentConverter.class) - private List contents; + private Set contents; @Column(updatable = false) private LocalDateTime createdAt; - public Review(Association parkingId, Association reviewerId, List contents) { + public Review(Association parkingId, Association reviewerId, Set contents) { validate(contents); this.parkingId = parkingId; this.reviewerId = reviewerId; @@ -50,7 +50,7 @@ public Review(Association parkingId, Association reviewerId, Li this.createdAt = LocalDateTime.now(); } - private static void validate(List contents) { + private static void validate(Set contents) { if (contents == null || contents.isEmpty() || contents.size() > MAX_CONTENTS_SIZE) { throw new DomainException(DomainExceptionInformation.INVALID_CONTENTS_SIZE); } diff --git a/domain/src/main/java/com/parkingcomestrue/common/domain/searchcondition/SearchCondition.java b/domain/src/main/java/com/parkingcomestrue/common/domain/searchcondition/SearchCondition.java index 29f441ed..5da57066 100644 --- a/domain/src/main/java/com/parkingcomestrue/common/domain/searchcondition/SearchCondition.java +++ b/domain/src/main/java/com/parkingcomestrue/common/domain/searchcondition/SearchCondition.java @@ -18,7 +18,7 @@ import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; -import java.util.List; +import java.util.Set; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; @@ -36,16 +36,16 @@ public class SearchCondition { private Association memberId; @Convert(converter = OperationTypeConverter.class) - private List operationTypes; + private Set operationTypes; @Convert(converter = ParkingTypeConverter.class) - private List parkingTypes; + private Set parkingTypes; @Convert(converter = FeeTypeConverter.class) - private List feeTypes; + private Set feeTypes; @Convert(converter = PayTypeConverter.class) - private List payTypes; + private Set payTypes; @Enumerated(EnumType.STRING) private Priority priority; @@ -53,9 +53,9 @@ public class SearchCondition { @Embedded private Hours hours; - public SearchCondition(Association memberId, List operationTypes, - List parkingTypes, - List feeTypes, List payTypes, Priority priority, Hours hours) { + public SearchCondition(Association memberId, Set operationTypes, + Set parkingTypes, + Set feeTypes, Set payTypes, Priority priority, Hours hours) { this.memberId = memberId; this.operationTypes = operationTypes; this.parkingTypes = parkingTypes; diff --git a/domain/src/main/java/com/parkingcomestrue/common/infra/converter/ContentConverter.java b/domain/src/main/java/com/parkingcomestrue/common/infra/converter/ContentConverter.java index 5f5344c7..f33eb19c 100644 --- a/domain/src/main/java/com/parkingcomestrue/common/infra/converter/ContentConverter.java +++ b/domain/src/main/java/com/parkingcomestrue/common/infra/converter/ContentConverter.java @@ -4,7 +4,7 @@ import jakarta.persistence.Converter; @Converter -public class ContentConverter extends EnumListConverter { +public class ContentConverter extends EnumsConverter { protected ContentConverter() { super(Content.class); diff --git a/domain/src/main/java/com/parkingcomestrue/common/infra/converter/EnumListConverter.java b/domain/src/main/java/com/parkingcomestrue/common/infra/converter/EnumsConverter.java similarity index 63% rename from domain/src/main/java/com/parkingcomestrue/common/infra/converter/EnumListConverter.java rename to domain/src/main/java/com/parkingcomestrue/common/infra/converter/EnumsConverter.java index 41aaba43..d62f98bb 100644 --- a/domain/src/main/java/com/parkingcomestrue/common/infra/converter/EnumListConverter.java +++ b/domain/src/main/java/com/parkingcomestrue/common/infra/converter/EnumsConverter.java @@ -2,21 +2,21 @@ import jakarta.persistence.AttributeConverter; import java.util.Arrays; -import java.util.List; +import java.util.Set; import java.util.stream.Collectors; -public abstract class EnumListConverter> implements AttributeConverter, String> { +public abstract class EnumsConverter> implements AttributeConverter, String> { private static final String DELIMITER = ", "; private final Class enumClass; - protected EnumListConverter(Class enumClass) { + protected EnumsConverter(Class enumClass) { this.enumClass = enumClass; } @Override - public String convertToDatabaseColumn(List attribute) { + public String convertToDatabaseColumn(Set attribute) { return attribute.stream() .map(Enum::name) .sorted() @@ -24,9 +24,9 @@ public String convertToDatabaseColumn(List attribute) { } @Override - public List convertToEntityAttribute(String dbData) { + public Set convertToEntityAttribute(String dbData) { return Arrays.stream(dbData.split(DELIMITER)) .map(name -> Enum.valueOf(enumClass, name)) - .toList(); + .collect(Collectors.toSet()); } } diff --git a/domain/src/main/java/com/parkingcomestrue/common/infra/converter/FeeTypeConverter.java b/domain/src/main/java/com/parkingcomestrue/common/infra/converter/FeeTypeConverter.java index e8e6ca89..cd449e18 100644 --- a/domain/src/main/java/com/parkingcomestrue/common/infra/converter/FeeTypeConverter.java +++ b/domain/src/main/java/com/parkingcomestrue/common/infra/converter/FeeTypeConverter.java @@ -4,7 +4,7 @@ import jakarta.persistence.Converter; @Converter -public class FeeTypeConverter extends EnumListConverter { +public class FeeTypeConverter extends EnumsConverter { public FeeTypeConverter() { super(FeeType.class); diff --git a/domain/src/main/java/com/parkingcomestrue/common/infra/converter/OperationTypeConverter.java b/domain/src/main/java/com/parkingcomestrue/common/infra/converter/OperationTypeConverter.java index 330edf91..2147e28c 100644 --- a/domain/src/main/java/com/parkingcomestrue/common/infra/converter/OperationTypeConverter.java +++ b/domain/src/main/java/com/parkingcomestrue/common/infra/converter/OperationTypeConverter.java @@ -4,7 +4,7 @@ import jakarta.persistence.Converter; @Converter -public class OperationTypeConverter extends EnumListConverter { +public class OperationTypeConverter extends EnumsConverter { public OperationTypeConverter() { super(OperationType.class); diff --git a/domain/src/main/java/com/parkingcomestrue/common/infra/converter/ParkingTypeConverter.java b/domain/src/main/java/com/parkingcomestrue/common/infra/converter/ParkingTypeConverter.java index 35b5f741..3325424a 100644 --- a/domain/src/main/java/com/parkingcomestrue/common/infra/converter/ParkingTypeConverter.java +++ b/domain/src/main/java/com/parkingcomestrue/common/infra/converter/ParkingTypeConverter.java @@ -4,7 +4,7 @@ import jakarta.persistence.Converter; @Converter -public class ParkingTypeConverter extends EnumListConverter { +public class ParkingTypeConverter extends EnumsConverter { public ParkingTypeConverter() { super(ParkingType.class); diff --git a/domain/src/main/java/com/parkingcomestrue/common/infra/converter/PayTypeConverter.java b/domain/src/main/java/com/parkingcomestrue/common/infra/converter/PayTypeConverter.java index 24950000..6de6baeb 100644 --- a/domain/src/main/java/com/parkingcomestrue/common/infra/converter/PayTypeConverter.java +++ b/domain/src/main/java/com/parkingcomestrue/common/infra/converter/PayTypeConverter.java @@ -4,7 +4,7 @@ import jakarta.persistence.Converter; @Converter -public class PayTypeConverter extends EnumListConverter { +public class PayTypeConverter extends EnumsConverter { public PayTypeConverter() { super(PayType.class); diff --git a/domain/src/main/java/com/parkingcomestrue/common/support/exception/DomainExceptionInformation.java b/domain/src/main/java/com/parkingcomestrue/common/support/exception/DomainExceptionInformation.java index ce37f420..95fab430 100644 --- a/domain/src/main/java/com/parkingcomestrue/common/support/exception/DomainExceptionInformation.java +++ b/domain/src/main/java/com/parkingcomestrue/common/support/exception/DomainExceptionInformation.java @@ -15,6 +15,7 @@ public enum DomainExceptionInformation { INVALID_CONTENTS_SIZE("리뷰 내용은 1개에서 3개까지 선택가능합니다."), INVALID_HOURS("이용 시간은 1~12, 24 시간까지만 선택할 수 있습니다."), INVALID_SEARCH_CONDITION("해당 회원의 검색 조건이 존재하지 않습니다."), + INVALID_PAY_TYPES_SIZE("결제 방식이 존재하지 않거나, 너무 많이 선택되었습니다."), ENCRYPT_EXCEPTION("암호화에 실패했습니다."), diff --git a/domain/src/test/java/com/parkingcomestrue/common/domain/parking/service/ParkingFilteringServiceTest.java b/domain/src/test/java/com/parkingcomestrue/common/domain/parking/service/ParkingFilteringServiceTest.java index 0c491cad..540ddc86 100644 --- a/domain/src/test/java/com/parkingcomestrue/common/domain/parking/service/ParkingFilteringServiceTest.java +++ b/domain/src/test/java/com/parkingcomestrue/common/domain/parking/service/ParkingFilteringServiceTest.java @@ -15,6 +15,7 @@ import com.parkingcomestrue.common.domain.searchcondition.FeeType; import java.time.LocalDateTime; import java.util.List; +import java.util.Set; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; @@ -31,30 +32,30 @@ class ParkingFilteringServiceTest { Parking wantParking = Parking.builder() .baseInformation(new BaseInformation("name", "tell", "address", - List.of(PayType.CASH), + Set.of(PayType.CASH), parkingTypeCondition, operationTypeCondition)) .build(); Parking notWantParking1 = Parking.builder() .baseInformation(new BaseInformation("name", "tell", "address", - List.of(PayType.NO_INFO), + Set.of(PayType.NO_INFO), parkingTypeCondition, OperationType.NO_INFO)) .build(); Parking notWantParking2 = Parking.builder() .baseInformation(new BaseInformation("name", "tell", "address", - List.of(PayType.NO_INFO), + Set.of(PayType.NO_INFO), ParkingType.OFF_STREET, operationTypeCondition)) .build(); // when SearchingCondition searchingCondition = new SearchingCondition( - List.of(operationTypeCondition), - List.of(parkingTypeCondition), - List.of(PayType.CASH), + Set.of(operationTypeCondition), + Set.of(parkingTypeCondition), + Set.of(PayType.CASH), FeeType.PAID, 3); List filterList = parkingFilteringService.filterByCondition( @@ -75,30 +76,30 @@ class ParkingFilteringServiceTest { Parking wantParking = Parking.builder() .baseInformation(new BaseInformation("name", "tel", "address", - List.of(PayType.CARD), + Set.of(PayType.CARD), wantParkingTypeCondition, wantOperationTypeCondition)) .build(); Parking notWantParking1 = Parking.builder() .baseInformation(new BaseInformation("name", "tel", "address", - List.of(PayType.NO_INFO), + Set.of(PayType.NO_INFO), ParkingType.MECHANICAL, wantOperationTypeCondition)) .build(); Parking notWantParking2 = Parking.builder() .baseInformation(new BaseInformation("name", "tel", "address", - List.of(PayType.NO_INFO), + Set.of(PayType.NO_INFO), ParkingType.NO_INFO, wantOperationTypeCondition)) .build(); // when SearchingCondition searchingCondition = new SearchingCondition( - List.of(wantOperationTypeCondition), - List.of(wantParkingTypeCondition), - List.of(PayType.CARD), + Set.of(wantOperationTypeCondition), + Set.of(wantParkingTypeCondition), + Set.of(PayType.CARD), FeeType.PAID, 3); List result = parkingFilteringService.filterByCondition( @@ -119,7 +120,7 @@ class ParkingFilteringServiceTest { OperationType operationType = OperationType.PUBLIC; ParkingType parkingType = ParkingType.MECHANICAL; BaseInformation baseInformation = new BaseInformation("name", "tel", "address", - List.of(PayType.CARD), + Set.of(PayType.CARD), parkingType, operationType ); @@ -144,8 +145,8 @@ class ParkingFilteringServiceTest { .build(); // when - 검색조건이 Free 인 filterCondition 으로 주차장 필터링 - SearchingCondition searchingCondition = new SearchingCondition(List.of(operationType), List.of(parkingType), - List.of(PayType.CARD), FeeType.FREE, 3); + SearchingCondition searchingCondition = new SearchingCondition(Set.of(operationType), Set.of(parkingType), + Set.of(PayType.CARD), FeeType.FREE, 3); List filteredParkings = parkingFilteringService.filterByCondition( List.of(freeParking1, freeParking2, paidParking), searchingCondition, @@ -162,25 +163,25 @@ class ParkingFilteringServiceTest { OperationType operationType = OperationType.PUBLIC; ParkingType parkingType = ParkingType.MECHANICAL; BaseInformation onlyCard = new BaseInformation("name", "tel", "address", - List.of(PayType.CARD), + Set.of(PayType.CARD), parkingType, operationType ); BaseInformation cardAndCash = new BaseInformation("name", "tel", "address", - List.of(PayType.CARD, PayType.CASH), + Set.of(PayType.CARD, PayType.CASH), parkingType, operationType ); BaseInformation bankTransfer = new BaseInformation("name", "tel", "address", - List.of(PayType.BANK_TRANSFER), + Set.of(PayType.BANK_TRANSFER), parkingType, operationType ); BaseInformation noInfo = new BaseInformation("name", "tel", "address", - List.of(PayType.NO_INFO), + Set.of(PayType.NO_INFO), parkingType, operationType ); @@ -208,8 +209,8 @@ class ParkingFilteringServiceTest { // when - 결제 방식을 기본 값(NO_INFO)으로 주차장 필터링 - SearchingCondition searchingCondition = new SearchingCondition(List.of(operationType), List.of(parkingType), - List.of(PayType.NO_INFO), FeeType.PAID, 3); + SearchingCondition searchingCondition = new SearchingCondition(Set.of(operationType), Set.of(parkingType), + Set.of(PayType.NO_INFO), FeeType.PAID, 3); List filteredParkings = parkingFilteringService.filterByCondition( List.of(parking1, parking2, parking3, parking4, parking5), searchingCondition, diff --git a/domain/src/test/java/com/parkingcomestrue/common/domain/review/service/ReviewDomainServiceTest.java b/domain/src/test/java/com/parkingcomestrue/common/domain/review/service/ReviewDomainServiceTest.java index 6dcb9369..ce331dc1 100644 --- a/domain/src/test/java/com/parkingcomestrue/common/domain/review/service/ReviewDomainServiceTest.java +++ b/domain/src/test/java/com/parkingcomestrue/common/domain/review/service/ReviewDomainServiceTest.java @@ -14,6 +14,7 @@ import com.parkingcomestrue.common.support.exception.DomainException; import java.util.List; import java.util.Map; +import java.util.Set; import org.junit.jupiter.api.Test; import repository.BasicReviewRepository; @@ -27,7 +28,7 @@ class ReviewDomainServiceTest { //given Association parkingId = Association.from(1L); Association reviewerId = Association.from(1L); - reviewRepository.save(new Review(parkingId, reviewerId, List.of(Content.LOW_PRICE))); + reviewRepository.save(new Review(parkingId, reviewerId, Set.of(Content.LOW_PRICE))); //when, then assertThatThrownBy(() -> reviewDomainService.validateDuplicateReview(parkingId, reviewerId)) @@ -40,13 +41,13 @@ class ReviewDomainServiceTest { //given List reviews = List.of( new Review(Association.from(1L), Association.from(1L), - List.of(Content.LOW_PRICE) + Set.of(Content.LOW_PRICE) ), new Review(Association.from(1L), Association.from(2L), - List.of(Content.LOW_PRICE, Content.EASY_TO_PAY) + Set.of(Content.LOW_PRICE, Content.EASY_TO_PAY) ), new Review(Association.from(1L), Association.from(3L), - List.of(Content.LOW_PRICE, Content.EASY_TO_PAY, Content.GOOD_ACCESSIBILITY) + Set.of(Content.LOW_PRICE, Content.EASY_TO_PAY, Content.GOOD_ACCESSIBILITY) ) ); //when @@ -63,9 +64,9 @@ class ReviewDomainServiceTest { @Test void 전체_리뷰수를_구한다() { //given - List contents1 = List.of(Content.LOW_PRICE); - List contents2 = List.of(Content.LOW_PRICE, Content.EASY_TO_PAY); - List contents3 = List.of(Content.LOW_PRICE, Content.EASY_TO_PAY, Content.GOOD_ACCESSIBILITY); + Set contents1 = Set.of(Content.LOW_PRICE); + Set contents2 = Set.of(Content.LOW_PRICE, Content.EASY_TO_PAY); + Set contents3 = Set.of(Content.LOW_PRICE, Content.EASY_TO_PAY, Content.GOOD_ACCESSIBILITY); List reviews = List.of( new Review(Association.from(1L), Association.from(1L), contents1 diff --git a/domain/src/test/java/com/parkingcomestrue/common/infra/converter/EnumListConverterTest.java b/domain/src/test/java/com/parkingcomestrue/common/infra/converter/EnumsConverterTest.java similarity index 64% rename from domain/src/test/java/com/parkingcomestrue/common/infra/converter/EnumListConverterTest.java rename to domain/src/test/java/com/parkingcomestrue/common/infra/converter/EnumsConverterTest.java index 58f5ec86..b615cd38 100644 --- a/domain/src/test/java/com/parkingcomestrue/common/infra/converter/EnumListConverterTest.java +++ b/domain/src/test/java/com/parkingcomestrue/common/infra/converter/EnumsConverterTest.java @@ -3,26 +3,26 @@ import static org.assertj.core.api.Assertions.assertThat; import com.parkingcomestrue.common.domain.searchcondition.FeeType; -import com.parkingcomestrue.common.infra.converter.FeeTypeConverter; -import java.util.List; +import java.util.Set; import java.util.stream.Collectors; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -class EnumListConverterTest { +class EnumsConverterTest { - @DisplayName("DB에 Enum을 List형식으로 저장할 때, Enum의 값 이름과 " + '"' + ", " + '"' + " 구분자를 이용해서 저장된다.") + @DisplayName("DB에 Enum Set을 저장할 때, Enum의 값 이름과 " + '"' + ", " + '"' + " 구분자를 이용해서 저장된다.") @Test void convertTest() { //given FeeTypeConverter feeTypeConverter = new FeeTypeConverter(); - List expectedFeeType = List.of(FeeType.FREE, FeeType.PAID); + Set expectedFeeType = Set.of(FeeType.FREE, FeeType.PAID); String expectedDatabaseColumn = expectedFeeType.stream().map(FeeType::name) + .sorted() .collect(Collectors.joining(", ")); //when String actualDatabaseField = feeTypeConverter.convertToDatabaseColumn(expectedFeeType); - List actualFeeTypes = feeTypeConverter.convertToEntityAttribute(actualDatabaseField); + Set actualFeeTypes = feeTypeConverter.convertToEntityAttribute(actualDatabaseField); //then assertThat(actualDatabaseField).isEqualTo(expectedDatabaseColumn); diff --git a/domain/src/testFixtures/java/repository/BasicParkingRepository.java b/domain/src/testFixtures/java/repository/BasicParkingRepository.java index e49f9e22..00ee792b 100644 --- a/domain/src/testFixtures/java/repository/BasicParkingRepository.java +++ b/domain/src/testFixtures/java/repository/BasicParkingRepository.java @@ -68,7 +68,7 @@ public List saveAndGet(int size) { for (int i = 0; i < size; i++) { Parking parking = new Parking( new BaseInformation("not offer parking" + i, "051-000" + i, "부산시 어딘가 " + i, - List.of(PayType.NO_INFO), + Set.of(PayType.NO_INFO), ParkingType.NO_INFO, OperationType.PUBLIC), Location.of("133.333" + i, "44.444" + i),