diff --git a/API/APIJsonSerializer.cs b/API/APIJsonSerializer.cs deleted file mode 100644 index aa98122..0000000 --- a/API/APIJsonSerializer.cs +++ /dev/null @@ -1,61 +0,0 @@ -using System.Reflection; -using System.Text.Json; -using API.Schema; -using API.Schema.Jobs; -using API.Schema.LibraryConnectors; -using API.Schema.NotificationConnectors; -using Newtonsoft.Json; -using JsonSerializer = Newtonsoft.Json.JsonSerializer; - -namespace API; - -internal class ApiJsonSerializer : System.Text.Json.Serialization.JsonConverter -{ - - public override bool CanConvert(Type typeToConvert) => typeToConvert == typeof(Job); - - public override APISerializable? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) - { - Span dest = stackalloc char[1024]; - string json = ""; - while (reader.Read()) - { - reader.CopyString(dest); - json += dest.ToString(); - } - JsonReader jr = new JsonTextReader(new StringReader(json)); - return new JobJsonDeserializer().ReadJson(jr, typeToConvert, null, JsonSerializer.Create(new JsonSerializerSettings())) as Job; - } - - public override void Write(Utf8JsonWriter writer, APISerializable value, JsonSerializerOptions options) - { - writer.WriteStartObject(); - foreach (PropertyInfo info in value.GetType().GetProperties()) - { - if(info.PropertyType == typeof(string)) - writer.WriteString(LowerCamelCase(info.Name), (string)info.GetValue(value)!); - else if(info.PropertyType == typeof(bool)) - writer.WriteBoolean(LowerCamelCase(info.Name), (bool)info.GetValue(value)!); - else if(info.PropertyType == typeof(int)) - writer.WriteNumber(LowerCamelCase(info.Name), (int)info.GetValue(value)!); - else if(info.PropertyType == typeof(ulong)) - writer.WriteNumber(LowerCamelCase(info.Name), (ulong)info.GetValue(value)!); - else if(info.PropertyType == typeof(JobType)) - writer.WriteString(LowerCamelCase(info.Name), Enum.GetName((JobType)info.GetValue(value)!)); - else if(info.PropertyType == typeof(JobState)) - writer.WriteString(LowerCamelCase(info.Name), Enum.GetName((JobState)info.GetValue(value)!)); - else if(info.PropertyType == typeof(NotificationConnectorType)) - writer.WriteString(LowerCamelCase(info.Name), Enum.GetName((NotificationConnectorType)info.GetValue(value)!)); - else if(info.PropertyType == typeof(LibraryType)) - writer.WriteString(LowerCamelCase(info.Name), Enum.GetName((LibraryType)info.GetValue(value)!)); - else if(info.PropertyType == typeof(DateTime)) - writer.WriteString(LowerCamelCase(info.Name), ((DateTime)info.GetValue(value)!).ToUniversalTime().ToString("u").Replace(' ','T')); - } - writer.WriteEndObject(); - } - - private static string LowerCamelCase(string s) - { - return char.ToLowerInvariant(s[0]) + s.Substring(1); - } -} \ No newline at end of file diff --git a/API/Dockerfile b/API/Dockerfile deleted file mode 100644 index 1f62941..0000000 --- a/API/Dockerfile +++ /dev/null @@ -1,23 +0,0 @@ -FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base -USER $APP_UID -WORKDIR /app -EXPOSE 8080 -EXPOSE 8081 - -FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build -ARG BUILD_CONFIGURATION=Release -WORKDIR /src -COPY ["API/API.csproj", "API/"] -RUN dotnet restore "API/API.csproj" -COPY . . -WORKDIR "/src/API" -RUN dotnet build "API.csproj" -c $BUILD_CONFIGURATION -o /app/build - -FROM build AS publish -ARG BUILD_CONFIGURATION=Release -RUN dotnet publish "API.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false - -FROM base AS final -WORKDIR /app -COPY --from=publish /app/publish . -ENTRYPOINT ["dotnet", "API.dll"] diff --git a/API/Program.cs b/API/Program.cs index ff3537c..ec1cae4 100644 --- a/API/Program.cs +++ b/API/Program.cs @@ -28,7 +28,6 @@ builder.Services.AddCors(options => builder.Services.AddMvc().AddJsonOptions(opts => { opts.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()); - opts.JsonSerializerOptions.Converters.Add(new ApiJsonSerializer()); }); builder.Services.AddApiVersioning(option => diff --git a/API/Schema/APISerializable.cs b/API/Schema/APISerializable.cs deleted file mode 100644 index 6c52606..0000000 --- a/API/Schema/APISerializable.cs +++ /dev/null @@ -1,3 +0,0 @@ -namespace API.Schema; - -public interface APISerializable; \ No newline at end of file diff --git a/API/Schema/Author.cs b/API/Schema/Author.cs index c757ca5..9055c63 100644 --- a/API/Schema/Author.cs +++ b/API/Schema/Author.cs @@ -1,5 +1,4 @@ using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; namespace API.Schema; diff --git a/API/Schema/Jobs/Job.cs b/API/Schema/Jobs/Job.cs index 58ebec4..3411f52 100644 --- a/API/Schema/Jobs/Job.cs +++ b/API/Schema/Jobs/Job.cs @@ -6,7 +6,7 @@ using Newtonsoft.Json; namespace API.Schema.Jobs; [PrimaryKey("JobId")] -public abstract class Job : APISerializable +public abstract class Job { [MaxLength(64)] public string JobId { get; init; } diff --git a/API/Schema/LibraryConnectors/LibraryConnector.cs b/API/Schema/LibraryConnectors/LibraryConnector.cs index 0c78999..4d070e9 100644 --- a/API/Schema/LibraryConnectors/LibraryConnector.cs +++ b/API/Schema/LibraryConnectors/LibraryConnector.cs @@ -4,7 +4,7 @@ using Microsoft.EntityFrameworkCore; namespace API.Schema.LibraryConnectors; [PrimaryKey("LibraryConnectorId")] -public abstract class LibraryConnector(string libraryConnectorId, LibraryType libraryType, string baseUrl, string auth) : APISerializable +public abstract class LibraryConnector(string libraryConnectorId, LibraryType libraryType, string baseUrl, string auth) { [MaxLength(64)] public string LibraryConnectorId { get; } = libraryConnectorId; diff --git a/API/Schema/Link.cs b/API/Schema/Link.cs index 5a81bdc..af7dc7a 100644 --- a/API/Schema/Link.cs +++ b/API/Schema/Link.cs @@ -1,5 +1,4 @@ using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; namespace API.Schema; @@ -11,7 +10,4 @@ public class Link(string linkProvider, string linkUrl) public string LinkId { get; init; } = TokenGen.CreateToken(typeof(Link), 64); public string LinkProvider { get; init; } = linkProvider; public string LinkUrl { get; init; } = linkUrl; - - [ForeignKey("MangaId")] - public virtual Manga Manga { get; init; } } \ No newline at end of file diff --git a/API/Schema/Manga.cs b/API/Schema/Manga.cs index e0c6134..ddf4fb3 100644 --- a/API/Schema/Manga.cs +++ b/API/Schema/Manga.cs @@ -70,9 +70,6 @@ public class Manga( public string[] AltTitleIds { get; internal set; } = altTitleIds; [ForeignKey("AltTitleIds")] public virtual MangaAltTitle[] AltTitles { get; } - - [ForeignKey("ChapterIds")] - public virtual Chapter[] Chapters { get; internal set; } public MoveFileOrFolderJob UpdateFolderName(string downloadLocation, string newName) { diff --git a/API/Schema/MangaAltTitle.cs b/API/Schema/MangaAltTitle.cs index ba5b173..39d22aa 100644 --- a/API/Schema/MangaAltTitle.cs +++ b/API/Schema/MangaAltTitle.cs @@ -12,7 +12,4 @@ public class MangaAltTitle(string language, string title) [MaxLength(8)] public string Language { get; init; } = language; public string Title { get; set; } = title; - - [ForeignKey("MangaId")] - public virtual Manga Manga { get; init; } } \ No newline at end of file diff --git a/API/Schema/MangaConnectors/MangaConnector.cs b/API/Schema/MangaConnectors/MangaConnector.cs index 5384fbf..bed247d 100644 --- a/API/Schema/MangaConnectors/MangaConnector.cs +++ b/API/Schema/MangaConnectors/MangaConnector.cs @@ -13,11 +13,6 @@ public abstract class MangaConnector(string name, string[] supportedLanguages, s public string Name { get; init; } = name; public string[] SupportedLanguages { get; init; } = supportedLanguages; public string[] BaseUris { get; init; } = baseUris; - - [JsonIgnore] - [ForeignKey("MangaIds")] - public virtual Manga[] Mangas { get; internal set; } = []; - public abstract (Manga, Author[], MangaTag[], Link[], MangaAltTitle[])[] GetManga(string publicationTitle = ""); diff --git a/API/Schema/MangaTag.cs b/API/Schema/MangaTag.cs index fdec050..3964f4c 100644 --- a/API/Schema/MangaTag.cs +++ b/API/Schema/MangaTag.cs @@ -7,7 +7,4 @@ namespace API.Schema; public class MangaTag(string tag) { public string Tag { get; init; } = tag; - - [ForeignKey("MangaIds")] - public virtual Manga[] Mangas { get; internal set; } = []; } \ No newline at end of file diff --git a/API/Schema/NotificationConnectors/NotificationConnector.cs b/API/Schema/NotificationConnectors/NotificationConnector.cs index 909d219..b110215 100644 --- a/API/Schema/NotificationConnectors/NotificationConnector.cs +++ b/API/Schema/NotificationConnectors/NotificationConnector.cs @@ -6,7 +6,7 @@ using Newtonsoft.Json; namespace API.Schema.NotificationConnectors; [PrimaryKey("NotificationConnectorId")] -public abstract class NotificationConnector(string notificationConnectorId, NotificationConnectorType notificationConnectorType) : APISerializable +public abstract class NotificationConnector(string notificationConnectorId, NotificationConnectorType notificationConnectorType) { [MaxLength(64)] public string NotificationConnectorId { get; } = notificationConnectorId; diff --git a/API/Schema/PgsqlContext.cs b/API/Schema/PgsqlContext.cs index 6c7db2f..934ea16 100644 --- a/API/Schema/PgsqlContext.cs +++ b/API/Schema/PgsqlContext.cs @@ -52,9 +52,7 @@ public class PgsqlContext(DbContextOptions options) : DbContext(op .HasValue(JobType.UpdateMetaDataJob); modelBuilder.Entity() - .HasOne(c => c.ParentManga) - .WithMany(m => m.Chapters) - .HasForeignKey(c => c.ParentMangaId); + .HasOne(c => c.ParentManga); modelBuilder.Entity() .HasOne(m => m.LatestChapterAvailable) @@ -63,30 +61,14 @@ public class PgsqlContext(DbContextOptions options) : DbContext(op .HasOne(m => m.LatestChapterDownloaded) .WithOne(); modelBuilder.Entity() - .HasOne(m => m.MangaConnector) - .WithMany(c => c.Mangas) - .HasForeignKey(m => m.MangaConnectorName); + .HasOne(m => m.MangaConnector); modelBuilder.Entity() - .HasMany(m => m.Authors) - .WithMany(a => a.Mangas) - .UsingEntity( - "MangaAuthor", - l => l.HasOne(typeof(Manga)).WithMany().HasForeignKey("MangaId").HasPrincipalKey("MangaId"), - r => r.HasOne(typeof(Author)).WithMany().HasForeignKey("AuthorId").HasPrincipalKey("AuthorId"), - j => j.HasKey("MangaId", "AuthorId")); + .HasMany(m => m.Authors); modelBuilder.Entity() - .HasMany(m => m.Tags) - .WithMany(t => t.Mangas) - .UsingEntity( - "MangaTag", - l => l.HasOne(typeof(Manga)).WithMany().HasForeignKey("MangaId").HasPrincipalKey("MangaId"), - r => r.HasOne(typeof(MangaTag)).WithMany().HasForeignKey("Tag").HasPrincipalKey("Tag"), - j => j.HasKey("MangaId", "Tag")); + .HasMany(m => m.Tags); modelBuilder.Entity() - .HasMany(m => m.Links) - .WithOne(c => c.Manga); + .HasMany(m => m.Links); modelBuilder.Entity() - .HasMany(m => m.AltTitles) - .WithOne(c => c.Manga); + .HasMany(m => m.AltTitles); } } \ No newline at end of file