Skip to content
This repository was archived by the owner on May 21, 2026. It is now read-only.

Commit 0472eb5

Browse files
Add statusId, genreId, mediaId, categoryName filters to findUserMediaLibrary
Agent-Logs-Url: https://github.com/EspacoGeek-Teams/SpringAPI_EspacoGeek/sessions/b6f2c08a-c3ac-49e3-a959-88a442a3d3fe Co-authored-by: vitorhugo-java <65777252+vitorhugo-java@users.noreply.github.com>
1 parent d49719a commit 0472eb5

6 files changed

Lines changed: 218 additions & 65 deletions

File tree

src/main/java/com/espacogeek/geek/controllers/UserMediaListController.java

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,27 +24,37 @@ public class UserMediaListController {
2424

2525
/**
2626
* Returns the authenticated user's media library, optionally filtered by
27-
* status, category, genre, media name, or alternative title.
27+
* status, statusId, category, categoryName, genre, genreId, mediaId, media name,
28+
* or alternative title.
2829
*
29-
* @param status optional status filter (e.g. "watching", "completed")
30-
* @param categoryId optional media category ID filter
31-
* @param genreName optional genre name filter
32-
* @param mediaName optional media name filter (partial match)
33-
* @param altTitle optional alternative title filter (partial match)
30+
* @param status optional user tracking status string filter (e.g. "watching")
31+
* @param statusId optional media production status ID filter (MediaStatusModel.id)
32+
* @param categoryId optional media category ID filter
33+
* @param categoryName optional media category name filter (e.g. "ANIME")
34+
* @param genreId optional genre ID filter
35+
* @param genreName optional genre name filter
36+
* @param mediaId optional media ID filter
37+
* @param mediaName optional media name filter (partial match)
38+
* @param altTitle optional alternative title filter (partial match)
3439
* @param authentication the currently authenticated user (required)
3540
* @return list of matching library entries belonging to the user
3641
*/
3742
@QueryMapping(name = "findUserMediaLibrary")
3843
@PreAuthorize("hasRole('user')")
3944
public List<UserMediaListModel> findUserMediaLibrary(
4045
@Argument(name = "status") String status,
46+
@Argument(name = "statusId") Integer statusId,
4147
@Argument(name = "categoryId") Integer categoryId,
48+
@Argument(name = "categoryName") String categoryName,
49+
@Argument(name = "genreId") Integer genreId,
4250
@Argument(name = "genreName") String genreName,
51+
@Argument(name = "mediaId") Integer mediaId,
4352
@Argument(name = "mediaName") String mediaName,
4453
@Argument(name = "altTitle") String altTitle,
4554
Authentication authentication) {
4655
var user = userService.findUserByEmail(authentication.getName())
4756
.orElseThrow(() -> new GenericException("User not found"));
48-
return userMediaListService.findByUserIdWithFilters(user.getId(), status, categoryId, genreName, mediaName, altTitle);
57+
return userMediaListService.findByUserIdWithFilters(
58+
user.getId(), status, statusId, categoryId, categoryName, genreId, genreName, mediaId, mediaName, altTitle);
4959
}
5060
}

src/main/java/com/espacogeek/geek/repositories/UserMediaListRepository.java

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,29 +13,42 @@ public interface UserMediaListRepository extends JpaRepository<UserMediaListMode
1313

1414
/**
1515
* Fetches library entries for a given user with optional filters on:
16-
* status, media category, genre name, media name, and alternative title.
16+
* status string, status ID (media's production status), media category ID,
17+
* category name, genre ID, genre name, media ID, media name, and alternative title.
1718
*
18-
* @param userId the ID of the authenticated user (required)
19-
* @param status optional status filter (case-insensitive exact match)
20-
* @param categoryId optional media category ID filter
21-
* @param genreName optional genre name filter (case-insensitive exact match)
22-
* @param mediaName optional media name filter (case-insensitive partial match)
23-
* @param altTitle optional alternative title filter (case-insensitive partial match)
19+
* @param userId the ID of the authenticated user (required)
20+
* @param status optional user tracking status string filter (case-insensitive exact match)
21+
* @param statusId optional media production status ID filter (MediaStatusModel.id, Integer)
22+
* @param categoryId optional media category ID filter
23+
* @param categoryName optional media category name filter (case-insensitive exact match)
24+
* @param genreId optional genre ID filter
25+
* @param genreName optional genre name filter (case-insensitive exact match)
26+
* @param mediaId optional media ID filter
27+
* @param mediaName optional media name filter (case-insensitive partial match)
28+
* @param altTitle optional alternative title filter (case-insensitive partial match)
2429
* @return a distinct list of matching library entries
2530
*/
2631
@Query("SELECT DISTINCT u FROM UserMediaListModel u " +
2732
"JOIN u.media m " +
2833
"WHERE u.user.id = :userId " +
2934
"AND (:status IS NULL OR LOWER(u.status) = LOWER(:status)) " +
35+
"AND (:statusId IS NULL OR (m.mediaStatus IS NOT NULL AND m.mediaStatus.id = :statusId)) " +
3036
"AND (:categoryId IS NULL OR m.mediaCategory.id = :categoryId) " +
37+
"AND (:categoryName IS NULL OR LOWER(CAST(m.mediaCategory.name AS string)) = LOWER(:categoryName)) " +
38+
"AND (:genreId IS NULL OR EXISTS (SELECT 1 FROM GenreModel g WHERE g MEMBER OF m.genre AND g.id = :genreId)) " +
3139
"AND (:genreName IS NULL OR EXISTS (SELECT 1 FROM GenreModel g WHERE g MEMBER OF m.genre AND LOWER(g.name) = LOWER(:genreName))) " +
40+
"AND (:mediaId IS NULL OR m.id = :mediaId) " +
3241
"AND (:mediaName IS NULL OR LOWER(m.name) LIKE LOWER(CONCAT('%', :mediaName, '%'))) " +
3342
"AND (:altTitle IS NULL OR EXISTS (SELECT 1 FROM AlternativeTitleModel a WHERE a.media = m AND LOWER(a.name) LIKE LOWER(CONCAT('%', :altTitle, '%'))))")
3443
List<UserMediaListModel> findByUserIdWithFilters(
3544
@Param("userId") Integer userId,
3645
@Param("status") String status,
46+
@Param("statusId") Integer statusId,
3747
@Param("categoryId") Integer categoryId,
48+
@Param("categoryName") String categoryName,
49+
@Param("genreId") Integer genreId,
3850
@Param("genreName") String genreName,
51+
@Param("mediaId") Integer mediaId,
3952
@Param("mediaName") String mediaName,
4053
@Param("altTitle") String altTitle);
4154
}

src/main/java/com/espacogeek/geek/services/UserMediaListService.java

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,27 @@ public interface UserMediaListService {
1313
/**
1414
* Retrieves all library entries for the given user, with optional filters.
1515
*
16-
* @param userId the ID of the authenticated user
17-
* @param status optional status filter (e.g. "watching", "completed")
18-
* @param categoryId optional media category ID filter
19-
* @param genreName optional genre name filter
20-
* @param mediaName optional media name filter (partial match)
21-
* @param altTitle optional alternative title filter (partial match)
16+
* @param userId the ID of the authenticated user
17+
* @param status optional user tracking status string filter (e.g. "watching", "completed")
18+
* @param statusId optional media production status ID filter (MediaStatusModel.id)
19+
* @param categoryId optional media category ID filter
20+
* @param categoryName optional media category name filter (e.g. "ANIME", "MOVIE")
21+
* @param genreId optional genre ID filter
22+
* @param genreName optional genre name filter
23+
* @param mediaId optional media ID filter
24+
* @param mediaName optional media name filter (partial match)
25+
* @param altTitle optional alternative title filter (partial match)
2226
* @return a list of matching {@link UserMediaListModel} entries
2327
*/
2428
List<UserMediaListModel> findByUserIdWithFilters(
2529
Integer userId,
2630
String status,
31+
Integer statusId,
2732
Integer categoryId,
33+
String categoryName,
34+
Integer genreId,
2835
String genreName,
36+
Integer mediaId,
2937
String mediaName,
3038
String altTitle);
3139
}

src/main/java/com/espacogeek/geek/services/impl/UserMediaListServiceImpl.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,21 @@ public class UserMediaListServiceImpl implements UserMediaListService {
1919
private UserMediaListRepository userMediaListRepository;
2020

2121
/**
22-
* @see UserMediaListService#findByUserIdWithFilters(Integer, String, Integer, String, String, String)
22+
* @see UserMediaListService#findByUserIdWithFilters(Integer, String, Long, Integer, String, Integer, String, Integer, String, String)
2323
*/
2424
@Override
2525
public List<UserMediaListModel> findByUserIdWithFilters(
2626
Integer userId,
2727
String status,
28+
Integer statusId,
2829
Integer categoryId,
30+
String categoryName,
31+
Integer genreId,
2932
String genreName,
33+
Integer mediaId,
3034
String mediaName,
3135
String altTitle) {
32-
return userMediaListRepository.findByUserIdWithFilters(userId, status, categoryId, genreName, mediaName, altTitle);
36+
return userMediaListRepository.findByUserIdWithFilters(
37+
userId, status, statusId, categoryId, categoryName, genreId, genreName, mediaId, mediaName, altTitle);
3338
}
3439
}

src/main/resources/graphql/query.graphqls

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,9 @@ type Query {
7878

7979
"""
8080
Fetch the authenticated user's media library with optional filters.
81-
Filters: status (e.g. "watching"), categoryId, genreName, mediaName, altTitle.
81+
Filters: status, statusId (media production status ID), categoryId, categoryName,
82+
genreId, genreName, mediaId, mediaName, altTitle.
8283
Example: findUserMediaLibrary(status: "watching") { id status media { name } }
8384
"""
84-
findUserMediaLibrary(status: String, categoryId: Int, genreName: String, mediaName: String, altTitle: String): [UserMediaList]
85+
findUserMediaLibrary(status: String, statusId: Int, categoryId: Int, categoryName: String, genreId: Int, genreName: String, mediaId: Int, mediaName: String, altTitle: String): [UserMediaList]
8586
}

0 commit comments

Comments
 (0)