using FictionArchive.Common.Enums; using FictionArchive.Service.NovelService.Models.DTOs; using FictionArchive.Service.NovelService.Services; using HotChocolate.Authorization; using HotChocolate.Data; using HotChocolate.Types; namespace FictionArchive.Service.NovelService.GraphQL; public class Query { [Authorize] [UsePaging] [UseProjection] [UseFiltering] [UseSorting] public IQueryable GetNovels( NovelServiceDbContext dbContext, Language preferredLanguage = Language.En) { return dbContext.Novels.Select(novel => new NovelDto { Id = novel.Id, CreatedTime = novel.CreatedTime, LastUpdatedTime = novel.LastUpdatedTime, Url = novel.Url, RawLanguage = novel.RawLanguage, RawStatus = novel.RawStatus, StatusOverride = novel.StatusOverride, ExternalId = novel.ExternalId, Name = novel.Name.Texts .Where(t => t.Language == preferredLanguage) .Select(t => t.Text) .FirstOrDefault() ?? novel.Name.Texts.Select(t => t.Text).FirstOrDefault() ?? "", Description = novel.Description.Texts .Where(t => t.Language == preferredLanguage) .Select(t => t.Text) .FirstOrDefault() ?? novel.Description.Texts.Select(t => t.Text).FirstOrDefault() ?? "", Author = new PersonDto { Id = novel.Author.Id, CreatedTime = novel.Author.CreatedTime, LastUpdatedTime = novel.Author.LastUpdatedTime, Name = novel.Author.Name.Texts .Where(t => t.Language == preferredLanguage) .Select(t => t.Text) .FirstOrDefault() ?? novel.Author.Name.Texts.Select(t => t.Text).FirstOrDefault() ?? "", ExternalUrl = novel.Author.ExternalUrl }, Source = new SourceDto { Id = novel.Source.Id, CreatedTime = novel.Source.CreatedTime, LastUpdatedTime = novel.Source.LastUpdatedTime, Name = novel.Source.Name, Key = novel.Source.Key, Url = novel.Source.Url }, CoverImage = novel.CoverImage != null ? new ImageDto { Id = novel.CoverImage.Id, CreatedTime = novel.CoverImage.CreatedTime, LastUpdatedTime = novel.CoverImage.LastUpdatedTime, NewPath = novel.CoverImage.NewPath } : null, Chapters = novel.Chapters.Select(chapter => new ChapterDto { Id = chapter.Id, CreatedTime = chapter.CreatedTime, LastUpdatedTime = chapter.LastUpdatedTime, Revision = chapter.Revision, Order = chapter.Order, Url = chapter.Url, Name = chapter.Name.Texts .Where(t => t.Language == preferredLanguage) .Select(t => t.Text) .FirstOrDefault() ?? chapter.Name.Texts.Select(t => t.Text).FirstOrDefault() ?? "", Body = chapter.Body.Texts .Where(t => t.Language == preferredLanguage) .Select(t => t.Text) .FirstOrDefault() ?? chapter.Body.Texts.Select(t => t.Text).FirstOrDefault() ?? "", Images = chapter.Images.Select(image => new ImageDto { Id = image.Id, CreatedTime = image.CreatedTime, LastUpdatedTime = image.LastUpdatedTime, NewPath = image.NewPath }).ToList() }).ToList(), Tags = novel.Tags.Select(tag => new NovelTagDto { Id = tag.Id, CreatedTime = tag.CreatedTime, LastUpdatedTime = tag.LastUpdatedTime, Key = tag.Key, TagType = tag.TagType, DisplayName = tag.DisplayName.Texts .Where(t => t.Language == preferredLanguage) .Select(t => t.Text) .FirstOrDefault() ?? tag.DisplayName.Texts.Select(t => t.Text).FirstOrDefault() ?? "", Source = tag.Source != null ? new SourceDto { Id = tag.Source.Id, CreatedTime = tag.Source.CreatedTime, LastUpdatedTime = tag.Source.LastUpdatedTime, Name = tag.Source.Name, Key = tag.Source.Key, Url = tag.Source.Url } : null }).ToList() }); } [Authorize] [UseFirstOrDefault] [UseProjection] public IQueryable GetChapter( NovelServiceDbContext dbContext, uint novelId, uint chapterOrder, Language preferredLanguage = Language.En) { return dbContext.Chapters .Where(c => c.Novel.Id == novelId && c.Order == chapterOrder) .Select(chapter => new ChapterReaderDto { Id = chapter.Id, CreatedTime = chapter.CreatedTime, LastUpdatedTime = chapter.LastUpdatedTime, Revision = chapter.Revision, Order = chapter.Order, Url = chapter.Url, Name = chapter.Name.Texts .Where(t => t.Language == preferredLanguage) .Select(t => t.Text) .FirstOrDefault() ?? chapter.Name.Texts.Select(t => t.Text).FirstOrDefault() ?? "", Body = chapter.Body.Texts .Where(t => t.Language == preferredLanguage) .Select(t => t.Text) .FirstOrDefault() ?? chapter.Body.Texts.Select(t => t.Text).FirstOrDefault() ?? "", Images = chapter.Images.Select(image => new ImageDto { Id = image.Id, CreatedTime = image.CreatedTime, LastUpdatedTime = image.LastUpdatedTime, NewPath = image.NewPath }).ToList(), NovelId = chapter.Novel.Id, NovelName = chapter.Novel.Name.Texts .Where(t => t.Language == preferredLanguage) .Select(t => t.Text) .FirstOrDefault() ?? chapter.Novel.Name.Texts.Select(t => t.Text).FirstOrDefault() ?? "", TotalChapters = chapter.Novel.Chapters.Count, PrevChapterOrder = chapter.Novel.Chapters .Where(c => c.Order < chapterOrder) .OrderByDescending(c => c.Order) .Select(c => (uint?)c.Order) .FirstOrDefault(), NextChapterOrder = chapter.Novel.Chapters .Where(c => c.Order > chapterOrder) .OrderBy(c => c.Order) .Select(c => (uint?)c.Order) .FirstOrDefault() }); } }