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
Expand Up @@ -9,7 +9,9 @@
import lombok.*;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

@Entity
@Getter
Expand All @@ -31,17 +33,19 @@ public class Member extends BaseEntity {
@Column(nullable = false, name = "nick_name")
private String nickName;

private String image;

@Enumerated(EnumType.STRING)
private MemberRole role;

@OneToOne(mappedBy = "member", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private Onboarding onboarding;

@OneToMany(mappedBy = "member", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Bookmark> bookmarks = new ArrayList<>();
private Set<Bookmark> bookmarks = new HashSet<>();

@OneToMany(mappedBy = "member", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Library> libraries = new ArrayList<>();
private Set<Library> libraries = new HashSet<>();

public static Member toEntity(String email, String encoded, String nickName){
return Member.builder()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.hansung.leafly.domain.member.entity.Member;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;

import java.util.Optional;
Expand All @@ -12,4 +13,12 @@ public interface MemberRepository extends JpaRepository<Member, Long> {
boolean existsByEmail(String email);

Optional<Member> findByEmail(String email);

@Query("""
select m from Member m
left join fetch m.libraries
left join fetch m.bookmarks
where m.id = :memberId
""")
Optional<Member> findDetailById(Long memberId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,6 @@ public interface MemberService {
LoginRes login(LoginReq loginReq);

void onboarding(Member member, OnboardingReq req);

MemberDetailsRes details(Member member);
}
Original file line number Diff line number Diff line change
@@ -1,26 +1,33 @@
package com.hansung.leafly.domain.member.service;

import com.hansung.leafly.domain.bookmark.entity.Bookmark;
import com.hansung.leafly.domain.library.entity.Library;
import com.hansung.leafly.domain.member.entity.Genre;
import com.hansung.leafly.domain.member.entity.Member;
import com.hansung.leafly.domain.member.entity.Onboarding;
import com.hansung.leafly.domain.member.entity.enums.GenreType;
import com.hansung.leafly.domain.member.exception.AlreadyOnboardedException;
import com.hansung.leafly.domain.member.exception.InvalidCredentialsException;
import com.hansung.leafly.domain.member.exception.MemberAlreadyExistException;
import com.hansung.leafly.domain.member.exception.MemberNotFoundException;
import com.hansung.leafly.domain.member.repository.GenreRepository;
import com.hansung.leafly.domain.member.repository.MemberRepository;
import com.hansung.leafly.domain.member.repository.OnboardingRepository;
import com.hansung.leafly.domain.member.web.dto.*;
import com.hansung.leafly.domain.member.web.dto.info.BookSimple;
import com.hansung.leafly.global.auth.jwt.JwtTokenProvider;
import lombok.RequiredArgsConstructor;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.hansung.leafly.domain.library.entity.enums.LibraryStatus;

import java.util.List;
import java.util.Set;

@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class MemberServiceImpl implements MemberService {
private final MemberRepository memberRepository;
private final PasswordEncoder passwordEncoder;
Expand Down Expand Up @@ -80,4 +87,51 @@ public void onboarding(Member member, OnboardingReq req) {

onboardingRepository.save(onboarding);
}

@Override
public MemberDetailsRes details(Member m) {
Member member = memberRepository.findDetailById(m.getId())
.orElseThrow(MemberNotFoundException::new);

String nickName = member.getNickName();
String profileImage = member.getImage(); // null 가능

// 서재, 북마크 가져오기
Set<Library> libraries = member.getLibraries();
Set<Bookmark> bookmarks = member.getBookmarks();

// 서재: 완독 책
List<BookSimple> finishedBooks = libraries.stream()
.filter(lib -> lib.getStatus() == LibraryStatus.DONE)
.map(lib -> new BookSimple(lib.getIsbn(), lib.getCover()))
.toList();

int finishedCount = finishedBooks.size();

// 서재: 읽고 싶음 책
List<BookSimple> wantBooks = libraries.stream()
.filter(lib -> lib.getStatus() == LibraryStatus.WANT_TO_READ)
.map(lib -> new BookSimple(lib.getIsbn(), lib.getCover()))
.toList();

int wantCount = wantBooks.size();

// 좋아요 LIST
List<BookSimple> likeBooks = bookmarks.stream()
.map(bm -> new BookSimple(String.valueOf(bm.getIsbn()), bm.getCover()))
.toList();

int likeCount = likeBooks.size();

return MemberDetailsRes.of(
nickName,
profileImage,
finishedCount,
finishedBooks,
wantCount,
wantBooks,
likeCount,
likeBooks
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -45,4 +45,13 @@ public ResponseEntity<SuccessResponse<?>> onboarding(
memberService.onboarding(memberDetails.getMember(), req);
return ResponseEntity.status(HttpStatus.CREATED).body(SuccessResponse.created(null));
}

//회원 정보 반환
@GetMapping
public ResponseEntity<SuccessResponse<MemberDetailsRes>> details(
@AuthenticationPrincipal CustomMemberDetails memberDetails
){
MemberDetailsRes res = memberService.details(memberDetails.getMember());
return ResponseEntity.status(HttpStatus.OK).body(SuccessResponse.from(res));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package com.hansung.leafly.domain.member.web.dto;

import com.hansung.leafly.domain.member.web.dto.info.BookSimple;
import com.hansung.leafly.domain.member.web.dto.info.LibrarySection;
import com.hansung.leafly.domain.member.web.dto.info.LikeSection;

import java.util.List;

public record MemberDetailsRes (
String nickName,
String profileImage,
LibrarySection library,
LikeSection likes
){
public static MemberDetailsRes of(
String nickName,
String profileImage,
int finishedCount,
List<BookSimple> finishedBooks,
int wantCount,
List<BookSimple> wantBooks,
int likeCount,
List<BookSimple> likeBooks
) {
return new MemberDetailsRes(
nickName,
profileImage,
new LibrarySection(
finishedCount,
finishedBooks,
wantCount,
wantBooks
),
new LikeSection(
likeCount,
likeBooks
)
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.hansung.leafly.domain.member.web.dto.info;

public record BookSimple(
String isbn,
String coverUrl
) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.hansung.leafly.domain.member.web.dto.info;

import java.util.List;

public record LibrarySection(
int finishedCount,
List<BookSimple> finishedBooks,
int wantCount,
List<BookSimple> wantBooks
) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.hansung.leafly.domain.member.web.dto.info;

import java.util.List;

public record LikeSection(
int likeCount,
List<BookSimple> likeBooks
) {}