Skip to content

Commit

Permalink
[Refactor] 내 일정 상세 정보로 진입할 때 탈퇴한 멘토/멘티의 정보도 보여주도록 Native Query로 전환한다 (#…
Browse files Browse the repository at this point in the history
…172)

* feat: Mentor, Mentee getByIdWithNative 쿼리

* refactor: 내 일정 상세 정보 조회 멘토, 멘티 상태값 추가

- ACTIVE, INACTIVE, BAN

* refactor: 내 일정 상세 정보 조회 UseCase 멘토, 멘티 Native Query 적용

* fix: 내 일정 상세 조회 멘토, 멘티 관련 언어 Native Query Fetching 적용

- Lazy Loading이 안되므로 직접 Fetching
  • Loading branch information
sjiwon authored Feb 25, 2024
1 parent 2b93b3a commit 07cbbb0
Show file tree
Hide file tree
Showing 15 changed files with 357 additions and 79 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,39 +9,57 @@
import com.koddy.server.global.annotation.KoddyReadOnlyTransactional;
import com.koddy.server.global.annotation.UseCase;
import com.koddy.server.global.utils.encrypt.Encryptor;
import com.koddy.server.member.domain.model.AvailableLanguage;
import com.koddy.server.member.domain.model.Language;
import com.koddy.server.member.domain.model.mentee.Mentee;
import com.koddy.server.member.domain.model.mentor.Mentor;
import com.koddy.server.member.domain.repository.AvailableLanguageRepository;
import com.koddy.server.member.domain.repository.MenteeRepository;
import com.koddy.server.member.domain.repository.MentorRepository;

import java.util.List;

@UseCase
public class GetCoffeeChatScheduleDetailsUseCase {
private final CoffeeChatRepository coffeeChatRepository;
private final MentorRepository mentorRepository;
private final MenteeRepository menteeRepository;
private final AvailableLanguageRepository availableLanguageRepository;
private final Encryptor encryptor;

public GetCoffeeChatScheduleDetailsUseCase(
final CoffeeChatRepository coffeeChatRepository,
final MentorRepository mentorRepository,
final MenteeRepository menteeRepository,
final AvailableLanguageRepository availableLanguageRepository,
final Encryptor encryptor
) {
this.coffeeChatRepository = coffeeChatRepository;
this.mentorRepository = mentorRepository;
this.menteeRepository = menteeRepository;
this.availableLanguageRepository = availableLanguageRepository;
this.encryptor = encryptor;
}

@KoddyReadOnlyTransactional
public CoffeeChatScheduleDetails invoke(final GetCoffeeChatScheduleDetails query) {
final CoffeeChat coffeeChat = coffeeChatRepository.getById(query.coffeeChatId());
final Mentor mentor = mentorRepository.getById(coffeeChat.getMentorId());
final Mentee mentee = menteeRepository.getById(coffeeChat.getMenteeId());

if (query.authenticated().isMentor()) {
return MentorCoffeeChatScheduleDetails.of(mentee, coffeeChat, encryptor);
final Mentee mentee = menteeRepository.getByIdWithNative(coffeeChat.getMenteeId());
final List<Language> languages = fetchMemberLanguages(mentee.getId());
return MentorCoffeeChatScheduleDetails.of(mentee, languages, coffeeChat, encryptor);
} else {
final Mentor mentor = mentorRepository.getByIdWithNative(coffeeChat.getMentorId());
final List<Language> languages = fetchMemberLanguages(mentor.getId());
return MenteeCoffeeChatScheduleDetails.of(mentor, languages, coffeeChat, encryptor);
}
return MenteeCoffeeChatScheduleDetails.of(mentor, coffeeChat, encryptor);
}

private List<Language> fetchMemberLanguages(final long memberId) {
return availableLanguageRepository.findByMemberIdWithNative(memberId)
.stream()
.map(AvailableLanguage::getLanguage)
.toList();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,23 @@
import com.koddy.server.coffeechat.domain.model.response.CoffeeChatScheduleDetails;
import com.koddy.server.coffeechat.domain.model.response.MentorDetails;
import com.koddy.server.global.utils.encrypt.Encryptor;
import com.koddy.server.member.domain.model.Language;
import com.koddy.server.member.domain.model.mentor.Mentor;

import java.util.List;

public record MenteeCoffeeChatScheduleDetails(
MentorDetails mentor,
CoffeeChatDetails coffeeChat
) implements CoffeeChatScheduleDetails {
public static MenteeCoffeeChatScheduleDetails of(
final Mentor mentor,
final List<Language> languages,
final CoffeeChat coffeeChat,
final Encryptor encryptor
) {
return new MenteeCoffeeChatScheduleDetails(
MentorDetails.from(mentor),
MentorDetails.of(mentor, languages),
CoffeeChatDetails.of(coffeeChat, encryptor)
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,23 @@
import com.koddy.server.coffeechat.domain.model.response.CoffeeChatScheduleDetails;
import com.koddy.server.coffeechat.domain.model.response.MenteeDetails;
import com.koddy.server.global.utils.encrypt.Encryptor;
import com.koddy.server.member.domain.model.Language;
import com.koddy.server.member.domain.model.mentee.Mentee;

import java.util.List;

public record MentorCoffeeChatScheduleDetails(
MenteeDetails mentee,
CoffeeChatDetails coffeeChat
) implements CoffeeChatScheduleDetails {
public static MentorCoffeeChatScheduleDetails of(
final Mentee mentee,
final List<Language> languages,
final CoffeeChat coffeeChat,
final Encryptor encryptor
) {
return new MentorCoffeeChatScheduleDetails(
MenteeDetails.from(mentee),
MenteeDetails.of(mentee, languages),
CoffeeChatDetails.of(coffeeChat, encryptor)
);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
package com.koddy.server.coffeechat.domain.model.response;

import com.koddy.server.member.domain.model.Language;
import com.koddy.server.member.domain.model.mentee.Mentee;
import com.koddy.server.member.domain.model.response.LanguageResponse;

import java.util.List;

public record MenteeDetails(
long id,
String name,
Expand All @@ -11,7 +14,8 @@ public record MenteeDetails(
String introduction,
LanguageResponse languages,
String interestSchool,
String interestMajor
String interestMajor,
String status
) {
public static MenteeDetails from(final Mentee mentee) {
return new MenteeDetails(
Expand All @@ -22,7 +26,25 @@ public static MenteeDetails from(final Mentee mentee) {
mentee.getIntroduction(),
LanguageResponse.of(mentee.getLanguages()),
mentee.getInterest().getSchool(),
mentee.getInterest().getMajor()
mentee.getInterest().getMajor(),
mentee.getStatus().name()
);
}

public static MenteeDetails of(
final Mentee mentee,
final List<Language> languages
) {
return new MenteeDetails(
mentee.getId(),
mentee.getName(),
mentee.getProfileImageUrl(),
mentee.getNationality().code,
mentee.getIntroduction(),
LanguageResponse.of(languages),
mentee.getInterest().getSchool(),
mentee.getInterest().getMajor(),
mentee.getStatus().name()
);
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
package com.koddy.server.coffeechat.domain.model.response;

import com.koddy.server.member.domain.model.Language;
import com.koddy.server.member.domain.model.mentor.Mentor;
import com.koddy.server.member.domain.model.response.LanguageResponse;

import java.util.List;

public record MentorDetails(
long id,
String name,
Expand All @@ -11,7 +14,8 @@ public record MentorDetails(
LanguageResponse languages,
String school,
String major,
int enteredIn
int enteredIn,
String status
) {
public static MentorDetails from(final Mentor mentor) {
return new MentorDetails(
Expand All @@ -22,7 +26,25 @@ public static MentorDetails from(final Mentor mentor) {
LanguageResponse.of(mentor.getLanguages()),
mentor.getUniversityProfile().getSchool(),
mentor.getUniversityProfile().getMajor(),
mentor.getUniversityProfile().getEnteredIn()
mentor.getUniversityProfile().getEnteredIn(),
mentor.getStatus().name()
);
}

public static MentorDetails of(
final Mentor mentor,
final List<Language> languages
) {
return new MentorDetails(
mentor.getId(),
mentor.getName(),
mentor.getProfileImageUrl(),
mentor.getIntroduction(),
LanguageResponse.of(languages),
mentor.getUniversityProfile().getSchool(),
mentor.getUniversityProfile().getMajor(),
mentor.getUniversityProfile().getEnteredIn(),
mentor.getStatus().name()
);
}
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,20 @@
package com.koddy.server.member.domain.repository;

import com.koddy.server.global.annotation.KoddyWritableTransactional;
import com.koddy.server.member.domain.model.AvailableLanguage;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import java.util.List;

public interface AvailableLanguageRepository extends JpaRepository<AvailableLanguage, Long> {
@KoddyWritableTransactional
@Modifying
@Query("DELETE FROM AvailableLanguage al WHERE al.member.id = :id")
void deleteMemberLanguage(@Param("id") final long id);
@Query(
value = """
SELECT *
FROM member_language
WHERE member_id = :memberId
""",
nativeQuery = true
)
List<AvailableLanguage> findByMemberIdWithNative(@Param("memberId") final long memberId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,22 @@ default Mentee getById(final Long id) {
.orElseThrow(() -> new MemberException(MENTEE_NOT_FOUND));
}

@Query(
value = """
SELECT *
FROM mentee m1
INNER JOIN member m2 ON m1.id = m2.id
WHERE m1.id = :id
""",
nativeQuery = true
)
Optional<Mentee> findByIdWithNative(@Param("id") final Long id);

default Mentee getByIdWithNative(final Long id) {
return findByIdWithNative(id)
.orElseThrow(() -> new MemberException(MENTEE_NOT_FOUND));
}

@Query("""
SELECT m
FROM Mentee m
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,22 @@ default Mentor getById(final Long id) {
.orElseThrow(() -> new MemberException(MENTOR_NOT_FOUND));
}

@Query(
value = """
SELECT *
FROM mentor m1
INNER JOIN member m2 ON m1.id = m2.id
WHERE m1.id = :id
""",
nativeQuery = true
)
Optional<Mentor> findByIdWithNative(@Param("id") final Long id);

default Mentor getByIdWithNative(final Long id) {
return findByIdWithNative(id)
.orElseThrow(() -> new MemberException(MENTOR_NOT_FOUND));
}

@Query("""
SELECT m
FROM Mentor m
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,31 +3,26 @@
import com.koddy.server.auth.application.adapter.TokenStore;
import com.koddy.server.global.annotation.KoddyWritableTransactional;
import com.koddy.server.member.domain.model.Member;
import com.koddy.server.member.domain.repository.AvailableLanguageRepository;
import com.koddy.server.member.domain.repository.MemberRepository;
import org.springframework.stereotype.Service;

@Service
public class MenteeDeleter {
private final MemberRepository memberRepository;
private final TokenStore tokenStore;
private final AvailableLanguageRepository availableLanguageRepository;

public MenteeDeleter(
final MemberRepository memberRepository,
final TokenStore tokenStore,
final AvailableLanguageRepository availableLanguageRepository
final TokenStore tokenStore
) {
this.memberRepository = memberRepository;
this.tokenStore = tokenStore;
this.availableLanguageRepository = availableLanguageRepository;
}

@KoddyWritableTransactional
public void execute(final long menteeId) {
final Member<?> mentee = memberRepository.getById(menteeId);
tokenStore.deleteRefreshToken(mentee.getId());
availableLanguageRepository.deleteMemberLanguage(mentee.getId());
memberRepository.deleteMember(mentee.getId());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import com.koddy.server.auth.application.adapter.TokenStore;
import com.koddy.server.global.annotation.KoddyWritableTransactional;
import com.koddy.server.member.domain.model.Member;
import com.koddy.server.member.domain.repository.AvailableLanguageRepository;
import com.koddy.server.member.domain.repository.MemberRepository;
import com.koddy.server.member.domain.repository.MentorScheduleRepository;
import org.springframework.stereotype.Service;
Expand All @@ -12,26 +11,22 @@
public class MentorDeleter {
private final MemberRepository memberRepository;
private final TokenStore tokenStore;
private final AvailableLanguageRepository availableLanguageRepository;
private final MentorScheduleRepository mentorScheduleRepository;

public MentorDeleter(
final MemberRepository memberRepository,
final TokenStore tokenStore,
final AvailableLanguageRepository availableLanguageRepository,
final MentorScheduleRepository mentorScheduleRepository
) {
this.memberRepository = memberRepository;
this.tokenStore = tokenStore;
this.availableLanguageRepository = availableLanguageRepository;
this.mentorScheduleRepository = mentorScheduleRepository;
}

@KoddyWritableTransactional
public void execute(final long mentorId) {
final Member<?> mentor = memberRepository.getById(mentorId);
tokenStore.deleteRefreshToken(mentor.getId());
availableLanguageRepository.deleteMemberLanguage(mentor.getId());
mentorScheduleRepository.deleteMentorSchedule(mentor.getId());
memberRepository.deleteMember(mentor.getId());
}
Expand Down
Loading

0 comments on commit 07cbbb0

Please sign in to comment.