using System.Security.Claims; using FictionArchive.Service.UserNovelDataService.Models.Database; using FictionArchive.Service.UserNovelDataService.Models.DTOs; using FictionArchive.Service.UserNovelDataService.Services; using HotChocolate.Authorization; using Microsoft.EntityFrameworkCore; namespace FictionArchive.Service.UserNovelDataService.GraphQL; public class Query { [Authorize] public async Task> GetBookmarks( UserNovelDataServiceDbContext dbContext, ClaimsPrincipal claimsPrincipal, uint novelId) { var oAuthProviderId = claimsPrincipal.FindFirst(ClaimTypes.NameIdentifier)?.Value; if (string.IsNullOrEmpty(oAuthProviderId)) { return new List().AsQueryable(); } var user = await dbContext.Users .AsNoTracking() .FirstOrDefaultAsync(u => u.OAuthProviderId == oAuthProviderId); if (user == null) { return new List().AsQueryable(); } return dbContext.Bookmarks .AsNoTracking() .Where(b => b.UserId == user.Id && b.NovelId == novelId) .OrderByDescending(b => b.CreatedTime) .Select(b => new BookmarkDto { Id = b.Id, ChapterId = b.ChapterId, NovelId = b.NovelId, Description = b.Description, CreatedTime = b.CreatedTime }); } [Authorize] public async Task> GetReadingLists( UserNovelDataServiceDbContext dbContext, ClaimsPrincipal claimsPrincipal) { var oAuthProviderId = claimsPrincipal.FindFirst(ClaimTypes.NameIdentifier)?.Value; if (string.IsNullOrEmpty(oAuthProviderId)) { return []; } var user = await dbContext.Users .AsNoTracking() .FirstOrDefaultAsync(u => u.OAuthProviderId == oAuthProviderId); if (user == null) { return []; } var lists = await dbContext.ReadingLists .AsNoTracking() .Include(r => r.Items) .Where(r => r.UserId == user.Id) .OrderByDescending(r => r.LastUpdatedTime) .ToListAsync(); return lists.Select(r => new ReadingListDto { Id = r.Id, Name = r.Name, Description = r.Description, ItemCount = r.Items.Count, Items = r.Items.Select(i => new ReadingListItemDto { NovelId = i.NovelId, Order = i.Order, AddedTime = i.CreatedTime }), CreatedTime = r.CreatedTime }); } [Authorize] public async Task GetReadingList( UserNovelDataServiceDbContext dbContext, ClaimsPrincipal claimsPrincipal, int id) { var oAuthProviderId = claimsPrincipal.FindFirst(ClaimTypes.NameIdentifier)?.Value; if (string.IsNullOrEmpty(oAuthProviderId)) { return null; } var user = await dbContext.Users .AsNoTracking() .FirstOrDefaultAsync(u => u.OAuthProviderId == oAuthProviderId); if (user == null) { return null; } var readingList = await dbContext.ReadingLists .AsNoTracking() .Include(r => r.Items.OrderBy(i => i.Order)) .FirstOrDefaultAsync(r => r.Id == id && r.UserId == user.Id); if (readingList == null) { return null; } return new ReadingListDto { Id = readingList.Id, Name = readingList.Name, Description = readingList.Description, ItemCount = readingList.Items.Count, Items = readingList.Items.Select(i => new ReadingListItemDto { NovelId = i.NovelId, Order = i.Order, AddedTime = i.CreatedTime }), CreatedTime = readingList.CreatedTime }; } }