From 4b652a9a7748fbcb1a1c5959104cc7a5e2db14da Mon Sep 17 00:00:00 2001 From: gahyuun Date: Tue, 18 Feb 2025 19:32:53 +0900 Subject: [PATCH 1/4] =?UTF-8?q?chore:=20=EB=8F=99=EB=84=A4=20=EC=9D=B8?= =?UTF-8?q?=EC=A6=9D=20=EC=97=94=EB=93=9C=20=ED=8F=AC=EC=9D=B8=ED=8A=B8=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=20(#87)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/acon/server/member/api/controller/MemberController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/acon/server/member/api/controller/MemberController.java b/src/main/java/com/acon/server/member/api/controller/MemberController.java index d4c340f..d8a7993 100644 --- a/src/main/java/com/acon/server/member/api/controller/MemberController.java +++ b/src/main/java/com/acon/server/member/api/controller/MemberController.java @@ -56,7 +56,7 @@ public ResponseEntity login( ); } - @PostMapping(path = "/member/area", + @PostMapping(path = "/members/area", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE ) From 15d5369e4472cf53f538ca2d71ecd2d02d40f13a Mon Sep 17 00:00:00 2001 From: gahyuun Date: Tue, 18 Feb 2025 21:37:07 +0900 Subject: [PATCH 2/4] =?UTF-8?q?fix:=20=EB=8F=99=EB=84=A4=20=EC=9D=B8?= =?UTF-8?q?=EC=A6=9D=20=EC=97=AC=EB=9F=AC=20=EB=8F=99=20=EA=B0=80=EB=8A=A5?= =?UTF-8?q?=ED=95=98=EA=B2=8C=20=EC=88=98=EC=A0=95=20(#87)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/acon/server/global/exception/ErrorType.java | 2 +- .../server/member/application/service/MemberService.java | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/acon/server/global/exception/ErrorType.java b/src/main/java/com/acon/server/global/exception/ErrorType.java index 3e52b43..47ba40e 100644 --- a/src/main/java/com/acon/server/global/exception/ErrorType.java +++ b/src/main/java/com/acon/server/global/exception/ErrorType.java @@ -48,7 +48,7 @@ public enum ErrorType { INVALID_FAVORITE_SPOT_ERROR(HttpStatus.BAD_REQUEST, 40017, "유효하지 않은 favoriteSpot입니다."), INVALID_FAVORITE_SPOT_RANK_SIZE_ERROR(HttpStatus.BAD_REQUEST, 40030, "favoriteSpotRank의 사이즈가 잘못되었습니다."), INVALID_FAVORITE_CUISINE_RANK_SIZE_ERROR(HttpStatus.BAD_REQUEST, 40031, "favoriteCuisineRank의 사이즈가 잘못되었습니다."), - ALREADY_VERIFIED_AREA_ERROR(HttpStatus.BAD_REQUEST, 40032, "이미 인증된 동네가 존재합니다."), + INVALID_AREA_NUMBER_ERROR(HttpStatus.BAD_REQUEST, 40032, "동네 인증은 최소 1개 ~ 최대 5개까지 가능합니다."), INVALID_IMAGE_TYPE_ERROR(HttpStatus.BAD_REQUEST, 40045, "유효하지 않은 imageType입니다."), INVALID_NICKNAME_ERROR(HttpStatus.BAD_REQUEST, 40051, "닉네임이 조건을 만족하지 않습니다."), INVALID_BIRTH_DATE_ERROR(HttpStatus.BAD_REQUEST, 40053, "유효하지 않은 생년월일입니다."), diff --git a/src/main/java/com/acon/server/member/application/service/MemberService.java b/src/main/java/com/acon/server/member/application/service/MemberService.java index 808cfea..a4d781a 100644 --- a/src/main/java/com/acon/server/member/application/service/MemberService.java +++ b/src/main/java/com/acon/server/member/application/service/MemberService.java @@ -61,6 +61,7 @@ public class MemberService { private static final char[] CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.".toCharArray(); private static final int MAX_NICKNAME_LENGTH = 16; private static final String NICKNAME_PATTERN = "^[a-zA-Z0-9_.가-힣]+$"; + private static final int NUMBER_OF_VERIFIED_AREA = 5; private final GuidedSpotRepository guidedSpotRepository; private final MemberRepository memberRepository; @@ -161,9 +162,10 @@ public MemberAreaResponse createMemberArea( ) { MemberEntity memberEntity = memberRepository.findByIdOrElseThrow(principalHandler.getUserIdFromPrincipal()); - // 추후 여러 동네 인증이 가능하게 되면 제거 예정 - if (verifiedAreaRepository.existsByMemberId(memberEntity.getId())) { - throw new BusinessException(ErrorType.ALREADY_VERIFIED_AREA_ERROR); + List verifiedAreaEntityList = verifiedAreaRepository.findAllByMemberId( + memberEntity.getId()); + if (verifiedAreaEntityList.size() > NUMBER_OF_VERIFIED_AREA || verifiedAreaEntityList.isEmpty()) { + throw new BusinessException(ErrorType.INVALID_AREA_NUMBER_ERROR); } String legalDong = naverMapsAdapter.getReverseGeoCodingResult(latitude, longitude); From 8b478b34ea77027994802743e0c1cf32f488e8af Mon Sep 17 00:00:00 2001 From: gahyuun Date: Tue, 18 Feb 2025 22:36:32 +0900 Subject: [PATCH 3/4] =?UTF-8?q?feat:=20=EC=9D=B8=EC=A6=9D=20=EB=8F=99?= =?UTF-8?q?=EB=84=A4=20=EC=A1=B0=ED=9A=8C=20API=20=EA=B5=AC=ED=98=84=20(#8?= =?UTF-8?q?7)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/controller/MemberController.java | 22 +++++++++++----- ...aRequest.java => VerifiedAreaRequest.java} | 2 +- .../response/VerifiedAreaListResponse.java | 16 ++++++++++++ ...esponse.java => VerifiedAreaResponse.java} | 6 ++--- .../application/service/MemberService.java | 26 +++++++++++++++---- 5 files changed, 57 insertions(+), 15 deletions(-) rename src/main/java/com/acon/server/member/api/request/{MemberAreaRequest.java => VerifiedAreaRequest.java} (78%) create mode 100644 src/main/java/com/acon/server/member/api/response/VerifiedAreaListResponse.java rename src/main/java/com/acon/server/member/api/response/{MemberAreaResponse.java => VerifiedAreaResponse.java} (55%) diff --git a/src/main/java/com/acon/server/member/api/controller/MemberController.java b/src/main/java/com/acon/server/member/api/controller/MemberController.java index d8e7380..d122417 100644 --- a/src/main/java/com/acon/server/member/api/controller/MemberController.java +++ b/src/main/java/com/acon/server/member/api/controller/MemberController.java @@ -3,18 +3,19 @@ import com.acon.server.member.api.request.GuidedSpotRequest; import com.acon.server.member.api.request.LoginRequest; import com.acon.server.member.api.request.LogoutRequest; -import com.acon.server.member.api.request.MemberAreaRequest; import com.acon.server.member.api.request.PreferenceRequest; import com.acon.server.member.api.request.ProfileRequest; import com.acon.server.member.api.request.ReissueTokenRequest; +import com.acon.server.member.api.request.VerifiedAreaRequest; import com.acon.server.member.api.request.WithdrawalReasonRequest; import com.acon.server.member.api.response.AcornCountResponse; import com.acon.server.member.api.response.AreaResponse; import com.acon.server.member.api.response.LoginResponse; -import com.acon.server.member.api.response.MemberAreaResponse; import com.acon.server.member.api.response.PreSignedUrlResponse; import com.acon.server.member.api.response.ProfileResponse; import com.acon.server.member.api.response.ReissueTokenResponse; +import com.acon.server.member.api.response.VerifiedAreaListResponse; +import com.acon.server.member.api.response.VerifiedAreaResponse; import com.acon.server.member.application.service.MemberService; import com.acon.server.member.domain.enums.Cuisine; import com.acon.server.member.domain.enums.DislikeFood; @@ -62,16 +63,25 @@ public ResponseEntity login( ); } - @PostMapping(path = "/members/area", + @PostMapping(path = "/members/verified-areas", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE ) - public ResponseEntity postArea( - @Valid @RequestBody final MemberAreaRequest request + public ResponseEntity postVerifiedArea( + @Valid @RequestBody final VerifiedAreaRequest request ) { return ResponseEntity.ok( - memberService.createMemberArea(request.latitude(), request.longitude()) + memberService.createVerifiedArea(request.latitude(), request.longitude()) + ); + } + + @GetMapping(path = "/members/verified-areas", produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity getVerifiedAreaList( + ) { + + return ResponseEntity.ok( + memberService.fetchVerifiedAreaList() ); } diff --git a/src/main/java/com/acon/server/member/api/request/MemberAreaRequest.java b/src/main/java/com/acon/server/member/api/request/VerifiedAreaRequest.java similarity index 78% rename from src/main/java/com/acon/server/member/api/request/MemberAreaRequest.java rename to src/main/java/com/acon/server/member/api/request/VerifiedAreaRequest.java index 047388f..39d561e 100644 --- a/src/main/java/com/acon/server/member/api/request/MemberAreaRequest.java +++ b/src/main/java/com/acon/server/member/api/request/VerifiedAreaRequest.java @@ -1,7 +1,7 @@ package com.acon.server.member.api.request; // TODO: validation 추가 -public record MemberAreaRequest( +public record VerifiedAreaRequest( Double latitude, Double longitude ) { diff --git a/src/main/java/com/acon/server/member/api/response/VerifiedAreaListResponse.java b/src/main/java/com/acon/server/member/api/response/VerifiedAreaListResponse.java new file mode 100644 index 0000000..2c07899 --- /dev/null +++ b/src/main/java/com/acon/server/member/api/response/VerifiedAreaListResponse.java @@ -0,0 +1,16 @@ +package com.acon.server.member.api.response; + +import java.util.List; + +public record VerifiedAreaListResponse( + List verifiedAreaList +) { + + public record VerifiedArea( + Long id, + String name + ) { + + } + +} diff --git a/src/main/java/com/acon/server/member/api/response/MemberAreaResponse.java b/src/main/java/com/acon/server/member/api/response/VerifiedAreaResponse.java similarity index 55% rename from src/main/java/com/acon/server/member/api/response/MemberAreaResponse.java rename to src/main/java/com/acon/server/member/api/response/VerifiedAreaResponse.java index 69946cc..0aaeffc 100644 --- a/src/main/java/com/acon/server/member/api/response/MemberAreaResponse.java +++ b/src/main/java/com/acon/server/member/api/response/VerifiedAreaResponse.java @@ -1,14 +1,14 @@ package com.acon.server.member.api.response; -public record MemberAreaResponse( +public record VerifiedAreaResponse( Long id, String name ) { - public static MemberAreaResponse of( + public static VerifiedAreaResponse of( final Long id, final String name ) { - return new MemberAreaResponse(id, name); + return new VerifiedAreaResponse(id, name); } } diff --git a/src/main/java/com/acon/server/member/application/service/MemberService.java b/src/main/java/com/acon/server/member/application/service/MemberService.java index a4d781a..364429a 100644 --- a/src/main/java/com/acon/server/member/application/service/MemberService.java +++ b/src/main/java/com/acon/server/member/application/service/MemberService.java @@ -9,10 +9,11 @@ import com.acon.server.global.external.s3.S3Adapter; import com.acon.server.member.api.response.AcornCountResponse; import com.acon.server.member.api.response.LoginResponse; -import com.acon.server.member.api.response.MemberAreaResponse; import com.acon.server.member.api.response.PreSignedUrlResponse; import com.acon.server.member.api.response.ProfileResponse; import com.acon.server.member.api.response.ReissueTokenResponse; +import com.acon.server.member.api.response.VerifiedAreaListResponse; +import com.acon.server.member.api.response.VerifiedAreaResponse; import com.acon.server.member.application.mapper.GuidedSpotMapper; import com.acon.server.member.application.mapper.MemberMapper; import com.acon.server.member.application.mapper.PreferenceMapper; @@ -61,7 +62,7 @@ public class MemberService { private static final char[] CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.".toCharArray(); private static final int MAX_NICKNAME_LENGTH = 16; private static final String NICKNAME_PATTERN = "^[a-zA-Z0-9_.가-힣]+$"; - private static final int NUMBER_OF_VERIFIED_AREA = 5; + private static final int MAX_VERIFIED_AREA_LIST = 5; private final GuidedSpotRepository guidedSpotRepository; private final MemberRepository memberRepository; @@ -156,7 +157,7 @@ private String generateRandomNickname() { } @Transactional - public MemberAreaResponse createMemberArea( + public VerifiedAreaResponse createVerifiedArea( final Double latitude, final Double longitude ) { @@ -164,7 +165,8 @@ public MemberAreaResponse createMemberArea( List verifiedAreaEntityList = verifiedAreaRepository.findAllByMemberId( memberEntity.getId()); - if (verifiedAreaEntityList.size() > NUMBER_OF_VERIFIED_AREA || verifiedAreaEntityList.isEmpty()) { + + if (verifiedAreaEntityList.size() > MAX_VERIFIED_AREA_LIST - 1) { throw new BusinessException(ErrorType.INVALID_AREA_NUMBER_ERROR); } @@ -177,7 +179,21 @@ public MemberAreaResponse createMemberArea( .map(entity -> updateVerifiedAreaEntity(entity, currentDate)) .orElseGet(() -> createVerifiedAreaEntity(legalDong, memberEntity.getId(), currentDate)); - return MemberAreaResponse.of(savedVerifiedAreaEntity.getId(), savedVerifiedAreaEntity.getName()); + return VerifiedAreaResponse.of(savedVerifiedAreaEntity.getId(), savedVerifiedAreaEntity.getName()); + } + + @Transactional(readOnly = true) + public VerifiedAreaListResponse fetchVerifiedAreaList() { + MemberEntity memberEntity = memberRepository.findByIdOrElseThrow(principalHandler.getUserIdFromPrincipal()); + List verifiedAreaEntityList = verifiedAreaRepository.findAllByMemberId( + memberEntity.getId()); + List verifiedAreaList = verifiedAreaEntityList.stream() + .map(verifiedAreaEntity -> new VerifiedAreaListResponse.VerifiedArea(verifiedAreaEntity.getId(), + verifiedAreaEntity.getName())) + .toList(); + + return new VerifiedAreaListResponse(verifiedAreaList); + } private VerifiedAreaEntity updateVerifiedAreaEntity( From e4784570b555204b2ba228c09652ac544658ad95 Mon Sep 17 00:00:00 2001 From: gahyuun Date: Wed, 19 Feb 2025 00:21:30 +0900 Subject: [PATCH 4/4] =?UTF-8?q?fix:=20size=20=EB=84=A4=EC=9D=B4=EB=B0=8D?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EC=A0=95=EC=A0=81=20?= =?UTF-8?q?=ED=8C=A9=ED=86=A0=EB=A6=AC=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=20(#87)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/acon/server/global/exception/ErrorType.java | 2 +- .../member/api/response/VerifiedAreaListResponse.java | 9 +-------- .../member/application/service/MemberService.java | 10 +++++----- 3 files changed, 7 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/acon/server/global/exception/ErrorType.java b/src/main/java/com/acon/server/global/exception/ErrorType.java index 47ba40e..9311977 100644 --- a/src/main/java/com/acon/server/global/exception/ErrorType.java +++ b/src/main/java/com/acon/server/global/exception/ErrorType.java @@ -48,7 +48,7 @@ public enum ErrorType { INVALID_FAVORITE_SPOT_ERROR(HttpStatus.BAD_REQUEST, 40017, "유효하지 않은 favoriteSpot입니다."), INVALID_FAVORITE_SPOT_RANK_SIZE_ERROR(HttpStatus.BAD_REQUEST, 40030, "favoriteSpotRank의 사이즈가 잘못되었습니다."), INVALID_FAVORITE_CUISINE_RANK_SIZE_ERROR(HttpStatus.BAD_REQUEST, 40031, "favoriteCuisineRank의 사이즈가 잘못되었습니다."), - INVALID_AREA_NUMBER_ERROR(HttpStatus.BAD_REQUEST, 40032, "동네 인증은 최소 1개 ~ 최대 5개까지 가능합니다."), + INVALID_AREA_SIZE_ERROR(HttpStatus.BAD_REQUEST, 40032, "동네 인증은 최소 1개 ~ 최대 5개까지 가능합니다."), INVALID_IMAGE_TYPE_ERROR(HttpStatus.BAD_REQUEST, 40045, "유효하지 않은 imageType입니다."), INVALID_NICKNAME_ERROR(HttpStatus.BAD_REQUEST, 40051, "닉네임이 조건을 만족하지 않습니다."), INVALID_BIRTH_DATE_ERROR(HttpStatus.BAD_REQUEST, 40053, "유효하지 않은 생년월일입니다."), diff --git a/src/main/java/com/acon/server/member/api/response/VerifiedAreaListResponse.java b/src/main/java/com/acon/server/member/api/response/VerifiedAreaListResponse.java index 2c07899..61638c4 100644 --- a/src/main/java/com/acon/server/member/api/response/VerifiedAreaListResponse.java +++ b/src/main/java/com/acon/server/member/api/response/VerifiedAreaListResponse.java @@ -3,14 +3,7 @@ import java.util.List; public record VerifiedAreaListResponse( - List verifiedAreaList + List verifiedAreaList ) { - public record VerifiedArea( - Long id, - String name - ) { - - } - } diff --git a/src/main/java/com/acon/server/member/application/service/MemberService.java b/src/main/java/com/acon/server/member/application/service/MemberService.java index 364429a..af6e5df 100644 --- a/src/main/java/com/acon/server/member/application/service/MemberService.java +++ b/src/main/java/com/acon/server/member/application/service/MemberService.java @@ -62,7 +62,7 @@ public class MemberService { private static final char[] CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.".toCharArray(); private static final int MAX_NICKNAME_LENGTH = 16; private static final String NICKNAME_PATTERN = "^[a-zA-Z0-9_.가-힣]+$"; - private static final int MAX_VERIFIED_AREA_LIST = 5; + private static final int MAX_VERIFIED_AREA_SIZE = 5; private final GuidedSpotRepository guidedSpotRepository; private final MemberRepository memberRepository; @@ -166,8 +166,8 @@ public VerifiedAreaResponse createVerifiedArea( List verifiedAreaEntityList = verifiedAreaRepository.findAllByMemberId( memberEntity.getId()); - if (verifiedAreaEntityList.size() > MAX_VERIFIED_AREA_LIST - 1) { - throw new BusinessException(ErrorType.INVALID_AREA_NUMBER_ERROR); + if (verifiedAreaEntityList.size() >= MAX_VERIFIED_AREA_SIZE) { + throw new BusinessException(ErrorType.INVALID_AREA_SIZE_ERROR); } String legalDong = naverMapsAdapter.getReverseGeoCodingResult(latitude, longitude); @@ -187,8 +187,8 @@ public VerifiedAreaListResponse fetchVerifiedAreaList() { MemberEntity memberEntity = memberRepository.findByIdOrElseThrow(principalHandler.getUserIdFromPrincipal()); List verifiedAreaEntityList = verifiedAreaRepository.findAllByMemberId( memberEntity.getId()); - List verifiedAreaList = verifiedAreaEntityList.stream() - .map(verifiedAreaEntity -> new VerifiedAreaListResponse.VerifiedArea(verifiedAreaEntity.getId(), + List verifiedAreaList = verifiedAreaEntityList.stream() + .map(verifiedAreaEntity -> VerifiedAreaResponse.of(verifiedAreaEntity.getId(), verifiedAreaEntity.getName())) .toList();