[FA-misc] Switches to using DTOs, updates frontend with details and reader page, updates novel import to be an upsert
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
using FictionArchive.Service.NovelService.Models.Novels;
|
||||
using FictionArchive.Common.Enums;
|
||||
using FictionArchive.Service.NovelService.Models.DTOs;
|
||||
using FictionArchive.Service.NovelService.Services;
|
||||
using HotChocolate.Authorization;
|
||||
using HotChocolate.Data;
|
||||
@@ -13,8 +14,186 @@ public class Query
|
||||
[UseProjection]
|
||||
[UseFiltering]
|
||||
[UseSorting]
|
||||
public IQueryable<Novel> GetNovels(NovelServiceDbContext dbContext)
|
||||
public IQueryable<NovelDto> GetNovels(
|
||||
NovelServiceDbContext dbContext,
|
||||
Language preferredLanguage = Language.En)
|
||||
{
|
||||
return dbContext.Novels.AsQueryable();
|
||||
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<ChapterReaderDto> 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()
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user