Skip to content

Commit c7002da

Browse files
authored
Merge pull request #88 from TeamACON/feat/#87
[FEAT/#87] 인증 동네 리스트 조회 구현
2 parents 874a579 + e478457 commit c7002da

File tree

6 files changed

+54
-17
lines changed

6 files changed

+54
-17
lines changed

src/main/java/com/acon/server/global/exception/ErrorType.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public enum ErrorType {
4848
INVALID_FAVORITE_SPOT_ERROR(HttpStatus.BAD_REQUEST, 40017, "유효하지 않은 favoriteSpot입니다."),
4949
INVALID_FAVORITE_SPOT_RANK_SIZE_ERROR(HttpStatus.BAD_REQUEST, 40030, "favoriteSpotRank의 사이즈가 잘못되었습니다."),
5050
INVALID_FAVORITE_CUISINE_RANK_SIZE_ERROR(HttpStatus.BAD_REQUEST, 40031, "favoriteCuisineRank의 사이즈가 잘못되었습니다."),
51-
ALREADY_VERIFIED_AREA_ERROR(HttpStatus.BAD_REQUEST, 40032, "이미 인증된 동네가 존재합니다."),
51+
INVALID_AREA_SIZE_ERROR(HttpStatus.BAD_REQUEST, 40032, "동네 인증은 최소 1개 ~ 최대 5개까지 가능합니다."),
5252
INVALID_IMAGE_TYPE_ERROR(HttpStatus.BAD_REQUEST, 40045, "유효하지 않은 imageType입니다."),
5353
INVALID_NICKNAME_ERROR(HttpStatus.BAD_REQUEST, 40051, "닉네임이 조건을 만족하지 않습니다."),
5454
INVALID_BIRTH_DATE_ERROR(HttpStatus.BAD_REQUEST, 40053, "유효하지 않은 생년월일입니다."),

src/main/java/com/acon/server/member/api/controller/MemberController.java

+16-6
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,19 @@
33
import com.acon.server.member.api.request.GuidedSpotRequest;
44
import com.acon.server.member.api.request.LoginRequest;
55
import com.acon.server.member.api.request.LogoutRequest;
6-
import com.acon.server.member.api.request.MemberAreaRequest;
76
import com.acon.server.member.api.request.PreferenceRequest;
87
import com.acon.server.member.api.request.ProfileRequest;
98
import com.acon.server.member.api.request.ReissueTokenRequest;
9+
import com.acon.server.member.api.request.VerifiedAreaRequest;
1010
import com.acon.server.member.api.request.WithdrawalReasonRequest;
1111
import com.acon.server.member.api.response.AcornCountResponse;
1212
import com.acon.server.member.api.response.AreaResponse;
1313
import com.acon.server.member.api.response.LoginResponse;
14-
import com.acon.server.member.api.response.MemberAreaResponse;
1514
import com.acon.server.member.api.response.PreSignedUrlResponse;
1615
import com.acon.server.member.api.response.ProfileResponse;
1716
import com.acon.server.member.api.response.ReissueTokenResponse;
17+
import com.acon.server.member.api.response.VerifiedAreaListResponse;
18+
import com.acon.server.member.api.response.VerifiedAreaResponse;
1819
import com.acon.server.member.application.service.MemberService;
1920
import com.acon.server.member.domain.enums.Cuisine;
2021
import com.acon.server.member.domain.enums.DislikeFood;
@@ -62,16 +63,25 @@ public ResponseEntity<LoginResponse> login(
6263
);
6364
}
6465

65-
@PostMapping(path = "/member/area",
66+
@PostMapping(path = "/members/verified-areas",
6667
consumes = MediaType.APPLICATION_JSON_VALUE,
6768
produces = MediaType.APPLICATION_JSON_VALUE
6869
)
69-
public ResponseEntity<MemberAreaResponse> postArea(
70-
@Valid @RequestBody final MemberAreaRequest request
70+
public ResponseEntity<VerifiedAreaResponse> postVerifiedArea(
71+
@Valid @RequestBody final VerifiedAreaRequest request
7172
) {
7273

7374
return ResponseEntity.ok(
74-
memberService.createMemberArea(request.latitude(), request.longitude())
75+
memberService.createVerifiedArea(request.latitude(), request.longitude())
76+
);
77+
}
78+
79+
@GetMapping(path = "/members/verified-areas", produces = MediaType.APPLICATION_JSON_VALUE)
80+
public ResponseEntity<VerifiedAreaListResponse> getVerifiedAreaList(
81+
) {
82+
83+
return ResponseEntity.ok(
84+
memberService.fetchVerifiedAreaList()
7585
);
7686
}
7787

src/main/java/com/acon/server/member/api/request/MemberAreaRequest.java src/main/java/com/acon/server/member/api/request/VerifiedAreaRequest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.acon.server.member.api.request;
22

33
// TODO: validation 추가
4-
public record MemberAreaRequest(
4+
public record VerifiedAreaRequest(
55
Double latitude,
66
Double longitude
77
) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.acon.server.member.api.response;
2+
3+
import java.util.List;
4+
5+
public record VerifiedAreaListResponse(
6+
List<VerifiedAreaResponse> verifiedAreaList
7+
) {
8+
9+
}
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
package com.acon.server.member.api.response;
22

3-
public record MemberAreaResponse(
3+
public record VerifiedAreaResponse(
44
Long id,
55
String name
66
) {
77

8-
public static MemberAreaResponse of(
8+
public static VerifiedAreaResponse of(
99
final Long id,
1010
final String name
1111
) {
12-
return new MemberAreaResponse(id, name);
12+
return new VerifiedAreaResponse(id, name);
1313
}
1414
}

src/main/java/com/acon/server/member/application/service/MemberService.java

+24-6
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,11 @@
99
import com.acon.server.global.external.s3.S3Adapter;
1010
import com.acon.server.member.api.response.AcornCountResponse;
1111
import com.acon.server.member.api.response.LoginResponse;
12-
import com.acon.server.member.api.response.MemberAreaResponse;
1312
import com.acon.server.member.api.response.PreSignedUrlResponse;
1413
import com.acon.server.member.api.response.ProfileResponse;
1514
import com.acon.server.member.api.response.ReissueTokenResponse;
15+
import com.acon.server.member.api.response.VerifiedAreaListResponse;
16+
import com.acon.server.member.api.response.VerifiedAreaResponse;
1617
import com.acon.server.member.application.mapper.GuidedSpotMapper;
1718
import com.acon.server.member.application.mapper.MemberMapper;
1819
import com.acon.server.member.application.mapper.PreferenceMapper;
@@ -61,6 +62,7 @@ public class MemberService {
6162
private static final char[] CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.".toCharArray();
6263
private static final int MAX_NICKNAME_LENGTH = 16;
6364
private static final String NICKNAME_PATTERN = "^[a-zA-Z0-9_.가-힣]+$";
65+
private static final int MAX_VERIFIED_AREA_SIZE = 5;
6466

6567
private final GuidedSpotRepository guidedSpotRepository;
6668
private final MemberRepository memberRepository;
@@ -155,15 +157,17 @@ private String generateRandomNickname() {
155157
}
156158

157159
@Transactional
158-
public MemberAreaResponse createMemberArea(
160+
public VerifiedAreaResponse createVerifiedArea(
159161
final Double latitude,
160162
final Double longitude
161163
) {
162164
MemberEntity memberEntity = memberRepository.findByIdOrElseThrow(principalHandler.getUserIdFromPrincipal());
163165

164-
// 추후 여러 동네 인증이 가능하게 되면 제거 예정
165-
if (verifiedAreaRepository.existsByMemberId(memberEntity.getId())) {
166-
throw new BusinessException(ErrorType.ALREADY_VERIFIED_AREA_ERROR);
166+
List<VerifiedAreaEntity> verifiedAreaEntityList = verifiedAreaRepository.findAllByMemberId(
167+
memberEntity.getId());
168+
169+
if (verifiedAreaEntityList.size() >= MAX_VERIFIED_AREA_SIZE) {
170+
throw new BusinessException(ErrorType.INVALID_AREA_SIZE_ERROR);
167171
}
168172

169173
String legalDong = naverMapsAdapter.getReverseGeoCodingResult(latitude, longitude);
@@ -175,7 +179,21 @@ public MemberAreaResponse createMemberArea(
175179
.map(entity -> updateVerifiedAreaEntity(entity, currentDate))
176180
.orElseGet(() -> createVerifiedAreaEntity(legalDong, memberEntity.getId(), currentDate));
177181

178-
return MemberAreaResponse.of(savedVerifiedAreaEntity.getId(), savedVerifiedAreaEntity.getName());
182+
return VerifiedAreaResponse.of(savedVerifiedAreaEntity.getId(), savedVerifiedAreaEntity.getName());
183+
}
184+
185+
@Transactional(readOnly = true)
186+
public VerifiedAreaListResponse fetchVerifiedAreaList() {
187+
MemberEntity memberEntity = memberRepository.findByIdOrElseThrow(principalHandler.getUserIdFromPrincipal());
188+
List<VerifiedAreaEntity> verifiedAreaEntityList = verifiedAreaRepository.findAllByMemberId(
189+
memberEntity.getId());
190+
List<VerifiedAreaResponse> verifiedAreaList = verifiedAreaEntityList.stream()
191+
.map(verifiedAreaEntity -> VerifiedAreaResponse.of(verifiedAreaEntity.getId(),
192+
verifiedAreaEntity.getName()))
193+
.toList();
194+
195+
return new VerifiedAreaListResponse(verifiedAreaList);
196+
179197
}
180198

181199
private VerifiedAreaEntity updateVerifiedAreaEntity(

0 commit comments

Comments
 (0)