diff --git a/src/main/java/es/princip/ringus/application/mentor/service/AcceptMentoringService.java b/src/main/java/es/princip/ringus/application/mentor/service/AcceptMentoringService.java new file mode 100644 index 0000000..da967ed --- /dev/null +++ b/src/main/java/es/princip/ringus/application/mentor/service/AcceptMentoringService.java @@ -0,0 +1,58 @@ +package es.princip.ringus.application.mentor.service; + +import es.princip.ringus.domain.exception.MenteeErrorCode; +import es.princip.ringus.domain.exception.MentorErrorCode; +import es.princip.ringus.domain.exception.MentoringErrorCode; +import es.princip.ringus.domain.mentee.Mentee; +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.domain.mentoring.Mentoring; +import es.princip.ringus.domain.mentoring.MentoringRepository; +import es.princip.ringus.domain.mentoring.MentoringTime; +import es.princip.ringus.domain.mentoring.accept.MentoringAccept; +import es.princip.ringus.domain.mentoring.accept.MentoringAcceptRepository; +import es.princip.ringus.global.exception.CustomRuntimeException; +import es.princip.ringus.presentation.mentoring.dto.AcceptMentoringRequest; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class AcceptMentoringService { + private final MentorRepository mentorRepository; + private final MenteeRepository menteeRepository; + private final MentoringRepository mentoringRepository; + private final MentoringAcceptRepository mentoringAcceptRepository; + + private boolean isRequestedTimeInMentoringTime(Mentoring mentoring, AcceptMentoringRequest request) { + return mentoring.getApplyTimes().stream() + .anyMatch(time -> MentoringTime.equals(time, request.mentoringTime())); + } + + public Long accept(AcceptMentoringRequest request, Long memberId) { + Mentor mentor = mentorRepository.findByMemberId(memberId) + .orElseThrow(() -> new CustomRuntimeException(MentorErrorCode.MENTOR_NOT_FOUND)); + Mentee mentee = menteeRepository.findById(request.menteeId()) + .orElseThrow(() -> new CustomRuntimeException(MenteeErrorCode.MENTEE_NOT_FOUND)); + + Mentoring mentoring = mentoringRepository.findByMenteeIdAndMentorId(mentee.getId(), mentor.getId()) + .orElseThrow(() -> new CustomRuntimeException(MentoringErrorCode.MENTORING_NOT_FOUND)); + + if (mentoring.isNotWaiting()) { + throw new CustomRuntimeException(MentoringErrorCode.MENTORING_STATUS_NOT_WAITING); + } + if (!isRequestedTimeInMentoringTime(mentoring, request)) { + throw new CustomRuntimeException(MentoringErrorCode.MENTORING_TIME_NOT_MATCH); + } + + MentoringAccept accept = MentoringAccept.builder() + .mentee(mentee) + .mentor(mentor) + .mentoringTime(request.mentoringTime()) + .build(); + mentoring.accept(); + + return mentoringAcceptRepository.save(accept).getId(); + } +} diff --git a/src/main/java/es/princip/ringus/application/mentoring/MentoringService.java b/src/main/java/es/princip/ringus/application/mentoring/MentoringService.java index ad762fc..d91fa2a 100644 --- a/src/main/java/es/princip/ringus/application/mentoring/MentoringService.java +++ b/src/main/java/es/princip/ringus/application/mentoring/MentoringService.java @@ -2,7 +2,6 @@ import es.princip.ringus.domain.exception.MenteeErrorCode; import es.princip.ringus.domain.exception.MentorErrorCode; -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.Mentor; @@ -46,8 +45,5 @@ public MentoringResponse createMentoring(CreateMentoringRequest request, Long me mentor.addMentoring(mentoring); return MentoringResponse.from(mentoringRepository.save(mentoring)); - } - - -} +} \ No newline at end of file diff --git a/src/main/java/es/princip/ringus/domain/exception/MentoringErrorCode.java b/src/main/java/es/princip/ringus/domain/exception/MentoringErrorCode.java index e6d2647..2038873 100644 --- a/src/main/java/es/princip/ringus/domain/exception/MentoringErrorCode.java +++ b/src/main/java/es/princip/ringus/domain/exception/MentoringErrorCode.java @@ -7,7 +7,9 @@ public enum MentoringErrorCode implements ErrorCode { MENTORING_NOT_FOUND(HttpStatus.NOT_FOUND,"해당 신청이 존재하지 않음"), MENTORING_TIME_CONVERT_ERROR(HttpStatus.NOT_MODIFIED,"신청 시간 변환 오류"), - MENTORING_TIME_ERROR(HttpStatus.BAD_REQUEST,"신청 가능 시간 오류"); + MENTORING_TIME_ERROR(HttpStatus.BAD_REQUEST,"신청 가능 시간 오류"), + MENTORING_STATUS_NOT_WAITING(HttpStatus.BAD_REQUEST,"멘토링 대기 상태가 아님"), + MENTORING_TIME_NOT_MATCH(HttpStatus.BAD_REQUEST,"멘티의 제안 시간에 멘토링 시간이 포함되지 않음"); MentoringErrorCode(HttpStatus status , String message) { this.status = status; diff --git a/src/main/java/es/princip/ringus/domain/mentoring/Mentoring.java b/src/main/java/es/princip/ringus/domain/mentoring/Mentoring.java index 4c29652..03371a6 100644 --- a/src/main/java/es/princip/ringus/domain/mentoring/Mentoring.java +++ b/src/main/java/es/princip/ringus/domain/mentoring/Mentoring.java @@ -1,6 +1,6 @@ package es.princip.ringus.domain.mentoring; -import es.princip.ringus.domain.mentoring.converter.MentoringTimeConverter; +import es.princip.ringus.domain.mentoring.converter.MentoringTimeListConverter; import es.princip.ringus.domain.base.BaseTimeEntity; import es.princip.ringus.domain.exception.MentoringErrorCode; import es.princip.ringus.domain.mentee.Mentee; @@ -33,7 +33,7 @@ public class Mentoring extends BaseTimeEntity { @Column(name = "mentoring_topic") private MentoringTopic mentoringTopic; - @Convert(converter = MentoringTimeConverter.class) + @Convert(converter = MentoringTimeListConverter.class) @Column(length = 500, nullable = false) // 500자 이내 //@Column(columnDefinition = "TEXT") // 500자 초과 시 private List applyTimes; @@ -89,4 +89,12 @@ public static Mentoring of( mentee ); } + + public boolean isNotWaiting() { + return mentoringStatus != MentoringStatus.WAITING; + } + + public void accept() { + this.mentoringStatus = MentoringStatus.ACCEPTED; + } } diff --git a/src/main/java/es/princip/ringus/domain/mentoring/MentoringRepository.java b/src/main/java/es/princip/ringus/domain/mentoring/MentoringRepository.java index 968ff28..aef0d76 100644 --- a/src/main/java/es/princip/ringus/domain/mentoring/MentoringRepository.java +++ b/src/main/java/es/princip/ringus/domain/mentoring/MentoringRepository.java @@ -4,6 +4,9 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.Optional; + @Repository public interface MentoringRepository extends JpaRepository { + Optional findByMenteeIdAndMentorId(Long menteeId, Long mentorId); } diff --git a/src/main/java/es/princip/ringus/domain/mentoring/MentoringTime.java b/src/main/java/es/princip/ringus/domain/mentoring/MentoringTime.java index 3605272..8a6c5a7 100644 --- a/src/main/java/es/princip/ringus/domain/mentoring/MentoringTime.java +++ b/src/main/java/es/princip/ringus/domain/mentoring/MentoringTime.java @@ -3,7 +3,6 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; -import jakarta.persistence.Embeddable; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; @@ -33,4 +32,16 @@ public MentoringTime(@JsonProperty("startTime")final LocalDateTime startTime, this.startTime = startTime; this.endTime = endTime; } + + public static boolean equals(MentoringTime expected, MentoringTime actual) { + if (expected == null || actual == null) { + return false; + } + return expected.getStartTime().equals(actual.getStartTime()) && expected.getEndTime().equals(actual.getEndTime()); + } + + @Override + public String toString() { + return "MentoringTime(startTime=" + this.getStartTime() + ", endTime=" + this.getEndTime() + ")"; + } } diff --git a/src/main/java/es/princip/ringus/domain/mentoring/accept/MentoringAccept.java b/src/main/java/es/princip/ringus/domain/mentoring/accept/MentoringAccept.java new file mode 100644 index 0000000..921781e --- /dev/null +++ b/src/main/java/es/princip/ringus/domain/mentoring/accept/MentoringAccept.java @@ -0,0 +1,43 @@ +package es.princip.ringus.domain.mentoring.accept; + +import es.princip.ringus.domain.base.BaseTimeEntity; +import es.princip.ringus.domain.mentee.Mentee; +import es.princip.ringus.domain.mentor.Mentor; +import es.princip.ringus.domain.mentoring.MentoringTime; +import es.princip.ringus.domain.mentoring.converter.MentoringTimeConverter; +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Getter +@Table(name = "mentoring_accept") +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class MentoringAccept extends BaseTimeEntity { + + @Id + @Column(name = "mentoring_accept_id") + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Convert(converter = MentoringTimeConverter.class) + @Column(length = 200, nullable = false) + private MentoringTime mentoringTime; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "mentor_id", nullable = false) + private Mentor mentor; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "mentee_id", nullable = false) + private Mentee mentee; + + @Builder + public MentoringAccept(final MentoringTime mentoringTime, final Mentor mentor, final Mentee mentee) { + this.mentoringTime = mentoringTime; + this.mentor = mentor; + this.mentee = mentee; + } +} diff --git a/src/main/java/es/princip/ringus/domain/mentoring/accept/MentoringAcceptRepository.java b/src/main/java/es/princip/ringus/domain/mentoring/accept/MentoringAcceptRepository.java new file mode 100644 index 0000000..809b779 --- /dev/null +++ b/src/main/java/es/princip/ringus/domain/mentoring/accept/MentoringAcceptRepository.java @@ -0,0 +1,8 @@ +package es.princip.ringus.domain.mentoring.accept; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface MentoringAcceptRepository extends JpaRepository { +} diff --git a/src/main/java/es/princip/ringus/domain/mentoring/converter/MentoringTimeConverter.java b/src/main/java/es/princip/ringus/domain/mentoring/converter/MentoringTimeConverter.java index 319bd2c..6c1462f 100644 --- a/src/main/java/es/princip/ringus/domain/mentoring/converter/MentoringTimeConverter.java +++ b/src/main/java/es/princip/ringus/domain/mentoring/converter/MentoringTimeConverter.java @@ -1,51 +1,40 @@ package es.princip.ringus.domain.mentoring.converter; import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import es.princip.ringus.domain.mentoring.MentoringTime; import es.princip.ringus.domain.exception.MentoringErrorCode; +import es.princip.ringus.domain.mentoring.MentoringTime; import es.princip.ringus.global.exception.CustomRuntimeException; import jakarta.persistence.AttributeConverter; import jakarta.persistence.Converter; +import lombok.extern.slf4j.Slf4j; -import java.util.ArrayList; -import java.util.List; +@Slf4j +@Converter +public class MentoringTimeConverter implements AttributeConverter { -@Converter(autoApply = false) -public class MentoringTimeConverter implements AttributeConverter,String> { - private static final ObjectMapper objectMapper = new ObjectMapper() - .registerModule(new JavaTimeModule()); + private final ObjectMapper objectMapper = new ObjectMapper().registerModule(new JavaTimeModule()); @Override - public String convertToDatabaseColumn(List mentoringTimes) { + public String convertToDatabaseColumn(MentoringTime attribute) { try { - if (mentoringTimes == null || mentoringTimes.isEmpty()) { - return "[]"; // 빈 리스트일 경우 빈 JSON 배열 반환 + if (attribute == null) { + return "[]"; } - String json = objectMapper.writeValueAsString(mentoringTimes); - System.out.println("✅ MentoringTime JSON 변환 (DB 저장): " + json); - return json; + return objectMapper.writeValueAsString(attribute); } catch (Exception e) { - System.err.println("❌ MentoringTime 변환 오류 (DB 저장): " + mentoringTimes); - e.printStackTrace(); + log.error("Failed to convert MentoringTime to JSON {}", e.getMessage()); throw new CustomRuntimeException(MentoringErrorCode.MENTORING_TIME_CONVERT_ERROR); } } @Override - public List convertToEntityAttribute(String dbData) { + public MentoringTime convertToEntityAttribute(String dbData) { try { - if (dbData == null || dbData.isEmpty()) { - return new ArrayList<>(); // null 또는 빈 값이면 빈 리스트 반환 - } - List times = objectMapper.readValue(dbData, new TypeReference>() {}); - System.out.println("✅ MentoringTime 객체 변환 (조회 시): " + times); - return times; + return objectMapper.readValue(dbData, MentoringTime.class); } catch (JsonProcessingException e) { - System.err.println("❌ MentoringTime 변환 오류 (조회 시): " + dbData); - e.printStackTrace(); + log.error("Failed to convert JSON to MentoringTime: {}", e.getMessage()); throw new CustomRuntimeException(MentoringErrorCode.MENTORING_TIME_CONVERT_ERROR); } } diff --git a/src/main/java/es/princip/ringus/domain/mentoring/converter/MentoringTimeListConverter.java b/src/main/java/es/princip/ringus/domain/mentoring/converter/MentoringTimeListConverter.java new file mode 100644 index 0000000..b3d5248 --- /dev/null +++ b/src/main/java/es/princip/ringus/domain/mentoring/converter/MentoringTimeListConverter.java @@ -0,0 +1,52 @@ +package es.princip.ringus.domain.mentoring.converter; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import es.princip.ringus.domain.mentoring.MentoringTime; +import es.princip.ringus.domain.exception.MentoringErrorCode; +import es.princip.ringus.global.exception.CustomRuntimeException; +import jakarta.persistence.AttributeConverter; +import jakarta.persistence.Converter; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; +import java.util.List; + +@Slf4j +@Converter +public class MentoringTimeListConverter implements AttributeConverter,String> { + private static final ObjectMapper objectMapper = new ObjectMapper() + .registerModule(new JavaTimeModule()); + + @Override + public String convertToDatabaseColumn(List mentoringTimes) { + try { + if (mentoringTimes == null || mentoringTimes.isEmpty()) { + return "[]"; // 빈 리스트일 경우 빈 JSON 배열 반환 + } + String json = objectMapper.writeValueAsString(mentoringTimes); + log.info("Success to convert MentoringTime to JSON: {}", json); + return json; + } catch (Exception e) { + log.error("Failed to convert MentoringTime to JSON {}", e.getMessage()); + throw new CustomRuntimeException(MentoringErrorCode.MENTORING_TIME_CONVERT_ERROR); + } + } + + @Override + public List convertToEntityAttribute(String dbData) { + try { + if (dbData == null || dbData.isEmpty()) { + return new ArrayList<>(); // null 또는 빈 값이면 빈 리스트 반환 + } + List times = objectMapper.readValue(dbData, new TypeReference>() {}); + log.info("Success to convert JSON to MentoringTime: {}", times); + return times; + } catch (JsonProcessingException e) { + log.error("Failed to convert JSON to MentoringTime: {}", e.getMessage()); + throw new CustomRuntimeException(MentoringErrorCode.MENTORING_TIME_CONVERT_ERROR); + } + } +} diff --git a/src/main/java/es/princip/ringus/infra/config/SecurityConfig.java b/src/main/java/es/princip/ringus/infra/config/SecurityConfig.java index 9296f63..53fe0d0 100644 --- a/src/main/java/es/princip/ringus/infra/config/SecurityConfig.java +++ b/src/main/java/es/princip/ringus/infra/config/SecurityConfig.java @@ -41,7 +41,7 @@ public PasswordEncoder passwordEncoder() { public CorsConfigurationSource corsConfigurationSource() { CorsConfiguration config = new CorsConfiguration(); config.setAllowedOriginPatterns(List.of("http://localhost:5178", "https://ringus.my")); - config.setAllowedMethods(List.of("GET", "POST", "PATCH", "DELETE", "OPTIONS")); + config.setAllowedMethods(List.of("GET", "POST", "PATCH", "DELETE", "OPTIONS", "PUT")); config.setAllowedHeaders(List.of("Authorization", "Content-Type")); config.setExposedHeaders(List.of("Authorization")); config.setAllowCredentials(true); // 인증 정보 포함 허용 diff --git a/src/main/java/es/princip/ringus/presentation/mentor/dto/CursorRequest.java b/src/main/java/es/princip/ringus/presentation/mentor/dto/CursorRequest.java index 0b9439f..51eb9c8 100644 --- a/src/main/java/es/princip/ringus/presentation/mentor/dto/CursorRequest.java +++ b/src/main/java/es/princip/ringus/presentation/mentor/dto/CursorRequest.java @@ -2,7 +2,6 @@ public record CursorRequest( boolean bookmarked, - boolean commissioned, boolean suggested, Long cursor ) { diff --git a/src/main/java/es/princip/ringus/presentation/mentor/dto/MentorDetailResponse.java b/src/main/java/es/princip/ringus/presentation/mentor/dto/MentorDetailResponse.java index ec84d1c..887046a 100644 --- a/src/main/java/es/princip/ringus/presentation/mentor/dto/MentorDetailResponse.java +++ b/src/main/java/es/princip/ringus/presentation/mentor/dto/MentorDetailResponse.java @@ -1,6 +1,7 @@ package es.princip.ringus.presentation.mentor.dto; import es.princip.ringus.domain.mentor.Mentor; +import es.princip.ringus.domain.mentor.vo.Hashtag; import es.princip.ringus.presentation.common.dto.*; import java.util.List; @@ -26,7 +27,7 @@ public static MentorDetailResponse from(final Mentor mentor) { IntroductionResponse.from(mentor.getIntroduction()), TimezoneResponse.from(mentor.getTimezone()), mentor.getMentoringField().stream().map(String::valueOf).collect(Collectors.toSet()), - mentor.getHashtags().stream().map(String::valueOf).toList(), + mentor.getHashtags().stream().map(Hashtag::getValue).toList(), mentor.getMessage(), PortfolioResponse.from(mentor.getPortfolio()) ); diff --git a/src/main/java/es/princip/ringus/presentation/mentor/dto/MyMentorResponse.java b/src/main/java/es/princip/ringus/presentation/mentor/dto/MyMentorResponse.java index dd994f4..416f80c 100644 --- a/src/main/java/es/princip/ringus/presentation/mentor/dto/MyMentorResponse.java +++ b/src/main/java/es/princip/ringus/presentation/mentor/dto/MyMentorResponse.java @@ -1,6 +1,7 @@ package es.princip.ringus.presentation.mentor.dto; import es.princip.ringus.domain.mentor.Mentor; +import es.princip.ringus.domain.mentor.vo.Hashtag; import es.princip.ringus.presentation.common.dto.*; import java.util.List; @@ -26,7 +27,7 @@ public static MyMentorResponse from(final Mentor mentor) { IntroductionResponse.from(mentor.getIntroduction()), TimezoneResponse.from(mentor.getTimezone()), mentor.getMentoringField().stream().map(String::valueOf).collect(Collectors.toSet()), - mentor.getHashtags().stream().map(String::valueOf).toList(), + mentor.getHashtags().stream().map(Hashtag::getValue).toList(), mentor.getMessage(), PortfolioResponse.from(mentor.getPortfolio()) ); diff --git a/src/main/java/es/princip/ringus/presentation/mentoring/AcceptMentoringController.java b/src/main/java/es/princip/ringus/presentation/mentoring/AcceptMentoringController.java new file mode 100644 index 0000000..7d93391 --- /dev/null +++ b/src/main/java/es/princip/ringus/presentation/mentoring/AcceptMentoringController.java @@ -0,0 +1,32 @@ +package es.princip.ringus.presentation.mentoring; + +import es.princip.ringus.application.mentor.service.AcceptMentoringService; +import es.princip.ringus.global.annotation.SessionCheck; +import es.princip.ringus.global.annotation.SessionMemberId; +import es.princip.ringus.global.util.ApiResponseWrapper; +import es.princip.ringus.presentation.mentoring.dto.AcceptMentoringRequest; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/mentoring/accept") +@RequiredArgsConstructor +public class AcceptMentoringController { + private final AcceptMentoringService mentoringService; + + @SessionCheck + @PatchMapping + public ResponseEntity> acceptMentoring( + @SessionMemberId Long memberId, + @Valid @RequestBody AcceptMentoringRequest request + ) { + Long id = mentoringService.accept(request, memberId); + return ResponseEntity.ok(ApiResponseWrapper.success(HttpStatus.OK, "멘토링 수락 완료", id)); + } +} diff --git a/src/main/java/es/princip/ringus/presentation/mentoring/AcceptMentoringControllerDocs.java b/src/main/java/es/princip/ringus/presentation/mentoring/AcceptMentoringControllerDocs.java new file mode 100644 index 0000000..c736994 --- /dev/null +++ b/src/main/java/es/princip/ringus/presentation/mentoring/AcceptMentoringControllerDocs.java @@ -0,0 +1,31 @@ +package es.princip.ringus.presentation.mentoring; + +import es.princip.ringus.global.annotation.SessionMemberId; +import es.princip.ringus.global.util.ApiResponseWrapper; +import es.princip.ringus.presentation.mentoring.dto.AcceptMentoringRequest; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; + +@Tag(name = "Mentoring API", description = "멘토링 수락 관련 API") +@RequestMapping("/mentoring/accept") +public interface AcceptMentoringControllerDocs { + + @PatchMapping + @Operation(summary = "멘토링 수락", description = "멘토링을 수락 합니다.") + @ApiResponse(responseCode = "200", description = "멘토링 수락 성공") + @ApiResponse(responseCode = "404", description = "해당 신청이 존재하지 않음") + @ApiResponse(responseCode = "304", description = "신청 시간 변환 오류") + @ApiResponse(responseCode = "400", description = "신청 가능 시간 오류") + @ApiResponse(responseCode = "400", description = "멘토링 대기 상태가 아님") + @ApiResponse(responseCode = "400", description = "멘티의 제안 시간에 멘토링 시간이 포함되지 않음") + public ResponseEntity> acceptMentoring( + @SessionMemberId Long memberId, + @Valid @RequestBody AcceptMentoringRequest request + ); +} diff --git a/src/main/java/es/princip/ringus/presentation/mentoring/MentoringControllerDocs.java b/src/main/java/es/princip/ringus/presentation/mentoring/MentoringControllerDocs.java index 74cdfcc..cfa269f 100644 --- a/src/main/java/es/princip/ringus/presentation/mentoring/MentoringControllerDocs.java +++ b/src/main/java/es/princip/ringus/presentation/mentoring/MentoringControllerDocs.java @@ -26,5 +26,6 @@ public interface MentoringControllerDocs { @PostMapping ResponseEntity> suggest( @SessionMemberId Long memberId, - @Valid @RequestBody @Parameter CreateMentoringRequest request); + @Valid @RequestBody @Parameter CreateMentoringRequest request + ); } diff --git a/src/main/java/es/princip/ringus/presentation/mentoring/dto/AcceptMentoringRequest.java b/src/main/java/es/princip/ringus/presentation/mentoring/dto/AcceptMentoringRequest.java new file mode 100644 index 0000000..0872d43 --- /dev/null +++ b/src/main/java/es/princip/ringus/presentation/mentoring/dto/AcceptMentoringRequest.java @@ -0,0 +1,10 @@ +package es.princip.ringus.presentation.mentoring.dto; + +import es.princip.ringus.domain.mentoring.MentoringTime; +import jakarta.validation.constraints.NotNull; + +public record AcceptMentoringRequest( + @NotNull Long menteeId, + MentoringTime mentoringTime +) { +} diff --git a/src/main/resources/db/migration/V4__add_mentoring_accept.sql b/src/main/resources/db/migration/V4__add_mentoring_accept.sql new file mode 100644 index 0000000..63de49b --- /dev/null +++ b/src/main/resources/db/migration/V4__add_mentoring_accept.sql @@ -0,0 +1,16 @@ +CREATE TABLE mentoring_accept ( + mentoring_accept_id BIGINT NOT NULL AUTO_INCREMENT, + mentoring_time VARCHAR(200) NOT NULL, + mentor_id BIGINT NOT NULL, + mentee_id BIGINT NOT NULL, + created_at DATETIME(6) NOT NULL, + updated_at DATETIME(6) NOT NULL, + + PRIMARY KEY (mentoring_accept_id), + + CONSTRAINT fk_mentoring_accept_mentor + FOREIGN KEY (mentor_id) REFERENCES mentor(mentor_id) ON DELETE CASCADE, + + CONSTRAINT fk_mentoring_accept_mentee + FOREIGN KEY (mentee_id) REFERENCES mentee(mentee_id) ON DELETE CASCADE +); \ No newline at end of file