diff --git a/.gitignore b/.gitignore index 19e83d29..9112f598 100644 --- a/.gitignore +++ b/.gitignore @@ -51,3 +51,5 @@ application*.yml gradle.properties src/main/resources/firebase-key.json +*.lck +*.part diff --git a/src/main/java/com/projectlyrics/server/domain/note/api/NoteController.java b/src/main/java/com/projectlyrics/server/domain/note/api/NoteController.java index a245c91e..8b05587b 100644 --- a/src/main/java/com/projectlyrics/server/domain/note/api/NoteController.java +++ b/src/main/java/com/projectlyrics/server/domain/note/api/NoteController.java @@ -10,6 +10,7 @@ import com.projectlyrics.server.domain.note.dto.response.NoteDetailResponse; import com.projectlyrics.server.domain.note.dto.response.NoteGetResponse; import com.projectlyrics.server.domain.note.dto.response.NoteUpdateResponse; +import com.projectlyrics.server.domain.note.entity.NoteType; import com.projectlyrics.server.domain.note.service.NoteCommandService; import com.projectlyrics.server.domain.note.service.NoteQueryService; import com.projectlyrics.server.domain.view.service.ViewCommandService; @@ -96,10 +97,11 @@ public ResponseEntity> getNotesOfUs @Authenticated AuthContext authContext, @RequestParam(name = "hasLyrics") boolean hasLyrics, @RequestParam(name = "artistId", required = false) Long artistId, + @RequestParam(name = "noteType", required = false) NoteType noteType, @RequestParam(name = "cursor", required = false) Long cursor, @RequestParam(name = "size", defaultValue = "10") int size ) { - CursorBasePaginatedResponse response = noteQueryService.getNotesByUserId(hasLyrics, artistId, authContext.getId(), cursor, size); + CursorBasePaginatedResponse response = noteQueryService.getNotesByUserId(hasLyrics, artistId, noteType, authContext.getId(), cursor, size); return ResponseEntity .status(HttpStatus.OK) @@ -111,10 +113,11 @@ public ResponseEntity> getNotes( @Authenticated AuthContext authContext, @RequestParam(name = "hasLyrics") boolean hasLyrics, @RequestParam(name = "isFavoriteArtistsOnly", defaultValue = "false") boolean isFavoriteArtistsOnly, + @RequestParam(name = "noteType", required = false) NoteType noteType, @RequestParam(name = "cursor", required = false) Long cursor, @RequestParam(name = "size", defaultValue = "10") int size ) { - CursorBasePaginatedResponse response = noteQueryService.getNotes(hasLyrics, isFavoriteArtistsOnly, authContext.getId(), cursor, size); + CursorBasePaginatedResponse response = noteQueryService.getNotes(hasLyrics, isFavoriteArtistsOnly, noteType, authContext.getId(), cursor, size); return ResponseEntity .status(HttpStatus.OK) @@ -126,10 +129,11 @@ public ResponseEntity> getNotesOfAr @Authenticated AuthContext authContext, @RequestParam(name = "hasLyrics") boolean hasLyrics, @RequestParam(name = "artistId") Long artistId, + @RequestParam(name = "noteType", required = false) NoteType noteType, @RequestParam(name = "cursor", required = false) Long cursor, @RequestParam(name = "size", defaultValue = "10") int size ) { - CursorBasePaginatedResponse response = noteQueryService.getNotesByArtistId(hasLyrics, artistId, authContext.getId(), cursor, size); + CursorBasePaginatedResponse response = noteQueryService.getNotesByArtistId(hasLyrics, artistId, noteType, authContext.getId(), cursor, size); return ResponseEntity .status(HttpStatus.OK) @@ -141,10 +145,11 @@ public ResponseEntity> getNotesOfSo @Authenticated AuthContext authContext, @RequestParam(name = "hasLyrics") boolean hasLyrics, @RequestParam(name = "songId") Long songId, + @RequestParam(name = "noteType", required = false) NoteType noteType, @RequestParam(name = "cursor", required = false) Long cursor, @RequestParam(name = "size", defaultValue = "10") int size ) { - CursorBasePaginatedResponse response = noteQueryService.getNotesBySongId(hasLyrics, songId, authContext.getId(), cursor, size); + CursorBasePaginatedResponse response = noteQueryService.getNotesBySongId(hasLyrics, songId, noteType, authContext.getId(), cursor, size); return ResponseEntity .status(HttpStatus.OK) @@ -156,10 +161,11 @@ public ResponseEntity> getNotesBook @Authenticated AuthContext authContext, @RequestParam(name = "hasLyrics") boolean hasLyrics, @RequestParam(name = "artistId", required = false) Long artistId, + @RequestParam(name = "noteType", required = false) NoteType noteType, @RequestParam(name = "cursor", required = false) Long cursor, @RequestParam(name = "size", defaultValue = "10") int size ) { - CursorBasePaginatedResponse response = noteQueryService.getBookmarkedNotes(hasLyrics, artistId, authContext.getId(), cursor, size); + CursorBasePaginatedResponse response = noteQueryService.getBookmarkedNotes(hasLyrics, artistId, noteType, authContext.getId(), cursor, size); return ResponseEntity .status(HttpStatus.OK) diff --git a/src/main/java/com/projectlyrics/server/domain/note/entity/NoteType.java b/src/main/java/com/projectlyrics/server/domain/note/entity/NoteType.java index 834c6d02..a82690e7 100644 --- a/src/main/java/com/projectlyrics/server/domain/note/entity/NoteType.java +++ b/src/main/java/com/projectlyrics/server/domain/note/entity/NoteType.java @@ -24,7 +24,7 @@ public String getType() { @JsonCreator public static NoteType of(String type) { return Arrays.stream(NoteType.values()) - .filter(noteType -> noteType.type.equals(type)) + .filter(noteType -> noteType.type.equalsIgnoreCase(type)) .findFirst() .orElseThrow(() -> new IllegalArgumentException("Invalid NoteType: " + type)); } diff --git a/src/main/java/com/projectlyrics/server/domain/note/repository/NoteQueryRepository.java b/src/main/java/com/projectlyrics/server/domain/note/repository/NoteQueryRepository.java index 06271afb..db611482 100644 --- a/src/main/java/com/projectlyrics/server/domain/note/repository/NoteQueryRepository.java +++ b/src/main/java/com/projectlyrics/server/domain/note/repository/NoteQueryRepository.java @@ -1,5 +1,6 @@ package com.projectlyrics.server.domain.note.repository; +import com.projectlyrics.server.domain.note.entity.NoteType; import com.projectlyrics.server.domain.note.entity.Note; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Slice; @@ -10,12 +11,12 @@ public interface NoteQueryRepository { Note findById(Long id); - Slice findAllByUserId(boolean hasLyrics, Long artistId, Long userId, Long cursorId, Pageable pageable); - Slice findAllByArtistIds(boolean hasLyrics, List artistsIds, Long userId, Long cursorId, Pageable pageable); - Slice findAll(boolean hasLyrics, List artistsIds, Long userId, Long cursorId, Pageable pageable); - Slice findAllByArtistId(boolean hasLyrics, Long artistId, Long userId, Long cursorId, Pageable pageable); - Slice findAllBookmarkedAndByArtistId(boolean hasLyrics, Long artistId, Long userId, Long cursorId, Pageable pageable); - Slice findAllBySongId(boolean hasLyrics, Long songId, Long userId, Long cursorId, Pageable pageable); + Slice findAllByUserId(boolean hasLyrics, Long artistId, NoteType noteType, Long userId, Long cursorId, Pageable pageable); + Slice findAllByArtistIds(boolean hasLyrics, List artistsIds, NoteType noteType, Long userId, Long cursorId, Pageable pageable); + Slice findAll(boolean hasLyrics, List artistsIds, NoteType noteType, Long userId, Long cursorId, Pageable pageable); + Slice findAllByArtistId(boolean hasLyrics, Long artistId, NoteType noteType, Long userId, Long cursorId, Pageable pageable); + Slice findAllBookmarkedAndByArtistId(boolean hasLyrics, Long artistId, NoteType noteType, Long userId, Long cursorId, Pageable pageable); + Slice findAllBySongId(boolean hasLyrics, Long songId, NoteType noteType, Long userId, Long cursorId, Pageable pageable); long countDraftNotesByUserId(Long userId); } diff --git a/src/main/java/com/projectlyrics/server/domain/note/repository/impl/QueryDslNoteQueryRepository.java b/src/main/java/com/projectlyrics/server/domain/note/repository/impl/QueryDslNoteQueryRepository.java index 00f546ca..1ee0058e 100644 --- a/src/main/java/com/projectlyrics/server/domain/note/repository/impl/QueryDslNoteQueryRepository.java +++ b/src/main/java/com/projectlyrics/server/domain/note/repository/impl/QueryDslNoteQueryRepository.java @@ -11,8 +11,10 @@ import com.projectlyrics.server.domain.common.util.QueryDslUtils; import com.projectlyrics.server.domain.note.entity.Note; import com.projectlyrics.server.domain.note.entity.NoteStatus; +import com.projectlyrics.server.domain.note.entity.NoteType; import com.projectlyrics.server.domain.note.exception.NoteNotFoundException; import com.projectlyrics.server.domain.note.repository.NoteQueryRepository; +import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.jpa.JPAExpressions; import com.querydsl.jpa.impl.JPAQueryFactory; @@ -50,7 +52,7 @@ public Note findById(Long id) { } @Override - public Slice findAllByUserId(boolean hasLyrics, Long artistId, Long userId, Long cursorId, Pageable pageable) { + public Slice findAllByUserId(boolean hasLyrics, Long artistId, NoteType noteType, Long userId, Long cursorId, Pageable pageable) { List content = jpaQueryFactory .selectFrom(note) .leftJoin(note.lyrics).fetchJoin() @@ -61,6 +63,7 @@ public Slice findAllByUserId(boolean hasLyrics, Long artistId, Long userId .where( hasLyrics(hasLyrics), artistId == null ? null : artist.id.eq(artistId), + hasNoteType(noteType), note.publisher.deletedAt.isNull(), note.publisher.id.eq(userId), note.deletedAt.isNull(), @@ -79,7 +82,7 @@ public Slice findAllByUserId(boolean hasLyrics, Long artistId, Long userId } @Override - public Slice findAllByArtistIds(boolean hasLyrics, List artistsIds, Long userId, Long cursorId, Pageable pageable) { + public Slice findAllByArtistIds(boolean hasLyrics, List artistsIds, NoteType noteType, Long userId, Long cursorId, Pageable pageable) { List content = jpaQueryFactory .selectFrom(note) .leftJoin(note.lyrics).fetchJoin() @@ -90,6 +93,7 @@ public Slice findAllByArtistIds(boolean hasLyrics, List artistsIds, .where( hasLyrics(hasLyrics), note.song.artist.id.in(artistsIds), + hasNoteType(noteType), note.deletedAt.isNull(), QueryDslUtils.ltCursorId(cursorId, note.id), note.publisher.notIn( @@ -106,7 +110,7 @@ public Slice findAllByArtistIds(boolean hasLyrics, List artistsIds, } @Override - public Slice findAll(boolean hasLyrics, List artistsIds, Long userId, Long cursorId, Pageable pageable) { + public Slice findAll(boolean hasLyrics, List artistsIds, NoteType noteType, Long userId, Long cursorId, Pageable pageable) { List content = jpaQueryFactory .selectFrom(note) .leftJoin(note.lyrics).fetchJoin() @@ -117,6 +121,7 @@ public Slice findAll(boolean hasLyrics, List artistsIds, Long userId .where( hasLyrics(hasLyrics), artistsIds == null || artistsIds.isEmpty() ? null : note.song.artist.id.in(artistsIds), + hasNoteType(noteType), note.deletedAt.isNull(), QueryDslUtils.ltCursorId(cursorId, note.id), note.publisher.notIn( @@ -133,7 +138,7 @@ public Slice findAll(boolean hasLyrics, List artistsIds, Long userId } @Override - public Slice findAllByArtistId(boolean hasLyrics, Long artistId, Long userId, Long cursorId, Pageable pageable) { + public Slice findAllByArtistId(boolean hasLyrics, Long artistId, NoteType noteType, Long userId, Long cursorId, Pageable pageable) { List content = jpaQueryFactory .selectFrom(note) .leftJoin(note.lyrics).fetchJoin() @@ -144,6 +149,7 @@ public Slice findAllByArtistId(boolean hasLyrics, Long artistId, Long user .where( hasLyrics(hasLyrics), note.song.artist.id.eq(artistId), + hasNoteType(noteType), note.deletedAt.isNull(), QueryDslUtils.ltCursorId(cursorId, note.id), note.publisher.notIn( @@ -160,7 +166,7 @@ public Slice findAllByArtistId(boolean hasLyrics, Long artistId, Long user } @Override - public Slice findAllBySongId(boolean hasLyrics, Long songId, Long userId, Long cursorId, Pageable pageable) { + public Slice findAllBySongId(boolean hasLyrics, Long songId, NoteType noteType, Long userId, Long cursorId, Pageable pageable) { List content = jpaQueryFactory .selectFrom(note) .leftJoin(note.lyrics).fetchJoin() @@ -171,6 +177,7 @@ public Slice findAllBySongId(boolean hasLyrics, Long songId, Long userId, .where( hasLyrics(hasLyrics), note.song.id.eq(songId), + hasNoteType(noteType), note.deletedAt.isNull(), QueryDslUtils.ltCursorId(cursorId, note.id), note.publisher.notIn( @@ -187,7 +194,7 @@ public Slice findAllBySongId(boolean hasLyrics, Long songId, Long userId, } @Override - public Slice findAllBookmarkedAndByArtistId(boolean hasLyrics, Long artistId, Long userId, Long cursorId, Pageable pageable) { + public Slice findAllBookmarkedAndByArtistId(boolean hasLyrics, Long artistId, NoteType noteType, Long userId, Long cursorId, Pageable pageable) { List content = jpaQueryFactory .selectFrom(note) .leftJoin(note.lyrics).fetchJoin() @@ -200,6 +207,7 @@ public Slice findAllBookmarkedAndByArtistId(boolean hasLyrics, Long artist .and(bookmark.deletedAt.isNull()), hasLyrics(hasLyrics), artistId == null ? null : note.song.artist.id.eq(artistId), + hasNoteType(noteType), note.deletedAt.isNull(), QueryDslUtils.ltCursorId(cursorId, note.id), note.publisher.notIn( @@ -229,4 +237,8 @@ public long countDraftNotesByUserId(Long userId) { .fetchOne() ).orElse(0L); } + + private BooleanExpression hasNoteType(NoteType noteType) { + return noteType == null ? null : note.noteType.eq(noteType); + } } diff --git a/src/main/java/com/projectlyrics/server/domain/note/service/NoteQueryService.java b/src/main/java/com/projectlyrics/server/domain/note/service/NoteQueryService.java index 952c6d84..9bbaa2fa 100644 --- a/src/main/java/com/projectlyrics/server/domain/note/service/NoteQueryService.java +++ b/src/main/java/com/projectlyrics/server/domain/note/service/NoteQueryService.java @@ -7,6 +7,7 @@ import com.projectlyrics.server.domain.note.dto.response.NoteDetailResponse; import com.projectlyrics.server.domain.note.dto.response.NoteGetResponse; import com.projectlyrics.server.domain.note.entity.Note; +import com.projectlyrics.server.domain.note.entity.NoteType; import com.projectlyrics.server.domain.note.repository.NoteQueryRepository; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.PageRequest; @@ -32,14 +33,14 @@ public NoteDetailResponse getNoteById(Long noteId, Long userId) { return NoteDetailResponse.of(note, comments, userId); } - public CursorBasePaginatedResponse getNotesByUserId(boolean hasLyrics, Long artistId, Long userId, Long cursor, int size) { - Slice notes = noteQueryRepository.findAllByUserId(hasLyrics, artistId, userId, cursor, PageRequest.ofSize(size)) + public CursorBasePaginatedResponse getNotesByUserId(boolean hasLyrics, Long artistId, NoteType noteType, Long userId, Long cursor, int size) { + Slice notes = noteQueryRepository.findAllByUserId(hasLyrics, artistId, noteType, userId, cursor, PageRequest.ofSize(size)) .map(note -> NoteGetResponse.of(note, userId)); return CursorBasePaginatedResponse.of(notes); } - public CursorBasePaginatedResponse getNotes(boolean hasLyrics, boolean isFavoriteArtistsOnly, Long userId, Long cursor, int size) { + public CursorBasePaginatedResponse getNotes(boolean hasLyrics, boolean isFavoriteArtistsOnly, NoteType noteType, Long userId, Long cursor, int size) { List artistsIds = null; if (isFavoriteArtistsOnly) { artistsIds = favoriteArtistQueryRepository.findAllByUserIdFetchArtist(userId) @@ -48,28 +49,28 @@ public CursorBasePaginatedResponse getNotes(boolean hasLyrics, .toList(); } - Slice notes = noteQueryRepository.findAll(hasLyrics, artistsIds, userId, cursor, PageRequest.ofSize(size)) + Slice notes = noteQueryRepository.findAll(hasLyrics, artistsIds, noteType, userId, cursor, PageRequest.ofSize(size)) .map(note -> NoteGetResponse.of(note, userId)); return CursorBasePaginatedResponse.of(notes); } - public CursorBasePaginatedResponse getNotesByArtistId(boolean hasLyrics, Long artistId, Long userId, Long cursor, int size) { - Slice notes = noteQueryRepository.findAllByArtistId(hasLyrics, artistId, userId, cursor, PageRequest.ofSize(size)) + public CursorBasePaginatedResponse getNotesByArtistId(boolean hasLyrics, Long artistId, NoteType noteType, Long userId, Long cursor, int size) { + Slice notes = noteQueryRepository.findAllByArtistId(hasLyrics, artistId, noteType, userId, cursor, PageRequest.ofSize(size)) .map(note -> NoteGetResponse.of(note, userId)); return CursorBasePaginatedResponse.of(notes); } - public CursorBasePaginatedResponse getNotesBySongId(boolean hasLyrics, Long songId, Long userId, Long cursor, int size) { - Slice notes = noteQueryRepository.findAllBySongId(hasLyrics, songId, userId, cursor, PageRequest.ofSize(size)) + public CursorBasePaginatedResponse getNotesBySongId(boolean hasLyrics, Long songId, NoteType noteType, Long userId, Long cursor, int size) { + Slice notes = noteQueryRepository.findAllBySongId(hasLyrics, songId, noteType, userId, cursor, PageRequest.ofSize(size)) .map(note -> NoteGetResponse.of(note, userId)); return CursorBasePaginatedResponse.of(notes); } - public CursorBasePaginatedResponse getBookmarkedNotes(boolean hasLyrics, Long artistId, Long userId, Long cursor, int size) { - Slice notes = noteQueryRepository.findAllBookmarkedAndByArtistId(hasLyrics, artistId, userId, cursor, PageRequest.ofSize(size)) + public CursorBasePaginatedResponse getBookmarkedNotes(boolean hasLyrics, Long artistId, NoteType noteType, Long userId, Long cursor, int size) { + Slice notes = noteQueryRepository.findAllBookmarkedAndByArtistId(hasLyrics, artistId, noteType, userId, cursor, PageRequest.ofSize(size)) .map(note -> NoteGetResponse.of(note, userId)); return CursorBasePaginatedResponse.of(notes); diff --git a/src/main/java/com/projectlyrics/server/global/configuration/WebConfig.java b/src/main/java/com/projectlyrics/server/global/configuration/WebConfig.java index cbc9cdf2..30d5c610 100644 --- a/src/main/java/com/projectlyrics/server/global/configuration/WebConfig.java +++ b/src/main/java/com/projectlyrics/server/global/configuration/WebConfig.java @@ -6,6 +6,7 @@ import com.projectlyrics.server.global.slack.interceptor.SlackInterceptor; import com.projectlyrics.server.domain.auth.authentication.interceptor.AdminInterceptor; import com.projectlyrics.server.domain.auth.authentication.interceptor.VersionVerificationInterceptor; +import com.projectlyrics.server.global.converter.NoteTypeConverter; import com.projectlyrics.server.global.converter.ProfileCharacterConverter; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; @@ -75,6 +76,7 @@ public void addArgumentResolvers(List resolvers) @Override public void addFormatters(FormatterRegistry registry) { + registry.addConverter(new NoteTypeConverter()); registry.addConverter(new ProfileCharacterConverter()); } } diff --git a/src/main/java/com/projectlyrics/server/global/converter/NoteTypeConverter.java b/src/main/java/com/projectlyrics/server/global/converter/NoteTypeConverter.java new file mode 100644 index 00000000..e275a897 --- /dev/null +++ b/src/main/java/com/projectlyrics/server/global/converter/NoteTypeConverter.java @@ -0,0 +1,11 @@ +package com.projectlyrics.server.global.converter; + +import com.projectlyrics.server.domain.note.entity.NoteType; +import org.springframework.core.convert.converter.Converter; + +public class NoteTypeConverter implements Converter { + @Override + public NoteType convert(String source) { + return NoteType.of(source); + } +} diff --git a/src/test/java/com/projectlyrics/server/domain/note/api/NoteControllerTest.java b/src/test/java/com/projectlyrics/server/domain/note/api/NoteControllerTest.java index 57b3f151..163f0f7b 100644 --- a/src/test/java/com/projectlyrics/server/domain/note/api/NoteControllerTest.java +++ b/src/test/java/com/projectlyrics/server/domain/note/api/NoteControllerTest.java @@ -287,7 +287,7 @@ private RestDocumentationResultHandler getNoteDetailDocument() { data ); - given(noteQueryService.getNotesByUserId(anyBoolean(), any(), any(), any(), anyInt())) + given(noteQueryService.getNotesByUserId(anyBoolean(), any(), any(), any(), any(), anyInt())) .willReturn(response); // when, then @@ -391,7 +391,7 @@ private RestDocumentationResultHandler getNoteListOfUserDocument() { data ); - given(noteQueryService.getNotes(anyBoolean(), anyBoolean(), any(), any(), anyInt())) + given(noteQueryService.getNotes(anyBoolean(), anyBoolean(), any(), any(), any(), anyInt())) .willReturn(response); // when, then @@ -495,7 +495,7 @@ private RestDocumentationResultHandler getNoteListDocument() { data ); - given(noteQueryService.getNotesByArtistId(anyBoolean(), any(), any(), any(), anyInt())) + given(noteQueryService.getNotesByArtistId(anyBoolean(), any(), any(), any(), any(), anyInt())) .willReturn(response); // when, then @@ -598,7 +598,7 @@ private RestDocumentationResultHandler getNoteListByArtistDocument() { data ); - given(noteQueryService.getNotesBySongId(anyBoolean(), any(), any(), any(), anyInt())) + given(noteQueryService.getNotesBySongId(anyBoolean(), any(), any(), any(), any(), anyInt())) .willReturn(response); // when, then @@ -701,7 +701,7 @@ private RestDocumentationResultHandler getNoteListBySongDocument() { data ); - given(noteQueryService.getBookmarkedNotes(anyBoolean(), any(), any(), any(), anyInt())) + given(noteQueryService.getBookmarkedNotes(anyBoolean(), any(), any(), any(), any(), anyInt())) .willReturn(response); // when, then @@ -787,4 +787,4 @@ private RestDocumentationResultHandler getBookmarkedNoteListDocument() { ) ); } -} \ No newline at end of file +} diff --git a/src/test/java/com/projectlyrics/server/domain/note/entity/NoteTypeCaseInsensitiveTest.java b/src/test/java/com/projectlyrics/server/domain/note/entity/NoteTypeCaseInsensitiveTest.java new file mode 100644 index 00000000..1ee61775 --- /dev/null +++ b/src/test/java/com/projectlyrics/server/domain/note/entity/NoteTypeCaseInsensitiveTest.java @@ -0,0 +1,22 @@ +package com.projectlyrics.server.domain.note.entity; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.Test; + +class NoteTypeCaseInsensitiveTest { + + @Test + void 소문자_문자열도_노트타입으로_변환한다() { + NoteType result = NoteType.of("free"); + + assertThat(result).isEqualTo(NoteType.FREE); + } + + @Test + void 혼합_대소문자_문자열도_노트타입으로_변환한다() { + NoteType result = NoteType.of("lyrics_analysis"); + + assertThat(result).isEqualTo(NoteType.LYRICS_ANALYSIS); + } +} diff --git a/src/test/java/com/projectlyrics/server/domain/note/entity/NoteTypeTest.java b/src/test/java/com/projectlyrics/server/domain/note/entity/NoteTypeTest.java index 8c2c53a6..4bd83dbf 100644 --- a/src/test/java/com/projectlyrics/server/domain/note/entity/NoteTypeTest.java +++ b/src/test/java/com/projectlyrics/server/domain/note/entity/NoteTypeTest.java @@ -37,7 +37,7 @@ class NoteTypeTest { } @ParameterizedTest - @ValueSource(strings = {"INVALID", "free", "question", "", " "}) + @ValueSource(strings = {"INVALID", "FREEE", "QUESTIONS", "", " ", "lyrics-analysis"}) void 유효하지_않은_문자열에_대해_예외를_발생시켜야_한다(String invalidType) { // when & then assertThatThrownBy(() -> NoteType.of(invalidType)) diff --git a/src/test/java/com/projectlyrics/server/domain/note/service/NoteCommandServiceTest.java b/src/test/java/com/projectlyrics/server/domain/note/service/NoteCommandServiceTest.java index 80b0e462..05a9f1ad 100644 --- a/src/test/java/com/projectlyrics/server/domain/note/service/NoteCommandServiceTest.java +++ b/src/test/java/com/projectlyrics/server/domain/note/service/NoteCommandServiceTest.java @@ -72,7 +72,7 @@ class NoteCommandServiceTest extends IntegrationTest { Note note = sut.create(request, user.getId()); // then - Slice result = noteQueryRepository.findAllByUserId(true, null, user.getId(), null, PageRequest.ofSize(5)); + Slice result = noteQueryRepository.findAllByUserId(true, null, null, user.getId(), null, PageRequest.ofSize(5)); assertAll( () -> assertThat(result.getContent().size()).isEqualTo(1), () -> assertThat(result.getContent().getFirst().getId()).isEqualTo(note.getId()), @@ -127,9 +127,9 @@ class NoteCommandServiceTest extends IntegrationTest { Note note = sut.create(request, user.getId()); // when - Slice beforeResult = noteQueryRepository.findAllByUserId(true, null, user.getId(), null, PageRequest.ofSize(5)); + Slice beforeResult = noteQueryRepository.findAllByUserId(true, null, null, user.getId(), null, PageRequest.ofSize(5)); sut.delete(user.getId(), note.getId()); - Slice afterResult = noteQueryRepository.findAllByUserId(true, null, user.getId(), null, PageRequest.ofSize(5)); + Slice afterResult = noteQueryRepository.findAllByUserId(true, null, null, user.getId(), null, PageRequest.ofSize(5)); // then assertAll( @@ -308,4 +308,4 @@ class NoteCommandServiceTest extends IntegrationTest { assertThatThrownBy(() -> sut.create(request, user.getId())) .isInstanceOf(InvalidDisciplineActionException.class); } -} \ No newline at end of file +} diff --git a/src/test/java/com/projectlyrics/server/domain/note/service/NoteQueryServiceTest.java b/src/test/java/com/projectlyrics/server/domain/note/service/NoteQueryServiceTest.java index 86da0f47..f2242d8e 100644 --- a/src/test/java/com/projectlyrics/server/domain/note/service/NoteQueryServiceTest.java +++ b/src/test/java/com/projectlyrics/server/domain/note/service/NoteQueryServiceTest.java @@ -35,6 +35,8 @@ import java.util.stream.IntStream; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; import org.springframework.beans.factory.annotation.Autowired; class NoteQueryServiceTest extends IntegrationTest { @@ -184,7 +186,8 @@ void setUp() { }); // when - CursorBasePaginatedResponse result = sut.getNotesByUserId(true, null, user.getId(), null, 10); + CursorBasePaginatedResponse result = sut.getNotesByUserId(true, null, null, user.getId(), null, + 10); // then assertAll( @@ -207,7 +210,8 @@ void setUp() { }); // when - CursorBasePaginatedResponse result = sut.getNotesByUserId(false, null, user.getId(), null, 10); + CursorBasePaginatedResponse result = sut.getNotesByUserId(false, null, null, user.getId(), + null, 10); // then assertAll( @@ -230,7 +234,7 @@ void setUp() { Note likedArtistSongNote3 = noteCommandService.create(likedArtistSongNoteRequest, user.getId()); // when - CursorBasePaginatedResponse result = sut.getNotes(true, true, user.getId(), null, 5); + CursorBasePaginatedResponse result = sut.getNotes(true, true, null, user.getId(), null, 5); // then assertAll( @@ -255,7 +259,7 @@ void setUp() { blockCommandRepository.save(BlockFixture.create(user, user1)); // when - CursorBasePaginatedResponse result = sut.getNotes(true, true, user.getId(), null, 5); + CursorBasePaginatedResponse result = sut.getNotes(true, true, null, user.getId(), null, 5); // then assertAll( @@ -273,8 +277,10 @@ void setUp() { Note note3 = noteCommandService.create(likedArtistSongNoteRequest, user.getId()); // when - CursorBasePaginatedResponse result1 = sut.getNotesByArtistId(false, likedArtist.getId(), user.getId(), null, 5); - CursorBasePaginatedResponse result2 = sut.getNotesByArtistId(false, unlikedArtistSong.getId(), user.getId(), null, 5); + CursorBasePaginatedResponse result1 = sut.getNotesByArtistId(false, likedArtist.getId(), null, + user.getId(), null, 5); + CursorBasePaginatedResponse result2 = sut.getNotesByArtistId(false, unlikedArtistSong.getId(), + null, user.getId(), null, 5); // then assertAll( @@ -303,7 +309,8 @@ void setUp() { Note note3 = noteCommandService.create(likedArtistSongNoteRequest, user.getId()); // when - CursorBasePaginatedResponse result = sut.getNotesByArtistId(true, likedArtist.getId(), user.getId(), null, 5); + CursorBasePaginatedResponse result = sut.getNotesByArtistId(true, likedArtist.getId(), null, + user.getId(), null, 5); // then assertAll( @@ -323,7 +330,8 @@ void setUp() { blockCommandRepository.save(BlockFixture.create(user, user1)); // when - CursorBasePaginatedResponse result = sut.getNotesByArtistId(false, likedArtist.getId(), user.getId(), null, 5); + CursorBasePaginatedResponse result = sut.getNotesByArtistId(false, likedArtist.getId(), null, + user.getId(), null, 5); // then assertAll( @@ -341,8 +349,10 @@ void setUp() { Note note3 = noteCommandService.create(likedArtistSongNoteRequest, user.getId()); // when - CursorBasePaginatedResponse result1 = sut.getNotesBySongId(false, likedArtistSong.getId(), user.getId(), null, 5); - CursorBasePaginatedResponse result2 = sut.getNotesBySongId(false, unlikedArtistSong.getId(), user.getId(), null, 5); + CursorBasePaginatedResponse result1 = sut.getNotesBySongId(false, likedArtistSong.getId(), + null, user.getId(), null, 5); + CursorBasePaginatedResponse result2 = sut.getNotesBySongId(false, unlikedArtistSong.getId(), + null, user.getId(), null, 5); // then assertAll( @@ -364,7 +374,8 @@ void setUp() { blockCommandRepository.save(BlockFixture.create(user, user1)); // when - CursorBasePaginatedResponse result = sut.getNotesBySongId(false, likedArtistSong.getId(), user.getId(), null, 5); + CursorBasePaginatedResponse result = sut.getNotesBySongId(false, likedArtistSong.getId(), null, + user.getId(), null, 5); // then assertAll( @@ -385,7 +396,8 @@ void setUp() { bookmarkCommandRepository.save(BookmarkFixture.create(user, bookmarkedNote2)); // when - CursorBasePaginatedResponse result = sut.getBookmarkedNotes(true, likedArtist.getId(), user.getId(), null, 5); + CursorBasePaginatedResponse result = sut.getBookmarkedNotes(true, likedArtist.getId(), null, + user.getId(), null, 5); // then assertAll( @@ -405,7 +417,8 @@ void setUp() { bookmarkCommandRepository.save(BookmarkFixture.create(user, bookmarkedNoteOfUnlikedArtist)); // when - CursorBasePaginatedResponse result = sut.getBookmarkedNotes(true, likedArtist.getId(), user.getId(), null, 5); + CursorBasePaginatedResponse result = sut.getBookmarkedNotes(true, likedArtist.getId(), null, + user.getId(), null, 5); // then assertAll( @@ -424,7 +437,8 @@ void setUp() { bookmarkCommandRepository.save(BookmarkFixture.create(user, unlikedArtistNote)); // when - CursorBasePaginatedResponse result = sut.getBookmarkedNotes(true, likedArtist.getId(), user.getId(), null, 5); + CursorBasePaginatedResponse result = sut.getBookmarkedNotes(true, likedArtist.getId(), null, + user.getId(), null, 5); // then assertAll( @@ -450,7 +464,8 @@ void setUp() { blockCommandRepository.save(BlockFixture.create(user, user1)); // when - CursorBasePaginatedResponse result = sut.getBookmarkedNotes(true, likedArtist.getId(), user.getId(), null, 5); + CursorBasePaginatedResponse result = sut.getBookmarkedNotes(true, likedArtist.getId(), null, + user.getId(), null, 5); // then assertAll( @@ -459,4 +474,134 @@ void setUp() { () -> assertThat(result.data().get(1).id()).isEqualTo(bookmarkedNote3.getId()) ); } -} \ No newline at end of file + + @ParameterizedTest + @EnumSource(NoteType.class) + void 노트_타입으로_사용자_노트를_조회할_수_있다(NoteType noteType) { + // given + Note expectedNote = noteCommandService.create(createNoteRequestByType(likedArtistSong.getId(), noteType), + user.getId()); + noteCommandService.create(createNoteRequestByType(likedArtistSong.getId(), getAnotherType(noteType)), + user.getId()); + + // when + CursorBasePaginatedResponse result = sut.getNotesByUserId(true, null, noteType, user.getId(), + null, 10); + + // then + assertAll( + () -> assertThat(result.data()).hasSize(1), + () -> assertThat(result.data().getFirst().id()).isEqualTo(expectedNote.getId()), + () -> assertThat(result.data().getFirst().noteType()).isEqualTo(noteType.getType()) + ); + } + + @ParameterizedTest + @EnumSource(NoteType.class) + void 노트_타입으로_좋아하는_아티스트_노트를_조회할_수_있다(NoteType noteType) { + // given + favoriteArtistCommandRepository.save(FavoriteArtistFixture.create(user, likedArtist)); + Note expectedNote = noteCommandService.create(createNoteRequestByType(likedArtistSong.getId(), noteType), + user.getId()); + noteCommandService.create(createNoteRequestByType(likedArtistSong.getId(), getAnotherType(noteType)), + user.getId()); + noteCommandService.create(createNoteRequestByType(unlikedArtistSong.getId(), noteType), user.getId()); + + // when + CursorBasePaginatedResponse result = sut.getNotes(true, true, noteType, user.getId(), null, + 10); + + // then + assertAll( + () -> assertThat(result.data()).hasSize(1), + () -> assertThat(result.data().getFirst().id()).isEqualTo(expectedNote.getId()), + () -> assertThat(result.data().getFirst().noteType()).isEqualTo(noteType.getType()) + ); + } + + @ParameterizedTest + @EnumSource(NoteType.class) + void 노트_타입으로_아티스트별_노트를_조회할_수_있다(NoteType noteType) { + // given + Note expectedNote = noteCommandService.create(createNoteRequestByType(likedArtistSong.getId(), noteType), + user.getId()); + noteCommandService.create(createNoteRequestByType(likedArtistSong.getId(), getAnotherType(noteType)), + user.getId()); + noteCommandService.create(createNoteRequestByType(unlikedArtistSong.getId(), noteType), user.getId()); + + // when + CursorBasePaginatedResponse result = sut.getNotesByArtistId(true, likedArtist.getId(), + noteType, user.getId(), null, 10); + + // then + assertAll( + () -> assertThat(result.data()).hasSize(1), + () -> assertThat(result.data().getFirst().id()).isEqualTo(expectedNote.getId()), + () -> assertThat(result.data().getFirst().noteType()).isEqualTo(noteType.getType()) + ); + } + + @ParameterizedTest + @EnumSource(NoteType.class) + void 노트_타입으로_곡별_노트를_조회할_수_있다(NoteType noteType) { + // given + Note expectedNote = noteCommandService.create(createNoteRequestByType(likedArtistSong.getId(), noteType), + user.getId()); + noteCommandService.create(createNoteRequestByType(likedArtistSong.getId(), getAnotherType(noteType)), + user.getId()); + + // when + CursorBasePaginatedResponse result = sut.getNotesBySongId(true, likedArtistSong.getId(), + noteType, user.getId(), null, 10); + + // then + assertAll( + () -> assertThat(result.data()).hasSize(1), + () -> assertThat(result.data().getFirst().id()).isEqualTo(expectedNote.getId()), + () -> assertThat(result.data().getFirst().noteType()).isEqualTo(noteType.getType()) + ); + } + + @ParameterizedTest + @EnumSource(NoteType.class) + void 노트_타입으로_북마크한_노트를_조회할_수_있다(NoteType noteType) { + // given + Note expectedNote = noteCommandService.create(createNoteRequestByType(likedArtistSong.getId(), noteType), + user.getId()); + Note anotherTypeNote = noteCommandService.create( + createNoteRequestByType(likedArtistSong.getId(), getAnotherType(noteType)), user.getId()); + + bookmarkCommandRepository.save(BookmarkFixture.create(user, expectedNote)); + bookmarkCommandRepository.save(BookmarkFixture.create(user, anotherTypeNote)); + + // when + CursorBasePaginatedResponse result = sut.getBookmarkedNotes(true, likedArtist.getId(), + noteType, user.getId(), null, 10); + + // then + assertAll( + () -> assertThat(result.data()).hasSize(1), + () -> assertThat(result.data().getFirst().id()).isEqualTo(expectedNote.getId()), + () -> assertThat(result.data().getFirst().noteType()).isEqualTo(noteType.getType()) + ); + } + + private NoteCreateRequest createNoteRequestByType(Long songId, NoteType noteType) { + return new NoteCreateRequest( + "content", + "lyrics", + NoteBackground.DEFAULT, + NoteStatus.PUBLISHED, + noteType, + songId + ); + } + + private NoteType getAnotherType(NoteType noteType) { + return switch (noteType) { + case FREE -> NoteType.QUESTION; + case QUESTION -> NoteType.LYRICS_ANALYSIS; + case LYRICS_ANALYSIS -> NoteType.FREE; + }; + } +}