Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[FEAT] 마이페이지 조회 API 구현 #43

Merged
merged 11 commits into from
Jan 11, 2024
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
import org.sopt.lequuServer.domain.member.dto.request.SocialLoginRequestDto;
import org.sopt.lequuServer.domain.member.dto.response.MemberLoginResponseDto;
import org.sopt.lequuServer.domain.member.dto.response.MemberNicknameResponseDto;
import org.sopt.lequuServer.domain.member.dto.response.MypageBookResponseDto;
import org.sopt.lequuServer.domain.member.dto.response.MypageNoteResponseDto;
import org.sopt.lequuServer.domain.member.service.MemberService;
import org.sopt.lequuServer.global.auth.fegin.kakao.KakaoLoginService;
import org.sopt.lequuServer.global.auth.jwt.JwtProvider;
Expand All @@ -17,7 +19,7 @@

import java.security.Principal;

import static org.sopt.lequuServer.global.exception.enums.SuccessType.SET_MEMBER_NICKNAME_SUCCESS;
import static org.sopt.lequuServer.global.exception.enums.SuccessType.*;

@RestController
@RequestMapping("/api")
Expand Down Expand Up @@ -66,4 +68,16 @@ public ApiResponse<MemberNicknameResponseDto> setMemberNickname(Principal princi

return ApiResponse.success(SET_MEMBER_NICKNAME_SUCCESS, memberService.setMemberNickname(JwtProvider.getUserFromPrincial(principal), request));
}

@GetMapping("/mypage/book")
@ResponseStatus(HttpStatus.OK)
public ApiResponse<MypageBookResponseDto> getMypageBook(Principal principal) {
return ApiResponse.success(GET_MYPAGE_BOOK_SUCCESS, memberService.getMypageBook(JwtProvider.getUserFromPrincial(principal)));
}

@GetMapping("/mypage/note")
@ResponseStatus(HttpStatus.OK)
public ApiResponse<MypageNoteResponseDto> getMypageNote(Principal principal) {
return ApiResponse.success(GET_MYPAGE_NOTE_SUCCESS, memberService.getMypageNote(JwtProvider.getUserFromPrincial(principal)));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package org.sopt.lequuServer.domain.member.dto.response;

import org.sopt.lequuServer.domain.book.model.Book;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public record MypageBookListResponseDto(

Long bookId,
String bookUuid,
String title,
String bookDate,
int bookBackgroundColor,

int noteNum
) {
public static MypageBookListResponseDto of(Book book) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd");
String bookDate = book.getCreatedAt().format(formatter);

return new MypageBookListResponseDto(
book.getId(),
book.getUuid(),
book.getTitle(),
bookDate,
book.getBackgroundColor(),
book.getNotes().size()
);
}
}
Copy link
Contributor

Choose a reason for hiding this comment

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

[P3] QueryDSL 기능을 이용하면 더 좋은 방식으로 불러올 수도 있을 것 같네요~
나중에 리팩토링 해봅시다~

Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package org.sopt.lequuServer.domain.member.dto.response;

import org.sopt.lequuServer.domain.book.model.Book;

import java.util.List;

public record MypageBookResponseDto(
String memberNickname,
List<MypageBookListResponseDto> mypageBookList
) {
public static MypageBookResponseDto of(String nickName, List<Book> books) {
List<MypageBookListResponseDto> mypageBookList = books.stream()
.map(MypageBookListResponseDto::of)
.toList();

return new MypageBookResponseDto(nickName, mypageBookList);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package org.sopt.lequuServer.domain.member.dto.response;

import org.sopt.lequuServer.domain.note.model.Note;

import java.time.format.DateTimeFormatter;

public record MypageNoteListResponseDto(
String bookUuid,
String title,
Long noteId,
String content,
String noteDate,

int noteBackgroundColor,
String noteBackgroundImage
) {
public static MypageNoteListResponseDto of(Note note) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd");
String noteDate = note.getCreatedAt().format(formatter);

String background = note.getBackground();
if (background.endsWith(".jpg")) {
return new MypageNoteListResponseDto(note.getBook().getUuid(), note.getBook().getTitle(),
note.getId(), note.getContent(),
noteDate, -1, background);
} else {
return new MypageNoteListResponseDto(note.getBook().getUuid(), note.getBook().getTitle(),
note.getId(), note.getContent(),
noteDate, Integer.parseInt(background), "");
}
Copy link
Contributor

Choose a reason for hiding this comment

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

[P2] 클린코드를 위해서는 else 예약어 사용을 지양하는 편이 좋다고 합니다!
위 코드는

Suggested change
if (background.endsWith(".jpg")) {
return new MypageNoteListResponseDto(note.getBook().getUuid(), note.getBook().getTitle(),
note.getId(), note.getContent(),
noteDate, -1, background);
} else {
return new MypageNoteListResponseDto(note.getBook().getUuid(), note.getBook().getTitle(),
note.getId(), note.getContent(),
noteDate, Integer.parseInt(background), "");
}
if (background.endsWith(".jpg")) {
return new MypageNoteListResponseDto(note.getBook().getUuid(), note.getBook().getTitle(),
note.getId(), note.getContent(),
noteDate, -1, background);
}
return new MypageNoteListResponseDto(note.getBook().getUuid(), note.getBook().getTitle(),
note.getId(), note.getContent(),
noteDate, Integer.parseInt(background), "");

이렇게 바꿀 수 있겠네요 :)

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package org.sopt.lequuServer.domain.member.dto.response;

import org.sopt.lequuServer.domain.note.model.Note;

import java.util.List;
import java.util.stream.Collectors;

public record MypageNoteResponseDto(

List<MypageNoteListResponseDto> mypageNoteList
) {
public static MypageNoteResponseDto of(List<Note> notes) {
List<MypageNoteListResponseDto> mypageNoteList = notes.stream()
.map(MypageNoteListResponseDto::of)
.collect(Collectors.toList());

return new MypageNoteResponseDto(mypageNoteList);
}
}
Copy link
Contributor

Choose a reason for hiding this comment

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

[P3] DTO 리스트가 단일 필드로 들어가 있는거면 따로 감싸지 않고 그대로 반환하는 것은 어떤가요?
감싸는 것이 좋은 이유가 있다면 알려주세요~

Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
package org.sopt.lequuServer.domain.member.repository;

import java.util.Optional;
import org.sopt.lequuServer.domain.member.model.Member;
import org.sopt.lequuServer.domain.member.model.SocialPlatform;
import org.sopt.lequuServer.global.exception.enums.ErrorType;
import org.sopt.lequuServer.global.exception.model.CustomException;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.Optional;

public interface MemberRepository extends JpaRepository<Member, Long> {

boolean existsBySocialPlatformAndSocialId(SocialPlatform socialPlatform, String socialId);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
package org.sopt.lequuServer.domain.member.service;

import lombok.RequiredArgsConstructor;
import org.sopt.lequuServer.domain.book.model.Book;
import org.sopt.lequuServer.domain.member.dto.request.MemberNicknameRequestDto;
import org.sopt.lequuServer.domain.member.dto.request.SocialLoginRequestDto;
import org.sopt.lequuServer.domain.member.dto.response.MemberLoginResponseDto;
import org.sopt.lequuServer.domain.member.dto.response.MemberNicknameResponseDto;
import org.sopt.lequuServer.domain.member.dto.response.MypageBookResponseDto;
import org.sopt.lequuServer.domain.member.dto.response.MypageNoteResponseDto;
import org.sopt.lequuServer.domain.member.model.Member;
import org.sopt.lequuServer.domain.member.model.SocialPlatform;
import org.sopt.lequuServer.domain.member.repository.MemberRepository;
import org.sopt.lequuServer.domain.note.model.Note;
import org.sopt.lequuServer.global.auth.fegin.kakao.KakaoLoginService;
import org.sopt.lequuServer.global.auth.jwt.JwtProvider;
import org.sopt.lequuServer.global.auth.jwt.TokenDto;
Expand All @@ -16,6 +20,8 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

import static org.sopt.lequuServer.global.exception.enums.ErrorType.*;

@Service
Expand Down Expand Up @@ -110,4 +116,30 @@ public MemberNicknameResponseDto setMemberNickname(Long memberId, MemberNickname

return MemberNicknameResponseDto.of(memberId);
}
}

public MypageBookResponseDto getMypageBook(Long memberId) {

// 회원 id 찾기
Member member = memberRepository.findByIdOrThrow(memberId);

// 회원 id로 memberNickname 조회
String nickname = member.getNickname();

// 회원이 소유한 Book 리스트 가져오기
List<Book> books = member.getBooks();

return MypageBookResponseDto.of(nickname, books);
}

public MypageNoteResponseDto getMypageNote(Long memberId) {

// 회원 id 찾기
Member member = memberRepository.findByIdOrThrow(memberId);

// 회원이 소유한 Note 리스트 가져오기
List<Note> notes = member.getNotes();

return MypageNoteResponseDto.of(notes);
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public record NoteCreateDto(
String content,
@Schema(example = "0")
int textColor,
@Schema(example = "0")
@Schema(example = "0 or ~.jpg")
String background
) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,6 @@ public NoteResponseDto createNote(Long userId, NoteCreateDto noteCreateDto) {
background = s3Service.getURL(NOTE_BACKGROUND_IMAGE_FOLDER_NAME.getValue() + noteCreateDto.background());
}

return noteService.saveNote(Note.of(noteCreateDto.content(), background, noteCreateDto.textColor(), member, book), member, book);
return noteService.saveNote(Note.of(noteCreateDto.content(), noteCreateDto.background(), noteCreateDto.textColor(), member, book), member, book);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,15 @@

import jakarta.persistence.EntityListeners;
import jakarta.persistence.MappedSuperclass;
import lombok.Getter;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;

@MappedSuperclass
@Getter
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseTimeEntity {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ public enum SuccessType {
STICKER_PACK_LIST_SUCCESS(HttpStatus.OK, "스티커팩 목록 조회에 성공했습니다."),
GET_SPLASH_SUCCESS(HttpStatus.OK, "스플래시 조회에 성공했습니다."),
GET_HOME_SUCCESS(HttpStatus.OK, "홈 화면 조회에 성공했습니다."),
GET_MYPAGE_BOOK_SUCCESS(HttpStatus.OK, "마이페이지의 유저 닉네임과 내 레큐북 조회에 성공했습니다."),
GET_MYPAGE_NOTE_SUCCESS(HttpStatus.OK, "마이페이지 내 레큐노트 조회에 성공했습니다."),

/**
* 201 CREATED
Expand Down
Loading