using System.ComponentModel.DataAnnotations; using API.Schema.MangaConnectors; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Newtonsoft.Json; namespace API.Schema; [PrimaryKey("Key")] public class MangaConnectorId : Identifiable where T : Identifiable { [StringLength(64)] [Required] public string ObjId { get; private set; } = null!; [JsonIgnore] private T? _obj; [JsonIgnore] public T Obj { get => _lazyLoader.Load(this, ref _obj) ?? throw new InvalidOperationException(); internal set { ObjId = value.Key; _obj = value; } } [StringLength(32)] [Required] public string MangaConnectorName { get; private set; } = null!; [JsonIgnore] private MangaConnector? _mangaConnector; [JsonIgnore] public MangaConnector MangaConnector { get => _lazyLoader.Load(this, ref _mangaConnector) ?? throw new InvalidOperationException(); init { MangaConnectorName = value.Name; _mangaConnector = value; } } [StringLength(256)] [Required] public string IdOnConnectorSite { get; init; } [Url] [StringLength(512)] public string? WebsiteUrl { get; internal init; } private readonly ILazyLoader _lazyLoader = null!; public MangaConnectorId(T obj, MangaConnector mangaConnector, string idOnConnectorSite, string? websiteUrl) : base(TokenGen.CreateToken(typeof(MangaConnectorId), mangaConnector.Name, idOnConnectorSite)) { this.Obj = obj; this.MangaConnector = mangaConnector; this.IdOnConnectorSite = idOnConnectorSite; this.WebsiteUrl = websiteUrl; } /// /// EF CORE ONLY!!! /// public MangaConnectorId(ILazyLoader lazyLoader, string key, string objId, string mangaConnectorName, string idOnConnectorSite, string? websiteUrl) : base(key) { this._lazyLoader = lazyLoader; this.ObjId = objId; this.MangaConnectorName = mangaConnectorName; this.IdOnConnectorSite = idOnConnectorSite; this.WebsiteUrl = websiteUrl; } public override string ToString() => $"{base.ToString()} {_obj}"; }