Skip to content
Merged
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
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
package es.princip.ringus.application.mentee.service;

import es.princip.ringus.domain.exception.MenteeErrorCode;
import es.princip.ringus.domain.exception.SignUpErrorCode;
import es.princip.ringus.domain.member.Member;
import es.princip.ringus.domain.member.MemberRepository;
import es.princip.ringus.domain.mentee.Mentee;
import es.princip.ringus.domain.mentee.MenteeRepository;
import es.princip.ringus.domain.mentor.MentorRepository;
import es.princip.ringus.global.exception.CustomRuntimeException;
import es.princip.ringus.presentation.mentee.dto.EditMenteeRequest;
import es.princip.ringus.presentation.mentee.dto.MenteeRequest;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
Expand All @@ -22,9 +23,18 @@ public class MenteeService {

@Transactional
public Long register(MenteeRequest request) {
//TODO: 확인 쿼리로 최적화
Member member = memberRepository.findByEmail(request.email())
.orElseThrow(() -> new CustomRuntimeException(SignUpErrorCode.WRONG_EMAIL));
Mentee mentee = request.toEntity();
Mentee mentee = request.toEntity(member.getId());
return menteeRepository.save(mentee).getId();
}

@Transactional
public Long edit(EditMenteeRequest request) {
Mentee mentee = menteeRepository.findById(request.menteeId())
.orElseThrow(() -> new CustomRuntimeException(MenteeErrorCode.MENTEE_PROFILE_NOT_FOUND));
mentee.edit(request);
return mentee.getId();
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
package es.princip.ringus.application.mentor.service;

import es.princip.ringus.domain.exception.MentorErrorCode;
import es.princip.ringus.domain.exception.SignUpErrorCode;
import es.princip.ringus.domain.member.Member;
import es.princip.ringus.domain.member.MemberRepository;
import es.princip.ringus.domain.mentee.MenteeRepository;
import es.princip.ringus.domain.mentor.Mentor;
import es.princip.ringus.domain.mentor.MentorRepository;
import es.princip.ringus.global.exception.CustomRuntimeException;
import es.princip.ringus.presentation.mentor.dto.EditMentorRequest;
import es.princip.ringus.presentation.mentor.dto.MentorRequest;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
Expand All @@ -23,8 +24,16 @@ public class MentorService {
@Transactional
public Long register(MentorRequest request) {
Member member = memberRepository.findByEmail(request.email())
.orElseThrow(() -> new CustomRuntimeException(SignUpErrorCode.WRONG_EMAIL));
.orElseThrow(() -> new CustomRuntimeException(SignUpErrorCode.DUPLICATE_EMAIL));
Mentor mentor = request.toEntity(member.getId());
return mentorRepository.save(mentor).getId();
}

@Transactional
public Long edit(EditMentorRequest request) {
Mentor mentor = mentorRepository.findById(request.mentorId())
.orElseThrow(() -> new CustomRuntimeException(MentorErrorCode.MENTOR_PROFILE_NOT_FOUND));
mentor.edit(request);
return mentor.getId();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package es.princip.ringus.domain.exception;

import es.princip.ringus.global.exception.ErrorCode;
import org.springframework.http.HttpStatus;

public enum MenteeErrorCode implements ErrorCode {
MENTEE_PROFILE_NOT_FOUND(HttpStatus.NOT_FOUND, "멘티 프로필을 등록한 적이 없음");

MenteeErrorCode(HttpStatus status, String message) {
this.status = status;
this.message = message;
}

private final HttpStatus status;
private final String message;

@Override
public HttpStatus status() {
return this.status;
}

@Override
public String message() {
return this.message;
}

@Override
public String code() {
return this.name();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package es.princip.ringus.domain.exception;

import es.princip.ringus.global.exception.ErrorCode;
import org.springframework.http.HttpStatus;

public enum MentorErrorCode implements ErrorCode {
MENTOR_PROFILE_NOT_FOUND(HttpStatus.NOT_FOUND, "멘토 프로필을 등록한 적이 없음");

MentorErrorCode(HttpStatus status, String message) {
this.status = status;
this.message = message;
}

private final HttpStatus status;
private final String message;

@Override
public HttpStatus status() {
return this.status;
}

@Override
public String message() {
return this.message;
}

@Override
public String code() {
return this.name();
}
}
8 changes: 8 additions & 0 deletions src/main/java/es/princip/ringus/domain/mentee/Mentee.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import es.princip.ringus.domain.common.Education;
import es.princip.ringus.infra.storage.domain.ProfileImage;
import es.princip.ringus.presentation.mentee.dto.EditMenteeRequest;
import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Builder;
Expand Down Expand Up @@ -51,4 +52,11 @@ public Mentee(
this.profileImage = profileImage;
this.memberId = memberId;
}

public void edit(final EditMenteeRequest request) {
this.nickname = request.nickname();
this.education = request.education().toEntity();
this.introduction = request.introduction();
this.profileImage = request.image().toEntity();
}
}
24 changes: 13 additions & 11 deletions src/main/java/es/princip/ringus/domain/mentor/Mentor.java
Original file line number Diff line number Diff line change
@@ -1,13 +1,9 @@
package es.princip.ringus.domain.mentor;

import es.princip.ringus.domain.common.Education;
import es.princip.ringus.domain.mentor.vo.Hashtag;
import es.princip.ringus.domain.mentor.vo.MentoringField;
import es.princip.ringus.domain.mentor.vo.Organization;
import es.princip.ringus.domain.mentor.vo.Portfolio;
import es.princip.ringus.domain.mentor.vo.Timezone;
import es.princip.ringus.infra.storage.domain.Certificate;
import es.princip.ringus.domain.mentor.vo.*;
import es.princip.ringus.infra.storage.domain.ProfileImage;
import es.princip.ringus.presentation.mentor.dto.EditMentorRequest;
import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Builder;
Expand All @@ -16,6 +12,7 @@

import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

@Getter
@Entity
Expand Down Expand Up @@ -99,10 +96,15 @@ public Mentor(
this.memberId = memberId;
}

/**
* 프로필 이미지 업데이트
*/
public void updateProfileImage(ProfileImage profileImage) {
this.profileImage = profileImage;
public void edit(final EditMentorRequest request) {
this.nickname = request.nickname();
this.education = request.education().toEntity();
this.organization = request.organization().toEntity();
this.introduction = request.introduction();
this.timezone = request.timezone().toEntity();
this.mentoringField = request.mentoringField().stream().map(MentoringField::valueOf).collect(Collectors.toSet());
this.hashtags = request.hashtags().stream().map(Hashtag::new).toList();
this.message = request.message();
this.portfolio = request.portfolio().toEntity();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@
public interface AuthControllerDocs {

@Operation(summary = "회원가입", description = "회원가입을 처리합니다.")

@ApiResponses(value = {
@ApiResponse(responseCode = "201", description = "회원가입 성공"),
@ApiResponse(responseCode = "409", description = "이미 가입된 이메일"),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,15 @@
package es.princip.ringus.presentation.common.dto;

import es.princip.ringus.domain.common.Education;

public record EducationRequest(
String schoolName,
String major
) {
public Education toEntity() {
return new Education(
schoolName,
major
);
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
package es.princip.ringus.presentation.common.dto;

import es.princip.ringus.domain.mentor.vo.Organization;

public record OrganizationRequest(
String name,
String role,
int experience
) {
public Organization toEntity() {
return new Organization(name, role, experience);
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
package es.princip.ringus.presentation.common.dto;

import es.princip.ringus.domain.mentor.vo.Portfolio;

public record PortfolioRequest(
String url,
String description
) {
public Portfolio toEntity() {
return new Portfolio(url, description);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,31 @@

import es.princip.ringus.application.mentee.service.MenteeService;
import es.princip.ringus.global.util.ApiResponseWrapper;
import es.princip.ringus.presentation.mentee.dto.EditMenteeRequest;
import es.princip.ringus.presentation.mentee.dto.EditMenteeResponse;
import es.princip.ringus.presentation.mentee.dto.MenteeRequest;
import es.princip.ringus.presentation.mentee.dto.MenteeResponse;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;

@RestController
@RequiredArgsConstructor
@RequestMapping("/mentee")
public class MenteeController {
public class MenteeController implements MenteeControllerDocs{
private final MenteeService menteeService;

@PostMapping
public ResponseEntity<ApiResponseWrapper<MenteeResponse>> create(@Valid @RequestBody MenteeRequest request) {
MenteeResponse response = MenteeResponse.from(menteeService.register(request));
return ResponseEntity.ok(ApiResponseWrapper.success(HttpStatus.OK, "성공", response));
}

@PutMapping
public ResponseEntity<ApiResponseWrapper<EditMenteeResponse>> update(@Valid @RequestBody EditMenteeRequest request) {
EditMenteeResponse response = EditMenteeResponse.from(menteeService.edit(request));
return ResponseEntity.ok(ApiResponseWrapper.success(HttpStatus.OK, "성공", response));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package es.princip.ringus.presentation.mentee;


import es.princip.ringus.global.util.ApiResponseWrapper;
import es.princip.ringus.presentation.mentee.dto.EditMenteeRequest;
import es.princip.ringus.presentation.mentee.dto.EditMenteeResponse;
import es.princip.ringus.presentation.mentee.dto.MenteeRequest;
import es.princip.ringus.presentation.mentee.dto.MenteeResponse;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;

@Tag(name = "Mentee API", description = "멘티 관련 API")
@RequestMapping("/mentee")
public interface MenteeControllerDocs {

@Operation(summary = "멘티 등록", description = "새로운 멘티를 등록합니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "멘티 등록 성공"),
@ApiResponse(responseCode = "409", description = "이미 가입된 이메일")
})
@PostMapping
ResponseEntity<ApiResponseWrapper<MenteeResponse>> create(@Valid @RequestBody @Parameter(description = "멘티 등록 요청") MenteeRequest request);

@Operation(summary = "멘티 수정", description = "기존 멘티 정보를 수정합니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "멘티 수정 성공"),
@ApiResponse(responseCode = "404", description = "멘티 프로필을 등록한 적이 없음")
})
@PutMapping
ResponseEntity<ApiResponseWrapper<EditMenteeResponse>> update(@Valid @RequestBody @Parameter(description = "멘티 수정 요청") EditMenteeRequest request);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package es.princip.ringus.presentation.mentee.dto;

import es.princip.ringus.presentation.common.dto.EducationRequest;
import es.princip.ringus.presentation.common.dto.ProfileImageRequest;
import jakarta.validation.constraints.NotBlank;

public record EditMenteeRequest(
@NotBlank Long menteeId,
@NotBlank String nickname,
EducationRequest education,
ProfileImageRequest image,
@NotBlank String introduction
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package es.princip.ringus.presentation.mentee.dto;

public record EditMenteeResponse(
Long menteeId
) {
public static EditMenteeResponse from(final Long menteeId) {
return new EditMenteeResponse(menteeId);
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package es.princip.ringus.presentation.mentee.dto;

import es.princip.ringus.domain.mentee.Mentee;
import es.princip.ringus.domain.common.Education;
import es.princip.ringus.presentation.common.dto.EducationRequest;
import es.princip.ringus.presentation.common.dto.ProfileImageRequest;
import jakarta.validation.constraints.NotBlank;
Expand All @@ -13,12 +12,13 @@ public record MenteeRequest(
ProfileImageRequest image,
@NotBlank String introduction
) {
public Mentee toEntity() {
return Mentee.builder()
.nickname(nickname)
.education(new Education(education.schoolName(), education().major()))
.profileImage(image.toEntity())
.introduction(introduction)
.build();
}
public Mentee toEntity(Long memberId) {
return Mentee.builder()
.nickname(nickname)
.education(education.toEntity())
.profileImage(image.toEntity())
.introduction(introduction)
.memberId(memberId)
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
public record MenteeResponse(
Long menteeId
) {
public static MenteeResponse from(Long menteeId) {
public static MenteeResponse from(final Long menteeId) {
return new MenteeResponse(menteeId);
}
}
Loading
Loading