diff --git a/src/main/java/org/atdev/artrip/domain/Enum/DomesticRegion.java b/src/main/java/org/atdev/artrip/domain/Enum/DomesticRegion.java new file mode 100644 index 0000000..0e43912 --- /dev/null +++ b/src/main/java/org/atdev/artrip/domain/Enum/DomesticRegion.java @@ -0,0 +1,20 @@ +package org.atdev.artrip.domain.Enum; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public enum DomesticRegion { + + SEOUL("서울", "https://arttrip.s3.ap-northeast-2.amazonaws.com/region/%EC%84%9C%EC%9A%B8.jpg"), + GYEONGGI("경기", "https://arttrip.s3.ap-northeast-2.amazonaws.com/region/%EA%B2%BD%EA%B8%B0.jpg"), + JEONLA("전라", "https://arttrip.s3.ap-northeast-2.amazonaws.com/region/%EC%A0%84%EB%9D%BC.jpg"), + JEJU("제주", "https://arttrip.s3.ap-northeast-2.amazonaws.com/region/%EC%A0%9C%EC%A3%BC.jpg"), + GYEONGSANG("경상", "https://arttrip.s3.ap-northeast-2.amazonaws.com/region/%EA%B2%BD%EC%83%81.jpg"), + GANGWON("강원", "https://arttrip.s3.ap-northeast-2.amazonaws.com/region/%EA%B0%95%EC%9B%90.jpg"), + CHUNGCHEONG("충청", "https://arttrip.s3.ap-northeast-2.amazonaws.com/region/%EC%B6%A9%EC%B2%AD.jpg"); + + private final String region; + private final String imageUrl; +} diff --git a/src/main/java/org/atdev/artrip/domain/exhibit/web/controller/ExhibitController.java b/src/main/java/org/atdev/artrip/domain/exhibit/web/controller/ExhibitController.java index 9c5b192..94138f7 100644 --- a/src/main/java/org/atdev/artrip/domain/exhibit/web/controller/ExhibitController.java +++ b/src/main/java/org/atdev/artrip/domain/exhibit/web/controller/ExhibitController.java @@ -7,6 +7,7 @@ import org.atdev.artrip.domain.exhibit.web.dto.request.ExhibitFilterRequest; import org.atdev.artrip.domain.home.response.FilterResponse; import org.atdev.artrip.domain.home.service.HomeService; +import org.atdev.artrip.domain.home.web.dto.response.RegionResponse; import org.atdev.artrip.global.apipayload.CommonResponse; import org.atdev.artrip.global.apipayload.code.status.CommonError; import org.atdev.artrip.global.apipayload.code.status.HomeError; @@ -19,6 +20,7 @@ import org.springframework.web.bind.annotation.*; import java.util.List; +import java.util.Map; @RestController @RequiredArgsConstructor @@ -71,16 +73,28 @@ public ResponseEntity>> getOverseas(){ return ResponseEntity.ok(CommonResponse.onSuccess(OverseasList)); } - @Operation(summary = "국내 지역 목록 조회") +// @Operation(summary = "국내 지역 목록 조회") +// @ApiErrorResponses( +// common = {CommonError._BAD_REQUEST, CommonError._UNAUTHORIZED} +// ) +// @GetMapping("/domestic") +// public ResponseEntity>> getDomestic(){ +// +// List domesticList = homeService.getDomestic(); +// +// return ResponseEntity.ok(CommonResponse.onSuccess(domesticList)); +// } + + @Operation(summary = "국내 지역 목록 조회")//하드코딩 @ApiErrorResponses( common = {CommonError._BAD_REQUEST, CommonError._UNAUTHORIZED} ) @GetMapping("/domestic") - public ResponseEntity>> getDomestic(){ + public ResponseEntity>> getDomestic2(){ - List domesticList = homeService.getDomestic(); + List response = homeService.getRegions(); - return ResponseEntity.ok(CommonResponse.onSuccess(domesticList)); + return ResponseEntity.ok(CommonResponse.onSuccess(response)); } diff --git a/src/main/java/org/atdev/artrip/domain/exhibitHall/repository/ExhibitHallRepository.java b/src/main/java/org/atdev/artrip/domain/exhibitHall/repository/ExhibitHallRepository.java index e5130a9..b3f4108 100644 --- a/src/main/java/org/atdev/artrip/domain/exhibitHall/repository/ExhibitHallRepository.java +++ b/src/main/java/org/atdev/artrip/domain/exhibitHall/repository/ExhibitHallRepository.java @@ -17,8 +17,14 @@ public interface ExhibitHallRepository extends JpaRepository @Query("SELECT DISTINCT e.country FROM ExhibitHall e WHERE e.country <> '한국'") List findAllOverseasCountries(); - @Query("SELECT DISTINCT e.region FROM ExhibitHall e WHERE e.country IN ('한국', '대한민국')") - List findAllDomesticRegions(); +// @Query(""" +// select distinct e.region +// from ExhibitHall e +// where (e.isDomestic = true +// or e.country in ('한국', '대한민국')) +// and e.region is not null +// """) +// List findAllDomesticRegions(); Optional findByName(String placeName); diff --git a/src/main/java/org/atdev/artrip/domain/home/converter/HomeConverter.java b/src/main/java/org/atdev/artrip/domain/home/converter/HomeConverter.java index 4954cff..30f8e4c 100644 --- a/src/main/java/org/atdev/artrip/domain/home/converter/HomeConverter.java +++ b/src/main/java/org/atdev/artrip/domain/home/converter/HomeConverter.java @@ -1,16 +1,19 @@ package org.atdev.artrip.domain.home.converter; +import org.atdev.artrip.domain.Enum.DomesticRegion; import org.atdev.artrip.domain.Enum.KeywordType; import org.atdev.artrip.domain.exhibit.data.Exhibit; import org.atdev.artrip.domain.exhibit.reponse.ExhibitDetailResponse; import org.atdev.artrip.domain.home.response.FilterResponse; import org.atdev.artrip.domain.home.response.HomeListResponse; import org.atdev.artrip.domain.home.web.dto.request.*; +import org.atdev.artrip.domain.home.web.dto.response.RegionResponse; import org.atdev.artrip.domain.keyword.data.Keyword; import org.springframework.data.domain.Slice; import org.springframework.stereotype.Component; import java.time.format.DateTimeFormatter; +import java.util.Arrays; import java.util.List; import java.util.Set; import java.util.stream.Collectors; @@ -137,5 +140,14 @@ private String normalize(String value) { return value; } + public List toResponseList() { + return Arrays.stream(DomesticRegion.values()) + .map(region -> RegionResponse.builder() + .region(region.getRegion()) + .imageUrl(region.getImageUrl()) + .build()) + .collect(Collectors.toList()); + } + } diff --git a/src/main/java/org/atdev/artrip/domain/home/service/HomeService.java b/src/main/java/org/atdev/artrip/domain/home/service/HomeService.java index d90c3b9..b6b671f 100644 --- a/src/main/java/org/atdev/artrip/domain/home/service/HomeService.java +++ b/src/main/java/org/atdev/artrip/domain/home/service/HomeService.java @@ -12,6 +12,7 @@ import org.atdev.artrip.domain.exhibit.repository.ExhibitRepository; import org.atdev.artrip.domain.home.response.HomeListResponse; import org.atdev.artrip.domain.home.web.dto.request.*; +import org.atdev.artrip.domain.home.web.dto.response.RegionResponse; import org.atdev.artrip.domain.keyword.data.Keyword; import org.atdev.artrip.domain.keyword.data.UserKeyword; import org.atdev.artrip.domain.keyword.repository.UserKeywordRepository; @@ -23,9 +24,8 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.Collections; -import java.util.List; -import java.util.Set; +import java.util.*; +import java.util.stream.Collectors; @Service @RequiredArgsConstructor @@ -68,8 +68,12 @@ public List getOverseas(){ } // 국내 지역 목록 조회 - public List getDomestic(){ - return exhibitHallRepository.findAllDomesticRegions(); +// public List getDomestic(){ +// return exhibitHallRepository.findAllDomesticRegions(); +// } + + public List getRegions() { + return homeConverter.toResponseList(); } diff --git a/src/main/java/org/atdev/artrip/domain/home/web/dto/response/RegionResponse.java b/src/main/java/org/atdev/artrip/domain/home/web/dto/response/RegionResponse.java new file mode 100644 index 0000000..b6bc89d --- /dev/null +++ b/src/main/java/org/atdev/artrip/domain/home/web/dto/response/RegionResponse.java @@ -0,0 +1,13 @@ +package org.atdev.artrip.domain.home.web.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +@AllArgsConstructor +public class RegionResponse { + private String region; + private String imageUrl; +} \ No newline at end of file diff --git a/src/main/java/org/atdev/artrip/domain/keyword/service/KeywordService.java b/src/main/java/org/atdev/artrip/domain/keyword/service/KeywordService.java index 2acfa31..3db869a 100644 --- a/src/main/java/org/atdev/artrip/domain/keyword/service/KeywordService.java +++ b/src/main/java/org/atdev/artrip/domain/keyword/service/KeywordService.java @@ -1,12 +1,19 @@ package org.atdev.artrip.domain.keyword.service; import lombok.RequiredArgsConstructor; +import org.atdev.artrip.domain.auth.data.User; +import org.atdev.artrip.domain.auth.repository.UserRepository; +import org.atdev.artrip.domain.keyword.data.Keyword; +import org.atdev.artrip.domain.keyword.data.UserKeyword; import org.atdev.artrip.domain.keyword.repository.KeywordRepository; import org.atdev.artrip.domain.keyword.repository.UserKeywordRepository; import org.atdev.artrip.domain.keyword.web.dto.KeywordResponse; +import org.atdev.artrip.global.apipayload.code.status.UserError; +import org.atdev.artrip.global.apipayload.exception.GeneralException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDateTime; import java.util.List; import java.util.stream.Collectors; @@ -16,6 +23,28 @@ public class KeywordService { private final KeywordRepository keywordRepository; private final UserKeywordRepository userKeywordRepository; + private final UserRepository userRepository; + + @Transactional + public void saveUserKeywords(Long userId, List keywordIds) { + + User user = userRepository.findById(userId) + .orElseThrow(() -> new GeneralException(UserError._USER_NOT_FOUND)); + + userKeywordRepository.deleteByUser(user); + + List keywords = keywordRepository.findAllById(keywordIds); + + List userKeywords = keywords.stream() + .map(keyword -> UserKeyword.builder() + .user(user) + .keyword(keyword) + .createdAt(LocalDateTime.now()) + .build()) + .toList(); + + userKeywordRepository.saveAll(userKeywords); + } @Transactional public List getAllKeywords() { diff --git a/src/main/java/org/atdev/artrip/domain/keyword/web/controller/UserKeywordController.java b/src/main/java/org/atdev/artrip/domain/keyword/web/controller/UserKeywordController.java index d2883e3..f72da68 100644 --- a/src/main/java/org/atdev/artrip/domain/keyword/web/controller/UserKeywordController.java +++ b/src/main/java/org/atdev/artrip/domain/keyword/web/controller/UserKeywordController.java @@ -23,6 +23,22 @@ public class UserKeywordController { private final KeywordService keywordService; + @Operation(summary = "나의 취향 분석", description = "내가 선택한 키워드 선택 저장") + @ApiErrorResponses( + common = {CommonError._INTERNAL_SERVER_ERROR, CommonError._UNAUTHORIZED}, + keyword = {KeywordError._KEYWORD_INVALID_REQUEST, KeywordError._KEYWORD_SELECTION_LIMIT_EXCEEDED, KeywordError._KEYWORD_NOT_FOUND} + ) + @PostMapping("/keywords") + public ResponseEntity> saveUserKeywords( + @AuthenticationPrincipal UserDetails userDetails, + @RequestBody KeywordRequest request) { + + Long userId = Long.parseLong(userDetails.getUsername()); // subject → userId형변환 + + keywordService.saveUserKeywords(userId, request.getKeywordIds()); + return ResponseEntity.ok(CommonResponse.onSuccess(null)); + } + @Operation(summary = "모든 키워드 조회", description = "전체 조회") @ApiErrorResponses( common = {CommonError._INTERNAL_SERVER_ERROR}, diff --git a/src/main/java/org/atdev/artrip/domain/review/web/controller/ReviewController.java b/src/main/java/org/atdev/artrip/domain/review/web/controller/ReviewController.java index 3b5eca6..ce70b75 100644 --- a/src/main/java/org/atdev/artrip/domain/review/web/controller/ReviewController.java +++ b/src/main/java/org/atdev/artrip/domain/review/web/controller/ReviewController.java @@ -34,8 +34,8 @@ public class ReviewController { ) @PostMapping("/{exhibitId}") public ResponseEntity> CreateReview(@PathVariable Long exhibitId, - @RequestPart("images") List images, - @RequestPart("request") ReviewCreateRequest request, + @RequestPart(value = "images",required = false) List images, + @RequestPart(value = "request") ReviewCreateRequest request, @AuthenticationPrincipal UserDetails userDetails){ Long userId = Long.valueOf(userDetails.getUsername()); diff --git a/src/main/java/org/atdev/artrip/domain/user/service/UserService.java b/src/main/java/org/atdev/artrip/domain/user/service/UserService.java index 98eb47e..66f64a3 100644 --- a/src/main/java/org/atdev/artrip/domain/user/service/UserService.java +++ b/src/main/java/org/atdev/artrip/domain/user/service/UserService.java @@ -27,35 +27,10 @@ @RequiredArgsConstructor public class UserService { - private final KeywordRepository keywordRepository; - private final UserKeywordRepository userKeywordRepository; private final UserRepository userRepository; private final S3Service s3Service; - private static final String NICKNAME_REGEX = "^[a-zA-Z0-9가-힣]+$"; - - @Transactional - public void saveUserKeywords(Long userId, List keywordIds) { - - User user = userRepository.findById(userId) - .orElseThrow(() -> new GeneralException(UserError._USER_NOT_FOUND)); - - userKeywordRepository.deleteByUser(user); - - List keywords = keywordRepository.findAllById(keywordIds); - - List userKeywords = keywords.stream() - .map(keyword -> UserKeyword.builder() - .user(user) - .keyword(keyword) - .createdAt(LocalDateTime.now()) - .build()) - .toList(); - - userKeywordRepository.saveAll(userKeywords); - } - @Transactional public NicknameResponse updateNickName(Long userId, NicknameRequest dto){ diff --git a/src/main/java/org/atdev/artrip/domain/user/web/controller/UserController.java b/src/main/java/org/atdev/artrip/domain/user/web/controller/UserController.java index 1de7093..c325e24 100644 --- a/src/main/java/org/atdev/artrip/domain/user/web/controller/UserController.java +++ b/src/main/java/org/atdev/artrip/domain/user/web/controller/UserController.java @@ -2,6 +2,7 @@ import io.swagger.v3.oas.annotations.Operation; import lombok.RequiredArgsConstructor; +import org.atdev.artrip.domain.keyword.service.KeywordService; import org.atdev.artrip.domain.keyword.web.dto.KeywordRequest; import org.atdev.artrip.domain.user.service.UserService; import org.atdev.artrip.domain.user.web.dto.request.NicknameRequest; @@ -26,22 +27,6 @@ public class UserController { private final UserService userService; - @Operation(summary = "나의 취향 분석", description = "내가 선택한 키워드 선택 저장") - @ApiErrorResponses( - common = {CommonError._INTERNAL_SERVER_ERROR, CommonError._UNAUTHORIZED}, - keyword = {KeywordError._KEYWORD_INVALID_REQUEST, KeywordError._KEYWORD_SELECTION_LIMIT_EXCEEDED, KeywordError._KEYWORD_NOT_FOUND} - ) - @PostMapping("/keywords") - public ResponseEntity> saveUserKeywords( - @AuthenticationPrincipal UserDetails userDetails, - @RequestBody KeywordRequest request) { - - Long userId = Long.parseLong(userDetails.getUsername()); // subject → userId형변환 - - userService.saveUserKeywords(userId, request.getKeywordIds()); - return ResponseEntity.ok(CommonResponse.onSuccess(null)); - } - @Operation(summary = "프로필 이미지 추가", description = "프로필 이미지를 추가합니다") @PostMapping(value = "/profile", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) @ApiErrorResponses(