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
1 change: 0 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@ dependencies {
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0'
implementation 'org.flywaydb:flyway-core'
implementation 'org.flywaydb:flyway-mysql'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
runtimeOnly 'com.mysql:mysql-connector-j'
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package es.princip.ringus.application.member.service;

import es.princip.ringus.domain.mentor.vo.Organization;
import es.princip.ringus.infra.storage.domain.ProfileImage;

public record MemberMentorProfile(
ProfileImage profileImage,
Organization organization
) {
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
package es.princip.ringus.application.member.service;

import es.princip.ringus.domain.common.Education;
import es.princip.ringus.domain.exception.MemberErrorCode;
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.mentee.MenteeRepository;
import es.princip.ringus.domain.mentor.MentorRepository;
import es.princip.ringus.domain.mentor.vo.Organization;
import es.princip.ringus.domain.serviceTerm.ServiceTermAgreement;
import es.princip.ringus.global.exception.CustomRuntimeException;
import es.princip.ringus.global.util.UniversityDomainUtil;
Expand Down Expand Up @@ -49,27 +51,22 @@ public Member createMember(SignUpRequest request, Set<ServiceTermAgreement> serv
return member;
}

private String getMemberImageUrl(Member member) {
if (member.getMemberType().equals(MemberType.MENTEE)) {
ProfileImage img = menteeRepository.findProfileByMemberId(member.getId());
return img != null ? img.getFilePath() : null;
}
else if (member.getMemberType().equals(MemberType.MENTOR)) {
ProfileImage img = mentorRepository.findProfileByMemberId(member.getId());
return img != null ? img.getFilePath() : null;
}
return "";
}

public MemberResponse getMember(Long memberId) {
Member member = memberRepository.findById(memberId)
.orElseThrow(() -> new CustomRuntimeException(MemberErrorCode.MEMBER_NOT_FOUND));

String imgUrl = "";
if (member.isProfileRegistered()) {
imgUrl = getMemberImageUrl(member);
if (member.getMemberType().equals(MemberType.ROLE_MENTEE)) {
ProfileImage img = menteeRepository.findProfileByMemberId(member.getId());
Education education = menteeRepository.findEducationByMemberId(member.getId());
//null check 필요
return MemberResponse.of(member, img.getFilePath(), education);
} else if (member.getMemberType().equals(MemberType.ROLE_MENTOR)) {
ProfileImage img = mentorRepository.findProfileByMemberId(member.getId());
Organization organization = mentorRepository.findOrganizationByMemberId(member.getId());
return MemberResponse.of(member, img.getFilePath(), organization);
}
}

return MemberResponse.of(member, imgUrl);
return MemberResponse.of(member);
}
}
Original file line number Diff line number Diff line change
@@ -1,24 +1,28 @@
package es.princip.ringus.application.mentor.service;

import es.princip.ringus.application.support.CursorParser;
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.mentor.Mentor;
import es.princip.ringus.domain.mentor.MentorRepository;
import es.princip.ringus.domain.support.CursorResponse;
import es.princip.ringus.global.exception.CustomRuntimeException;
import es.princip.ringus.presentation.mentor.dto.EditMentorRequest;
import es.princip.ringus.presentation.mentor.dto.MentorRequest;
import es.princip.ringus.presentation.mentor.dto.*;
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;

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

@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class MentorService {

// private final SerializeMentorCursor serializeMentorCursor;
private final MemberRepository memberRepository;
private final MentorRepository mentorRepository;

Expand Down Expand Up @@ -48,4 +52,16 @@ public Long edit(Long memberId, EditMentorRequest request) {
mentor.edit(request);
return mentor.getId();
}

public CursorResponse<MentorCardResponse> getMentorBy(CursorRequest request, Pageable pageable) {
final Slice<MentorCardResponse> response = mentorRepository.findMentorBy(request, pageable);
final Long cursor = parse(request.cursor(), response);
return CursorResponse.of(response, cursor);
}

public MentorDetailResponse getDetailBy(Long mentorId) {
Mentor mentor = mentorRepository.findById(mentorId)
.orElseThrow(() -> new CustomRuntimeException(MentorErrorCode.MENTOR_PROFILE_NOT_FOUND));
return MentorDetailResponse.from(mentor);
}
}
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.mentor.dto.MentorCardResponse;
import org.springframework.data.domain.Slice;

public class CursorParser {
public static Long parse(final Long cursor, final Slice<MentorCardResponse> slice) {
if (slice.isLast()) {
return null;
}
if (slice.hasNext()) {
return slice.getContent()
.get(slice.getSize() -1)
.mentorId();
}
return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,5 +35,4 @@ public Bookmark(
this.mentor = mentor;
this.mentee = mentee;
}

}
4 changes: 2 additions & 2 deletions src/main/java/es/princip/ringus/domain/member/Member.java
Original file line number Diff line number Diff line change
Expand Up @@ -87,10 +87,10 @@ public void confirmUniversity() {
}

public boolean isNotMentor() {
return this.memberType != MemberType.MENTOR;
return this.memberType != MemberType.ROLE_MENTOR;
}

public boolean isNotMentee() {
return this.memberType != MemberType.MENTEE;
return this.memberType != MemberType.ROLE_MENTEE;
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@


public enum MemberType {
ADMIN, MENTOR, MENTEE
ROLE_ADMIN, ROLE_MENTOR, ROLE_MENTEE
}
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 @@ -14,4 +15,7 @@ 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);
}
3 changes: 2 additions & 1 deletion src/main/java/es/princip/ringus/domain/mentor/Mentor.java
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ public class Mentor {
private List<Mentoring> mentorings = new ArrayList<>();

// 멘티에게 전하는 말
@Column(name = "message", length = 50)
@Column(name = "message", length = 100)
private String message;

// 포트폴리오
Expand Down Expand Up @@ -113,6 +113,7 @@ public void edit(final EditMentorRequest request) {
this.hashtags = request.hashtags().stream().map(Hashtag::new).toList();
this.message = request.message();
this.portfolio = request.portfolio().toEntity();
this.profileImage = request.image().toEntity();
}

public void addMentoring(Mentoring mentoring){
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package es.princip.ringus.domain.mentor;

import es.princip.ringus.presentation.mentor.dto.CursorRequest;
import es.princip.ringus.presentation.mentor.dto.MentorCardResponse;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;

public interface MentorQueryDslRepository{
Slice<MentorCardResponse> findMentorBy(CursorRequest request, Pageable pageable);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package es.princip.ringus.domain.mentor;

import com.querydsl.core.Tuple;
import com.querydsl.core.types.OrderSpecifier;
import es.princip.ringus.domain.support.QueryDslSupport;
import es.princip.ringus.presentation.mentor.dto.CursorRequest;
import es.princip.ringus.presentation.mentor.dto.MentorCardResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
import org.springframework.stereotype.Repository;

import java.util.List;

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

@Repository
@RequiredArgsConstructor
public class MentorQueryDslRepositoryImpl extends QueryDslSupport implements MentorQueryDslRepository{

private List<Tuple> fetchMentor(
final Pageable pageable,
final Long cursor
) {
return queryFactory.select(
mentor.id,
mentor.nickname,
mentor.profileImage,
mentor.introduction,
mentor.organization,
mentor.message
)
.from(mentor)
.where(cursor != null ? mentor.id.goe( cursor) : mentor.id.isNotNull())
.orderBy(new OrderSpecifier<>(ASC, mentor.id))
.limit(pageable.getPageSize() + 1)
.fetch();
}

private List<MentorCardResponse> fetchContent(
final Pageable pageable,
final Long cursor
) {
return fetchMentor(pageable, cursor).stream()
.map(tuple -> MentorCardResponse.of(
tuple.get(mentor.id),
tuple.get(mentor.nickname),
tuple.get(mentor.profileImage),
tuple.get(mentor.introduction),
tuple.get(mentor.organization),
tuple.get(mentor.message),
0
))
.toList();
}

@Override
public Slice<MentorCardResponse> findMentorBy(CursorRequest request, Pageable pageable) {
final List<MentorCardResponse> content = fetchContent(pageable, request.cursor());
return paginate(pageable, content);
}
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,20 @@
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")
ProfileImage findProfileByMemberId(Long memberId);

@Query("SELECT m.organization FROM Mentor m WHERE m.memberId = :memberId")
Organization findOrganizationByMemberId(Long memberId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Introduction {
// 제목
@Column(name="introduction_title", length = 15)
@Column(name="introduction_title", length = 30)
private String title;
// 내용
@Column(name="introduction_content", length = 300)
@Column(name="introduction_content", length = 500)
private String content;
}
46 changes: 46 additions & 0 deletions src/main/java/es/princip/ringus/domain/support/CursorResponse.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package es.princip.ringus.domain.support;

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Builder;
import lombok.Getter;
import org.springframework.data.domain.Slice;
import org.springframework.data.domain.Sort;

import java.util.List;

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

@Getter
public class CursorResponse<T> {

private final List<T> content;
private final SliceInfo sliceInfo;

private CursorResponse(final List<T> content, final SliceInfo sliceInfo) {
this.content = content;
this.sliceInfo = sliceInfo;
}

public static <T> CursorResponse<T> of(final Slice<T> slice, final Long cursor) {
SliceInfo pageInfo = SliceInfo.builder()
.size(slice.getSize())
.numberOfElements(slice.getNumberOfElements())
.last(slice.isLast())
.empty(slice.isEmpty())
.cursor(cursor)
.build();
return new CursorResponse<>(slice.getContent(), pageInfo);
}

record SliceInfo(
int size,
int numberOfElements,
boolean last,
boolean empty,
@JsonInclude(NON_NULL) Long cursor
) {
@Builder
public SliceInfo {
}
}
}
Loading