Skip to content

Commit

Permalink
Merge pull request #169 from IT-Cotato/feature/168-implement-profile-…
Browse files Browse the repository at this point in the history
…info-api-및-exit-room-api

Feature: implement profile info api 및 exit room api(#168)
  • Loading branch information
yooooonshine authored Feb 11, 2025
2 parents bbecdf4 + 33ada85 commit 3042b40
Show file tree
Hide file tree
Showing 10 changed files with 268 additions and 21 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,13 @@
import middle_point_search.backend.common.util.MemberLoader;
import middle_point_search.backend.domains.member.dto.request.CreateMemberRequest;
import middle_point_search.backend.domains.member.dto.request.DeleteMemberRequest;
import middle_point_search.backend.domains.member.dto.request.FindMemberInfoResponse;
import middle_point_search.backend.domains.member.dto.request.LoginMemberRequest;
import middle_point_search.backend.domains.member.dto.request.SendEmailVerificationRequest;
import middle_point_search.backend.domains.member.dto.request.SendNewPasswordRequest;
import middle_point_search.backend.domains.member.dto.request.SendPasswordReissueVerificationRequest;
import middle_point_search.backend.domains.member.dto.request.UpdateMemberInfoRequest;
import middle_point_search.backend.domains.member.dto.request.UpdateMemberAddressRequest;
import middle_point_search.backend.domains.member.dto.request.UpdateMemberNameRequest;
import middle_point_search.backend.domains.member.dto.request.UpdatePasswordRequest;
import middle_point_search.backend.domains.member.dto.request.VerifyEmailVerificationCodeRequest;
import middle_point_search.backend.domains.member.dto.response.FindProfileImageUrlResponse;
Expand Down Expand Up @@ -297,10 +299,10 @@ public ResponseEntity<DataResponse<Void>> sendNewPassword(
return ResponseEntity.ok(DataResponse.ok());
}

@PatchMapping("/info")
@GetMapping("/info")
@Operation(
summary = "회원정보(닉네임, 주소) 수정",
description = "회원정보(닉네임, 주소) 수정",
summary = "회원정보 조회",
description = "회원정보 조회",
responses = {
@ApiResponse(
responseCode = "200",
Expand All @@ -318,16 +320,112 @@ public ResponseEntity<DataResponse<Void>> sendNewPassword(
)
}
)
public ResponseEntity<DataResponse<Void>> updateMemberInfo(
@Valid @RequestBody UpdateMemberInfoRequest request
public ResponseEntity<DataResponse<FindMemberInfoResponse>> findMemberInfo() {
Long memberId = memberLoader.getMemberId();

FindMemberInfoResponse response = memberService.findMemberInfo(memberId);

return ResponseEntity.ok(DataResponse.from(response));
}

@PatchMapping("/name")
@Operation(
summary = "닉네임 수정",
description = """
닉네임 수정
""",
responses = {
@ApiResponse(
responseCode = "200",
description = "성공"
),
@ApiResponse(
responseCode = "401",
description = "인증에 실패하였습니다.[C-101]",
content = @Content(schema = @Schema(implementation = ErrorResponse.class))
),
@ApiResponse(
responseCode = "402",
description = "Access Token을 재발급해야합니다.[A-004]",
content = @Content(schema = @Schema(implementation = ErrorResponse.class))
)
}
)
public ResponseEntity<DataResponse<Void>> updateMemberName(
@Valid @RequestBody UpdateMemberNameRequest request
) {
Long memberId = memberLoader.getMemberId();

memberService.updateMemberName(memberId, request);

return ResponseEntity.ok(DataResponse.ok());
}

@PatchMapping("/address")
@Operation(
summary = "주소 수정",
description = """
주소 수정
""",
responses = {
@ApiResponse(
responseCode = "200",
description = "성공"
),
@ApiResponse(
responseCode = "401",
description = "인증에 실패하였습니다.[C-101]",
content = @Content(schema = @Schema(implementation = ErrorResponse.class))
),
@ApiResponse(
responseCode = "402",
description = "Access Token을 재발급해야합니다.[A-004]",
content = @Content(schema = @Schema(implementation = ErrorResponse.class))
)
}
)
public ResponseEntity<DataResponse<Void>> updateMemberAddress(
@Valid @RequestBody UpdateMemberAddressRequest request
) {
Long memberId = memberLoader.getMemberId();

memberService.updateMemberInfo(memberId, request);
memberService.updateMemberAddress(memberId, request);

return ResponseEntity.ok(DataResponse.ok());
}

@DeleteMapping("/address")
@Operation(
summary = "주소 삭제",
description = """
주소 삭제
""",
responses = {
@ApiResponse(
responseCode = "200",
description = "성공"
),
@ApiResponse(
responseCode = "401",
description = "인증에 실패하였습니다.[C-101]",
content = @Content(schema = @Schema(implementation = ErrorResponse.class))
),
@ApiResponse(
responseCode = "402",
description = "Access Token을 재발급해야합니다.[A-004]",
content = @Content(schema = @Schema(implementation = ErrorResponse.class))
)
}
)
public ResponseEntity<DataResponse<Void>> deleteMemberAddress() {
Long memberId = memberLoader.getMemberId();

memberService.deleteMemberAddress(memberId);

return ResponseEntity.ok(DataResponse.ok());
}


// 파일 업로드 전 사전 서명된 URL 생성
@GetMapping("/profile/presigned")
@Operation(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,16 @@ public void updateAddress(
this.addressLongitude = addressLongitude;
}

// 주소 삭제
public void deleteAddress() {
this.existAddress = false;
this.siDo = null;
this.siGunGu = null;
this.roadNameAddress = null;
this.addressLatitude = null;
this.addressLongitude = null;
}

// 프로필 이미지 path 변경
public void updateProfileImagePath(String profileImagePath) {
this.profileImagePath = profileImagePath;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package middle_point_search.backend.domains.member.dto.request;

import com.fasterxml.jackson.annotation.JsonInclude;

import middle_point_search.backend.domains.member.domain.Member;

@JsonInclude(JsonInclude.Include.NON_NULL)
public record FindMemberInfoResponse(
String email,
String name,
String existAddress,
String siDo,
String siGunGu,
String roadNameAddress,
Double addressLatitude,
Double addressLongitude
) {
public static FindMemberInfoResponse from(Member member) {
if (member.getExistAddress()) {
return new FindMemberInfoResponse(
member.getEmail(),
member.getName(),
"true",
member.getSiDo(),
member.getSiGunGu(),
member.getRoadNameAddress(),
member.getAddressLatitude(),
member.getAddressLongitude()
);
} else {
return new FindMemberInfoResponse(
member.getEmail(),
member.getName(),
"false",
null,
null,
null,
null,
null
);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package middle_point_search.backend.domains.member.dto.request;

import jakarta.validation.constraints.NotBlank;

public record UpdateMemberAddressRequest(
@NotBlank(message = "siDo는 비어있을 수 없습니다.") String siDo,
@NotBlank(message = "siGunGu는 비어있을 수 없습니다.") String siGunGu,
@NotBlank(message = "roadNameAddress는 비어있을 수 없습니다.") String roadNameAddress,
Double addressLatitude,
Double addressLongitude
) {
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package middle_point_search.backend.domains.member.dto.request;

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;

public record UpdateMemberNameRequest(
@NotBlank(message = "이름을 입력해주세요.") @Size(min = 2, max = 30, message = "이름은 2자 이상, 30자 이하여야 합니다.") String name
) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,12 @@
import middle_point_search.backend.domains.member.domain.Member;
import middle_point_search.backend.domains.member.domain.Role;
import middle_point_search.backend.domains.member.dto.request.CreateMemberRequest;
import middle_point_search.backend.domains.member.dto.request.FindMemberInfoResponse;
import middle_point_search.backend.domains.member.dto.request.SendEmailVerificationRequest;
import middle_point_search.backend.domains.member.dto.request.SendNewPasswordRequest;
import middle_point_search.backend.domains.member.dto.request.SendPasswordReissueVerificationRequest;
import middle_point_search.backend.domains.member.dto.request.UpdateMemberInfoRequest;
import middle_point_search.backend.domains.member.dto.request.UpdateMemberAddressRequest;
import middle_point_search.backend.domains.member.dto.request.UpdateMemberNameRequest;
import middle_point_search.backend.domains.member.dto.request.VerifyEmailVerificationCodeRequest;
import middle_point_search.backend.domains.member.dto.response.FindProfileImageUrlResponse;
import middle_point_search.backend.domains.member.dto.response.VerifyEmailVerificationCodeResponse;
Expand Down Expand Up @@ -187,13 +189,21 @@ public void sendPasswordReissueVerification(SendPasswordReissueVerificationReque
emailService.sendPasswordReissueVerificationCodeEmail(request.getEmail(), code);
}

// 회원 정보(닉네임, 주소) 수정
// 이름 수정
@Transactional
public void updateMemberInfo(Long memberId, UpdateMemberInfoRequest request) {
public void updateMemberName(Long memberId, UpdateMemberNameRequest request) {
Member member = memberRepository.findById(memberId)
.orElseThrow(() -> CustomException.from(MEMBER_NOT_FOUND));

member.updateName(request.name());
}

// 주소 수정
@Transactional
public void updateMemberAddress(Long memberId, UpdateMemberAddressRequest request) {
Member member = memberRepository.findById(memberId)
.orElseThrow(() -> CustomException.from(MEMBER_NOT_FOUND));

member.updateAddress(
request.siDo(),
request.siGunGu(),
Expand All @@ -202,6 +212,15 @@ public void updateMemberInfo(Long memberId, UpdateMemberInfoRequest request) {
request.addressLongitude());
}

// 회원 주소 삭제
@Transactional
public void deleteMemberAddress(Long memberId) {
Member member = memberRepository.findById(memberId)
.orElseThrow(() -> CustomException.from(MEMBER_NOT_FOUND));

member.deleteAddress();
}

// 회원 프로필 presigned path 생성
@Transactional
public CreatePreSignedUrlResponse createProfilePreSignedUrl(Long memberId, String filename) {
Expand Down Expand Up @@ -249,6 +268,7 @@ public void deleteProfileImage(Long memberId) {
member.updateProfileImagePath(null);
}

// 회원 삭제
@Transactional
public void deleteMember(Long memberId, String accessToken) {
memberRoomRepository.deleteAllByMemberId(memberId);
Expand All @@ -260,5 +280,12 @@ public void deleteMember(Long memberId, String accessToken) {
// 같은 accessToken 및 refreshToken으로 접속 못하도록 로그아웃
logoutMember(memberId, accessToken);
}

public FindMemberInfoResponse findMemberInfo(Long memberId) {
Member member = memberRepository.findById(memberId)
.orElseThrow(() -> CustomException.from(MEMBER_NOT_FOUND));

return FindMemberInfoResponse.from(member);
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import java.util.List;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
Expand Down Expand Up @@ -132,4 +133,45 @@ public ResponseEntity<DataResponse<ExistsMemberRoomResponse>> existsMemberRoom(

return ResponseEntity.ok(DataResponse.from(response));
}

@DeleteMapping("/rooms/{roomId}")
@Operation(
summary = "회원을 방에서 삭제",
description = "회원을 방에서 삭제합니다.",
responses = {
@ApiResponse(
responseCode = "200",
description = "성공"
),
@ApiResponse(
responseCode = "401",
description = "인증에 실패하였습니다.[C-101]",
content = @Content(schema = @Schema(implementation = ErrorResponse.class))
),
@ApiResponse(
responseCode = "402",
description = "Access Token을 재발급해야합니다.[A-004]",
content = @Content(schema = @Schema(implementation = ErrorResponse.class))
),
@ApiResponse(
responseCode = "404",
description = "존재하지 않는 방입니다.[R-201]",
content = @Content(schema = @Schema(implementation = ErrorResponse.class))
),
@ApiResponse(
responseCode = "409",
description = "해당 방에 존재하지 않는 회원입니다.[MR-001]",
content = @Content(schema = @Schema(implementation = ErrorResponse.class))
)
}
)
public ResponseEntity<DataResponse<Void>> deleteMemberFromRoom(@PathVariable("roomId") String roomId) {
Long memberId = memberLoader.getMemberId();

memberRoomService.deleteMemberFromRoom(memberId, roomId);

return ResponseEntity.ok(DataResponse.ok());
}
}


Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,8 @@ public interface MemberRoomRepository extends JpaRepository<MemberRoom, Long> {
List<MemberRoom> findAllByRoomId(String roomId);

void deleteAllByMemberId(Long memberId);

void deleteByRoomIdAndMemberId(String roomId, Long memberId);

boolean existsByRoomId(String roomId);
}
Loading

0 comments on commit 3042b40

Please sign in to comment.