Skip to content

Commit

Permalink
Feat : 관심분야 등록/수정, 관심분야 조회 API 추가
Browse files Browse the repository at this point in the history
Merge pull request #12 from kkijuk/mvp/member
  • Loading branch information
tape4 authored Jul 26, 2024
2 parents 9ae99b8 + 81ba544 commit e64e0a1
Show file tree
Hide file tree
Showing 10 changed files with 425 additions and 27 deletions.
1 change: 0 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'mysql:mysql-connector-java:8.0.32'
implementation 'org.springframework.boot:spring-boot-starter-validation'

implementation 'org.openapitools:jackson-databind-nullable:0.2.1'
}

Expand Down
9 changes: 8 additions & 1 deletion src/main/java/umc/kkijuk/server/common/LoginUser.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,19 @@
package umc.kkijuk.server.common;

import lombok.Getter;

@Getter
public class LoginUser {
private static final LoginUser LOGIN_USER = new LoginUser(0L);

private Long id;
private static final LoginUser LOGIN_USER = new LoginUser(1L);

public LoginUser(Long id) {
this.id = id;
}

public static LoginUser get() {
return LOGIN_USER;
}

}
Original file line number Diff line number Diff line change
@@ -1,13 +1,181 @@
package umc.kkijuk.server.member.controller;

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Controller;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import umc.kkijuk.server.common.LoginUser;
import umc.kkijuk.server.member.domain.Member;
import umc.kkijuk.server.member.dto.MemberFieldDto;
import umc.kkijuk.server.member.dto.MemberInfoChangeDto;
import umc.kkijuk.server.member.dto.MemberJoinDto;
import umc.kkijuk.server.member.service.MemberService;
import lombok.Data;
import lombok.RequiredArgsConstructor;

import java.time.LocalDate;
import java.util.List;


@Controller
@Tag(name = "member", description = "회원 관리 API")
@RestController
@RequestMapping("/member")
@RequiredArgsConstructor
public class MemberController {

private final MemberService memberService;

@Operation(
summary = "회원가입 요청",
description = "회원가입 요청을 받아 성공/실패 여부를 반환합니다.")
@PostMapping
public ResponseEntity<CreateMemberResponse> saveMember(@RequestBody @Valid MemberJoinDto memberJoinDto) {
String passwordConfirm = memberJoinDto.getPasswordConfirm();
if (!passwordConfirm.equals(memberJoinDto.getPassword())) {
return ResponseEntity
.status(HttpStatus.BAD_REQUEST)
.body(new CreateMemberResponse("Passwords do not match"));
}

try {
Long memberId = memberService.join(memberJoinDto.toEntity());
return ResponseEntity
.status(HttpStatus.CREATED)
.body(new CreateMemberResponse(memberId, "Member created successfully"));
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity
.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new CreateMemberResponse("Member creation failed"));
}
}

/**
일단 RequestParam 사용, 나중에 jwt토큰으로 사용자 정보 식별할 수 있도록 변경
*/
@Operation(
summary = "내 정보 조회",
description = "마이페이지에서 내 정보들을 가져옵니다.")
@GetMapping("/myPage/info")
public ResponseEntity<MemberInfoResponse> getInfo() {
try {
Long loginUser = LoginUser.get().getId();
Member member = memberService.getMemberInfo(loginUser);
MemberInfoResponse response = new MemberInfoResponse(
member.getEmail(),
member.getName(),
member.getPhoneNumber(),
member.getBirthDate()
);
return ResponseEntity.ok(response);
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
}
}

@Operation(
summary = "내 정보 수정",
description = "내 정보 수정 요청을 받아 성공/실패를 반환합니다.")
@PutMapping("/myPage/info")
public ResponseEntity<ResultResponse> changeMemberInfo(@RequestBody MemberInfoChangeDto memberInfoChangeDto) {
Long loginUser = LoginUser.get().getId();
try {
memberService.updateMemberInfo(loginUser, memberInfoChangeDto);
return ResponseEntity.ok()
.body(new ResultResponse("information update success"));
}catch (Exception e){
return ResponseEntity
.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ResultResponse("information update failed"));
}

}


@Operation(
summary = "관심분야 조회",
description = "마이페이지에서 관심분야를 조회합니다.")
@GetMapping("/myPage/field")
public ResponseEntity<MemberFieldResponse> getField() {
try {
Long loginUser = LoginUser.get().getId();
List<String> memberField = memberService.getMemberField(loginUser);
return ResponseEntity.ok().body(new MemberFieldResponse(memberField));
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
}
}

@Operation(
summary = "관심분야 등록/수정",
description = "초기/마이페이지에서 관심분야를 등록/수정합니다.")
@PostMapping({"/field", "/myPage/field"})
public ResponseEntity<MemberFieldResponse> postField(@RequestBody @Valid MemberFieldDto memberFieldDto) {
try {
Long loginUserId = LoginUser.get().getId();
List<String> updatedMember = memberService.updateMemberField(loginUserId, memberFieldDto);
MemberFieldResponse response = new MemberFieldResponse(updatedMember);
return ResponseEntity.ok(response);
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
}
}



@Data
static class CreateMemberResponse {
private Long id;
private String message;

public CreateMemberResponse(String message) {
this.message = message;
}

public CreateMemberResponse(Long id, String message) {
this.id = id;
this.message = message;
}
}

@Data
static class ResultResponse{
private String message;

public ResultResponse(String message) {
this.message = message;
}
}

@Data
static class MemberInfoResponse {
private String email;
private String name;
private String phoneNumber;
private LocalDate birthDate;

public MemberInfoResponse(String email, String name, String phoneNumber, LocalDate birthDate) {
this.email = email;
this.name = name;
this.phoneNumber = phoneNumber;
this.birthDate = birthDate;
}
}

@Data
static class MemberFieldResponse{
private List<String> field;

public MemberFieldResponse(List<String> field) {
this.field = field;
}
}
}






11 changes: 11 additions & 0 deletions src/main/java/umc/kkijuk/server/member/domain/MarketingAgree.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package umc.kkijuk.server.member.domain;

public enum MarketingAgree {
BOTH,

EMAIL,

SMS,

NONE
}
37 changes: 27 additions & 10 deletions src/main/java/umc/kkijuk/server/member/domain/Member.java
Original file line number Diff line number Diff line change
@@ -1,22 +1,23 @@
package umc.kkijuk.server.member.domain;


import jakarta.persistence.*;
import jakarta.validation.constraints.NotNull;
import lombok.*;
import umc.kkijuk.server.member.converter.StringListConverter;

import java.time.LocalDate;
import java.util.List;
import java.util.ArrayList;

import umc.kkijuk.server.common.converter.StringListToStringConverter;

@Entity
@Getter
@Builder
@Getter @Setter
@NoArgsConstructor
@AllArgsConstructor
@NoArgsConstructor
public class Member {

@Id @GeneratedValue
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "member_id")
private Long id;

Expand All @@ -35,17 +36,22 @@ public class Member {
@NotNull
private String password;

@Convert(converter = StringListConverter.class)
private List<String> field = new ArrayList<>();

@Convert(converter = StringListToStringConverter.class)
private List<String> field;

@NotNull
private Boolean marketingAgree;
@Enumerated(EnumType.STRING)
private MarketingAgree marketingAgree;

@NotNull
@Enumerated(EnumType.STRING)
private State userState;

public Member(String email, String name, String phoneNumber, LocalDate birthDate, String password, Boolean marketingAgree, State userState) {
private LocalDate deleteDate;


public Member( String email, String name, String phoneNumber, LocalDate birthDate, String password, MarketingAgree marketingAgree, State userState) {
this.email = email;
this.name = name;
this.phoneNumber = phoneNumber;
Expand All @@ -54,5 +60,16 @@ public Member(String email, String name, String phoneNumber, LocalDate birthDate
this.marketingAgree = marketingAgree;
this.userState = userState;
}
}

public void changeFieldInfo(List<String> field){
this.field = field;
}

public void changeMemberInfo(String phoneNumber, LocalDate birthDate, MarketingAgree marketingAgree){
this.phoneNumber = phoneNumber;
this.birthDate = birthDate;
this.marketingAgree = marketingAgree;
}


}
19 changes: 19 additions & 0 deletions src/main/java/umc/kkijuk/server/member/dto/MemberFieldDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package umc.kkijuk.server.member.dto;

import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;


@Data
@NoArgsConstructor
public class MemberFieldDto {
private List<String> field;

@Builder
public MemberFieldDto(List<String> field) {
this.field = field;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package umc.kkijuk.server.member.dto;


import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import umc.kkijuk.server.member.domain.MarketingAgree;

import java.time.LocalDate;

@Data
@NoArgsConstructor
public class MemberInfoChangeDto {
private Long id; //jwt토큰으로 받을땐 제거
private String phoneNumber;
private LocalDate birthDate;
private MarketingAgree marketingAgree;

@Builder
public MemberInfoChangeDto(String phoneNumber, LocalDate birthDate, MarketingAgree marketingAgree) {
this.phoneNumber = phoneNumber;
this.birthDate = birthDate;
this.marketingAgree = marketingAgree;
}
}
Loading

0 comments on commit e64e0a1

Please sign in to comment.