Fix redundant keys, MangaSearch

This commit is contained in:
Glax 2024-12-16 19:25:22 +01:00
parent 87274aca19
commit 3b58e0498b
16 changed files with 126 additions and 98 deletions

View File

@ -43,19 +43,14 @@ public class ConnectorController(PgsqlContext context) : Controller
{ {
try try
{ {
context.Tags.AddRange(tags); AddMangaToContext(manga, authors, tags, links, altTitles);
context.Authors.AddRange(authors);
context.Link.AddRange(links);
context.AltTitles.AddRange(altTitles);
context.Manga.AddRange(manga);
context.SaveChanges();
} }
catch (DbUpdateException) catch (DbUpdateException)
{ {
return StatusCode(500, new ProblemResponse("An error occurred while processing your request.")); return StatusCode(500, new ProblemResponse("An error occurred while processing your request."));
} }
} }
return Ok(allManga.Select(m => m.Item1).ToArray()); return Ok(allManga.Select(m => context.Manga.Find(m.Item1.MangaId)).ToArray());
} }
/// <summary> /// <summary>
@ -78,18 +73,49 @@ public class ConnectorController(PgsqlContext context) : Controller
{ {
try try
{ {
context.Tags.AddRange(tags); AddMangaToContext(manga, authors, tags, links, altTitles);
context.Authors.AddRange(authors);
context.Link.AddRange(links);
context.AltTitles.AddRange(altTitles);
context.Manga.AddRange(manga);
context.SaveChanges();
} }
catch (DbUpdateException) catch (DbUpdateException)
{ {
return StatusCode(500, new ProblemResponse("An error occurred while processing your request.")); return StatusCode(500, new ProblemResponse("An error occurred while processing your request."));
} }
} }
return Ok(mangas.Select(m => m.Item1).ToArray());
return Ok(mangas.Select(m => context.Manga.Find(m.Item1.MangaId)).ToArray());
}
private void AddMangaToContext(Manga? manga, Author[]? authors, MangaTag[]? tags, Link[]? links,
MangaAltTitle[]? altTitles)
{
if (manga is null)
return;
if (tags is not null)
{
IEnumerable<MangaTag> newTags = tags.Where(mt => context.Tags.All(t => !t.Tag.Equals(mt.Tag)));
context.Tags.AddRange(newTags);
}
if (authors is not null)
{
IEnumerable<Author> mergedAuthors = authors.Select(ma =>
{
Author? inDb = context.Authors.FirstOrDefault(a => a.Equals(ma));
return inDb ?? ma;
});
manga.Authors = mergedAuthors.ToArray();
IEnumerable<Author> newAuthors = authors.Where(ma => context.Authors.All(a => !a.Equals(ma)));
context.Authors.AddRange(newAuthors);
}
if (links is not null)
context.Link.AddRange(links);
if(altTitles is not null)
context.AltTitles.AddRange(altTitles);
context.Manga.Add(manga);
context.SaveChanges();
} }
} }

View File

@ -149,7 +149,7 @@ public class MangaController(PgsqlContext context) : Controller
Manga? m = context.Manga.Find(id); Manga? m = context.Manga.Find(id);
if (m is null) if (m is null)
return NotFound("Manga could not be found"); return NotFound("Manga could not be found");
Chapter[] ret = context.Chapters.Where(c => c.ParentMangaId == m.MangaId).ToArray(); Chapter[] ret = context.Chapters.Where(c => c.ParentManga.MangaId == m.MangaId).ToArray();
return Ok(ret); return Ok(ret);
} }
@ -171,7 +171,7 @@ public class MangaController(PgsqlContext context) : Controller
Manga? ret = context.Manga.Find(id); Manga? ret = context.Manga.Find(id);
if(ret is null) if(ret is null)
return NotFound("Manga could not be found"); return NotFound("Manga could not be found");
if(chapters.All(c => c.ParentMangaId == ret.MangaId)) if(chapters.All(c => c.ParentManga.MangaId == ret.MangaId))
return BadRequest("Chapters belong to different Manga."); return BadRequest("Chapters belong to different Manga.");
context.Chapters.AddRange(chapters); context.Chapters.AddRange(chapters);
@ -197,10 +197,9 @@ public class MangaController(PgsqlContext context) : Controller
Manga? m = context.Manga.Find(id); Manga? m = context.Manga.Find(id);
if (m is null) if (m is null)
return NotFound("Manga could not be found"); return NotFound("Manga could not be found");
Chapter? c = context.Chapters.Find(m.LatestChapterAvailableId); if (m.LatestChapterAvailable is null)
if (c is null)
return NotFound("Chapter could not be found"); return NotFound("Chapter could not be found");
return Ok(c); return Ok(m.LatestChapterAvailable);
} }
/// <summary> /// <summary>

View File

@ -10,6 +10,10 @@ public class Author(string authorName)
public string AuthorId { get; init; } = TokenGen.CreateToken(typeof(Author), 64); public string AuthorId { get; init; } = TokenGen.CreateToken(typeof(Author), 64);
public string AuthorName { get; init; } = authorName; public string AuthorName { get; init; } = authorName;
[ForeignKey("MangaIds")] public override bool Equals(object? obj)
public virtual Manga[] Mangas { get; internal set; } = []; {
if (obj is not Author other)
return false;
return other.AuthorName == AuthorName;
}
} }

View File

@ -18,15 +18,13 @@ public class Chapter : IComparable<Chapter>
public string ArchiveFileName { get; private set; } public string ArchiveFileName { get; private set; }
public bool Downloaded { get; internal set; } = false; public bool Downloaded { get; internal set; } = false;
[MaxLength(64)] [ForeignKey("MangaId")]
public string ParentMangaId { get; init; } public Manga ParentManga { get; init; }
[ForeignKey("ParentMangaId")]
public virtual Manga ParentManga { get; init; }
public Chapter(string parentMangaId, string url, float chapterNumber, public Chapter(Manga parentManga, string url, float chapterNumber,
float? volumeNumber = null, string? title = null) float? volumeNumber = null, string? title = null)
{ {
this.ParentMangaId = parentMangaId; this.ParentManga = parentManga;
this.Url = url; this.Url = url;
this.ChapterNumber = chapterNumber; this.ChapterNumber = chapterNumber;
this.VolumeNumber = volumeNumber; this.VolumeNumber = volumeNumber;
@ -34,10 +32,8 @@ public class Chapter : IComparable<Chapter>
this.ArchiveFileName = BuildArchiveFileName(); this.ArchiveFileName = BuildArchiveFileName();
} }
public Chapter(Manga parentManga, string url, float chapterNumber, public Chapter(string url, float chapterNumber, float? volumeNumber = null, string? title = null)
float? volumeNumber = null, string? title = null) : this(parentManga.MangaId, url, chapterNumber, volumeNumber, title) : this(null, url, chapterNumber, volumeNumber, title){}
{
}
public MoveFileOrFolderJob? UpdateChapterNumber(float chapterNumber) public MoveFileOrFolderJob? UpdateChapterNumber(float chapterNumber)
{ {

View File

@ -22,13 +22,13 @@ public class Manga(
string? originalLanguage, string? originalLanguage,
MangaReleaseStatus releaseStatus, MangaReleaseStatus releaseStatus,
float ignoreChapterBefore, float ignoreChapterBefore,
string? latestChapterDownloadedId, Chapter? latestChapterDownloaded,
string? latestChapterAvailableId, Chapter? latestChapterAvailable,
string mangaConnectorName, MangaConnector mangaConnector,
string[] authorIds, Author[] authors,
string[] tagIds, MangaTag[] tags,
string[] linkIds, Link[] links,
string[] altTitleIds) MangaAltTitle[] altTitles)
{ {
[MaxLength(64)] [MaxLength(64)]
public string MangaId { get; init; } = TokenGen.CreateToken(typeof(Manga), 64); public string MangaId { get; init; } = TokenGen.CreateToken(typeof(Manga), 64);
@ -46,30 +46,33 @@ public class Manga(
public string FolderName { get; private set; } = BuildFolderName(name); public string FolderName { get; private set; } = BuildFolderName(name);
public float IgnoreChapterBefore { get; internal set; } = ignoreChapterBefore; public float IgnoreChapterBefore { get; internal set; } = ignoreChapterBefore;
public string? LatestChapterDownloadedId { get; internal set; } = latestChapterDownloadedId; public Chapter? LatestChapterDownloaded { get; private set; } = latestChapterDownloaded;
public virtual Chapter? LatestChapterDownloaded { get; }
public string? LatestChapterAvailableId { get; internal set; } = latestChapterAvailableId; public Chapter? LatestChapterAvailable { get; private set; } = latestChapterAvailable;
public virtual Chapter? LatestChapterAvailable { get; }
public string MangaConnectorName { get; init; } = mangaConnectorName; public MangaConnector MangaConnector { get; private set; } = mangaConnector;
public virtual MangaConnector MangaConnector { get; }
public string[] AuthorIds { get; internal set; } = authorIds;
[ForeignKey("AuthorIds")] [ForeignKey("AuthorIds")]
public virtual Author[] Authors { get; } public ICollection<Author> Authors { get; internal set; } = authors;
public string[] TagIds { get; internal set; } = tagIds;
[ForeignKey("TagIds")] [ForeignKey("TagIds")]
public virtual MangaTag[] Tags { get; } public ICollection<MangaTag> Tags { get; private set; } = tags;
public string[] LinkIds { get; internal set; } = linkIds;
[ForeignKey("LinkIds")] [ForeignKey("LinkIds")]
public virtual Link[] Links { get; } public ICollection<Link> Links { get; private set; } = links;
public string[] AltTitleIds { get; internal set; } = altTitleIds;
[ForeignKey("AltTitleIds")] [ForeignKey("AltTitleIds")]
public virtual MangaAltTitle[] AltTitles { get; } public ICollection<MangaAltTitle> AltTitles { get; private set; } = altTitles;
public Manga(string connectorId, string name, string description, string websiteUrl, string coverUrl,
string? coverFileNameInCache,
uint year, string? originalLanguage, MangaReleaseStatus releaseStatus, float ignoreChapterBefore)
: this(connectorId, name, description, websiteUrl, coverUrl, coverFileNameInCache, year, originalLanguage,
releaseStatus,
ignoreChapterBefore, null, null, null, null, null, null, null)
{
}
public MoveFileOrFolderJob UpdateFolderName(string downloadLocation, string newName) public MoveFileOrFolderJob UpdateFolderName(string downloadLocation, string newName)
{ {
@ -85,11 +88,11 @@ public class Manga(
this.Description = other.Description; this.Description = other.Description;
this.CoverUrl = other.CoverUrl; this.CoverUrl = other.CoverUrl;
this.OriginalLanguage = other.OriginalLanguage; this.OriginalLanguage = other.OriginalLanguage;
this.AuthorIds = other.AuthorIds; this.Authors = other.Authors;
this.LinkIds = other.LinkIds; this.Links = other.Links;
this.TagIds = other.TagIds; this.Tags = other.Tags;
this.AltTitleIds = other.AltTitleIds; this.AltTitles = other.AltTitles;
this.LatestChapterAvailableId = other.LatestChapterAvailableId; this.LatestChapterAvailable = other.LatestChapterAvailable;
this.ReleaseStatus = other.ReleaseStatus; this.ReleaseStatus = other.ReleaseStatus;
} }

View File

@ -111,9 +111,9 @@ public class AsuraToon : MangaConnector
Manga manga = new (publicationId, sortName, description, websiteUrl, coverUrl, null, year, Manga manga = new (publicationId, sortName, description, websiteUrl, coverUrl, null, year,
originalLanguage, releaseStatus, -1, null, null, originalLanguage, releaseStatus, -1, null, null,
this.Name, this,
authors.Select(a => a.AuthorId).ToArray(), authors,
mangaTags.Select(t => t.Tag).ToArray(), mangaTags,
[], [],
[]); []);

View File

@ -113,11 +113,11 @@ public class Bato : MangaConnector
Manga manga = new (publicationId, sortName, description, websiteUrl, coverUrl, null, year, Manga manga = new (publicationId, sortName, description, websiteUrl, coverUrl, null, year,
originalLanguage, releaseStatus, -1, null, null, originalLanguage, releaseStatus, -1, null, null,
this.Name, this,
authors.Select(a => a.AuthorId).ToArray(), authors,
mangaTags.Select(t => t.Tag).ToArray(), mangaTags,
[], [],
altTitles.Select(a => a.AltTitleId).ToArray()); altTitles);
return (manga, authors, mangaTags, [], altTitles); return (manga, authors, mangaTags, [], altTitles);
} }

View File

@ -176,11 +176,11 @@ public class MangaDex : MangaConnector
Manga pub = new (publicationId, sortName, description, $"https://mangadex.org/title/{publicationId}", coverUrl, null, year, Manga pub = new (publicationId, sortName, description, $"https://mangadex.org/title/{publicationId}", coverUrl, null, year,
originalLanguage, releaseStatus, -1, null, null, originalLanguage, releaseStatus, -1, null, null,
this.Name, this,
authors.Select(a => a.AuthorId).ToArray(), authors,
mangaTags.Select(t => t.Tag).ToArray(), mangaTags,
links.Select(l => l.LinkId).ToArray(), links,
altTitles.Select(a => a.AltTitleId).ToArray()); altTitles);
return (pub, authors, mangaTags, links, altTitles); return (pub, authors, mangaTags, links, altTitles);
} }

View File

@ -101,9 +101,9 @@ public class MangaHere : MangaConnector
Manga manga = new (publicationId, sortName, description, websiteUrl, coverUrl, null, 0, Manga manga = new (publicationId, sortName, description, websiteUrl, coverUrl, null, 0,
originalLanguage, releaseStatus, -1, null, null, originalLanguage, releaseStatus, -1, null, null,
this.Name, this,
authors.Select(a => a.AuthorId).ToArray(), authors,
mangaTags.Select(t => t.Tag).ToArray(), mangaTags,
[], [],
[]); []);

View File

@ -141,11 +141,11 @@ public class MangaKatana : MangaConnector
Manga manga = new (publicationId, sortName, description, websiteUrl, coverUrl, null, year, Manga manga = new (publicationId, sortName, description, websiteUrl, coverUrl, null, year,
originalLanguage, releaseStatus, -1, null, null, originalLanguage, releaseStatus, -1, null, null,
this.Name, this,
authors.Select(a => a.AuthorId).ToArray(), authors,
mangaTags.Select(t => t.Tag).ToArray(), mangaTags,
[], [],
altTitles.Select(a => a.AltTitleId).ToArray()); altTitles);
return (manga, authors, mangaTags, [], altTitles); return (manga, authors, mangaTags, [], altTitles);
} }

View File

@ -120,9 +120,9 @@ public class MangaLife : MangaConnector
Manga manga = new (publicationId, sortName, description, websiteUrl, coverUrl, null, year, Manga manga = new (publicationId, sortName, description, websiteUrl, coverUrl, null, year,
originalLanguage, releaseStatus, -1, null, null, originalLanguage, releaseStatus, -1, null, null,
this.Name, this,
authors.Select(a => a.AuthorId).ToArray(), authors,
mangaTags.Select(t => t.Tag).ToArray(), mangaTags,
[], [],
[]); []);

View File

@ -136,11 +136,11 @@ public class Manganato : MangaConnector
Manga manga = new (publicationId, sortName, description, websiteUrl, coverUrl, null, year, Manga manga = new (publicationId, sortName, description, websiteUrl, coverUrl, null, year,
originalLanguage, releaseStatus, -1, null, null, originalLanguage, releaseStatus, -1, null, null,
this.Name, this,
authors.Select(a => a.AuthorId).ToArray(), authors,
mangaTags.Select(t => t.Tag).ToArray(), mangaTags,
[], [],
mangaAltTitles.Select(a => a.AltTitleId).ToArray()); mangaAltTitles);
return (manga, authors, mangaTags, [], mangaAltTitles); return (manga, authors, mangaTags, [], mangaAltTitles);
} }

View File

@ -150,9 +150,9 @@ public class Mangasee : MangaConnector
Manga manga = new (publicationId, sortName, description, websiteUrl, coverUrl, null, year, Manga manga = new (publicationId, sortName, description, websiteUrl, coverUrl, null, year,
originalLanguage, releaseStatus, -1, null, null, originalLanguage, releaseStatus, -1, null, null,
this.Name, this,
authors.Select(a => a.AuthorId).ToArray(), authors,
mangaTags.Select(t => t.Tag).ToArray(), mangaTags,
[], [],
[]); []);

View File

@ -118,11 +118,11 @@ public class Mangaworld : MangaConnector
Manga manga = new (publicationId, sortName, description, websiteUrl, coverUrl, null, year, Manga manga = new (publicationId, sortName, description, websiteUrl, coverUrl, null, year,
originalLanguage, releaseStatus, -1, null, null, originalLanguage, releaseStatus, -1, null, null,
this.Name, this,
authors.Select(a => a.AuthorId).ToArray(), authors,
mangaTags.Select(t => t.Tag).ToArray(), mangaTags,
[], [],
altTitles.Select(a => a.AltTitleId).ToArray()); altTitles);
return (manga, authors, mangaTags, [], altTitles); return (manga, authors, mangaTags, [], altTitles);
} }

View File

@ -123,9 +123,9 @@ public class ManhuaPlus : MangaConnector
Manga manga = new (publicationId, sortName, description, websiteUrl, coverUrl, null, year, Manga manga = new (publicationId, sortName, description, websiteUrl, coverUrl, null, year,
originalLanguage, releaseStatus, -1, null, null, originalLanguage, releaseStatus, -1, null, null,
this.Name, this,
authors.Select(a => a.AuthorId).ToArray(), authors,
mangaTags.Select(t => t.Tag).ToArray(), mangaTags,
[], [],
[]); []);

View File

@ -114,11 +114,11 @@ public class Weebcentral : MangaConnector
Manga manga = new (publicationId, sortName, description, websiteUrl, coverUrl, null, year, Manga manga = new (publicationId, sortName, description, websiteUrl, coverUrl, null, year,
originalLanguage, releaseStatus, -1, null, null, originalLanguage, releaseStatus, -1, null, null,
this.Name, this,
authors.Select(a => a.AuthorId).ToArray(), authors,
mangaTags.Select(t => t.Tag).ToArray(), mangaTags,
[], [],
altTitles.Select(a => a.AltTitleId).ToArray()); altTitles);
return (manga, authors, mangaTags, [], altTitles); return (manga, authors, mangaTags, [], altTitles);
} }