Skip to content

Commit

Permalink
feat: 약관 동의 수정, 조회 API 추가한다
Browse files Browse the repository at this point in the history
Issue: #116
  • Loading branch information
melonturtle committed Jan 25, 2024
1 parent 25e207a commit 8bee406
Show file tree
Hide file tree
Showing 9 changed files with 118 additions and 14 deletions.
16 changes: 15 additions & 1 deletion src/docs/asciidoc/member.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -41,4 +41,18 @@ DELETE members/profile/image

#### OK

operation::member-controller-test/remove-members-profile-image[snippets="http-request,http-response"]
operation::member-controller-test/remove-members-profile-image[snippets="http-request,http-response"]

### 7.4 멤버의 약관 동의 정보 조회

[source.html]
GET members/terms

operation::member-controller-test/get-members-terms-agreement[snippets="http-request,http-response"]

### 7.5 멤버의 약관 동의 정보 수정

[source.html]
PUT members/terms

operation::member-controller-test/update-members-terms-agreement[snippets="http-request,http-response"]
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
import life.offonoff.ab.web.response.auth.join.JoinStatusResponse;
import life.offonoff.ab.web.response.auth.join.ProfileRegisterResponse;
import life.offonoff.ab.web.response.auth.join.SignUpResponse;
import life.offonoff.ab.web.response.auth.join.TermsResponse;
import life.offonoff.ab.web.response.auth.join.JoinTermsResponse;
import life.offonoff.ab.web.response.auth.login.SignInResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
Expand Down Expand Up @@ -90,9 +90,9 @@ public JoinStatusResponse registerTerms(TermsRequest request) {
member.agreeTerms(request.toTermsEnabled());

Long memberId = member.getId();
return new TermsResponse(memberId,
member.getJoinStatus(),
tokenProvider.generateToken(memberId));
return new JoinTermsResponse(memberId,
member.getJoinStatus(),
tokenProvider.generateToken(memberId));
}

//== Sign In ==//
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@
import life.offonoff.ab.application.service.common.TextUtils;
import life.offonoff.ab.application.service.request.MemberProfileInfoRequest;
import life.offonoff.ab.application.service.request.MemberRequest;
import life.offonoff.ab.application.service.request.TermsUpdateRequest;
import life.offonoff.ab.domain.member.Member;
import life.offonoff.ab.exception.*;
import life.offonoff.ab.repository.member.MemberRepository;
import life.offonoff.ab.web.response.TermsResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
Expand Down Expand Up @@ -106,4 +108,15 @@ private void removeMembersProfileImage(Member member) {
}
}

@Transactional
public TermsResponse updateMembersTermsAgreement(final Long memberId, final TermsUpdateRequest request) {
Member member = findById(memberId);
member.agreeTerms(request.toTermsEnabled());
return TermsResponse.from(member.getTermsEnabled());
}

public TermsResponse getMembersTermsAgreement(Long memberId) {
Member member = findById(memberId);
return TermsResponse.from(member.getTermsEnabled());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package life.offonoff.ab.application.service.request;

import jakarta.validation.constraints.NotNull;
import life.offonoff.ab.domain.member.TermsEnabled;

public record TermsUpdateRequest(
boolean marketingTermsEnabled
) {
public TermsEnabled toTermsEnabled() {
return new TermsEnabled(marketingTermsEnabled);
}
}
24 changes: 22 additions & 2 deletions src/main/java/life/offonoff/ab/web/MemberController.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,18 @@
import life.offonoff.ab.application.service.member.MemberService;
import life.offonoff.ab.application.service.request.MemberProfileInfoRequest;
import life.offonoff.ab.application.service.request.ProfileImageRequest;
import life.offonoff.ab.application.service.request.TermsUpdateRequest;
import life.offonoff.ab.web.common.aspect.auth.Authorized;
import life.offonoff.ab.web.response.MemberInfoResponse;
import life.offonoff.ab.web.response.TermsResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@RequiredArgsConstructor
Expand All @@ -27,15 +33,15 @@ public ResponseEntity<MemberInfoResponse> getMemberInfo(@Authorized Long memberI
@PutMapping("/profile/information")
public ResponseEntity<Void> updateMembersProfileInformation(
@Authorized final Long memberId,
final MemberProfileInfoRequest request) {
@RequestBody final MemberProfileInfoRequest request) {
memberService.updateMembersProfileInformation(memberId, request);
return ResponseEntity.ok().build();
}

@PutMapping("/profile/image")
public ResponseEntity<Void> updateMembersProfileImage(
@Authorized final Long memberId,
final ProfileImageRequest request
@RequestBody final ProfileImageRequest request
) {
memberService.updateMembersProfileImage(memberId, request.imageUrl());
return ResponseEntity.ok().build();
Expand All @@ -48,4 +54,18 @@ public ResponseEntity<Void> removeMembersProfileImage(
memberService.removeMembersProfileImage(memberId);
return ResponseEntity.ok().build();
}

@GetMapping("/terms")
public ResponseEntity<TermsResponse> getMembersTermsAgreement(@Authorized Long memberId) {
return ResponseEntity.ok(memberService.getMembersTermsAgreement(memberId));
}

@PutMapping("/terms")
public ResponseEntity<TermsResponse> updateMembersTermsAgreement(
@Authorized Long memberId,
@RequestBody final TermsUpdateRequest request
) {
TermsResponse response = memberService.updateMembersTermsAgreement(memberId, request);
return ResponseEntity.ok(response);
}
}
11 changes: 11 additions & 0 deletions src/main/java/life/offonoff/ab/web/response/TermsResponse.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package life.offonoff.ab.web.response;

import life.offonoff.ab.domain.member.TermsEnabled;

public record TermsResponse(
boolean marketingTermsEnabled
) {
public static TermsResponse from(TermsEnabled termsEnabled) {
return new TermsResponse(termsEnabled.getListenMarketing());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@
import lombok.Getter;

@Getter
public class TermsResponse extends JoinStatusResponse {
public class JoinTermsResponse extends JoinStatusResponse {

private String accessToken;

public TermsResponse(Long memberId, JoinStatus status, String accessToken) {
public JoinTermsResponse(Long memberId, JoinStatus status, String accessToken) {
super(memberId, status);
this.accessToken = accessToken;
}
Expand Down
4 changes: 2 additions & 2 deletions src/test/java/life/offonoff/ab/web/AuthControllerTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
import life.offonoff.ab.web.common.aspect.auth.AuthorizedArgumentResolver;
import life.offonoff.ab.web.response.auth.join.ProfileRegisterResponse;
import life.offonoff.ab.web.response.auth.join.SignUpResponse;
import life.offonoff.ab.web.response.auth.join.TermsResponse;
import life.offonoff.ab.web.response.auth.join.JoinTermsResponse;
import life.offonoff.ab.web.response.auth.login.SignInResponse;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
Expand Down Expand Up @@ -151,7 +151,7 @@ void enable_terms() throws Exception {
Long memberId = 1L;

TermsRequest request = new TermsRequest(memberId, true);
TermsResponse response = new TermsResponse(1L, JoinStatus.COMPLETE, "access_token");
JoinTermsResponse response = new JoinTermsResponse(1L, JoinStatus.COMPLETE, "access_token");

when(authService.registerTerms(any(TermsRequest.class))).thenReturn(response);

Expand Down
40 changes: 37 additions & 3 deletions src/test/java/life/offonoff/ab/web/MemberControllerTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,14 @@
import life.offonoff.ab.application.service.member.MemberService;
import life.offonoff.ab.application.service.request.MemberProfileInfoRequest;
import life.offonoff.ab.application.service.request.ProfileImageRequest;
import life.offonoff.ab.application.service.request.TermsUpdateRequest;
import life.offonoff.ab.config.WebConfig;
import life.offonoff.ab.exception.DuplicateNicknameException;
import life.offonoff.ab.exception.LengthInvalidException;
import life.offonoff.ab.exception.NotKoreanEnglishNumberException;
import life.offonoff.ab.restdocs.RestDocsTest;
import life.offonoff.ab.web.common.aspect.auth.AuthorizedArgumentResolver;
import life.offonoff.ab.web.response.TermsResponse;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
Expand All @@ -20,9 +22,9 @@

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.when;
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

Expand All @@ -41,6 +43,7 @@ void updateMembersProfileInformation_withValidField_success() throws Exception {
MemberProfileInfoRequest request = new MemberProfileInfoRequest("바뀔닉네임", "바뀔직업");

mvc.perform(put(MemberUri.PROFILE_INFO).with(csrf().asHeader())
.header("Authorization", "Bearer ACCESS_TOKEN")
.contentType(MediaType.APPLICATION_JSON)
.content(new ObjectMapper().writeValueAsString(request)))
.andExpect(status().isOk());
Expand All @@ -54,6 +57,7 @@ void updateMembersProfileInformation_withIllegalLetterNickname_exception() throw
.when(memberService).updateMembersProfileInformation(any(), any());

mvc.perform(put(MemberUri.PROFILE_INFO).with(csrf().asHeader())
.header("Authorization", "Bearer ACCESS_TOKEN")
.contentType(MediaType.APPLICATION_JSON)
.content(new ObjectMapper().writeValueAsString(request)))
.andExpect(status().isBadRequest())
Expand All @@ -68,6 +72,7 @@ void updateMembersProfileInformation_withLongNickname_exception() throws Excepti
.when(memberService).updateMembersProfileInformation(any(), any());

mvc.perform(put(MemberUri.PROFILE_INFO).with(csrf().asHeader())
.header("Authorization", "Bearer ACCESS_TOKEN")
.contentType(MediaType.APPLICATION_JSON)
.content(new ObjectMapper().writeValueAsString(request)))
.andExpect(status().isBadRequest())
Expand All @@ -82,6 +87,7 @@ void updateMembersProfileInformation_withDuplicateNickname_exception() throws Ex
.when(memberService).updateMembersProfileInformation(any(), any());

mvc.perform(put(MemberUri.PROFILE_INFO).with(csrf().asHeader())
.header("Authorization", "Bearer ACCESS_TOKEN")
.contentType(MediaType.APPLICATION_JSON)
.content(new ObjectMapper().writeValueAsString(request)))
.andExpect(status().isBadRequest())
Expand All @@ -93,20 +99,48 @@ void updateMembersProfileImage() throws Exception {
ProfileImageRequest request = new ProfileImageRequest("htttps://tetestst/test.png");

mvc.perform(put(MemberUri.PROFILE_IMAGE).with(csrf().asHeader())
.header("Authorization", "Bearer ACCESS_TOKEN")
.contentType(MediaType.APPLICATION_JSON)
.content(new ObjectMapper().writeValueAsString(request)))
.andExpect(status().isOk());
}

@Test
void removeMembersProfileImage() throws Exception {
mvc.perform(delete(MemberUri.PROFILE_IMAGE).with(csrf().asHeader()))
mvc.perform(delete(MemberUri.PROFILE_IMAGE).with(csrf().asHeader())
.header("Authorization", "Bearer ACCESS_TOKEN"))
.andExpect(status().isOk());
}

@Test
void getMembersTermsAgreement() throws Exception {
when(memberService.getMembersTermsAgreement(any()))
.thenReturn(new TermsResponse(true));

mvc.perform(get(MemberUri.TERMS)
.header("Authorization", "Bearer ACCESS_TOKEN"))
.andExpect(status().isOk())
.andExpect(jsonPath("marketingTermsEnabled").value(true));
}

@Test
void updateMembersTermsAgreement() throws Exception {
TermsUpdateRequest request = new TermsUpdateRequest(false);
when(memberService.updateMembersTermsAgreement(any(), any()))
.thenReturn(new TermsResponse(false));

mvc.perform(put(MemberUri.TERMS).with(csrf().asHeader())
.header("Authorization", "Bearer ACCESS_TOKEN")
.contentType(MediaType.APPLICATION_JSON)
.content(new ObjectMapper().writeValueAsString(request)))
.andExpect(status().isOk())
.andExpect(jsonPath("marketingTermsEnabled").value(false));
}

private static class MemberUri {
private static final String BASE = "/members";
private static final String PROFILE_INFO = BASE + "/profile/information";
private static final String PROFILE_IMAGE = BASE + "/profile/image";
private static final String TERMS = BASE + "/terms";
}
}

0 comments on commit 8bee406

Please sign in to comment.