diff --git a/src/main/java/es/princip/ringus/application/mentor/service/MentorService.java b/src/main/java/es/princip/ringus/application/mentor/service/MentorService.java index 4d098f8..440721f 100644 --- a/src/main/java/es/princip/ringus/application/mentor/service/MentorService.java +++ b/src/main/java/es/princip/ringus/application/mentor/service/MentorService.java @@ -1,10 +1,11 @@ package es.princip.ringus.application.mentor.service; -import es.princip.ringus.application.support.CursorParser; +import es.princip.ringus.domain.exception.MemberErrorCode; 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.member.MemberType; import es.princip.ringus.domain.mentor.Mentor; import es.princip.ringus.domain.mentor.MentorRepository; import es.princip.ringus.domain.support.CursorResponse; @@ -53,8 +54,15 @@ public Long edit(Long memberId, EditMentorRequest request) { return mentor.getId(); } - public CursorResponse getMentorBy(CursorRequest request, Pageable pageable) { - final Slice response = mentorRepository.findMentorBy(request, pageable); + public CursorResponse getMentorBy(CursorRequest request, Pageable pageable, Long memberId) { + Member member = memberRepository.findById(memberId) + .orElseThrow(() -> new CustomRuntimeException(MemberErrorCode.MEMBER_NOT_FOUND)); + + if (member.getMemberType().equals(MemberType.ROLE_MENTEE)) { + throw new CustomRuntimeException(MemberErrorCode.MEMBER_TYPE_DIFFERENT); + } + + final Slice response = mentorRepository.findMentorBy(request, pageable, memberId); final Long cursor = parse(request.cursor(), response); return CursorResponse.of(response, cursor); } diff --git a/src/main/java/es/princip/ringus/domain/exception/MemberErrorCode.java b/src/main/java/es/princip/ringus/domain/exception/MemberErrorCode.java index bd947a0..8e65533 100644 --- a/src/main/java/es/princip/ringus/domain/exception/MemberErrorCode.java +++ b/src/main/java/es/princip/ringus/domain/exception/MemberErrorCode.java @@ -6,7 +6,8 @@ public enum MemberErrorCode implements ErrorCode { SESSION_EXPIRED(HttpStatus.UNAUTHORIZED, "세션이 거부됨"), - MEMBER_NOT_FOUND(HttpStatus.NOT_FOUND, "멤버를 찾을 수 없음"); + MEMBER_NOT_FOUND(HttpStatus.NOT_FOUND, "멤버를 찾을 수 없음"), + MEMBER_TYPE_DIFFERENT(HttpStatus.BAD_REQUEST, "다른 멤버 타입"); MemberErrorCode(HttpStatus status, String message) { this.status = status; diff --git a/src/main/java/es/princip/ringus/domain/member/MemberRepository.java b/src/main/java/es/princip/ringus/domain/member/MemberRepository.java index a832c0e..5487267 100644 --- a/src/main/java/es/princip/ringus/domain/member/MemberRepository.java +++ b/src/main/java/es/princip/ringus/domain/member/MemberRepository.java @@ -11,4 +11,5 @@ public interface MemberRepository extends JpaRepository { boolean existsByEmail(String email); + Optional findById(Long memberId); } diff --git a/src/main/java/es/princip/ringus/domain/mentee/MenteeRepository.java b/src/main/java/es/princip/ringus/domain/mentee/MenteeRepository.java index 6679c69..6bde4ce 100644 --- a/src/main/java/es/princip/ringus/domain/mentee/MenteeRepository.java +++ b/src/main/java/es/princip/ringus/domain/mentee/MenteeRepository.java @@ -1,5 +1,6 @@ package es.princip.ringus.domain.mentee; +import es.princip.ringus.domain.common.Education; import es.princip.ringus.infra.storage.domain.ProfileImage; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; @@ -15,5 +16,8 @@ public interface MenteeRepository extends JpaRepository { @Query("SELECT m.profileImage FROM Mentee m WHERE m.memberId = :memberId") ProfileImage findProfileByMemberId(Long memberId); + @Query("SELECT m.education FROM Mentee m WHERE m.memberId = :memberId") + Education findEducationByMemberId(Long memberId); + boolean existsByNickname(String nickname); } diff --git a/src/main/java/es/princip/ringus/domain/mentor/MentorQueryDslRepository.java b/src/main/java/es/princip/ringus/domain/mentor/MentorQueryDslRepository.java index a7c6b30..0de0e14 100644 --- a/src/main/java/es/princip/ringus/domain/mentor/MentorQueryDslRepository.java +++ b/src/main/java/es/princip/ringus/domain/mentor/MentorQueryDslRepository.java @@ -6,5 +6,5 @@ import org.springframework.data.domain.Slice; public interface MentorQueryDslRepository{ - Slice findMentorBy(CursorRequest request, Pageable pageable); + Slice findMentorBy(CursorRequest request, Pageable pageable, Long memberId); } diff --git a/src/main/java/es/princip/ringus/domain/mentor/MentorQueryDslRepositoryImpl.java b/src/main/java/es/princip/ringus/domain/mentor/MentorQueryDslRepositoryImpl.java index 52e5e76..9c392b6 100644 --- a/src/main/java/es/princip/ringus/domain/mentor/MentorQueryDslRepositoryImpl.java +++ b/src/main/java/es/princip/ringus/domain/mentor/MentorQueryDslRepositoryImpl.java @@ -2,6 +2,7 @@ import com.querydsl.core.Tuple; import com.querydsl.core.types.OrderSpecifier; +import com.querydsl.jpa.impl.JPAQuery; import es.princip.ringus.domain.support.QueryDslSupport; import es.princip.ringus.presentation.mentor.dto.CursorRequest; import es.princip.ringus.presentation.mentor.dto.MentorCardResponse; @@ -13,6 +14,8 @@ import java.util.List; import static com.querydsl.core.types.Order.ASC; +import static es.princip.ringus.domain.bookmark.QBookmark.bookmark; +import static es.princip.ringus.domain.mentee.QMentee.mentee; import static es.princip.ringus.domain.mentor.QMentor.mentor; @Repository @@ -21,28 +24,44 @@ public class MentorQueryDslRepositoryImpl extends QueryDslSupport implements Men private List fetchMentor( final Pageable pageable, - final Long cursor + final Long cursor, + final Boolean bookmarked, + final Long memberId ) { - return queryFactory.select( - mentor.id, - mentor.nickname, - mentor.profileImage, - mentor.introduction, - mentor.organization, - mentor.message + JPAQuery query = queryFactory.select( + mentor.id, + mentor.nickname, + mentor.profileImage, + mentor.introduction, + mentor.organization, + mentor.message ) - .from(mentor) + .from(mentor); + + if(bookmarked && memberId != null){ + query + .join(mentee).on(mentee.memberId.eq(memberId)) + .join(bookmark).on(mentor.id.eq(bookmark.mentor.id)) + .where( + bookmark.mentee.id.eq(mentee.id) + ); + } + + query .where(cursor != null ? mentor.id.goe( cursor) : mentor.id.isNotNull()) .orderBy(new OrderSpecifier<>(ASC, mentor.id)) - .limit(pageable.getPageSize() + 1) - .fetch(); + .limit(pageable.getPageSize() + 1); + + return query.fetch(); } private List fetchContent( final Pageable pageable, - final Long cursor + final Long cursor, + final Boolean bookmared, + final Long memberId ) { - return fetchMentor(pageable, cursor).stream() + return fetchMentor(pageable, cursor, bookmared, memberId).stream() .map(tuple -> MentorCardResponse.of( tuple.get(mentor.id), tuple.get(mentor.nickname), @@ -56,8 +75,8 @@ private List fetchContent( } @Override - public Slice findMentorBy(CursorRequest request, Pageable pageable) { - final List content = fetchContent(pageable, request.cursor()); + public Slice findMentorBy(CursorRequest request, Pageable pageable, Long memberId) { + final List content = fetchContent(pageable, request.cursor(), request.bookmarked(), memberId); return paginate(pageable, content); } } diff --git a/src/main/java/es/princip/ringus/domain/mentor/MentorRepository.java b/src/main/java/es/princip/ringus/domain/mentor/MentorRepository.java index d2776b1..dea6238 100644 --- a/src/main/java/es/princip/ringus/domain/mentor/MentorRepository.java +++ b/src/main/java/es/princip/ringus/domain/mentor/MentorRepository.java @@ -1,12 +1,15 @@ package es.princip.ringus.domain.mentor; +import es.princip.ringus.domain.mentor.vo.Organization; import es.princip.ringus.infra.storage.domain.ProfileImage; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; +import java.util.Optional; + @Repository -public interface MentorRepository extends JpaRepository { +public interface MentorRepository extends JpaRepository, MentorQueryDslRepository { boolean existsByMemberId(Long memberId); @Query("SELECT m.profileImage FROM Mentor m WHERE m.memberId = :memberId") diff --git a/src/main/java/es/princip/ringus/global/aop/SessionToMemberId.java b/src/main/java/es/princip/ringus/global/aop/SessionToMemberId.java new file mode 100644 index 0000000..938d920 --- /dev/null +++ b/src/main/java/es/princip/ringus/global/aop/SessionToMemberId.java @@ -0,0 +1,24 @@ +package es.princip.ringus.global.aop; + +import es.princip.ringus.domain.exception.MemberErrorCode; +import es.princip.ringus.global.exception.CustomRuntimeException; +import es.princip.ringus.global.util.CookieUtil; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpSession; + +public class SessionToMemberId{ + + public static Long getSessionMemberId (HttpServletRequest request, HttpServletResponse response){ + HttpSession session = request.getSession(false); + + if(session == null || session.getAttribute("memberId") == null){ + throw new CustomRuntimeException(MemberErrorCode.SESSION_EXPIRED); + } + + System.out.println("[Session Interceptor] : Interceptor 실행, 세션 유효, 멤버 ID: " + session.getAttribute("memberId")); + CookieUtil.addSessionCookie(response, session.getId()); + request.setAttribute("memberId", session.getAttribute("memberId")); + return (Long) request.getAttribute("memberId"); + } +} \ No newline at end of file diff --git a/src/main/java/es/princip/ringus/presentation/mentor/MentorController.java b/src/main/java/es/princip/ringus/presentation/mentor/MentorController.java index e6d1bec..de0bec0 100644 --- a/src/main/java/es/princip/ringus/presentation/mentor/MentorController.java +++ b/src/main/java/es/princip/ringus/presentation/mentor/MentorController.java @@ -4,8 +4,11 @@ import es.princip.ringus.domain.support.CursorResponse; import es.princip.ringus.global.annotation.SessionCheck; import es.princip.ringus.global.annotation.SessionMemberId; +import es.princip.ringus.global.aop.SessionToMemberId; import es.princip.ringus.global.util.ApiResponseWrapper; import es.princip.ringus.presentation.mentor.dto.*; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -16,7 +19,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; - +@Slf4j @RestController @RequiredArgsConstructor @RequestMapping("/mentor") @@ -47,9 +50,19 @@ public ResponseEntity> update( @GetMapping public ResponseEntity>> getMentors( @ModelAttribute final CursorRequest request, - @PageableDefault(sort = "mentorId", direction = Sort.Direction.DESC) final Pageable pageable + @PageableDefault(sort = "mentorId", direction = Sort.Direction.DESC) final Pageable pageable, + HttpServletRequest httpServletRequest, + HttpServletResponse httpServletResponse ) { - CursorResponse response = mentorService.getMentorBy(request, pageable); + Long memberId = null; + + if (request.isBookmarked()){ + memberId = SessionToMemberId.getSessionMemberId(httpServletRequest,httpServletResponse); + } + + log.info(request.toString()); + log.info(pageable.toString()); + CursorResponse response = mentorService.getMentorBy(request, pageable, memberId); return ResponseEntity.ok(ApiResponseWrapper.success(HttpStatus.OK, "성공", response)); } diff --git a/src/main/java/es/princip/ringus/presentation/mentor/MentorControllerDocs.java b/src/main/java/es/princip/ringus/presentation/mentor/MentorControllerDocs.java index 72588fd..fdfae27 100644 --- a/src/main/java/es/princip/ringus/presentation/mentor/MentorControllerDocs.java +++ b/src/main/java/es/princip/ringus/presentation/mentor/MentorControllerDocs.java @@ -9,6 +9,8 @@ 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.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; import org.springframework.data.domain.Pageable; import org.springframework.http.ResponseEntity; @@ -47,7 +49,9 @@ ResponseEntity> update( @GetMapping ResponseEntity>> getMentors( CursorRequest request, - Pageable pageable + Pageable pageable, + HttpServletRequest httpServletRequest, + HttpServletResponse httpServletResponse ); @Operation(summary = "멘토 상세 조회", description = "멘토 상세 정보를 조회합니다.") 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 71c12a2..a07c388 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 @@ -5,4 +5,7 @@ public record CursorRequest( boolean commissioned, Long cursor ) { + public boolean isBookmarked(){ + return bookmarked(); + } }