Skip to content

Commit

Permalink
Merge pull request #173 from nhnacademy-be4-ckin/feat/member
Browse files Browse the repository at this point in the history
[FEAT] Member 관련
  • Loading branch information
devhomh authored Mar 24, 2024
2 parents 1bc7046 + 25dc441 commit ee63a0e
Show file tree
Hide file tree
Showing 13 changed files with 252 additions and 26 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,17 +13,13 @@
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import store.ckin.api.member.domain.request.MemberAuthRequestDto;
import store.ckin.api.member.domain.request.MemberCreateRequestDto;
import store.ckin.api.member.domain.request.MemberEmailOnlyRequestDto;
import store.ckin.api.member.domain.request.MemberOauthIdOnlyRequestDto;
import store.ckin.api.member.domain.response.MemberAuthResponseDto;
import store.ckin.api.member.domain.response.MemberMyPageResponseDto;
import store.ckin.api.member.domain.response.MemberOauthLoginResponseDto;
import store.ckin.api.member.domain.request.*;
import store.ckin.api.member.domain.response.*;
import store.ckin.api.member.entity.Member;
import store.ckin.api.member.exception.MemberAlreadyExistsException;
import store.ckin.api.member.exception.MemberCannotChangeStateException;
import store.ckin.api.member.exception.MemberNotFoundException;
import store.ckin.api.member.exception.MemberPasswordCannotChangeException;
import store.ckin.api.member.service.MemberService;

/**
Expand All @@ -49,6 +45,12 @@ public ResponseEntity<Boolean> checkDuplicateEmail(
.body(memberService.alreadyExistsEmail(memberEmailOnlyRequestDto));
}

@GetMapping("/members/{memberId}/checkPassword")
public ResponseEntity<MemberPasswordResponseDto> checkPassword(@PathVariable("memberId") Long memberId) {
return ResponseEntity.status(HttpStatus.OK)
.body(memberService.getPassword(memberId));
}

/**
* Member 생성을 하는 API Method 입니다.
*
Expand Down Expand Up @@ -107,7 +109,7 @@ public ResponseEntity<MemberOauthLoginResponseDto> getOauthMemberInfo(
/**
* 서비스를 이용할 때마다 최근 로그인 날짜를 갱신해주는 메서드 입니다.
*/
@PutMapping("/members/{memberId}/update")
@PutMapping("/members/{memberId}/update-log")
public ResponseEntity<Void> memberUpdateLoginLog(@PathVariable("memberId") Long memberId) {
memberService.updateLatestLoginAt(memberId);

Expand All @@ -134,10 +136,45 @@ public ResponseEntity<Void> setDormantMember(@PathVariable("memberId") Long memb
return ResponseEntity.status(HttpStatus.OK).build();
}

/**
* 비밀번호를 변경하는 API 메서드 입니다.
*/
@PutMapping("/members/{memberId}/password")
public ResponseEntity<Void> changePassword(@PathVariable("memberId") Long memberId,
@Valid @RequestBody MemberPasswordRequestDto memberPasswordRequestDto) {
memberService.changePassword(memberId, memberPasswordRequestDto);

return ResponseEntity.status(HttpStatus.OK).build();
}

/**
* 회원정보를를 수정하는 API 메서드 입니다.
*/
@PutMapping("/members/{memberId}/update-info")
public ResponseEntity<Void> updateMemberInfo(@PathVariable("memberId") Long memberId,
@Valid @RequestBody MemberUpdateRequestDto memberUpdateRequestDto) {
memberService.updateMemberInfo(memberId, memberUpdateRequestDto);

return ResponseEntity.status(HttpStatus.OK).build();
}

/**
* 멤버 관련 정보를 가져오는 API 메서드 입니다.
*/
@GetMapping("/members/{memberId}/info")
public ResponseEntity<MemberDetailInfoResponseDto> getMemberDetailInfo(@PathVariable("memberId") Long memberId) {
return ResponseEntity.status(HttpStatus.OK)
.body(memberService.getMemberDetailInfo(memberId));
}

/**
* 409 Code 로 응답을 보내는 ExceptionHandler 입니다.
*/
@ExceptionHandler({MemberAlreadyExistsException.class, MemberCannotChangeStateException.class})
@ExceptionHandler({
MemberAlreadyExistsException.class,
MemberCannotChangeStateException.class,
MemberPasswordCannotChangeException.class
})
public ResponseEntity<Void> conflictExceptionHandler(Exception exception) {
log.debug("{} : {}", exception.getClass().getName(), exception.getMessage());

Expand All @@ -153,5 +190,4 @@ public ResponseEntity<Void> notFoundExceptionHandler(MemberNotFoundException exc

return ResponseEntity.status(HttpStatus.NOT_FOUND).build();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package store.ckin.api.member.domain.request;

import javax.validation.constraints.NotBlank;
import lombok.Getter;
import lombok.NoArgsConstructor;

/**
* 비밀번호 변경을 요청 DTO 입니다.
*
* @author : jinwoolee
* @version : 2024. 03. 24.
*/
@Getter
@NoArgsConstructor
public class MemberPasswordRequestDto {
@NotBlank
private String password;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package store.ckin.api.member.domain.request;

import java.time.LocalDate;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;

/**
* 회원 정보 수정 요청 DTO 입니다.
*
* @author : jinwoolee
* @version : 2024. 03. 24.
*/
@Getter
@NoArgsConstructor
public class MemberUpdateRequestDto {
@NotBlank
@Size(min = 2, max = 10)
private String name;

@NotBlank
@Size(min = 10, max = 11)
private String contact;

@NotNull
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate birth;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package store.ckin.api.member.domain.response;

import java.time.LocalDate;
import lombok.AllArgsConstructor;
import lombok.Getter;

/**
* 회원 정보 페이지 요청에 대한 응답 DTO 입니다.
*
* @author : jinwoolee
* @version : 2024. 03. 25.
*/
@Getter
@AllArgsConstructor
public class MemberDetailInfoResponseDto {
private String name;

private String contact;

private LocalDate birth;
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,5 +20,7 @@ public class MemberMyPageResponseDto {

private Integer point;

private Integer gradeCondition;

private Long countReview;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package store.ckin.api.member.domain.response;

import lombok.AllArgsConstructor;
import lombok.Getter;

/**
* 비밀번호 요청에 대한 응답 DTO 입니다.
*
* @author : jinwoolee
* @version : 2024. 03. 24.
*/
@Getter
@AllArgsConstructor
public class MemberPasswordResponseDto {
private String password;
}
14 changes: 14 additions & 0 deletions src/main/java/store/ckin/api/member/entity/Member.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import org.hibernate.annotations.ColumnDefault;
import org.hibernate.annotations.DynamicInsert;
import store.ckin.api.grade.entity.Grade;
import store.ckin.api.member.domain.request.MemberUpdateRequestDto;


/**
Expand Down Expand Up @@ -119,4 +120,17 @@ public void updateLatestLoginAt() {
public void changeState(State state) {
this.state = state;
}

public void changePassword(String password) {
this.password = password;
}

/**
* 회원정보를 수정하는 메서드 입니다.
*/
public void updateMemberInfo(MemberUpdateRequestDto memberUpdateRequestDto) {
this.name = memberUpdateRequestDto.getName();
this.contact = memberUpdateRequestDto.getContact();
this.birth = memberUpdateRequestDto.getBirth();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package store.ckin.api.member.exception;

/**
* 비밀번호를 바꿀수 없을 때 호출되는 메서드 입니다.
*
* @author : jinwoolee
* @version : 2024. 03. 24.
*/
public class MemberPasswordCannotChangeException extends RuntimeException {
public MemberPasswordCannotChangeException(Long memberId) {
super(String.format("비밀번호를 바꿀 수 없습니다. ID : [%d]", memberId));
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package store.ckin.api.member.repository;

import org.springframework.data.repository.NoRepositoryBean;
import store.ckin.api.member.domain.response.MemberAuthResponseDto;
import store.ckin.api.member.domain.response.MemberMyPageResponseDto;
import store.ckin.api.member.domain.response.MemberOauthLoginResponseDto;
import store.ckin.api.member.domain.response.*;

import java.util.Optional;

/**
* Member Entity 에 Query dsl 을 적용할 메서드를 기술한 interface 입니다.
Expand All @@ -18,4 +18,8 @@ public interface MemberRepositoryCustom {
MemberMyPageResponseDto getMyPageInfo(Long id);

MemberOauthLoginResponseDto getOauthMemberInfo(String oauthId);

Optional<MemberPasswordResponseDto> getPassword(Long memberId);

Optional<MemberDetailInfoResponseDto> getMemberDetailInfo(Long memberId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@
import com.querydsl.core.types.Projections;
import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport;
import store.ckin.api.grade.entity.QGrade;
import store.ckin.api.member.domain.response.MemberAuthResponseDto;
import store.ckin.api.member.domain.response.MemberMyPageResponseDto;
import store.ckin.api.member.domain.response.MemberOauthLoginResponseDto;
import store.ckin.api.member.domain.response.*;
import store.ckin.api.member.entity.Member;
import store.ckin.api.member.entity.QMember;
import store.ckin.api.member.repository.MemberRepositoryCustom;
import store.ckin.api.review.entity.QReview;

import java.util.Optional;

/**
* MemberRepositoryCustom 의 구현체 입니다.
*
Expand Down Expand Up @@ -50,6 +50,7 @@ public MemberMyPageResponseDto getMyPageInfo(Long id) {
grade.name,
member.accumulateAmount,
member.point,
grade.condition,
review.count()))
.innerJoin(member.grade, grade)
.leftJoin(review).on(member.id.eq(review.member.id))
Expand All @@ -69,4 +70,32 @@ public MemberOauthLoginResponseDto getOauthMemberInfo(String oauthId) {
.where(member.oauthId.eq(oauthId))
.fetchOne();
}

@Override
public Optional<MemberPasswordResponseDto> getPassword(Long memberId) {
QMember member = QMember.member;

return Optional.ofNullable(
from(member)
.select(Projections.constructor(
MemberPasswordResponseDto.class,
member.password))
.where(member.id.eq(memberId))
.fetchOne());
}

@Override
public Optional<MemberDetailInfoResponseDto> getMemberDetailInfo(Long memberId) {
QMember member = QMember.member;

return Optional.ofNullable(
from(member)
.select(Projections.constructor(
MemberDetailInfoResponseDto.class,
member.name,
member.contact,
member.birth))
.where(member.id.eq(memberId))
.fetchOne());
}
}
17 changes: 10 additions & 7 deletions src/main/java/store/ckin/api/member/service/MemberService.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,7 @@
package store.ckin.api.member.service;

import store.ckin.api.member.domain.request.MemberAuthRequestDto;
import store.ckin.api.member.domain.request.MemberCreateRequestDto;
import store.ckin.api.member.domain.request.MemberEmailOnlyRequestDto;
import store.ckin.api.member.domain.request.MemberOauthIdOnlyRequestDto;
import store.ckin.api.member.domain.response.MemberAuthResponseDto;
import store.ckin.api.member.domain.response.MemberMyPageResponseDto;
import store.ckin.api.member.domain.response.MemberOauthLoginResponseDto;
import store.ckin.api.member.domain.request.*;
import store.ckin.api.member.domain.response.*;
import store.ckin.api.member.entity.Member;

/**
Expand Down Expand Up @@ -69,4 +64,12 @@ public interface MemberService {
void updateLatestLoginAt(Long memberId);

void changeState(Long memberId, Member.State state);

MemberPasswordResponseDto getPassword(Long memberId);

void changePassword(Long memberId, MemberPasswordRequestDto memberPasswordRequestDto);

void updateMemberInfo(Long memberId, MemberUpdateRequestDto memberUpdateRequestDto);

MemberDetailInfoResponseDto getMemberDetailInfo(Long memberId);
}
Loading

0 comments on commit ee63a0e

Please sign in to comment.