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,15 +1,21 @@
package es.princip.ringus.application.mentee.service;

import es.princip.ringus.application.support.MenteeCursorParser;
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.support.CursorResponse;
import es.princip.ringus.global.exception.CustomRuntimeException;
import es.princip.ringus.presentation.mentee.dto.EditMenteeRequest;
import es.princip.ringus.presentation.mentee.dto.MenteeCardResponse;
import es.princip.ringus.presentation.mentee.dto.MenteeCursorRequest;
import es.princip.ringus.presentation.mentee.dto.MenteeRequest;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

Expand Down Expand Up @@ -48,4 +54,11 @@ public Long edit(Long memberId, EditMenteeRequest request) {
mentee.edit(request);
return mentee.getId();
}

public CursorResponse<MenteeCardResponse> getMenteeBy(MenteeCursorRequest request, Pageable pageable, Long memberId){
final Slice<MenteeCardResponse> response = menteeRepository.findMenteeBy(request, pageable, memberId);
final Long cursor = MenteeCursorParser.parse(request.cursor(), response);

return CursorResponse.of(response, cursor);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
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 All @@ -17,7 +16,7 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import static es.princip.ringus.application.support.CursorParser.parse;
import static es.princip.ringus.application.support.MentorCursorParser.parse;

@Service
@RequiredArgsConstructor
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package es.princip.ringus.application.support;

import es.princip.ringus.presentation.mentee.dto.MenteeCardResponse;
import org.springframework.data.domain.Slice;

public class MenteeCursorParser {
public static Long parse(final Long cursor, final Slice<MenteeCardResponse> slice) {
if (slice.isLast()) {
return null;
}
if (slice.hasNext()) {
return slice.getContent()
.get(slice.getSize() -1)
.menteeId();
}
return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import es.princip.ringus.presentation.mentor.dto.MentorCardResponse;
import org.springframework.data.domain.Slice;

public class CursorParser {
public class MentorCursorParser {
public static Long parse(final Long cursor, final Slice<MentorCardResponse> slice) {
if (slice.isLast()) {
return null;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package es.princip.ringus.domain.mentee;

import es.princip.ringus.presentation.mentee.dto.MenteeCardResponse;
import es.princip.ringus.presentation.mentee.dto.MenteeCursorRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;

public interface MenteeQueryDslRepository {
Slice<MenteeCardResponse> findMenteeBy(MenteeCursorRequest request, Pageable pageable, Long memberId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
package es.princip.ringus.domain.mentee;

import static com.querydsl.core.types.Order.ASC;
import static es.princip.ringus.domain.mentee.QMentee.mentee;
import static es.princip.ringus.domain.mentor.QMentor.mentor;
import static es.princip.ringus.domain.mentoring.QMentoring.mentoring;

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.mentee.dto.MenteeCardResponse;
import es.princip.ringus.presentation.mentee.dto.MenteeCursorRequest;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
import org.springframework.stereotype.Repository;

@Repository
@RequiredArgsConstructor
public class MenteeQueryDslRepositoryImpl extends QueryDslSupport implements MenteeQueryDslRepository {

private List<Tuple> fetchMentee(
final Pageable pageable,
final MenteeCursorRequest request,
final Long memberId
) {
JPAQuery<Tuple> query;
if (request.isSuggested()) {
query = queryFactory.select(
mentee.id,
mentee.nickname,
mentee.profileImage,
mentoring.mentoringStatus
)
.from(mentee);
}
else {
query = queryFactory.select(
mentee.id,
mentee.nickname,
mentee.profileImage
)
.from(mentee);
}
queryFilter(query, request, memberId);

query
.where(request.cursor() != null ? mentee.id.goe(request.cursor()) : mentee.id.isNotNull())
.orderBy(new OrderSpecifier<>(ASC, mentee.id))
.limit(pageable.getPageSize() + 1);

return query.fetch();
}

private List<MenteeCardResponse> fetchContent(
final Pageable pageable,
final MenteeCursorRequest request,
final Long memberId
) {

return fetchMentee(pageable, request, memberId).stream()
.map(tuple -> {
if (request.isSuggested()) {

return MenteeCardResponse.of(
tuple.get(mentee.id),
tuple.get(mentee.nickname),
tuple.get(mentee.profileImage),
tuple.get(mentoring.mentoringStatus.stringValue())

);
} else {
return MenteeCardResponse.of(
tuple.get(mentee.id),
tuple.get(mentee.nickname),
tuple.get(mentee.profileImage)
);
}
})
.toList();
}

private void queryFilter(
JPAQuery<Tuple> query,
MenteeCursorRequest request,
Long memberId
) {
if(request.isSuggested() && memberId != null){
query
.join(mentor).on(mentor.memberId.eq(memberId))
.join(mentoring).on(mentoring.mentor.id.eq(mentor.id))
.where(mentoring.mentee.id.eq(mentee.id));
}
}


@Override
public Slice<MenteeCardResponse> findMenteeBy(MenteeCursorRequest request, Pageable pageable, Long memberId){
final List<MenteeCardResponse> content = fetchContent(pageable, request, memberId);
return paginate(pageable, content);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import java.util.Optional;

@Repository
public interface MenteeRepository extends JpaRepository<Mentee, Long> {
public interface MenteeRepository extends JpaRepository<Mentee, Long>, MenteeQueryDslRepository {
Optional<Mentee> findByMemberId(Long memberId);
boolean existsByMemberId(Long memberId);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public ResponseEntity<ApiResponseWrapper<Void>> checkSession(){
}

@SessionCheck
@GetMapping("/check-nickname")
@PostMapping("/check-nickname")
public ResponseEntity<ApiResponseWrapper<Boolean>> isUniqueNickname(@RequestBody String ninkname){
boolean response = memberService.isUniqueNickname(ninkname);
return ResponseEntity.ok(ApiResponseWrapper.success(HttpStatus.OK, "성공", response));
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,10 @@
package es.princip.ringus.presentation.member.dto;

import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL;

import com.fasterxml.jackson.annotation.JsonInclude;
import es.princip.ringus.domain.common.Education;
import es.princip.ringus.domain.member.Member;
import es.princip.ringus.domain.member.MemberType;
import es.princip.ringus.domain.mentor.vo.Organization;
import es.princip.ringus.presentation.common.dto.EducationResponse;
import es.princip.ringus.presentation.common.dto.OrganizationResponse;

import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL;

public record MemberResponse(
Long memberId,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,24 @@
package es.princip.ringus.presentation.mentee;

import es.princip.ringus.application.mentee.service.MenteeService;
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.util.ApiResponseWrapper;
import es.princip.ringus.presentation.mentee.dto.*;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.web.PageableDefault;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping("/mentee")
Expand Down Expand Up @@ -38,7 +46,20 @@ public ResponseEntity<ApiResponseWrapper<EditMenteeResponse>> update(
}

@Override
public ResponseEntity<ApiResponseWrapper<MenteeDetailResponse>> getMyMentee(Long menteeId) {
return null;
@SessionCheck
@GetMapping
public ResponseEntity<ApiResponseWrapper<CursorResponse<MenteeCardResponse>>> getMyMentee(
@ModelAttribute final MenteeCursorRequest request,
@PageableDefault(sort = "menteeId", direction = Sort.Direction.DESC) final Pageable pageable,
HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse,
@SessionMemberId Long memberId
) {

log.info(request.toString());
log.info(pageable.toString());

CursorResponse<MenteeCardResponse> response = menteeService.getMenteeBy(request, pageable, memberId);
return ResponseEntity.ok(ApiResponseWrapper.success(HttpStatus.OK, "성공", response));
}
}
Original file line number Diff line number Diff line change
@@ -1,17 +1,34 @@
package es.princip.ringus.presentation.mentee;


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.util.ApiResponseWrapper;
import es.princip.ringus.presentation.mentee.dto.*;
import es.princip.ringus.presentation.mentee.dto.EditMenteeRequest;
import es.princip.ringus.presentation.mentee.dto.EditMenteeResponse;
import es.princip.ringus.presentation.mentee.dto.MenteeCardResponse;
import es.princip.ringus.presentation.mentee.dto.MenteeCursorRequest;
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.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.web.PageableDefault;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
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")
Expand Down Expand Up @@ -44,6 +61,14 @@ ResponseEntity<ApiResponseWrapper<EditMenteeResponse>> update(
@ApiResponse(responseCode = "200", description = "멘티 상세 조회 성공"),
@ApiResponse(responseCode = "404", description = "해당 id의 멘티가 존재하지 않음")
})

@SessionCheck
@GetMapping
ResponseEntity<ApiResponseWrapper<MenteeDetailResponse>> getMyMentee(Long menteeId);
ResponseEntity<ApiResponseWrapper<CursorResponse<MenteeCardResponse>>> getMyMentee(
@ModelAttribute MenteeCursorRequest request,
@PageableDefault(sort = "menteeId", direction = Sort.Direction.DESC) Pageable pageable,
HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse,
@SessionMemberId Long memberId
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package es.princip.ringus.presentation.mentee.dto;

import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL;

import com.fasterxml.jackson.annotation.JsonInclude;
import es.princip.ringus.infra.storage.domain.ProfileImage;

public record MenteeCardResponse(
Long menteeId,
String nickname,
String imgUrl,
@JsonInclude(NON_NULL) String status
) {
public static MenteeCardResponse of(
final Long menteeId,
final String nickname,
final ProfileImage profileImage,
final String status
) {
return new MenteeCardResponse(
menteeId,
nickname,
profileImage.getFilePath(),
status
);
}


public static MenteeCardResponse of(
final Long menteeId,
final String nickname,
final ProfileImage profileImage
) {
return new MenteeCardResponse(
menteeId,
nickname,
profileImage.getFilePath(),
null
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package es.princip.ringus.presentation.mentee.dto;

public record MenteeCursorRequest(
boolean suggested,
Long cursor
) {
public boolean isSuggested(){
return suggested();
}
}
Loading