Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[FEAT/#87] 인증 동네 리스트 조회 구현 #88

Merged
merged 6 commits into from
Feb 18, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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_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, "유효하지 않은 생년월일입니다."),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -62,16 +63,25 @@ public ResponseEntity<LoginResponse> login(
);
}

@PostMapping(path = "/member/area",
@PostMapping(path = "/members/verified-areas",
consumes = MediaType.APPLICATION_JSON_VALUE,
produces = MediaType.APPLICATION_JSON_VALUE
)
public ResponseEntity<MemberAreaResponse> postArea(
@Valid @RequestBody final MemberAreaRequest request
public ResponseEntity<VerifiedAreaResponse> 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<VerifiedAreaListResponse> getVerifiedAreaList(
) {

return ResponseEntity.ok(
memberService.fetchVerifiedAreaList()
);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.acon.server.member.api.request;

// TODO: validation 추가
public record MemberAreaRequest(
public record VerifiedAreaRequest(
Double latitude,
Double longitude
) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.acon.server.member.api.response;

import java.util.List;

public record VerifiedAreaListResponse(
List<VerifiedAreaResponse> verifiedAreaList
) {

}
Original file line number Diff line number Diff line change
@@ -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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -61,6 +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_SIZE = 5;

private final GuidedSpotRepository guidedSpotRepository;
private final MemberRepository memberRepository;
Expand Down Expand Up @@ -155,15 +157,17 @@ private String generateRandomNickname() {
}

@Transactional
public MemberAreaResponse createMemberArea(
public VerifiedAreaResponse createVerifiedArea(
final Double latitude,
final Double longitude
) {
MemberEntity memberEntity = memberRepository.findByIdOrElseThrow(principalHandler.getUserIdFromPrincipal());

// 추후 여러 동네 인증이 가능하게 되면 제거 예정
if (verifiedAreaRepository.existsByMemberId(memberEntity.getId())) {
throw new BusinessException(ErrorType.ALREADY_VERIFIED_AREA_ERROR);
List<VerifiedAreaEntity> verifiedAreaEntityList = verifiedAreaRepository.findAllByMemberId(
memberEntity.getId());

if (verifiedAreaEntityList.size() >= MAX_VERIFIED_AREA_SIZE) {
throw new BusinessException(ErrorType.INVALID_AREA_SIZE_ERROR);
}

String legalDong = naverMapsAdapter.getReverseGeoCodingResult(latitude, longitude);
Expand All @@ -175,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<VerifiedAreaEntity> verifiedAreaEntityList = verifiedAreaRepository.findAllByMemberId(
memberEntity.getId());
List<VerifiedAreaResponse> verifiedAreaList = verifiedAreaEntityList.stream()
.map(verifiedAreaEntity -> VerifiedAreaResponse.of(verifiedAreaEntity.getId(),
verifiedAreaEntity.getName()))
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2:

  1. VerifiedAreaListResponse 내부에 VerifiedArea를 만들어서 사용하는 것보다 이미 있는 VerifiedAreaResponse를 사용하는 건 어떨까요? (제안)

  2. new를 통한 객체 생성보다는 정적 팩토리 메서드 방식으로 바꿔주면 좋을 것 같아용

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

e478457
수정했습니당

.toList();

return new VerifiedAreaListResponse(verifiedAreaList);

}

private VerifiedAreaEntity updateVerifiedAreaEntity(
Expand Down