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

Feature/#270 마이페이지 수정 api 개발 #275

Open
wants to merge 3 commits into
base: develop
Choose a base branch
from
Open
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
11 changes: 11 additions & 0 deletions src/docs/asciidoc/member.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -57,3 +57,14 @@ include::{snippets}/get-sidebar-info/http-response.adoc[]

.Response Body's Fields
include::{snippets}/get-sidebar-info/response-body.adoc[]

== `PATCH`: 마이페이지 수정

.HTTP Request
include::{snippets}/myPage-update/http-request.adoc[]

.HTTP Response
include::{snippets}/myPage-update/http-response.adoc[]

.Path Parameters
include::{snippets}/myPage-update/path-parameters.adoc[]
13 changes: 12 additions & 1 deletion src/main/java/doore/member/api/MemberController.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,18 @@
import doore.member.application.MemberCommandService;
import doore.member.application.MemberQueryService;
import doore.member.application.dto.response.MemberAndMyTeamsAndStudiesResponse;
import doore.member.application.dto.response.MyPageUpdateRequest;
import doore.member.domain.Member;
import doore.resolver.LoginMember;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@Validated
Expand Down Expand Up @@ -46,7 +49,15 @@ public ResponseEntity<Void> deleteMember(@LoginMember final Member member) {

@GetMapping("/members/{memberId}")
public ResponseEntity<MemberAndMyTeamsAndStudiesResponse> getSideBarInfo(@PathVariable final Long memberId,
@LoginMember final Member member) {
@LoginMember final Member member) {
return ResponseEntity.ok(memberQueryService.getSideBarInfo(memberId, member.getId()));
}

@PatchMapping("/myPage/members/{memberId}")
public ResponseEntity<Void> updateMyPage(@Valid @RequestBody final MyPageUpdateRequest request,
@PathVariable final Long memberId, @LoginMember final Member member) {
memberCommandService.updateMyPage(request, memberId, member.getId());
return ResponseEntity.noContent().build();
}
Comment on lines +56 to +61
Copy link
Collaborator

Choose a reason for hiding this comment

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

API 주소를 /myPage/members/{memberId}에서 /members/me로 수정하는게 어떨까요?
memberId와 로그인 member id 값을 서비스로 전달해서 값이 동일한지 검증하는 로직도 있는데 타인의 정보를 수정할 수 있는 API가 아니기 때문에 memberId 없이 로그인 정보 기반으로만 동작하도록 해도 좋을 것 같습니다.


}
11 changes: 11 additions & 0 deletions src/main/java/doore/member/application/MemberCommandService.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package doore.member.application;

import doore.login.application.dto.response.GoogleAccountProfileResponse;
import doore.member.application.convenience.MemberConvenience;
import doore.member.application.convenience.MemberValidateAccessPermission;
import doore.member.application.convenience.StudyRoleValidateAccessPermission;
import doore.member.application.convenience.TeamRoleValidateAccessPermission;
import doore.member.application.dto.response.MyPageUpdateRequest;
import doore.member.domain.Member;
import doore.member.domain.StudyRole;
import doore.member.domain.TeamRole;
Expand All @@ -21,6 +23,8 @@ public class MemberCommandService {

private final MemberRepository memberRepository;

private final MemberConvenience memberConvenience;

private final TeamRoleValidateAccessPermission teamRoleValidateAccessPermission;
private final StudyRoleValidateAccessPermission studyRoleValidateAccessPermission;
private final TeamValidateAccessPermission teamValidateAccessPermission;
Expand Down Expand Up @@ -67,4 +71,11 @@ public void deleteMember(final Long memberId) {
final Member member = memberValidateAccessPermission.getValidateExistMember(memberId);
memberRepository.delete(member);
}

public void updateMyPage(final MyPageUpdateRequest request, final Long memberId, final Long tokenMemberId) {
final Member member = memberValidateAccessPermission.getValidateExistMember(memberId);
memberConvenience.checkSameMemberIdAndTokenMemberId(memberId, tokenMemberId);
member.updateMyPage(request.name());
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package doore.member.application.dto.response;

import jakarta.validation.constraints.NotNull;

public record MyPageUpdateRequest(
@NotNull(message = "이름을 입력해주세요.")
String name
Comment on lines +6 to +7
Copy link
Collaborator

Choose a reason for hiding this comment

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

이 부분은 기획에서 정의되지 않았지만 일반적으로 공백 이름이 설정되면 안되기 때문에 @notblank로 검증하는게 좋을 것 같습니다

) {
}
4 changes: 4 additions & 0 deletions src/main/java/doore/member/domain/Member.java
Original file line number Diff line number Diff line change
Expand Up @@ -47,4 +47,8 @@ private Member(final Long id, final String name, final String googleId, final St
this.imageUrl = imageUrl;
this.isDeleted = false;
}

public void updateMyPage(String name) {
this.name = name;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@

import doore.helper.IntegrationTest;
import doore.login.application.dto.response.GoogleAccountProfileResponse;
import doore.member.application.dto.response.MyPageUpdateRequest;
import doore.member.domain.Member;
import doore.member.domain.StudyRole;
import doore.member.domain.TeamRole;
Expand Down Expand Up @@ -229,4 +230,28 @@ void init() {
memberCommandService.transferStudyLeader(study.getId(), member.getId(), notStudyLeaderMember.getId());
});
}

@Test
@DisplayName("[성공] 정상적으로 마이페이지 정보를 수정할 수 있다.")
void updateMyPage_정상적으로_마이페이지_정보를_수정할_수_있다_성공() {
final MyPageUpdateRequest request = new MyPageUpdateRequest("수정된 이름");
final Member beforeMemberInfo = memberRepository.findById(member.getId()).orElseThrow();
assertThat(beforeMemberInfo.getName()).isEqualTo("아마란스");

memberCommandService.updateMyPage(request, member.getId(), member.getId());
final Member afterMemberInfo = memberRepository.findById(member.getId()).orElseThrow();

assertThat(afterMemberInfo.getName()).isEqualTo(request.name());
}

@Test
@DisplayName("[실패] 본인이 아니라면 마이페이지 정보를 수정할 수 없다.")
void updateMyPage_본인이_아니라면_마이페이지_정보를_수정할_수_없다_실패() {
final MyPageUpdateRequest request = new MyPageUpdateRequest("수정된 이름");
final Member otherMember = memberRepository.save(미나());

assertThatThrownBy(() -> {
memberCommandService.updateMyPage(request, member.getId(), otherMember.getId());
}).isInstanceOf(MemberException.class).hasMessage(UNAUTHORIZED.errorMessage());
}
}
21 changes: 21 additions & 0 deletions src/test/java/doore/restdocs/docs/MemberApiDocsTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,14 @@
import static org.mockito.Mockito.when;
import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document;
import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get;
import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields;
import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields;
import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName;
import static org.springframework.restdocs.request.RequestDocumentation.pathParameters;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

import doore.member.application.dto.response.MemberAndMyTeamsAndStudiesResponse;
import doore.member.application.dto.response.MyPageUpdateRequest;
import doore.restdocs.RestDocsTest;
import doore.study.application.dto.response.StudyNameResponse;
import doore.team.application.dto.response.MyTeamsAndStudiesResponse;
Expand Down Expand Up @@ -107,4 +109,23 @@ void setUp() {
.andExpect(status().isOk())
.andDo(document("get-sidebar-info", pathParameters, responseFieldsSnippet));
}

@Test
@DisplayName("[성공] 마이페이지를 수정한다.")
public void updateMyPage_마이페이지를_수정한다_성공() throws Exception {
final MyPageUpdateRequest request = new MyPageUpdateRequest("수정된 이름");

mockMvc.perform(RestDocumentationRequestBuilders.patch("/myPage/members/{memberId}", 1)
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(request)))
.andExpect(status().isNoContent())
.andDo(document("myPage-update",
pathParameters(
parameterWithName("memberId").description("멤버 id")
),
requestFields(
stringFieldWithPath("name", "수정할 이름")
)
));
}
}