From 5c47f64e315d9ddc579abfa68c23c03952b0830a Mon Sep 17 00:00:00 2001 From: rachel3486 Date: Sun, 14 Aug 2022 07:08:20 +0900 Subject: [PATCH 01/13] feat: Add manual company registration API --- .../place/controller/PlaceController.java | 29 +++++++++++++++ .../place/controller/dto/PlaceDto.java | 37 +++++++++++++++++++ .../ftw/hometerview/place/domain/Company.java | 33 +++++++++++++++++ .../place/repository/CompanyRepository.java | 10 +++++ .../place/service/CompanyService.java | 21 +++++++++++ .../place/service/PlaceServiceFacade.java | 17 +++++++++ 6 files changed, 147 insertions(+) create mode 100644 src/main/java/com/ftw/hometerview/place/controller/PlaceController.java create mode 100644 src/main/java/com/ftw/hometerview/place/controller/dto/PlaceDto.java create mode 100644 src/main/java/com/ftw/hometerview/place/domain/Company.java create mode 100644 src/main/java/com/ftw/hometerview/place/repository/CompanyRepository.java create mode 100644 src/main/java/com/ftw/hometerview/place/service/CompanyService.java create mode 100644 src/main/java/com/ftw/hometerview/place/service/PlaceServiceFacade.java diff --git a/src/main/java/com/ftw/hometerview/place/controller/PlaceController.java b/src/main/java/com/ftw/hometerview/place/controller/PlaceController.java new file mode 100644 index 0000000..1ec72f8 --- /dev/null +++ b/src/main/java/com/ftw/hometerview/place/controller/PlaceController.java @@ -0,0 +1,29 @@ +package com.ftw.hometerview.place.controller; + +import com.ftw.hometerview.core.domain.ResponseEntity; +import com.ftw.hometerview.place.controller.dto.PlaceDto; +import com.ftw.hometerview.place.service.PlaceServiceFacade; +import io.swagger.v3.oas.annotations.Operation; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RequiredArgsConstructor +@RestController +@RequestMapping("/api/v1/place") +public class PlaceController { + + private final PlaceServiceFacade placeService; + + @Operation(summary = "소속 수동입력") + @PostMapping + public ResponseEntity registerCompany( + @Validated @RequestBody PlaceDto.RegisterCompany req) { + this.placeService.registerCompany(req); + return ResponseEntity.successResponse(); + } + +} diff --git a/src/main/java/com/ftw/hometerview/place/controller/dto/PlaceDto.java b/src/main/java/com/ftw/hometerview/place/controller/dto/PlaceDto.java new file mode 100644 index 0000000..64cc1be --- /dev/null +++ b/src/main/java/com/ftw/hometerview/place/controller/dto/PlaceDto.java @@ -0,0 +1,37 @@ +package com.ftw.hometerview.place.controller.dto; + +import com.ftw.hometerview.place.domain.Company; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Pattern; +import lombok.Getter; + +public class PlaceDto { + + private static final String LOAD_PATTERN = + "(([가-힣A-Za-z·\\d~\\-\\.]{2,}(로|길).[\\d]+)|([가-힣A-Za-z·\\d~\\-\\.]+(읍|동)\\s)[\\d]+)"; + + @Getter + public static class RegisterCompany { + + @NotBlank + private String name; + @NotBlank + @Pattern(regexp = LOAD_PATTERN) + private String loadName; + @NotBlank + private String lat; + @NotBlank + private String lon; + + public Company toCompany() { + return Company.builder() + .name(this.name) + .loadName(this.loadName) // oo시 oo구 oo동 ~~ + .city(this.loadName.split(" ")[1]) + .lat(this.lat) + .lon(this.lon) + .build(); + } + } + +} diff --git a/src/main/java/com/ftw/hometerview/place/domain/Company.java b/src/main/java/com/ftw/hometerview/place/domain/Company.java new file mode 100644 index 0000000..1d96951 --- /dev/null +++ b/src/main/java/com/ftw/hometerview/place/domain/Company.java @@ -0,0 +1,33 @@ +package com.ftw.hometerview.place.domain; + +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.experimental.FieldDefaults; +import nonapi.io.github.classgraph.json.Id; +import org.bson.types.ObjectId; +import org.springframework.data.mongodb.core.mapping.Document; + +@Getter +@Builder +@FieldDefaults(level = AccessLevel.PRIVATE) +@Document(collection = "company") +public class Company { + + @Id + ObjectId id; + + String name; + String loadName; + String city; + String station; + String lat; + String lon; + + + public Company setNearliestStation(String station) { + this.station = station; + return this; + } + +} diff --git a/src/main/java/com/ftw/hometerview/place/repository/CompanyRepository.java b/src/main/java/com/ftw/hometerview/place/repository/CompanyRepository.java new file mode 100644 index 0000000..ef7e082 --- /dev/null +++ b/src/main/java/com/ftw/hometerview/place/repository/CompanyRepository.java @@ -0,0 +1,10 @@ +package com.ftw.hometerview.place.repository; + +import com.ftw.hometerview.place.domain.Company; +import org.springframework.data.mongodb.repository.MongoRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface CompanyRepository extends MongoRepository { + +} diff --git a/src/main/java/com/ftw/hometerview/place/service/CompanyService.java b/src/main/java/com/ftw/hometerview/place/service/CompanyService.java new file mode 100644 index 0000000..00e275c --- /dev/null +++ b/src/main/java/com/ftw/hometerview/place/service/CompanyService.java @@ -0,0 +1,21 @@ +package com.ftw.hometerview.place.service; + +import com.ftw.hometerview.place.controller.dto.PlaceDto; +import com.ftw.hometerview.place.domain.Company; +import com.ftw.hometerview.place.repository.CompanyRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@RequiredArgsConstructor +@Service +public class CompanyService { + + private final CompanyRepository companyRepository; + + public void register(PlaceDto.RegisterCompany req) { + Company company = req.toCompany(); + company.setNearliestStation(""); // TODO: get nearliest station from naver API + this.companyRepository.save(company); + } + +} diff --git a/src/main/java/com/ftw/hometerview/place/service/PlaceServiceFacade.java b/src/main/java/com/ftw/hometerview/place/service/PlaceServiceFacade.java new file mode 100644 index 0000000..d477df8 --- /dev/null +++ b/src/main/java/com/ftw/hometerview/place/service/PlaceServiceFacade.java @@ -0,0 +1,17 @@ +package com.ftw.hometerview.place.service; + +import com.ftw.hometerview.place.controller.dto.PlaceDto; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@RequiredArgsConstructor +@Service +public class PlaceServiceFacade { + + private final CompanyService companyService; + + public void registerCompany(PlaceDto.RegisterCompany req) { + this.companyService.register(req); + } + +} From ac05a759b040ef6b4177c8511aca85701493d190 Mon Sep 17 00:00:00 2001 From: rachel3486 Date: Sun, 14 Aug 2022 07:08:20 +0900 Subject: [PATCH 02/13] feat: Add manual company registration API --- .../place/controller/PlaceController.java | 29 +++++++++++++++ .../place/controller/dto/PlaceDto.java | 37 +++++++++++++++++++ .../ftw/hometerview/place/domain/Company.java | 33 +++++++++++++++++ .../place/repository/CompanyRepository.java | 10 +++++ .../place/service/CompanyService.java | 21 +++++++++++ .../place/service/PlaceServiceFacade.java | 17 +++++++++ 6 files changed, 147 insertions(+) create mode 100644 src/main/java/com/ftw/hometerview/place/controller/PlaceController.java create mode 100644 src/main/java/com/ftw/hometerview/place/controller/dto/PlaceDto.java create mode 100644 src/main/java/com/ftw/hometerview/place/domain/Company.java create mode 100644 src/main/java/com/ftw/hometerview/place/repository/CompanyRepository.java create mode 100644 src/main/java/com/ftw/hometerview/place/service/CompanyService.java create mode 100644 src/main/java/com/ftw/hometerview/place/service/PlaceServiceFacade.java diff --git a/src/main/java/com/ftw/hometerview/place/controller/PlaceController.java b/src/main/java/com/ftw/hometerview/place/controller/PlaceController.java new file mode 100644 index 0000000..1ec72f8 --- /dev/null +++ b/src/main/java/com/ftw/hometerview/place/controller/PlaceController.java @@ -0,0 +1,29 @@ +package com.ftw.hometerview.place.controller; + +import com.ftw.hometerview.core.domain.ResponseEntity; +import com.ftw.hometerview.place.controller.dto.PlaceDto; +import com.ftw.hometerview.place.service.PlaceServiceFacade; +import io.swagger.v3.oas.annotations.Operation; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RequiredArgsConstructor +@RestController +@RequestMapping("/api/v1/place") +public class PlaceController { + + private final PlaceServiceFacade placeService; + + @Operation(summary = "소속 수동입력") + @PostMapping + public ResponseEntity registerCompany( + @Validated @RequestBody PlaceDto.RegisterCompany req) { + this.placeService.registerCompany(req); + return ResponseEntity.successResponse(); + } + +} diff --git a/src/main/java/com/ftw/hometerview/place/controller/dto/PlaceDto.java b/src/main/java/com/ftw/hometerview/place/controller/dto/PlaceDto.java new file mode 100644 index 0000000..64cc1be --- /dev/null +++ b/src/main/java/com/ftw/hometerview/place/controller/dto/PlaceDto.java @@ -0,0 +1,37 @@ +package com.ftw.hometerview.place.controller.dto; + +import com.ftw.hometerview.place.domain.Company; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Pattern; +import lombok.Getter; + +public class PlaceDto { + + private static final String LOAD_PATTERN = + "(([가-힣A-Za-z·\\d~\\-\\.]{2,}(로|길).[\\d]+)|([가-힣A-Za-z·\\d~\\-\\.]+(읍|동)\\s)[\\d]+)"; + + @Getter + public static class RegisterCompany { + + @NotBlank + private String name; + @NotBlank + @Pattern(regexp = LOAD_PATTERN) + private String loadName; + @NotBlank + private String lat; + @NotBlank + private String lon; + + public Company toCompany() { + return Company.builder() + .name(this.name) + .loadName(this.loadName) // oo시 oo구 oo동 ~~ + .city(this.loadName.split(" ")[1]) + .lat(this.lat) + .lon(this.lon) + .build(); + } + } + +} diff --git a/src/main/java/com/ftw/hometerview/place/domain/Company.java b/src/main/java/com/ftw/hometerview/place/domain/Company.java new file mode 100644 index 0000000..1d96951 --- /dev/null +++ b/src/main/java/com/ftw/hometerview/place/domain/Company.java @@ -0,0 +1,33 @@ +package com.ftw.hometerview.place.domain; + +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.experimental.FieldDefaults; +import nonapi.io.github.classgraph.json.Id; +import org.bson.types.ObjectId; +import org.springframework.data.mongodb.core.mapping.Document; + +@Getter +@Builder +@FieldDefaults(level = AccessLevel.PRIVATE) +@Document(collection = "company") +public class Company { + + @Id + ObjectId id; + + String name; + String loadName; + String city; + String station; + String lat; + String lon; + + + public Company setNearliestStation(String station) { + this.station = station; + return this; + } + +} diff --git a/src/main/java/com/ftw/hometerview/place/repository/CompanyRepository.java b/src/main/java/com/ftw/hometerview/place/repository/CompanyRepository.java new file mode 100644 index 0000000..ef7e082 --- /dev/null +++ b/src/main/java/com/ftw/hometerview/place/repository/CompanyRepository.java @@ -0,0 +1,10 @@ +package com.ftw.hometerview.place.repository; + +import com.ftw.hometerview.place.domain.Company; +import org.springframework.data.mongodb.repository.MongoRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface CompanyRepository extends MongoRepository { + +} diff --git a/src/main/java/com/ftw/hometerview/place/service/CompanyService.java b/src/main/java/com/ftw/hometerview/place/service/CompanyService.java new file mode 100644 index 0000000..00e275c --- /dev/null +++ b/src/main/java/com/ftw/hometerview/place/service/CompanyService.java @@ -0,0 +1,21 @@ +package com.ftw.hometerview.place.service; + +import com.ftw.hometerview.place.controller.dto.PlaceDto; +import com.ftw.hometerview.place.domain.Company; +import com.ftw.hometerview.place.repository.CompanyRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@RequiredArgsConstructor +@Service +public class CompanyService { + + private final CompanyRepository companyRepository; + + public void register(PlaceDto.RegisterCompany req) { + Company company = req.toCompany(); + company.setNearliestStation(""); // TODO: get nearliest station from naver API + this.companyRepository.save(company); + } + +} diff --git a/src/main/java/com/ftw/hometerview/place/service/PlaceServiceFacade.java b/src/main/java/com/ftw/hometerview/place/service/PlaceServiceFacade.java new file mode 100644 index 0000000..d477df8 --- /dev/null +++ b/src/main/java/com/ftw/hometerview/place/service/PlaceServiceFacade.java @@ -0,0 +1,17 @@ +package com.ftw.hometerview.place.service; + +import com.ftw.hometerview.place.controller.dto.PlaceDto; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@RequiredArgsConstructor +@Service +public class PlaceServiceFacade { + + private final CompanyService companyService; + + public void registerCompany(PlaceDto.RegisterCompany req) { + this.companyService.register(req); + } + +} From 442ede4c20edf73d3e75037336b813d1f4cceec3 Mon Sep 17 00:00:00 2001 From: rachel3486 Date: Fri, 19 Aug 2022 10:34:35 +0900 Subject: [PATCH 03/13] feat: Add register company endpoint and duplication check method, modify return dto --- .../hometerview/core/domain/ResponseType.java | 1 + .../ftw/hometerview/core/util/Constants.java | 4 ++ .../place/controller/PlaceController.java | 4 +- .../place/controller/dto/CompanyDto.java | 44 +++++++++++++++++++ .../place/controller/dto/PlaceDto.java | 39 +++++++--------- .../ftw/hometerview/place/domain/Company.java | 25 +++++++---- .../{ => company}/CompanyRepository.java | 5 ++- .../company/CompanyRepositoryCustom.java | 12 +++++ .../company/CompanyRepositoryImpl.java | 37 ++++++++++++++++ .../place/service/CompanyService.java | 21 +++++++-- .../place/service/PlaceServiceFacade.java | 3 +- 11 files changed, 154 insertions(+), 41 deletions(-) create mode 100644 src/main/java/com/ftw/hometerview/place/controller/dto/CompanyDto.java rename src/main/java/com/ftw/hometerview/place/repository/{ => company}/CompanyRepository.java (53%) create mode 100644 src/main/java/com/ftw/hometerview/place/repository/company/CompanyRepositoryCustom.java create mode 100644 src/main/java/com/ftw/hometerview/place/repository/company/CompanyRepositoryImpl.java diff --git a/src/main/java/com/ftw/hometerview/core/domain/ResponseType.java b/src/main/java/com/ftw/hometerview/core/domain/ResponseType.java index c2a2445..de06e5f 100644 --- a/src/main/java/com/ftw/hometerview/core/domain/ResponseType.java +++ b/src/main/java/com/ftw/hometerview/core/domain/ResponseType.java @@ -21,6 +21,7 @@ public enum ResponseType { JWT_EXPIRED("CM08", "만료된 토큰입니다."), JWT_NULL_OR_EMPTY("CM09", "토큰이 없거나 값이 비어있습니다."), JWT_HEADER_PREFIX("CM10", "토큰 값은 'Bearer' 로 시작해야 합니다."), + DATA_DUPLICATED("CM11", "이미 존재하는 값입니다"), // AUTH AUTH_NULL_TOKEN("AU01", "토큰을 찾을 수 없습니다."), diff --git a/src/main/java/com/ftw/hometerview/core/util/Constants.java b/src/main/java/com/ftw/hometerview/core/util/Constants.java index f307e8a..72f599a 100644 --- a/src/main/java/com/ftw/hometerview/core/util/Constants.java +++ b/src/main/java/com/ftw/hometerview/core/util/Constants.java @@ -6,4 +6,8 @@ public class Constants { public static final int DEFAULT_PAGE_SIZE = 5; public static final String DEFAULT_KEYWORD = ".*"; // mongo wildcard + public static final String NAME = "name"; + public static final String LOAD_NAME = "loadName"; + public static final String STATION = "station"; + } diff --git a/src/main/java/com/ftw/hometerview/place/controller/PlaceController.java b/src/main/java/com/ftw/hometerview/place/controller/PlaceController.java index 1ec72f8..c65ec61 100644 --- a/src/main/java/com/ftw/hometerview/place/controller/PlaceController.java +++ b/src/main/java/com/ftw/hometerview/place/controller/PlaceController.java @@ -19,9 +19,9 @@ public class PlaceController { private final PlaceServiceFacade placeService; @Operation(summary = "소속 수동입력") - @PostMapping + @PostMapping("/company") public ResponseEntity registerCompany( - @Validated @RequestBody PlaceDto.RegisterCompany req) { + @Validated @RequestBody CompanyDto.RegisterCompany req) { this.placeService.registerCompany(req); return ResponseEntity.successResponse(); } diff --git a/src/main/java/com/ftw/hometerview/place/controller/dto/CompanyDto.java b/src/main/java/com/ftw/hometerview/place/controller/dto/CompanyDto.java new file mode 100644 index 0000000..cc23e9e --- /dev/null +++ b/src/main/java/com/ftw/hometerview/place/controller/dto/CompanyDto.java @@ -0,0 +1,44 @@ +package com.ftw.hometerview.place.controller.dto; + +import com.ftw.hometerview.place.domain.Company; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import lombok.Builder; +import lombok.Getter; + +public class CompanyDto { + + @Getter + public static class RegisterCompany { + + @NotBlank + private String name; + @NotBlank + private String loadName; + @NotNull + private Double lat; + @NotNull + private Double lon; + + public Company toCompany() { + return Company.builder() + .name(this.name) + .loadName(this.loadName) // oo시 oo구 oo동 ~~ + .province(this.loadName.split(" ")[1]) + .lat(this.lat) + .lon(this.lon) + .build(); + } + } + + @Getter + @Builder + public static class Meta { + + private String companyId; + private String name; + private String loadName; + private String station; + } + +} diff --git a/src/main/java/com/ftw/hometerview/place/controller/dto/PlaceDto.java b/src/main/java/com/ftw/hometerview/place/controller/dto/PlaceDto.java index 64cc1be..c39034d 100644 --- a/src/main/java/com/ftw/hometerview/place/controller/dto/PlaceDto.java +++ b/src/main/java/com/ftw/hometerview/place/controller/dto/PlaceDto.java @@ -1,36 +1,27 @@ package com.ftw.hometerview.place.controller.dto; -import com.ftw.hometerview.place.domain.Company; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.Pattern; +import com.ftw.hometerview.place.controller.dto.CompanyDto.Meta; +import java.util.Collections; +import java.util.List; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Getter; public class PlaceDto { - private static final String LOAD_PATTERN = - "(([가-힣A-Za-z·\\d~\\-\\.]{2,}(로|길).[\\d]+)|([가-힣A-Za-z·\\d~\\-\\.]+(읍|동)\\s)[\\d]+)"; - @Getter - public static class RegisterCompany { + @Builder + @AllArgsConstructor + public static class SearchResult { // 검색창 자동완성 데이터 - @NotBlank - private String name; - @NotBlank - @Pattern(regexp = LOAD_PATTERN) - private String loadName; - @NotBlank - private String lat; - @NotBlank - private String lon; + List companies; + List buildings; + List stations; - public Company toCompany() { - return Company.builder() - .name(this.name) - .loadName(this.loadName) // oo시 oo구 oo동 ~~ - .city(this.loadName.split(" ")[1]) - .lat(this.lat) - .lon(this.lon) - .build(); + public SearchResult(List companies) { + this.companies = companies; + this.buildings = Collections.EMPTY_LIST; + this.stations = Collections.EMPTY_LIST; } } diff --git a/src/main/java/com/ftw/hometerview/place/domain/Company.java b/src/main/java/com/ftw/hometerview/place/domain/Company.java index 1d96951..8418720 100644 --- a/src/main/java/com/ftw/hometerview/place/domain/Company.java +++ b/src/main/java/com/ftw/hometerview/place/domain/Company.java @@ -1,5 +1,7 @@ package com.ftw.hometerview.place.domain; +import com.ftw.hometerview.core.domain.AbstractDocument; +import com.ftw.hometerview.place.controller.dto.CompanyDto; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; @@ -12,22 +14,29 @@ @Builder @FieldDefaults(level = AccessLevel.PRIVATE) @Document(collection = "company") -public class Company { +public class Company extends AbstractDocument { @Id ObjectId id; String name; String loadName; - String city; - String station; - String lat; - String lon; + String province; + String stationId; + Double lat; + Double lon; - public Company setNearliestStation(String station) { - this.station = station; - return this; + public void setNearliestStation(String stationId) { + this.stationId = stationId; + } + + public CompanyDto.Meta toMeta() { + return CompanyDto.Meta.builder() + .companyId(String.valueOf(this.id)) + .name(this.name) + .loadName(this.loadName) + .build(); } } diff --git a/src/main/java/com/ftw/hometerview/place/repository/CompanyRepository.java b/src/main/java/com/ftw/hometerview/place/repository/company/CompanyRepository.java similarity index 53% rename from src/main/java/com/ftw/hometerview/place/repository/CompanyRepository.java rename to src/main/java/com/ftw/hometerview/place/repository/company/CompanyRepository.java index ef7e082..6e626b5 100644 --- a/src/main/java/com/ftw/hometerview/place/repository/CompanyRepository.java +++ b/src/main/java/com/ftw/hometerview/place/repository/company/CompanyRepository.java @@ -1,10 +1,11 @@ -package com.ftw.hometerview.place.repository; +package com.ftw.hometerview.place.repository.company; import com.ftw.hometerview.place.domain.Company; import org.springframework.data.mongodb.repository.MongoRepository; import org.springframework.stereotype.Repository; @Repository -public interface CompanyRepository extends MongoRepository { +public interface CompanyRepository extends + MongoRepository, CompanyRepositoryCustom { } diff --git a/src/main/java/com/ftw/hometerview/place/repository/company/CompanyRepositoryCustom.java b/src/main/java/com/ftw/hometerview/place/repository/company/CompanyRepositoryCustom.java new file mode 100644 index 0000000..d2e86b3 --- /dev/null +++ b/src/main/java/com/ftw/hometerview/place/repository/company/CompanyRepositoryCustom.java @@ -0,0 +1,12 @@ +package com.ftw.hometerview.place.repository.company; + +import com.ftw.hometerview.place.domain.Company; +import java.util.List; +import org.springframework.data.domain.Pageable; + +public interface CompanyRepositoryCustom { + + List searchByKeyword(String keyword, Pageable pageable); + boolean existsByNameAndLoadName(String name, String loadName); + +} diff --git a/src/main/java/com/ftw/hometerview/place/repository/company/CompanyRepositoryImpl.java b/src/main/java/com/ftw/hometerview/place/repository/company/CompanyRepositoryImpl.java new file mode 100644 index 0000000..31eba3c --- /dev/null +++ b/src/main/java/com/ftw/hometerview/place/repository/company/CompanyRepositoryImpl.java @@ -0,0 +1,37 @@ +package com.ftw.hometerview.place.repository.company; + +import static com.ftw.hometerview.core.util.Constants.LOAD_NAME; +import static com.ftw.hometerview.core.util.Constants.NAME; +import static com.ftw.hometerview.core.util.Constants.STATION; + +import com.ftw.hometerview.place.domain.Company; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Pageable; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; + +@RequiredArgsConstructor +public class CompanyRepositoryImpl implements CompanyRepositoryCustom { + + private final MongoTemplate mongoTemplate; + + @Override + public List searchByKeyword(String keyword, Pageable pageable) { + Criteria criteria = new Criteria().orOperator( + Criteria.where(NAME).regex(keyword, "i"), + Criteria.where(LOAD_NAME).regex(keyword, "i"), + Criteria.where(STATION).regex(keyword, "i") + ); + + return mongoTemplate.find(Query.query(criteria).with(pageable), Company.class); + } + + @Override + public boolean existsByNameAndLoadName(String name, String loadName) { + Criteria criteria = Criteria.where("name").is(name).and("loadName").is(loadName); + return mongoTemplate.exists(Query.query(criteria), Company.class); + } + +} diff --git a/src/main/java/com/ftw/hometerview/place/service/CompanyService.java b/src/main/java/com/ftw/hometerview/place/service/CompanyService.java index 00e275c..d34a321 100644 --- a/src/main/java/com/ftw/hometerview/place/service/CompanyService.java +++ b/src/main/java/com/ftw/hometerview/place/service/CompanyService.java @@ -1,9 +1,13 @@ package com.ftw.hometerview.place.service; -import com.ftw.hometerview.place.controller.dto.PlaceDto; +import com.ftw.hometerview.core.domain.ResponseType; +import com.ftw.hometerview.core.exception.BadRequestException; +import com.ftw.hometerview.place.controller.dto.CompanyDto; import com.ftw.hometerview.place.domain.Company; -import com.ftw.hometerview.place.repository.CompanyRepository; +import com.ftw.hometerview.place.repository.company.CompanyRepository; +import java.util.List; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; @RequiredArgsConstructor @@ -12,10 +16,19 @@ public class CompanyService { private final CompanyRepository companyRepository; - public void register(PlaceDto.RegisterCompany req) { + public void register(CompanyDto.RegisterCompany req) { + if (isDuplicated(req.getName(), req.getLoadName())) { + throw new BadRequestException(ResponseType.DATA_DUPLICATED); + } Company company = req.toCompany(); - company.setNearliestStation(""); // TODO: get nearliest station from naver API + // TODO: get nearliest station from naver API + // TODO: get station id from db + company.setNearliestStation(""); this.companyRepository.save(company); } + private boolean isDuplicated(String name, String loadName) { + return this.companyRepository.existsByNameAndLoadName(name, loadName); + } + } diff --git a/src/main/java/com/ftw/hometerview/place/service/PlaceServiceFacade.java b/src/main/java/com/ftw/hometerview/place/service/PlaceServiceFacade.java index d477df8..589d94a 100644 --- a/src/main/java/com/ftw/hometerview/place/service/PlaceServiceFacade.java +++ b/src/main/java/com/ftw/hometerview/place/service/PlaceServiceFacade.java @@ -1,5 +1,6 @@ package com.ftw.hometerview.place.service; +import com.ftw.hometerview.place.controller.dto.CompanyDto; import com.ftw.hometerview.place.controller.dto.PlaceDto; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -10,7 +11,7 @@ public class PlaceServiceFacade { private final CompanyService companyService; - public void registerCompany(PlaceDto.RegisterCompany req) { + public void registerCompany(CompanyDto.RegisterCompany req) { this.companyService.register(req); } From 8250016b2a1fb53521b07f05980af1f0e53ee198 Mon Sep 17 00:00:00 2001 From: rachel3486 Date: Fri, 19 Aug 2022 10:36:19 +0900 Subject: [PATCH 04/13] feat: Add search API --- .../place/controller/PlaceController.java | 20 +++++++++ .../place/controller/dto/BuildingDto.java | 32 +++++++++++++ .../place/controller/dto/StationDto.java | 17 +++++++ .../hometerview/place/domain/Building.java | 45 +++++++++++++++++++ .../hometerview/place/domain/SearchType.java | 5 +++ .../ftw/hometerview/place/domain/Station.java | 34 ++++++++++++++ .../building/BuildingRepository.java | 11 +++++ .../building/BuildingRepositoryCustom.java | 11 +++++ .../building/BuildingRepositoryImpl.java | 28 ++++++++++++ .../repository/station/StationRepository.java | 10 +++++ .../station/StationRepositoryCustom.java | 11 +++++ .../station/StationRepositoryImpl.java | 28 ++++++++++++ .../place/service/BuildingService.java | 23 ++++++++++ .../place/service/CompanyService.java | 6 +++ .../place/service/PlaceServiceFacade.java | 20 +++++++++ .../place/service/StationService.java | 23 ++++++++++ 16 files changed, 324 insertions(+) create mode 100644 src/main/java/com/ftw/hometerview/place/controller/dto/BuildingDto.java create mode 100644 src/main/java/com/ftw/hometerview/place/controller/dto/StationDto.java create mode 100644 src/main/java/com/ftw/hometerview/place/domain/Building.java create mode 100644 src/main/java/com/ftw/hometerview/place/domain/SearchType.java create mode 100644 src/main/java/com/ftw/hometerview/place/domain/Station.java create mode 100644 src/main/java/com/ftw/hometerview/place/repository/building/BuildingRepository.java create mode 100644 src/main/java/com/ftw/hometerview/place/repository/building/BuildingRepositoryCustom.java create mode 100644 src/main/java/com/ftw/hometerview/place/repository/building/BuildingRepositoryImpl.java create mode 100644 src/main/java/com/ftw/hometerview/place/repository/station/StationRepository.java create mode 100644 src/main/java/com/ftw/hometerview/place/repository/station/StationRepositoryCustom.java create mode 100644 src/main/java/com/ftw/hometerview/place/repository/station/StationRepositoryImpl.java create mode 100644 src/main/java/com/ftw/hometerview/place/service/BuildingService.java create mode 100644 src/main/java/com/ftw/hometerview/place/service/StationService.java diff --git a/src/main/java/com/ftw/hometerview/place/controller/PlaceController.java b/src/main/java/com/ftw/hometerview/place/controller/PlaceController.java index c65ec61..446f9b7 100644 --- a/src/main/java/com/ftw/hometerview/place/controller/PlaceController.java +++ b/src/main/java/com/ftw/hometerview/place/controller/PlaceController.java @@ -1,14 +1,23 @@ package com.ftw.hometerview.place.controller; +import static com.ftw.hometerview.core.util.Constants.DEFAULT_PAGE_SIZE; + +import com.ftw.hometerview.core.annotation.NonAuthorized; import com.ftw.hometerview.core.domain.ResponseEntity; +import com.ftw.hometerview.place.controller.dto.CompanyDto; import com.ftw.hometerview.place.controller.dto.PlaceDto; +import com.ftw.hometerview.place.domain.SearchType; import com.ftw.hometerview.place.service.PlaceServiceFacade; import io.swagger.v3.oas.annotations.Operation; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Pageable; +import org.springframework.data.web.PageableDefault; import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RequiredArgsConstructor @@ -26,4 +35,15 @@ public ResponseEntity registerCompany( return ResponseEntity.successResponse(); } + @Operation(summary = "검색") + @NonAuthorized + @GetMapping + public ResponseEntity search( + @RequestParam SearchType searchType, + @RequestParam String keyword, + @PageableDefault(size = DEFAULT_PAGE_SIZE) Pageable pageable) { + var searchResult = this.placeService.search(searchType, keyword, pageable); + return ResponseEntity.successResponse(searchResult); + } + } diff --git a/src/main/java/com/ftw/hometerview/place/controller/dto/BuildingDto.java b/src/main/java/com/ftw/hometerview/place/controller/dto/BuildingDto.java new file mode 100644 index 0000000..7488fee --- /dev/null +++ b/src/main/java/com/ftw/hometerview/place/controller/dto/BuildingDto.java @@ -0,0 +1,32 @@ +package com.ftw.hometerview.place.controller.dto; + +import com.ftw.hometerview.place.domain.Building.ResidenceType; +import lombok.Builder; +import lombok.Getter; + +public class BuildingDto { + + @Getter + @Builder + public static class Meta { + + private String buildingId; + private String name; + private String loadName; + } + + @Getter + @Builder + public static class Brief { + + private String buildingId; + private String name; + private String loadName; + private ResidenceType residenceType; + private Integer totalRating; + + private Integer totalReviewCount; + private Boolean isFavorite; + } + +} diff --git a/src/main/java/com/ftw/hometerview/place/controller/dto/StationDto.java b/src/main/java/com/ftw/hometerview/place/controller/dto/StationDto.java new file mode 100644 index 0000000..82f05f4 --- /dev/null +++ b/src/main/java/com/ftw/hometerview/place/controller/dto/StationDto.java @@ -0,0 +1,17 @@ +package com.ftw.hometerview.place.controller.dto; + +import lombok.Builder; +import lombok.Getter; + +public class StationDto { + + @Getter + @Builder + public static class Meta { + + private String stationId; + private String name; + private String loadName; + } + +} diff --git a/src/main/java/com/ftw/hometerview/place/domain/Building.java b/src/main/java/com/ftw/hometerview/place/domain/Building.java new file mode 100644 index 0000000..e584969 --- /dev/null +++ b/src/main/java/com/ftw/hometerview/place/domain/Building.java @@ -0,0 +1,45 @@ +package com.ftw.hometerview.place.domain; + +import com.ftw.hometerview.core.domain.AbstractDocument; +import com.ftw.hometerview.place.controller.dto.BuildingDto; +import java.util.Collections; +import java.util.List; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.experimental.FieldDefaults; +import org.bson.types.ObjectId; +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.mapping.Document; + +@Getter +@Builder +@FieldDefaults(level = AccessLevel.PRIVATE) +@Document(collection = "building") +public class Building extends AbstractDocument { + + @Id + ObjectId id; + + String name; + String loadName; + String city; + Double lat; + Double lon; + ResidenceType residenceType; + + Integer totalRating = 0; + List likedUsers = Collections.EMPTY_LIST; + + public enum ResidenceType { + OFFICETEL, ONEROOM, VILLA, APARTMENT + } + + public BuildingDto.Meta toMeta() { + return BuildingDto.Meta.builder() + .buildingId(String.valueOf(this.id)) + .name(this.name) + .loadName(this.loadName) + .build(); + } +} diff --git a/src/main/java/com/ftw/hometerview/place/domain/SearchType.java b/src/main/java/com/ftw/hometerview/place/domain/SearchType.java new file mode 100644 index 0000000..e27cfeb --- /dev/null +++ b/src/main/java/com/ftw/hometerview/place/domain/SearchType.java @@ -0,0 +1,5 @@ +package com.ftw.hometerview.place.domain; + +public enum SearchType { + COMMON, COMPANY +} diff --git a/src/main/java/com/ftw/hometerview/place/domain/Station.java b/src/main/java/com/ftw/hometerview/place/domain/Station.java new file mode 100644 index 0000000..2a90f37 --- /dev/null +++ b/src/main/java/com/ftw/hometerview/place/domain/Station.java @@ -0,0 +1,34 @@ +package com.ftw.hometerview.place.domain; + +import com.ftw.hometerview.core.domain.AbstractDocument; +import com.ftw.hometerview.place.controller.dto.StationDto; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.experimental.FieldDefaults; +import nonapi.io.github.classgraph.json.Id; +import org.bson.types.ObjectId; +import org.springframework.data.mongodb.core.mapping.Document; + +@Getter +@Builder +@FieldDefaults(level = AccessLevel.PRIVATE) +@Document(collection = "station") +public class Station extends AbstractDocument { + + @Id + ObjectId id; + String name; + String loadName; + Double lat; + Double lon; + + public StationDto.Meta toMeta() { + return StationDto.Meta.builder() + .stationId(String.valueOf(this.id)) + .name(this.name) + .loadName(this.loadName) + .build(); + } + +} diff --git a/src/main/java/com/ftw/hometerview/place/repository/building/BuildingRepository.java b/src/main/java/com/ftw/hometerview/place/repository/building/BuildingRepository.java new file mode 100644 index 0000000..7ff5f80 --- /dev/null +++ b/src/main/java/com/ftw/hometerview/place/repository/building/BuildingRepository.java @@ -0,0 +1,11 @@ +package com.ftw.hometerview.place.repository.building; + +import com.ftw.hometerview.place.domain.Building; +import org.springframework.data.mongodb.repository.MongoRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface BuildingRepository extends + MongoRepository, BuildingRepositoryCustom { + +} diff --git a/src/main/java/com/ftw/hometerview/place/repository/building/BuildingRepositoryCustom.java b/src/main/java/com/ftw/hometerview/place/repository/building/BuildingRepositoryCustom.java new file mode 100644 index 0000000..1a0ef9f --- /dev/null +++ b/src/main/java/com/ftw/hometerview/place/repository/building/BuildingRepositoryCustom.java @@ -0,0 +1,11 @@ +package com.ftw.hometerview.place.repository.building; + +import com.ftw.hometerview.place.domain.Building; +import java.util.List; +import org.springframework.data.domain.Pageable; + +public interface BuildingRepositoryCustom { + + List searchByKeyword(String keyword, Pageable pageable); + +} diff --git a/src/main/java/com/ftw/hometerview/place/repository/building/BuildingRepositoryImpl.java b/src/main/java/com/ftw/hometerview/place/repository/building/BuildingRepositoryImpl.java new file mode 100644 index 0000000..c49f172 --- /dev/null +++ b/src/main/java/com/ftw/hometerview/place/repository/building/BuildingRepositoryImpl.java @@ -0,0 +1,28 @@ +package com.ftw.hometerview.place.repository.building; + +import static com.ftw.hometerview.core.util.Constants.LOAD_NAME; +import static com.ftw.hometerview.core.util.Constants.NAME; + +import com.ftw.hometerview.place.domain.Building; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Pageable; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; + +@RequiredArgsConstructor +public class BuildingRepositoryImpl implements BuildingRepositoryCustom { + + private final MongoTemplate mongoTemplate; + + @Override + public List searchByKeyword(String keyword, Pageable pageable) { + Criteria criteria = new Criteria().orOperator( + Criteria.where(NAME).regex(keyword, "i"), + Criteria.where(LOAD_NAME).regex(keyword, "i") + ); + + return mongoTemplate.find(Query.query(criteria).with(pageable), Building.class); + } +} diff --git a/src/main/java/com/ftw/hometerview/place/repository/station/StationRepository.java b/src/main/java/com/ftw/hometerview/place/repository/station/StationRepository.java new file mode 100644 index 0000000..59f1214 --- /dev/null +++ b/src/main/java/com/ftw/hometerview/place/repository/station/StationRepository.java @@ -0,0 +1,10 @@ +package com.ftw.hometerview.place.repository.station; + +import com.ftw.hometerview.place.domain.Station; +import org.springframework.data.mongodb.repository.MongoRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface StationRepository extends MongoRepository,StationRepositoryCustom { + +} diff --git a/src/main/java/com/ftw/hometerview/place/repository/station/StationRepositoryCustom.java b/src/main/java/com/ftw/hometerview/place/repository/station/StationRepositoryCustom.java new file mode 100644 index 0000000..82f5dd9 --- /dev/null +++ b/src/main/java/com/ftw/hometerview/place/repository/station/StationRepositoryCustom.java @@ -0,0 +1,11 @@ +package com.ftw.hometerview.place.repository.station; + +import com.ftw.hometerview.place.domain.Station; +import java.util.List; +import org.springframework.data.domain.Pageable; + +public interface StationRepositoryCustom { + + List searchByKeyword(String keyword, Pageable pageable); + +} diff --git a/src/main/java/com/ftw/hometerview/place/repository/station/StationRepositoryImpl.java b/src/main/java/com/ftw/hometerview/place/repository/station/StationRepositoryImpl.java new file mode 100644 index 0000000..9c3909f --- /dev/null +++ b/src/main/java/com/ftw/hometerview/place/repository/station/StationRepositoryImpl.java @@ -0,0 +1,28 @@ +package com.ftw.hometerview.place.repository.station; + +import static com.ftw.hometerview.core.util.Constants.LOAD_NAME; +import static com.ftw.hometerview.core.util.Constants.NAME; + +import com.ftw.hometerview.place.domain.Station; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Pageable; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; + +@RequiredArgsConstructor +public class StationRepositoryImpl implements StationRepositoryCustom { + + private final MongoTemplate mongoTemplate; + + @Override + public List searchByKeyword(String keyword, Pageable pageable) { + Criteria criteria = new Criteria().orOperator( + Criteria.where(NAME).regex(keyword, "i"), + Criteria.where(LOAD_NAME).regex(keyword, "i") + ); + + return mongoTemplate.find(Query.query(criteria).with(pageable), Station.class); + } +} diff --git a/src/main/java/com/ftw/hometerview/place/service/BuildingService.java b/src/main/java/com/ftw/hometerview/place/service/BuildingService.java new file mode 100644 index 0000000..ee2de0f --- /dev/null +++ b/src/main/java/com/ftw/hometerview/place/service/BuildingService.java @@ -0,0 +1,23 @@ +package com.ftw.hometerview.place.service; + +import com.ftw.hometerview.place.controller.dto.BuildingDto; +import com.ftw.hometerview.place.domain.Building; +import com.ftw.hometerview.place.repository.building.BuildingRepository; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + +@RequiredArgsConstructor +@Service +public class BuildingService { + + private final BuildingRepository buildingRepository; + + public List searchByKeyword(String keyword, Pageable pageable) { + List buildings = this.buildingRepository.searchByKeyword(keyword, pageable); + List response = buildings.stream().map(Building::toMeta).toList(); + return response; + } + +} diff --git a/src/main/java/com/ftw/hometerview/place/service/CompanyService.java b/src/main/java/com/ftw/hometerview/place/service/CompanyService.java index d34a321..90a87c4 100644 --- a/src/main/java/com/ftw/hometerview/place/service/CompanyService.java +++ b/src/main/java/com/ftw/hometerview/place/service/CompanyService.java @@ -31,4 +31,10 @@ private boolean isDuplicated(String name, String loadName) { return this.companyRepository.existsByNameAndLoadName(name, loadName); } + public List searchByKeyword(String keyword, Pageable pageable) { + List companies = this.companyRepository.searchByKeyword(keyword, pageable); + List response = companies.stream().map(Company::toMeta).toList(); + return response; + } + } diff --git a/src/main/java/com/ftw/hometerview/place/service/PlaceServiceFacade.java b/src/main/java/com/ftw/hometerview/place/service/PlaceServiceFacade.java index 589d94a..daa66af 100644 --- a/src/main/java/com/ftw/hometerview/place/service/PlaceServiceFacade.java +++ b/src/main/java/com/ftw/hometerview/place/service/PlaceServiceFacade.java @@ -2,7 +2,13 @@ import com.ftw.hometerview.place.controller.dto.CompanyDto; import com.ftw.hometerview.place.controller.dto.PlaceDto; +import com.ftw.hometerview.place.controller.dto.BuildingDto; +import com.ftw.hometerview.place.controller.dto.PlaceDto.SearchResult; +import com.ftw.hometerview.place.controller.dto.StationDto; +import com.ftw.hometerview.place.domain.SearchType; +import java.util.List; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; @RequiredArgsConstructor @@ -10,9 +16,23 @@ public class PlaceServiceFacade { private final CompanyService companyService; + private final BuildingService buildingService; + private final StationService stationService; public void registerCompany(CompanyDto.RegisterCompany req) { this.companyService.register(req); } + public PlaceDto.SearchResult search(SearchType searchType, String keyword, Pageable pageable) { + List companies = this.companyService.searchByKeyword(keyword, pageable); + if (searchType.equals(SearchType.COMPANY)) { + return new SearchResult(companies); + } + List buildings = this.buildingService.searchByKeyword(keyword, pageable); + List stations = this.stationService.searchByKeyword(keyword, pageable); + return SearchResult.builder().companies(companies).buildings(buildings).stations(stations) + .build(); + // TODO:: Async 처리 적용 가능 여부(메서드 분리 필요 확인) + } + } diff --git a/src/main/java/com/ftw/hometerview/place/service/StationService.java b/src/main/java/com/ftw/hometerview/place/service/StationService.java new file mode 100644 index 0000000..f7ca9dc --- /dev/null +++ b/src/main/java/com/ftw/hometerview/place/service/StationService.java @@ -0,0 +1,23 @@ +package com.ftw.hometerview.place.service; + +import com.ftw.hometerview.place.controller.dto.StationDto; +import com.ftw.hometerview.place.domain.Station; +import com.ftw.hometerview.place.repository.station.StationRepository; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + +@RequiredArgsConstructor +@Service +public class StationService { + + private final StationRepository stationRepository; + + public List searchByKeyword(String keyword, Pageable pageable) { + List stations = this.stationRepository.searchByKeyword(keyword, pageable); + List response = stations.stream().map(Station::toMeta).toList(); + return response; + } + +} From 22f815427ce7f880992aa2db8ec6da0a09699c56 Mon Sep 17 00:00:00 2001 From: rachel3486 Date: Fri, 19 Aug 2022 10:46:19 +0900 Subject: [PATCH 05/13] feat: Enable Mongo audit, apply missing changes --- src/main/java/com/ftw/hometerview/HometerviewApplication.java | 2 ++ .../place/repository/company/CompanyRepositoryImpl.java | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/ftw/hometerview/HometerviewApplication.java b/src/main/java/com/ftw/hometerview/HometerviewApplication.java index a3e07cd..c131edb 100644 --- a/src/main/java/com/ftw/hometerview/HometerviewApplication.java +++ b/src/main/java/com/ftw/hometerview/HometerviewApplication.java @@ -2,7 +2,9 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.data.mongodb.config.EnableMongoAuditing; +@EnableMongoAuditing @SpringBootApplication public class HometerviewApplication { diff --git a/src/main/java/com/ftw/hometerview/place/repository/company/CompanyRepositoryImpl.java b/src/main/java/com/ftw/hometerview/place/repository/company/CompanyRepositoryImpl.java index 31eba3c..2fb9cfa 100644 --- a/src/main/java/com/ftw/hometerview/place/repository/company/CompanyRepositoryImpl.java +++ b/src/main/java/com/ftw/hometerview/place/repository/company/CompanyRepositoryImpl.java @@ -30,7 +30,7 @@ public List searchByKeyword(String keyword, Pageable pageable) { @Override public boolean existsByNameAndLoadName(String name, String loadName) { - Criteria criteria = Criteria.where("name").is(name).and("loadName").is(loadName); + Criteria criteria = Criteria.where(NAME).is(name).and(LOAD_NAME).is(loadName); return mongoTemplate.exists(Query.query(criteria), Company.class); } From 92a06dd209a8e67d81215b1cf9d030ab2db8f657 Mon Sep 17 00:00:00 2001 From: rachel3486 Date: Wed, 12 Oct 2022 23:24:23 +0900 Subject: [PATCH 06/13] refactor: Modify dto class name --- .../com/ftw/hometerview/place/controller/dto/BuildingDto.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/ftw/hometerview/place/controller/dto/BuildingDto.java b/src/main/java/com/ftw/hometerview/place/controller/dto/BuildingDto.java index 7488fee..8d96ac3 100644 --- a/src/main/java/com/ftw/hometerview/place/controller/dto/BuildingDto.java +++ b/src/main/java/com/ftw/hometerview/place/controller/dto/BuildingDto.java @@ -17,7 +17,7 @@ public static class Meta { @Getter @Builder - public static class Brief { + public static class Info { private String buildingId; private String name; From 67d53009dd13bf755f1320f2f7b882d9c55bac8d Mon Sep 17 00:00:00 2001 From: rachel3486 Date: Wed, 12 Oct 2022 23:32:49 +0900 Subject: [PATCH 07/13] refactor: Modify id field type ObjectId -> String --- .../com/ftw/hometerview/place/domain/Building.java | 10 +++++----- .../java/com/ftw/hometerview/place/domain/Company.java | 10 +++++----- .../java/com/ftw/hometerview/place/domain/Station.java | 10 +++++----- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/ftw/hometerview/place/domain/Building.java b/src/main/java/com/ftw/hometerview/place/domain/Building.java index e584969..1a900f2 100644 --- a/src/main/java/com/ftw/hometerview/place/domain/Building.java +++ b/src/main/java/com/ftw/hometerview/place/domain/Building.java @@ -8,9 +8,9 @@ import lombok.Builder; import lombok.Getter; import lombok.experimental.FieldDefaults; -import org.bson.types.ObjectId; -import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; +import org.springframework.data.mongodb.core.mapping.FieldType; +import org.springframework.data.mongodb.core.mapping.MongoId; @Getter @Builder @@ -18,8 +18,8 @@ @Document(collection = "building") public class Building extends AbstractDocument { - @Id - ObjectId id; + @MongoId(FieldType.OBJECT_ID) + String id; String name; String loadName; @@ -37,7 +37,7 @@ public enum ResidenceType { public BuildingDto.Meta toMeta() { return BuildingDto.Meta.builder() - .buildingId(String.valueOf(this.id)) + .buildingId(this.id) .name(this.name) .loadName(this.loadName) .build(); diff --git a/src/main/java/com/ftw/hometerview/place/domain/Company.java b/src/main/java/com/ftw/hometerview/place/domain/Company.java index 8418720..0f94d3e 100644 --- a/src/main/java/com/ftw/hometerview/place/domain/Company.java +++ b/src/main/java/com/ftw/hometerview/place/domain/Company.java @@ -6,9 +6,9 @@ import lombok.Builder; import lombok.Getter; import lombok.experimental.FieldDefaults; -import nonapi.io.github.classgraph.json.Id; -import org.bson.types.ObjectId; import org.springframework.data.mongodb.core.mapping.Document; +import org.springframework.data.mongodb.core.mapping.FieldType; +import org.springframework.data.mongodb.core.mapping.MongoId; @Getter @Builder @@ -16,8 +16,8 @@ @Document(collection = "company") public class Company extends AbstractDocument { - @Id - ObjectId id; + @MongoId(FieldType.OBJECT_ID) + String id; String name; String loadName; @@ -33,7 +33,7 @@ public void setNearliestStation(String stationId) { public CompanyDto.Meta toMeta() { return CompanyDto.Meta.builder() - .companyId(String.valueOf(this.id)) + .companyId(this.id) .name(this.name) .loadName(this.loadName) .build(); diff --git a/src/main/java/com/ftw/hometerview/place/domain/Station.java b/src/main/java/com/ftw/hometerview/place/domain/Station.java index 2a90f37..3e8fa69 100644 --- a/src/main/java/com/ftw/hometerview/place/domain/Station.java +++ b/src/main/java/com/ftw/hometerview/place/domain/Station.java @@ -6,9 +6,9 @@ import lombok.Builder; import lombok.Getter; import lombok.experimental.FieldDefaults; -import nonapi.io.github.classgraph.json.Id; -import org.bson.types.ObjectId; import org.springframework.data.mongodb.core.mapping.Document; +import org.springframework.data.mongodb.core.mapping.FieldType; +import org.springframework.data.mongodb.core.mapping.MongoId; @Getter @Builder @@ -16,8 +16,8 @@ @Document(collection = "station") public class Station extends AbstractDocument { - @Id - ObjectId id; + @MongoId(FieldType.OBJECT_ID) + String id; String name; String loadName; Double lat; @@ -25,7 +25,7 @@ public class Station extends AbstractDocument { public StationDto.Meta toMeta() { return StationDto.Meta.builder() - .stationId(String.valueOf(this.id)) + .stationId(this.id) .name(this.name) .loadName(this.loadName) .build(); From 62d4cb43fefacd1de4fd0d846152eae7c88b2e0b Mon Sep 17 00:00:00 2001 From: rachel3486 Date: Wed, 12 Oct 2022 23:33:57 +0900 Subject: [PATCH 08/13] refactor: Modify CompanyDto.Meta field name specific --- .../com/ftw/hometerview/place/controller/dto/CompanyDto.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/ftw/hometerview/place/controller/dto/CompanyDto.java b/src/main/java/com/ftw/hometerview/place/controller/dto/CompanyDto.java index cc23e9e..0de338d 100644 --- a/src/main/java/com/ftw/hometerview/place/controller/dto/CompanyDto.java +++ b/src/main/java/com/ftw/hometerview/place/controller/dto/CompanyDto.java @@ -38,7 +38,8 @@ public static class Meta { private String companyId; private String name; private String loadName; - private String station; + private String nearestStation; + } } From 8511fcabf47a525f37aad4cb0e1f9f15ebcd1665 Mon Sep 17 00:00:00 2001 From: rachel3486 Date: Wed, 12 Oct 2022 23:34:55 +0900 Subject: [PATCH 09/13] feat: Add station name to CompanyDto --- .../hometerview/place/controller/dto/CompanyDto.java | 3 +++ .../place/repository/station/StationRepository.java | 3 +++ .../hometerview/place/service/PlaceServiceFacade.java | 4 ++++ .../ftw/hometerview/place/service/StationService.java | 10 ++++++++++ 4 files changed, 20 insertions(+) diff --git a/src/main/java/com/ftw/hometerview/place/controller/dto/CompanyDto.java b/src/main/java/com/ftw/hometerview/place/controller/dto/CompanyDto.java index 0de338d..9d9a7e1 100644 --- a/src/main/java/com/ftw/hometerview/place/controller/dto/CompanyDto.java +++ b/src/main/java/com/ftw/hometerview/place/controller/dto/CompanyDto.java @@ -40,6 +40,9 @@ public static class Meta { private String loadName; private String nearestStation; + public void setStationName(String stationName) { + this.nearestStation = stationName; + } } } diff --git a/src/main/java/com/ftw/hometerview/place/repository/station/StationRepository.java b/src/main/java/com/ftw/hometerview/place/repository/station/StationRepository.java index 59f1214..a559724 100644 --- a/src/main/java/com/ftw/hometerview/place/repository/station/StationRepository.java +++ b/src/main/java/com/ftw/hometerview/place/repository/station/StationRepository.java @@ -1,10 +1,13 @@ package com.ftw.hometerview.place.repository.station; import com.ftw.hometerview.place.domain.Station; +import java.util.List; import org.springframework.data.mongodb.repository.MongoRepository; import org.springframework.stereotype.Repository; @Repository public interface StationRepository extends MongoRepository,StationRepositoryCustom { + List findByIds(List ids); + } diff --git a/src/main/java/com/ftw/hometerview/place/service/PlaceServiceFacade.java b/src/main/java/com/ftw/hometerview/place/service/PlaceServiceFacade.java index daa66af..85b1663 100644 --- a/src/main/java/com/ftw/hometerview/place/service/PlaceServiceFacade.java +++ b/src/main/java/com/ftw/hometerview/place/service/PlaceServiceFacade.java @@ -6,7 +6,9 @@ import com.ftw.hometerview.place.controller.dto.PlaceDto.SearchResult; import com.ftw.hometerview.place.controller.dto.StationDto; import com.ftw.hometerview.place.domain.SearchType; +import com.ftw.hometerview.place.domain.Station; import java.util.List; +import java.util.Map; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; @@ -25,6 +27,8 @@ public void registerCompany(CompanyDto.RegisterCompany req) { public PlaceDto.SearchResult search(SearchType searchType, String keyword, Pageable pageable) { List companies = this.companyService.searchByKeyword(keyword, pageable); + Map stationNames = this.stationService.getByIds(companies.stream().map(CompanyDto.Meta::getNearestStation).toList()); + companies.forEach(company -> company.setStationName(stationNames.get(company.getNearestStation()).getName())); if (searchType.equals(SearchType.COMPANY)) { return new SearchResult(companies); } diff --git a/src/main/java/com/ftw/hometerview/place/service/StationService.java b/src/main/java/com/ftw/hometerview/place/service/StationService.java index f7ca9dc..77af2e8 100644 --- a/src/main/java/com/ftw/hometerview/place/service/StationService.java +++ b/src/main/java/com/ftw/hometerview/place/service/StationService.java @@ -1,9 +1,14 @@ package com.ftw.hometerview.place.service; +import static java.util.Collections.unmodifiableMap; + import com.ftw.hometerview.place.controller.dto.StationDto; import com.ftw.hometerview.place.domain.Station; import com.ftw.hometerview.place.repository.station.StationRepository; import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; @@ -20,4 +25,9 @@ public List searchByKeyword(String keyword, Pageable pageable) return response; } + public Map getByIds(List stationIds) { + return unmodifiableMap(this.stationRepository.findByIds(stationIds) + .stream().collect(Collectors.toMap(Station::getId, Function.identity()))); + } + } From 9f25345afd4d1d49a8e7fd947f8d82ecddbe3875 Mon Sep 17 00:00:00 2001 From: rachel3486 Date: Wed, 12 Oct 2022 23:43:38 +0900 Subject: [PATCH 10/13] refactor: Modify building total rating field type int -> double --- src/main/java/com/ftw/hometerview/place/domain/Building.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/ftw/hometerview/place/domain/Building.java b/src/main/java/com/ftw/hometerview/place/domain/Building.java index 1a900f2..22188e9 100644 --- a/src/main/java/com/ftw/hometerview/place/domain/Building.java +++ b/src/main/java/com/ftw/hometerview/place/domain/Building.java @@ -28,7 +28,7 @@ public class Building extends AbstractDocument { Double lon; ResidenceType residenceType; - Integer totalRating = 0; + Double totalRating = 0D; List likedUsers = Collections.EMPTY_LIST; public enum ResidenceType { From 036d6f65ef54c16e01e89cfc390ccb2546f202fa Mon Sep 17 00:00:00 2001 From: rachel3486 Date: Thu, 13 Oct 2022 00:27:23 +0900 Subject: [PATCH 11/13] feat: Add String to SearchType converter --- .../com/ftw/hometerview/core/config/WebConfig.java | 7 +++++++ .../hometerview/core/util/SearchTypeConverter.java | 12 ++++++++++++ 2 files changed, 19 insertions(+) create mode 100644 src/main/java/com/ftw/hometerview/core/util/SearchTypeConverter.java diff --git a/src/main/java/com/ftw/hometerview/core/config/WebConfig.java b/src/main/java/com/ftw/hometerview/core/config/WebConfig.java index e62c3d0..885d9d6 100644 --- a/src/main/java/com/ftw/hometerview/core/config/WebConfig.java +++ b/src/main/java/com/ftw/hometerview/core/config/WebConfig.java @@ -1,7 +1,9 @@ package com.ftw.hometerview.core.config; import com.ftw.hometerview.core.interceptor.AuthorizationInterceptor; +import com.ftw.hometerview.core.util.SearchTypeConverter; import org.springframework.context.annotation.Configuration; +import org.springframework.format.FormatterRegistry; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @@ -16,4 +18,9 @@ public void addInterceptors(InterceptorRegistry registry) { .addPathPatterns("/api/**"); } + @Override + public void addFormatters(FormatterRegistry registry) { + registry.addConverter(new SearchTypeConverter()); + } + } diff --git a/src/main/java/com/ftw/hometerview/core/util/SearchTypeConverter.java b/src/main/java/com/ftw/hometerview/core/util/SearchTypeConverter.java new file mode 100644 index 0000000..5fecc60 --- /dev/null +++ b/src/main/java/com/ftw/hometerview/core/util/SearchTypeConverter.java @@ -0,0 +1,12 @@ +package com.ftw.hometerview.core.util; + +import com.ftw.hometerview.place.domain.SearchType; +import org.springframework.core.convert.converter.Converter; + +public class SearchTypeConverter implements Converter { + + @Override + public SearchType convert(String source) { + return SearchType.valueOf(source.toUpperCase()); + } +} From 8d447422f3016f8a316706f82ab5879a692b1e80 Mon Sep 17 00:00:00 2001 From: rachel3486 Date: Thu, 13 Oct 2022 00:28:18 +0900 Subject: [PATCH 12/13] fix: Modify mongo repository method name --- .../hometerview/place/repository/station/StationRepository.java | 2 +- .../java/com/ftw/hometerview/place/service/StationService.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/ftw/hometerview/place/repository/station/StationRepository.java b/src/main/java/com/ftw/hometerview/place/repository/station/StationRepository.java index a559724..227ccda 100644 --- a/src/main/java/com/ftw/hometerview/place/repository/station/StationRepository.java +++ b/src/main/java/com/ftw/hometerview/place/repository/station/StationRepository.java @@ -8,6 +8,6 @@ @Repository public interface StationRepository extends MongoRepository,StationRepositoryCustom { - List findByIds(List ids); + List findAllByIdIn(List ids); } diff --git a/src/main/java/com/ftw/hometerview/place/service/StationService.java b/src/main/java/com/ftw/hometerview/place/service/StationService.java index 77af2e8..12935d9 100644 --- a/src/main/java/com/ftw/hometerview/place/service/StationService.java +++ b/src/main/java/com/ftw/hometerview/place/service/StationService.java @@ -26,7 +26,7 @@ public List searchByKeyword(String keyword, Pageable pageable) } public Map getByIds(List stationIds) { - return unmodifiableMap(this.stationRepository.findByIds(stationIds) + return unmodifiableMap(this.stationRepository.findAllByIdIn(stationIds) .stream().collect(Collectors.toMap(Station::getId, Function.identity()))); } From be52f602fb5f561736f8abcbc1611b2c7b33974c Mon Sep 17 00:00:00 2001 From: rachel3486 Date: Tue, 24 Jan 2023 02:42:43 +0900 Subject: [PATCH 13/13] feat: Modify home review api --- .../building/BuildingRepository.java | 3 + .../place/service/BuildingService.java | 5 + .../review/controller/ReviewController.java | 9 +- .../review/repository/ReviewRepository.java | 2 + .../review/service/ReviewService.java | 76 ++++++++++++++-- .../review/service/ReviewServiceFacade.java | 44 +++++++++ .../review/service/ReviewServiceImpl.java | 91 ------------------- 7 files changed, 128 insertions(+), 102 deletions(-) create mode 100644 src/main/java/com/ftw/hometerview/review/service/ReviewServiceFacade.java delete mode 100644 src/main/java/com/ftw/hometerview/review/service/ReviewServiceImpl.java diff --git a/src/main/java/com/ftw/hometerview/place/repository/building/BuildingRepository.java b/src/main/java/com/ftw/hometerview/place/repository/building/BuildingRepository.java index 7ff5f80..776c80c 100644 --- a/src/main/java/com/ftw/hometerview/place/repository/building/BuildingRepository.java +++ b/src/main/java/com/ftw/hometerview/place/repository/building/BuildingRepository.java @@ -1,6 +1,7 @@ package com.ftw.hometerview.place.repository.building; import com.ftw.hometerview.place.domain.Building; +import java.util.List; import org.springframework.data.mongodb.repository.MongoRepository; import org.springframework.stereotype.Repository; @@ -8,4 +9,6 @@ public interface BuildingRepository extends MongoRepository, BuildingRepositoryCustom { + List findAllByCity(String city); + } diff --git a/src/main/java/com/ftw/hometerview/place/service/BuildingService.java b/src/main/java/com/ftw/hometerview/place/service/BuildingService.java index ee2de0f..4c2d360 100644 --- a/src/main/java/com/ftw/hometerview/place/service/BuildingService.java +++ b/src/main/java/com/ftw/hometerview/place/service/BuildingService.java @@ -20,4 +20,9 @@ public List searchByKeyword(String keyword, Pageable pageable) return response; } + public List getBuildingsByCity(String city) { + List buildings = this.buildingRepository.findAllByCity(city); + return buildings.stream().map(Building::getId).toList(); + } + } diff --git a/src/main/java/com/ftw/hometerview/review/controller/ReviewController.java b/src/main/java/com/ftw/hometerview/review/controller/ReviewController.java index 8681b63..2e6b571 100644 --- a/src/main/java/com/ftw/hometerview/review/controller/ReviewController.java +++ b/src/main/java/com/ftw/hometerview/review/controller/ReviewController.java @@ -6,7 +6,7 @@ import com.ftw.hometerview.core.annotation.NonAuthorized; import com.ftw.hometerview.core.domain.ResponseEntity; import com.ftw.hometerview.review.controller.dto.ReviewDto; -import com.ftw.hometerview.review.service.ReviewService; +import com.ftw.hometerview.review.service.ReviewServiceFacade; import io.swagger.v3.oas.annotations.Operation; import java.util.List; import lombok.RequiredArgsConstructor; @@ -28,16 +28,17 @@ @RestController public class ReviewController { - private final ReviewService reviewService; + private final ReviewServiceFacade reviewService; @Operation(summary = "홈 지역별 리뷰 리스트 조회") @NonAuthorized @GetMapping public ResponseEntity> getMainReviews( - @RequestParam(required = false, defaultValue = DEFAULT_KEYWORD) String buildingId, + // 사용처를 명확히 하고 required 조정 필요. 현재 홈화면 용으로 구현되어서 required임 + @RequestParam(required = false, defaultValue = DEFAULT_KEYWORD) String companyId, @RequestParam(required = false, defaultValue = DEFAULT_KEYWORD) String cityId, @PageableDefault(size = DEFAULT_PAGE_SIZE) Pageable pageable) { - var reviewList = this.reviewService.getHomeReviewList(buildingId, cityId, pageable); + var reviewList = this.reviewService.getHomeReviewList(companyId, cityId, pageable); return ResponseEntity.successResponse(reviewList); } diff --git a/src/main/java/com/ftw/hometerview/review/repository/ReviewRepository.java b/src/main/java/com/ftw/hometerview/review/repository/ReviewRepository.java index 2567274..36dbc36 100644 --- a/src/main/java/com/ftw/hometerview/review/repository/ReviewRepository.java +++ b/src/main/java/com/ftw/hometerview/review/repository/ReviewRepository.java @@ -11,6 +11,8 @@ public interface ReviewRepository extends MongoRepository { List getReviewByBuildingId(String buildingId, Pageable pageable); + List getReviewByCompanyId(String companyId, Pageable pageable); + List getReviewByMemberId(String memberId, Pageable pageable); } diff --git a/src/main/java/com/ftw/hometerview/review/service/ReviewService.java b/src/main/java/com/ftw/hometerview/review/service/ReviewService.java index 4e11c8c..0034e3d 100644 --- a/src/main/java/com/ftw/hometerview/review/service/ReviewService.java +++ b/src/main/java/com/ftw/hometerview/review/service/ReviewService.java @@ -1,21 +1,83 @@ package com.ftw.hometerview.review.service; +import static com.ftw.hometerview.core.interceptor.AuthUtil.getCurrentMemberId; + +import com.ftw.hometerview.core.domain.ResponseType; +import com.ftw.hometerview.core.exception.BadRequestException; +import com.ftw.hometerview.core.exception.NotFoundException; import com.ftw.hometerview.review.controller.dto.ReviewDto; +import com.ftw.hometerview.review.controller.dto.ReviewDto.Create; +import com.ftw.hometerview.review.controller.dto.ReviewDto.Detail; +import com.ftw.hometerview.review.controller.dto.ReviewDto.Meta; +import com.ftw.hometerview.review.controller.dto.ReviewDto.Modify; +import com.ftw.hometerview.review.domain.Review; +import com.ftw.hometerview.review.repository.ReviewRepository; +import java.util.Collections; import java.util.List; +import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + +@RequiredArgsConstructor +@Service +public class ReviewService { + + + private final ReviewRepository reviewRepository; + + public List getHomeReviewList(String companyId, Pageable pageable, List buildingIds) { + List reviews = this.reviewRepository.getReviewByCompanyId(companyId, pageable); + return reviews.stream() + .filter(review -> buildingIds.contains(review.getBuildingId())) + .map(Review::toMeta) + .toList(); + } -public interface ReviewService { + public List getBuildingReviewList(String buildingId, Pageable pageable) { + List reviews = this.reviewRepository.getReviewByBuildingId(buildingId, pageable); + List response = reviews.stream().map(Review::toDetail).toList(); + return response; + } - List getHomeReviewList(String buildingId, String cityId, Pageable pageable); + public List getMyReviewList(Pageable pageable) { + List reviews = this.reviewRepository.getReviewByMemberId(getCurrentMemberId(), + pageable); + List response = reviews.stream().map(Review::toDetail).toList(); + return response; + } - List getBuildingReviewList(String buildingId, Pageable pageable); + public void registerReview(Create req) { + Review review = req.toReview(); + setCertification(review); + this.reviewRepository.save(review); + } - List getMyReviewList(Pageable pageable); + public void modifyReview(Modify req) { + Review review = getReviewWithAuthCheck(req.getReviewId()); + review.modify(req); + setCertification(review); + this.reviewRepository.save(review); + } - void registerReview(ReviewDto.Create req); + private void setCertification(Review review) { + // TODO:: member service, feign... param: getCurrentMemberId, response: String + List cert = Collections.emptyList(); + review.setCertification(cert); + } - void modifyReview(ReviewDto.Modify req); + public void deleteReview(String reviewId) { + Review review = getReviewWithAuthCheck(reviewId); + this.reviewRepository.delete(review); + } - void deleteReview(String reviewId); + private Review getReviewWithAuthCheck(String reviewId) { + Review review = this.reviewRepository.findById(reviewId) + .orElseThrow(() -> new NotFoundException( + ResponseType.REVIEW_NOT_EXIST)); + if (!review.getMemberId().equals(getCurrentMemberId())) { + throw new BadRequestException(ResponseType.REVIEW_NOT_AUTHOR); + } + return review; + } } diff --git a/src/main/java/com/ftw/hometerview/review/service/ReviewServiceFacade.java b/src/main/java/com/ftw/hometerview/review/service/ReviewServiceFacade.java new file mode 100644 index 0000000..0bab94f --- /dev/null +++ b/src/main/java/com/ftw/hometerview/review/service/ReviewServiceFacade.java @@ -0,0 +1,44 @@ +package com.ftw.hometerview.review.service; + +import com.ftw.hometerview.place.service.BuildingService; +import com.ftw.hometerview.review.controller.dto.ReviewDto.Create; +import com.ftw.hometerview.review.controller.dto.ReviewDto.Detail; +import com.ftw.hometerview.review.controller.dto.ReviewDto.Meta; +import com.ftw.hometerview.review.controller.dto.ReviewDto.Modify; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + +@RequiredArgsConstructor +@Service +public class ReviewServiceFacade { + + private final ReviewService reviewService; + private final BuildingService buildingService; + + public List getHomeReviewList(String companyId, String cityId, Pageable pageable) { + List buildingIds = this.buildingService.getBuildingsByCity(cityId); + return this.reviewService.getHomeReviewList(companyId, pageable, buildingIds); + } + + public List getBuildingReviewList(String buildingId, Pageable pageable) { + return this.reviewService.getBuildingReviewList(buildingId, pageable); + } + + public List getMyReviewList(Pageable pageable) { + return this.reviewService.getMyReviewList(pageable); + } + + public void registerReview(Create req) { + this.reviewService.registerReview(req); + } + + public void modifyReview(Modify req) { + this.reviewService.modifyReview(req); + } + + public void deleteReview(String reviewId) { + this.reviewService.deleteReview(reviewId); + } +} diff --git a/src/main/java/com/ftw/hometerview/review/service/ReviewServiceImpl.java b/src/main/java/com/ftw/hometerview/review/service/ReviewServiceImpl.java deleted file mode 100644 index 49f7be8..0000000 --- a/src/main/java/com/ftw/hometerview/review/service/ReviewServiceImpl.java +++ /dev/null @@ -1,91 +0,0 @@ -package com.ftw.hometerview.review.service; - -import static com.ftw.hometerview.core.interceptor.AuthUtil.getCurrentMemberId; - -import com.ftw.hometerview.core.domain.ResponseType; -import com.ftw.hometerview.core.exception.BadRequestException; -import com.ftw.hometerview.core.exception.NotFoundException; -import com.ftw.hometerview.review.controller.dto.ReviewDto; -import com.ftw.hometerview.review.controller.dto.ReviewDto.Create; -import com.ftw.hometerview.review.controller.dto.ReviewDto.Detail; -import com.ftw.hometerview.review.controller.dto.ReviewDto.Meta; -import com.ftw.hometerview.review.controller.dto.ReviewDto.Modify; -import com.ftw.hometerview.review.domain.Review; -import com.ftw.hometerview.review.repository.ReviewRepository; -import java.util.Collections; -import java.util.List; -import lombok.RequiredArgsConstructor; -import org.springframework.data.domain.Pageable; -import org.springframework.stereotype.Service; - -@RequiredArgsConstructor -@Service -public class ReviewServiceImpl implements ReviewService { - - private final ReviewRepository reviewRepository; - - @Override - public List getHomeReviewList(String buildingId, String cityId, Pageable pageable) { - List reviews = this.reviewRepository.getReviewByBuildingId(buildingId, pageable); - List buildingIds = Collections.emptyList(); - // TODO:: buildingservice.getbuildingIds(cityId); - reviews = reviews.stream() - .filter(review -> buildingIds.contains(review.getBuildingId())) - .toList(); - List response = reviews.stream().map(Review::toMeta).toList(); - return response; - } - - @Override - public List getBuildingReviewList(String buildingId, Pageable pageable) { - List reviews = this.reviewRepository.getReviewByBuildingId(buildingId, pageable); - List response = reviews.stream().map(Review::toDetail).toList(); - return response; - } - - @Override - public List getMyReviewList(Pageable pageable) { - List reviews = this.reviewRepository.getReviewByMemberId(getCurrentMemberId(), - pageable); - List response = reviews.stream().map(Review::toDetail).toList(); - return response; - } - - @Override - public void registerReview(Create req) { - Review review = req.toReview(); - setCertification(review); - this.reviewRepository.save(review); - } - - @Override - public void modifyReview(Modify req) { - Review review = getReviewWithAuthCheck(req.getReviewId()); - review.modify(req); - setCertification(review); - this.reviewRepository.save(review); - } - - private void setCertification(Review review) { - // TODO:: member service, feign... param: getCurrentMemberId, response: String - List cert = Collections.emptyList(); - review.setCertification(cert); - } - - @Override - public void deleteReview(String reviewId) { - Review review = getReviewWithAuthCheck(reviewId); - this.reviewRepository.delete(review); - } - - private Review getReviewWithAuthCheck(String reviewId) { - Review review = this.reviewRepository.findById(reviewId) - .orElseThrow(() -> new NotFoundException( - ResponseType.REVIEW_NOT_EXIST)); - if (!review.getMemberId().equals(getCurrentMemberId())) { - throw new BadRequestException(ResponseType.REVIEW_NOT_AUTHOR); - } - return review; - } - -}