137 lines
4.1 KiB
C#
137 lines
4.1 KiB
C#
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<IQueryable<BookmarkDto>> GetBookmarks(
|
|
UserNovelDataServiceDbContext dbContext,
|
|
ClaimsPrincipal claimsPrincipal,
|
|
uint novelId)
|
|
{
|
|
var oAuthProviderId = claimsPrincipal.FindFirst(ClaimTypes.NameIdentifier)?.Value;
|
|
if (string.IsNullOrEmpty(oAuthProviderId))
|
|
{
|
|
return new List<BookmarkDto>().AsQueryable();
|
|
}
|
|
|
|
var user = await dbContext.Users
|
|
.AsNoTracking()
|
|
.FirstOrDefaultAsync(u => u.OAuthProviderId == oAuthProviderId);
|
|
|
|
if (user == null)
|
|
{
|
|
return new List<BookmarkDto>().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<IEnumerable<ReadingListDto>> 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<ReadingListDto?> 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
|
|
};
|
|
}
|
|
}
|