Skip to content
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
3 changes: 3 additions & 0 deletions leeseo/umc10th/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,9 @@ dependencies {
// Swagger
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:3.0.1'
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-api:3.0.1'

// Validation
implementation 'org.springframework.boot:spring-boot-starter-validation'
}

tasks.named('test') {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

@SpringBootApplication
@EnableJpaAuditing
public class Umc10thApplication {

public static void main(String[] args) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
package com.example.umc10th.domain.member.controller;

import com.example.umc10th.domain.member.dto.MemberReqDto;
import com.example.umc10th.domain.member.dto.MemberResDto;
import com.example.umc10th.domain.member.exception.code.MemberErrorCode;
import com.example.umc10th.domain.member.exception.code.MemberSuccessCode;
import com.example.umc10th.domain.member.service.MemberService;
import com.example.umc10th.global.apiPayload.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

Expand All @@ -14,6 +17,8 @@
@Tag(name = "Member", description = "회원 관련 API")
public class MemberController implements MemberControllerDocs{

private final MemberService memberService;

@PostMapping("/me/term")
public ApiResponse<Void> saveTermAgreement(
@RequestBody MemberReqDto.TermList dto
Expand All @@ -22,19 +27,27 @@ public ApiResponse<Void> saveTermAgreement(
return ApiResponse.onSuccess(MemberSuccessCode.TERM_POST_OK, null);
}

@GetMapping("/me/profile")
public ApiResponse<MemberResDto.Profile> getProfile(
@RequestParam Long id
) {
MemberResDto.Profile response = memberService.getProfile(id);
return ApiResponse.onSuccess(MemberSuccessCode.PROFILE_GET_OK, response);
}

@PatchMapping("/me/profile")
public ApiResponse<Void> updateProfile(
@RequestBody MemberReqDto.Profile dto
@RequestBody @Valid MemberReqDto.Profile dto
) {
// 서비스 로직
memberService.updateProfile(dto);
return ApiResponse.onSuccess(MemberSuccessCode.PROFILE_PATCH_OK, null);
}

@PatchMapping("/me/nickname")
public ApiResponse<Void> updateNickname(
@RequestBody MemberReqDto.Nickname dto
@RequestBody @Valid MemberReqDto.Nickname dto
) {
// 서비스 로직
memberService.updateNickname(dto);
return ApiResponse.onSuccess(MemberSuccessCode.NICKNAME_PATCH_OK, null);
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package com.example.umc10th.domain.member.controller;

import com.example.umc10th.domain.member.dto.MemberReqDto;
import com.example.umc10th.domain.member.dto.MemberResDto;
import com.example.umc10th.global.apiPayload.ApiResponse;
import io.swagger.v3.oas.annotations.Operation;
import org.springframework.web.bind.annotation.PatchMapping;
import jakarta.validation.Valid;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;

public interface MemberControllerDocs {

Expand All @@ -16,20 +18,27 @@ public ApiResponse<Void> saveTermAgreement(
@RequestBody MemberReqDto.TermList dto
);

@Operation(
summary = "회원정보 조회",
description = "회원 프로필 정보를 조회합니다."
)
public ApiResponse<MemberResDto.Profile> getProfile(
@RequestParam Long id
);

@Operation(
summary = "회원정보 저장",
description = "회원 프로필 정보를 저장합니다."
)
public ApiResponse<Void> updateProfile(
@RequestBody MemberReqDto.Profile dto
@RequestBody @Valid MemberReqDto.Profile dto
);

@Operation(
summary = "닉네임 수정",
description = "닉네임을 수정합니다."
)
@PatchMapping("/me/nickname")
public ApiResponse<Void> updateNickname(
@RequestBody MemberReqDto.Nickname dto
@RequestBody @Valid MemberReqDto.Nickname dto
);
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,33 @@
package com.example.umc10th.domain.member.converter;

import com.example.umc10th.domain.member.dto.MemberResDto;
import com.example.umc10th.domain.member.entity.Food;
import com.example.umc10th.domain.member.entity.Member;
import com.example.umc10th.domain.member.entity.mapping.MemberFood;

public class MemberConverter {

public static MemberResDto.Profile toProfile(
Member member
) {
return MemberResDto.Profile.builder()
.id(member.getId())
.nickname(member.getNickname())
.birth(member.getBirth())
.address(member.getAddress())
.fullAddress(member.getFullAddress())
.gender(member.getGender())
.food(member.getMemberFoodList().stream().map(MemberFood::getFood).toList())
.build();
}

public static MemberFood toMemberFood(
Food food,
Member member
) {
return MemberFood.builder()
.member(member)
.food(food)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
package com.example.umc10th.domain.member.dto;

import com.example.umc10th.domain.member.entity.Food;
import com.example.umc10th.domain.member.enums.FoodType;
import com.example.umc10th.domain.member.enums.Gender;
import com.example.umc10th.domain.mission.enums.Address;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;

import java.time.LocalDate;
import java.util.List;
Expand All @@ -13,21 +16,29 @@ public record TermList (
List<Term> terms
) {}

@Schema(name = "Term", description = "약관별 동의 여부를 저장합니다.")
public record Term (
Long termId,
Boolean agreed
) {}

@Schema(name = "Profile", description = "수정할 프로필 정보를 저장합합니다.")
public record Profile (
String nickname,
Gender gender,
LocalDate birth,
Address address,
String fullAddress,
List<Food> food
@NotNull(message = "사용자 ID는 필수입니다.")
Long id,
String nickname,
Gender gender,
LocalDate birth,
Address address,
String fullAddress,
List<FoodType> food
) {}

@Schema(name = "Nickname", description = "수정할 닉네임을 저장합합니다.")
public record Nickname (
String nickname
@NotNull(message = "사용자 ID는 필수입니다.")
Long id,
@NotBlank(message = "닉네임 입력은 필수입니다.")
String nickname
) {}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,23 @@
package com.example.umc10th.domain.member.dto;

import com.example.umc10th.domain.member.entity.Food;
import com.example.umc10th.domain.member.enums.Gender;
import com.example.umc10th.domain.mission.enums.Address;
import lombok.Builder;

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

public class MemberResDto {

@Builder
public record Profile (
Long id,
String nickname,
Gender gender,
LocalDate birth,
Address address,
String fullAddress,
List<Food> food
) {}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,32 @@
package com.example.umc10th.domain.member.entity;

import com.example.umc10th.domain.member.entity.mapping.MemberFood;
import com.example.umc10th.domain.member.enums.FoodType;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.ArrayList;
import java.util.List;

@Entity
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "food")
public class Food {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(name = "name", nullable = false)
@Enumerated(EnumType.STRING)
private FoodType name;

@OneToMany(mappedBy = "food")
private List<MemberFood> memberFoodList = new ArrayList<>();
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,124 @@
package com.example.umc10th.domain.member.entity;

public class Member {
import com.example.umc10th.domain.member.converter.MemberConverter;
import com.example.umc10th.domain.member.entity.mapping.MemberFood;
import com.example.umc10th.domain.member.entity.mapping.MemberTerm;
import com.example.umc10th.domain.member.enums.FoodType;
import com.example.umc10th.domain.member.enums.Gender;
import com.example.umc10th.domain.member.enums.SocialType;
import com.example.umc10th.domain.member.enums.Status;
import com.example.umc10th.domain.mission.entity.mapping.MemberMission;
import com.example.umc10th.domain.mission.enums.Address;
import com.example.umc10th.domain.review.entity.Review;
import com.example.umc10th.global.entity.BaseEntity;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

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

@Entity
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "member")
public class Member extends BaseEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(name = "nickname", unique = true)
private String nickname;

@Builder.Default
@Column(name = "gender")
@Enumerated(EnumType.STRING)
private Gender gender = Gender.NONE;

@Column(name = "birth")
private LocalDate birth;

@Column(name = "email", unique = true)
private String email;

@Column(name = "phone_number", unique = true)
private String phoneNumber;

@Column(name = "address")
@Enumerated(EnumType.STRING)
private Address address;

@Column(name = "full_address")
private String fullAddress;

@Column(name = "profile_image")
private String profileImage;

@Column(name = "social_type", nullable = false)
@Enumerated(EnumType.STRING)
private SocialType socialType;

@Column(name = "social_id", unique = true, nullable = false)
private String socialId;

@Builder.Default
@Column(name = "point", nullable = false)
private Integer point = 0;

@Builder.Default
@Column(name = "status", nullable = false)
@Enumerated(EnumType.STRING)
private Status status = Status.ACTIVATE;

@Builder.Default
@Column(name = "is_owner", nullable = false)
private Boolean isOwner = false;

@OneToMany(mappedBy = "member", cascade = CascadeType.ALL, orphanRemoval = true)
private List<MemberFood> memberFoodList = new ArrayList<>();

@OneToMany(mappedBy = "member", cascade = CascadeType.ALL, orphanRemoval = true)
private List<MemberTerm> memberTermList = new ArrayList<>();

@OneToMany(mappedBy = "member", cascade = CascadeType.ALL, orphanRemoval = true)
private List<MemberMission> memberMissionList = new ArrayList<>();

@OneToMany(mappedBy = "member")
private List<Review> reviewList = new ArrayList<>();

public void updateNickname(String nickname) {
this.nickname = nickname;
}

public void updateGender(Gender gender) {
this.gender = gender;
}

public void updateBirth(LocalDate birth) {
this.birth = birth;
}

public void updateAddress(Address address) {
this.address = address;
}

public void updateFullAddress(String fullAddress) {
this.fullAddress = fullAddress;
}

public void updateFoodList(List<Food> foodList) {
List<MemberFood> list = new ArrayList<>();
for (Food food : foodList) {
list.add(MemberConverter.toMemberFood(food, this));
}
this.memberFoodList.clear();
this.memberFoodList.addAll(list);
}

}
Loading