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,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;
Expand Down Expand Up @@ -53,8 +54,15 @@ public Long edit(Long memberId, EditMentorRequest request) {
return mentor.getId();
}

public CursorResponse<MentorCardResponse> getMentorBy(CursorRequest request, Pageable pageable) {
final Slice<MentorCardResponse> response = mentorRepository.findMentorBy(request, pageable);
public CursorResponse<MentorCardResponse> 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);
}
Comment on lines +61 to +63
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Member 인스턴스 메서드로 isNotMentee가 구현 되어있습니다. 해당 메서드를 사용하면 재사용성이 높아질 것 같습니다!


final Slice<MentorCardResponse> response = mentorRepository.findMentorBy(request, pageable, memberId);
final Long cursor = parse(request.cursor(), response);
return CursorResponse.of(response, cursor);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,5 @@ public interface MemberRepository extends JpaRepository<Member, Long> {

boolean existsByEmail(String email);

Optional<Member> findById(Long memberId);
}
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -15,5 +16,8 @@ public interface MenteeRepository extends JpaRepository<Mentee, Long> {
@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);
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,5 @@
import org.springframework.data.domain.Slice;

public interface MentorQueryDslRepository{
Slice<MentorCardResponse> findMentorBy(CursorRequest request, Pageable pageable);
Slice<MentorCardResponse> findMentorBy(CursorRequest request, Pageable pageable, Long memberId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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
Expand All @@ -21,28 +24,44 @@ public class MentorQueryDslRepositoryImpl extends QueryDslSupport implements Men

private List<Tuple> 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<Tuple> 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)
);
}
Comment on lines +41 to +48
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

buildQuery라는 private method로 분리해서 다른 조건이 들어왔을때 대응하기 좋게 만들면 좋을 것 같아요!


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<MentorCardResponse> 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),
Expand All @@ -56,8 +75,8 @@ private List<MentorCardResponse> fetchContent(
}

@Override
public Slice<MentorCardResponse> findMentorBy(CursorRequest request, Pageable pageable) {
final List<MentorCardResponse> content = fetchContent(pageable, request.cursor());
public Slice<MentorCardResponse> findMentorBy(CursorRequest request, Pageable pageable, Long memberId) {
final List<MentorCardResponse> content = fetchContent(pageable, request.cursor(), request.bookmarked(), memberId);
return paginate(pageable, content);
}
}
Original file line number Diff line number Diff line change
@@ -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<Mentor, Long> {
public interface MentorRepository extends JpaRepository<Mentor, Long>, MentorQueryDslRepository {
boolean existsByMemberId(Long memberId);

@Query("SELECT m.profileImage FROM Mentor m WHERE m.memberId = :memberId")
Expand Down
24 changes: 24 additions & 0 deletions src/main/java/es/princip/ringus/global/aop/SessionToMemberId.java
Original file line number Diff line number Diff line change
@@ -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");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -16,7 +19,7 @@
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;


@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping("/mentor")
Expand Down Expand Up @@ -47,9 +50,19 @@ public ResponseEntity<ApiResponseWrapper<EditMentorResponse>> update(
@GetMapping
public ResponseEntity<ApiResponseWrapper<CursorResponse<MentorCardResponse>>> 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<MentorCardResponse> 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<MentorCardResponse> response = mentorService.getMentorBy(request, pageable, memberId);
return ResponseEntity.ok(ApiResponseWrapper.success(HttpStatus.OK, "성공", response));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -47,7 +49,9 @@ ResponseEntity<ApiResponseWrapper<EditMentorResponse>> update(
@GetMapping
ResponseEntity<ApiResponseWrapper<CursorResponse<MentorCardResponse>>> getMentors(
CursorRequest request,
Pageable pageable
Pageable pageable,
HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse
);

@Operation(summary = "멘토 상세 조회", description = "멘토 상세 정보를 조회합니다.")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,7 @@ public record CursorRequest(
boolean commissioned,
Long cursor
) {
public boolean isBookmarked(){
return bookmarked();
}
}