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
@@ -0,0 +1,17 @@
package com.back.domain.member.member.error;

import com.back.global.exception.ErrorCode;
import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@RequiredArgsConstructor
public enum MemberErrorCode implements ErrorCode {

NOT_FOUND_MEMBER("404-1", "회원을 찾을 수 없습니다."),
NOT_FOUND_MENTOR("404-2", "멘토를 찾을 수 없습니다."),
NOT_FOUND_MENTEE("404-3", "멘티를 찾을 수 없습니다.");

private final String code;
private final String message;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.back.domain.member.member.service;

import com.back.domain.member.member.entity.Member;
import com.back.domain.member.member.error.MemberErrorCode;
import com.back.domain.member.mentee.entity.Mentee;
import com.back.domain.member.mentee.repository.MenteeRepository;
import com.back.domain.member.mentor.entity.Mentor;
import com.back.domain.member.mentor.repository.MentorRepository;
import com.back.global.exception.ServiceException;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;

@Component
@RequiredArgsConstructor
public class MemberStorage {

private final MentorRepository mentorRepository;
private final MenteeRepository menteeRepository;

public Mentor findMentorByMember(Member member) {
return findMentorByMemberId(member.getId());
}

public Mentor findMentorByMemberId(Long memberId) {
return mentorRepository.findByMemberId(memberId)
.orElseThrow(() -> new ServiceException(MemberErrorCode.NOT_FOUND_MENTOR));
}

public Mentee findMenteeByMember(Member member) {
return menteeRepository.findByMemberId(member.getId())
.orElseThrow(() -> new ServiceException(MemberErrorCode.NOT_FOUND_MENTEE));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.back.domain.member.mentee.dto;

import com.back.domain.member.mentee.entity.Mentee;
import io.swagger.v3.oas.annotations.media.Schema;

public record MenteeDto(
@Schema(description = "멘티 ID")
Long menteeId,
@Schema(description = "멘티명")
String name
) {
public static MenteeDto from(Mentee mentee) {
return new MenteeDto(
mentee.getId(),
mentee.getMember().getName()
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.back.domain.member.mentor.dto;

import com.back.domain.member.mentor.entity.Mentor;
import io.swagger.v3.oas.annotations.media.Schema;

public record MentorDetailDto(
@Schema(description = "멘토 ID")
Long mentorId,
@Schema(description = "멘토명")
String name,
@Schema(description = "평점")
Double rate,
// TODO: Job id, name
@Schema(description = "연차")
Integer careerYears
) {
public static MentorDetailDto from(Mentor mentor) {
return new MentorDetailDto(
mentor.getId(),
mentor.getMember().getName(),
mentor.getRate(),
mentor.getCareerYears()
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,16 @@
import com.back.domain.member.mentor.entity.Mentor;
import io.swagger.v3.oas.annotations.media.Schema;

public record MentorDto (
public record MentorDto(
@Schema(description = "멘토 ID")
Long mentorId,
@Schema(description = "멘토명")
String name,
@Schema(description = "평점")
Double rate,
// TODO: Job id, name
@Schema(description = "연차")
Integer careerYears
String name
) {
public static MentorDto from(Mentor mentor) {
return new MentorDto(
mentor.getId(),
mentor.getMember().getName(),
mentor.getRate(),
mentor.getCareerYears()
mentor.getMember().getName()
);
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.back.domain.mentoring.mentoring.controller;

import com.back.domain.member.member.entity.Member;
import com.back.domain.mentoring.mentoring.dto.MentoringDto;
import com.back.domain.mentoring.mentoring.dto.MentoringWithTagsDto;
import com.back.domain.mentoring.mentoring.dto.request.MentoringRequest;
import com.back.domain.mentoring.mentoring.dto.response.MentoringPagingResponse;
import com.back.domain.mentoring.mentoring.dto.response.MentoringResponse;
Expand Down Expand Up @@ -31,7 +31,7 @@ public RsData<MentoringPagingResponse> getMentorings(
@RequestParam(defaultValue = "10") int size,
@RequestParam(required = false) String keyword
) {
Page<MentoringDto> mentoringPage = mentoringService.getMentorings(keyword, page, size);
Page<MentoringWithTagsDto> mentoringPage = mentoringService.getMentorings(keyword, page, size);
MentoringPagingResponse resDto = MentoringPagingResponse.from(mentoringPage);

return new RsData<>(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,16 @@
import com.back.domain.mentoring.mentoring.entity.Mentoring;
import io.swagger.v3.oas.annotations.media.Schema;

import java.util.List;

public record MentoringDto(
@Schema(description = "멘토링 ID")
Long mentoringId,
@Schema(description = "멘토링 제목")
String title,
@Schema(description = "멘토링 태그")
List<String> tags
String title
) {
public static MentoringDto from(Mentoring mentoring) {
return new MentoringDto(
mentoring.getId(),
mentoring.getTitle(),
mentoring.getTags()
mentoring.getTitle()
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.back.domain.mentoring.mentoring.dto;

import com.back.domain.mentoring.mentoring.entity.Mentoring;
import io.swagger.v3.oas.annotations.media.Schema;

import java.util.List;

public record MentoringWithTagsDto(
@Schema(description = "멘토링 ID")
Long mentoringId,
@Schema(description = "멘토링 제목")
String title,
@Schema(description = "멘토링 태그")
List<String> tags
) {
public static MentoringWithTagsDto from(Mentoring mentoring) {
return new MentoringWithTagsDto(
mentoring.getId(),
mentoring.getTitle(),
mentoring.getTags()
);
}
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
package com.back.domain.mentoring.mentoring.dto.response;

import com.back.domain.mentoring.mentoring.dto.MentoringDto;
import com.back.domain.mentoring.mentoring.dto.MentoringWithTagsDto;
import io.swagger.v3.oas.annotations.media.Schema;
import org.springframework.data.domain.Page;

import java.util.List;

public record MentoringPagingResponse(
@Schema(description = "멘토링 목록")
List<MentoringDto> mentorings,
List<MentoringWithTagsDto> mentorings,
@Schema(description = "현재 페이지 (0부터 시작)")
int currentPage,
@Schema(description = "총 페이지")
Expand All @@ -18,7 +18,7 @@ public record MentoringPagingResponse(
@Schema(description = "다음 페이지 존재 여부")
boolean hasNext
) {
public static MentoringPagingResponse from(Page<MentoringDto> page) {
public static MentoringPagingResponse from(Page<MentoringWithTagsDto> page) {
return new MentoringPagingResponse(
page.getContent(),
page.getNumber(),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
package com.back.domain.mentoring.mentoring.dto.response;

import com.back.domain.member.mentor.dto.MentorDto;
import com.back.domain.member.mentor.dto.MentorDetailDto;
import com.back.domain.mentoring.mentoring.dto.MentoringDetailDto;
import io.swagger.v3.oas.annotations.media.Schema;

public record MentoringResponse(
@Schema(description = "멘토링")
MentoringDetailDto mentoring,
@Schema(description = "멘토")
MentorDto mentor
MentorDetailDto mentor
) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ public enum MentoringErrorCode implements ErrorCode {
// 404
NOT_FOUND_MENTOR("404-1", "멘토를 찾을 수 없습니다."),
NOT_FOUND_MENTORING("404-2", "멘토링을 찾을 수 없습니다."),
NOT_FOUND_MENTEE("404-3", "멘티를 찾을 수 없습니다."),

// 409
ALREADY_EXISTS_MENTORING("409-1", "이미 멘토링 정보가 존재합니다.");
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package com.back.domain.mentoring.mentoring.service;

import com.back.domain.member.member.entity.Member;
import com.back.domain.member.mentor.dto.MentorDto;
import com.back.domain.member.mentor.dto.MentorDetailDto;
import com.back.domain.member.mentor.entity.Mentor;
import com.back.domain.member.mentor.repository.MentorRepository;
import com.back.domain.mentoring.mentoring.dto.MentoringDetailDto;
import com.back.domain.mentoring.mentoring.dto.MentoringDto;
import com.back.domain.mentoring.mentoring.dto.MentoringWithTagsDto;
import com.back.domain.mentoring.mentoring.dto.request.MentoringRequest;
import com.back.domain.mentoring.mentoring.dto.response.MentoringResponse;
import com.back.domain.mentoring.mentoring.entity.Mentoring;
Expand All @@ -30,11 +30,11 @@ public class MentoringService {
private final MentorSlotRepository mentorSlotRepository;

@Transactional(readOnly = true)
public Page<MentoringDto> getMentorings(String keyword, int page, int size) {
public Page<MentoringWithTagsDto> getMentorings(String keyword, int page, int size) {
Pageable pageable = PageRequest.of(page, size);

return mentoringRepository.searchMentorings(keyword, pageable)
.map(MentoringDto::from);
.map(MentoringWithTagsDto::from);
}

@Transactional(readOnly = true)
Expand All @@ -44,7 +44,7 @@ public MentoringResponse getMentoring(Long mentoringId) {

return new MentoringResponse(
MentoringDetailDto.from(mentoring),
MentorDto.from(mentor)
MentorDetailDto.from(mentor)
);
}

Expand All @@ -69,7 +69,7 @@ public MentoringResponse createMentoring(MentoringRequest reqDto, Member member)

return new MentoringResponse(
MentoringDetailDto.from(mentoring),
MentorDto.from(mentor)
MentorDetailDto.from(mentor)
);
}

Expand All @@ -84,7 +84,7 @@ public MentoringResponse updateMentoring(Long mentoringId, MentoringRequest reqD

return new MentoringResponse(
MentoringDetailDto.from(mentoring),
MentorDto.from(mentor)
MentorDetailDto.from(mentor)
);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.back.domain.mentoring.mentoring.service;

import com.back.domain.mentoring.mentoring.entity.Mentoring;
import com.back.domain.mentoring.mentoring.error.MentoringErrorCode;
import com.back.domain.mentoring.mentoring.repository.MentoringRepository;
import com.back.domain.mentoring.reservation.repository.ReservationRepository;
import com.back.domain.mentoring.slot.entity.MentorSlot;
import com.back.domain.mentoring.slot.error.MentorSlotErrorCode;
import com.back.domain.mentoring.slot.repository.MentorSlotRepository;
import com.back.global.exception.ServiceException;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;

@Component
@RequiredArgsConstructor
public class MentoringStorage {

private final MentoringRepository mentoringRepository;
private final MentorSlotRepository mentorSlotRepository;
private final ReservationRepository reservationRepository;

public Mentoring findMentoring(Long mentoringId) {
return mentoringRepository.findById(mentoringId)
.orElseThrow(() -> new ServiceException(MentoringErrorCode.NOT_FOUND_MENTORING));
}

public MentorSlot findMentorSlot(Long slotId) {
return mentorSlotRepository.findById(slotId)
.orElseThrow(() -> new ServiceException(MentorSlotErrorCode.NOT_FOUND_MENTOR_SLOT));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package com.back.domain.mentoring.reservation.controller;

import com.back.domain.member.member.service.MemberStorage;
import com.back.domain.member.mentee.entity.Mentee;
import com.back.domain.mentoring.reservation.dto.request.ReservationRequest;
import com.back.domain.mentoring.reservation.dto.response.ReservationResponse;
import com.back.domain.mentoring.reservation.service.ReservationService;
import com.back.global.rq.Rq;
import com.back.global.rsData.RsData;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.security.access.prepost.PreAuthorize;
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;

@RestController
@RequestMapping("/reservations")
@RequiredArgsConstructor
@Tag(name = "ReservationController", description = "예약 API")
public class ReservationController {

private final ReservationService reservationService;
private final MemberStorage memberStorage;
private final Rq rq;

@PostMapping
@PreAuthorize("hasRole('MENTEE')")
@Operation(summary = "예약 신청", description = "멘티가 멘토의 슬롯을 선택해 예약 신청을 합니다. 로그인한 멘티만 예약 신청할 수 있습니다.")
public RsData<ReservationResponse> createReservation(
@RequestBody @Valid ReservationRequest reqDto
) {
Mentee mentee = memberStorage.findMenteeByMember(rq.getActor());

ReservationResponse resDto = reservationService.createReservation(mentee, reqDto);

return new RsData<>(
"201",
"예약 신청이 완료되었습니다.",
resDto
);
}
}
Loading