Logging Enhancements (#1521)
* Recreated Kavita Logging with Serilog instead of Default. This needs to be move out of the appsettings now, to allow auto updater to patch. * Refactored the code to be completely configured via Code rather than appsettings.json. This is a required step for Auto Updating. * Added in the ability to send logs directly to the UI only for users on the log route. Stopping implementation as Alerts page will handle the rest of the implementation. * Fixed up the backup service to not rely on Config from appsettings.json * Tweaked the Logging levels available * Moved everything over to File-scoped namespaces * Moved everything over to File-scoped namespaces * Code cleanup, removed an old migration and changed so debug logging doesn't print sensitive db data * Removed dead code
This commit is contained in:
parent
9f715cc35f
commit
d1a14f7e68
212 changed files with 16599 additions and 16834 deletions
|
|
@ -2,61 +2,60 @@
|
|||
using System.Collections.Generic;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace API.DTOs.OPDS
|
||||
namespace API.DTOs.OPDS;
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
[XmlRoot("feed", Namespace = "http://www.w3.org/2005/Atom")]
|
||||
public class Feed
|
||||
{
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
[XmlRoot("feed", Namespace = "http://www.w3.org/2005/Atom")]
|
||||
public class Feed
|
||||
[XmlElement("updated")]
|
||||
public string Updated { get; init; } = DateTime.UtcNow.ToString("s");
|
||||
|
||||
[XmlElement("id")]
|
||||
public string Id { get; set; }
|
||||
|
||||
[XmlElement("title")]
|
||||
public string Title { get; set; }
|
||||
|
||||
[XmlElement("icon")]
|
||||
public string Icon { get; set; } = "/favicon.ico";
|
||||
|
||||
[XmlElement("author")]
|
||||
public FeedAuthor Author { get; set; } = new FeedAuthor()
|
||||
{
|
||||
[XmlElement("updated")]
|
||||
public string Updated { get; init; } = DateTime.UtcNow.ToString("s");
|
||||
Name = "Kavita",
|
||||
Uri = "https://kavitareader.com"
|
||||
};
|
||||
|
||||
[XmlElement("id")]
|
||||
public string Id { get; set; }
|
||||
[XmlElement("totalResults", Namespace = "http://a9.com/-/spec/opensearch/1.1/")]
|
||||
public int? Total { get; set; } = null;
|
||||
|
||||
[XmlElement("title")]
|
||||
public string Title { get; set; }
|
||||
[XmlElement("itemsPerPage", Namespace = "http://a9.com/-/spec/opensearch/1.1/")]
|
||||
public int? ItemsPerPage { get; set; } = null;
|
||||
|
||||
[XmlElement("icon")]
|
||||
public string Icon { get; set; } = "/favicon.ico";
|
||||
[XmlElement("startIndex", Namespace = "http://a9.com/-/spec/opensearch/1.1/")]
|
||||
public int? StartIndex { get; set; } = null;
|
||||
|
||||
[XmlElement("author")]
|
||||
public FeedAuthor Author { get; set; } = new FeedAuthor()
|
||||
{
|
||||
Name = "Kavita",
|
||||
Uri = "https://kavitareader.com"
|
||||
};
|
||||
[XmlElement("link")]
|
||||
public List<FeedLink> Links { get; set; } = new List<FeedLink>() ;
|
||||
|
||||
[XmlElement("totalResults", Namespace = "http://a9.com/-/spec/opensearch/1.1/")]
|
||||
public int? Total { get; set; } = null;
|
||||
[XmlElement("entry")]
|
||||
public List<FeedEntry> Entries { get; set; } = new List<FeedEntry>();
|
||||
|
||||
[XmlElement("itemsPerPage", Namespace = "http://a9.com/-/spec/opensearch/1.1/")]
|
||||
public int? ItemsPerPage { get; set; } = null;
|
||||
public bool ShouldSerializeTotal()
|
||||
{
|
||||
return Total.HasValue;
|
||||
}
|
||||
|
||||
[XmlElement("startIndex", Namespace = "http://a9.com/-/spec/opensearch/1.1/")]
|
||||
public int? StartIndex { get; set; } = null;
|
||||
public bool ShouldSerializeItemsPerPage()
|
||||
{
|
||||
return ItemsPerPage.HasValue;
|
||||
}
|
||||
|
||||
[XmlElement("link")]
|
||||
public List<FeedLink> Links { get; set; } = new List<FeedLink>() ;
|
||||
|
||||
[XmlElement("entry")]
|
||||
public List<FeedEntry> Entries { get; set; } = new List<FeedEntry>();
|
||||
|
||||
public bool ShouldSerializeTotal()
|
||||
{
|
||||
return Total.HasValue;
|
||||
}
|
||||
|
||||
public bool ShouldSerializeItemsPerPage()
|
||||
{
|
||||
return ItemsPerPage.HasValue;
|
||||
}
|
||||
|
||||
public bool ShouldSerializeStartIndex()
|
||||
{
|
||||
return StartIndex.HasValue;
|
||||
}
|
||||
public bool ShouldSerializeStartIndex()
|
||||
{
|
||||
return StartIndex.HasValue;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,12 +1,11 @@
|
|||
using System.Xml.Serialization;
|
||||
|
||||
namespace API.DTOs.OPDS
|
||||
namespace API.DTOs.OPDS;
|
||||
|
||||
public class FeedAuthor
|
||||
{
|
||||
public class FeedAuthor
|
||||
{
|
||||
[XmlElement("name")]
|
||||
public string Name { get; set; }
|
||||
[XmlElement("uri")]
|
||||
public string Uri { get; set; }
|
||||
}
|
||||
[XmlElement("name")]
|
||||
public string Name { get; set; }
|
||||
[XmlElement("uri")]
|
||||
public string Uri { get; set; }
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,50 +2,49 @@
|
|||
using System.Collections.Generic;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace API.DTOs.OPDS
|
||||
namespace API.DTOs.OPDS;
|
||||
|
||||
public class FeedEntry
|
||||
{
|
||||
public class FeedEntry
|
||||
{
|
||||
[XmlElement("updated")]
|
||||
public string Updated { get; init; } = DateTime.UtcNow.ToString("s");
|
||||
[XmlElement("updated")]
|
||||
public string Updated { get; init; } = DateTime.UtcNow.ToString("s");
|
||||
|
||||
[XmlElement("id")]
|
||||
public string Id { get; set; }
|
||||
[XmlElement("id")]
|
||||
public string Id { get; set; }
|
||||
|
||||
[XmlElement("title")]
|
||||
public string Title { get; set; }
|
||||
[XmlElement("title")]
|
||||
public string Title { get; set; }
|
||||
|
||||
[XmlElement("summary")]
|
||||
public string Summary { get; set; }
|
||||
[XmlElement("summary")]
|
||||
public string Summary { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Represents Size of the Entry
|
||||
/// Tag: , ElementName = "dcterms:extent"
|
||||
/// <example>2 MB</example>
|
||||
/// </summary>
|
||||
[XmlElement("extent", Namespace = "http://purl.org/dc/terms/")]
|
||||
public string Extent { get; set; }
|
||||
/// <summary>
|
||||
/// Represents Size of the Entry
|
||||
/// Tag: , ElementName = "dcterms:extent"
|
||||
/// <example>2 MB</example>
|
||||
/// </summary>
|
||||
[XmlElement("extent", Namespace = "http://purl.org/dc/terms/")]
|
||||
public string Extent { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Format of the file
|
||||
/// https://dublincore.org/specifications/dublin-core/dcmi-terms/
|
||||
/// </summary>
|
||||
[XmlElement("format", Namespace = "http://purl.org/dc/terms/format")]
|
||||
public string Format { get; set; }
|
||||
/// <summary>
|
||||
/// Format of the file
|
||||
/// https://dublincore.org/specifications/dublin-core/dcmi-terms/
|
||||
/// </summary>
|
||||
[XmlElement("format", Namespace = "http://purl.org/dc/terms/format")]
|
||||
public string Format { get; set; }
|
||||
|
||||
[XmlElement("language", Namespace = "http://purl.org/dc/terms/")]
|
||||
public string Language { get; set; }
|
||||
[XmlElement("language", Namespace = "http://purl.org/dc/terms/")]
|
||||
public string Language { get; set; }
|
||||
|
||||
[XmlElement("content")]
|
||||
public FeedEntryContent Content { get; set; }
|
||||
[XmlElement("content")]
|
||||
public FeedEntryContent Content { get; set; }
|
||||
|
||||
[XmlElement("link")]
|
||||
public List<FeedLink> Links = new List<FeedLink>();
|
||||
[XmlElement("link")]
|
||||
public List<FeedLink> Links = new List<FeedLink>();
|
||||
|
||||
// [XmlElement("author")]
|
||||
// public List<FeedAuthor> Authors = new List<FeedAuthor>();
|
||||
// [XmlElement("author")]
|
||||
// public List<FeedAuthor> Authors = new List<FeedAuthor>();
|
||||
|
||||
// [XmlElement("category")]
|
||||
// public List<FeedCategory> Categories = new List<FeedCategory>();
|
||||
}
|
||||
// [XmlElement("category")]
|
||||
// public List<FeedCategory> Categories = new List<FeedCategory>();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,12 +1,11 @@
|
|||
using System.Xml.Serialization;
|
||||
|
||||
namespace API.DTOs.OPDS
|
||||
namespace API.DTOs.OPDS;
|
||||
|
||||
public class FeedEntryContent
|
||||
{
|
||||
public class FeedEntryContent
|
||||
{
|
||||
[XmlAttribute("type")]
|
||||
public string Type = "text";
|
||||
[XmlText]
|
||||
public string Text;
|
||||
}
|
||||
[XmlAttribute("type")]
|
||||
public string Type = "text";
|
||||
[XmlText]
|
||||
public string Text;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,33 +1,32 @@
|
|||
using System.Xml.Serialization;
|
||||
|
||||
namespace API.DTOs.OPDS
|
||||
namespace API.DTOs.OPDS;
|
||||
|
||||
public class FeedLink
|
||||
{
|
||||
public class FeedLink
|
||||
/// <summary>
|
||||
/// Relation on the Link
|
||||
/// </summary>
|
||||
[XmlAttribute("rel")]
|
||||
public string Rel { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Should be any of the types here <see cref="FeedLinkType"/>
|
||||
/// </summary>
|
||||
[XmlAttribute("type")]
|
||||
public string Type { get; set; }
|
||||
|
||||
[XmlAttribute("href")]
|
||||
public string Href { get; set; }
|
||||
|
||||
[XmlAttribute("title")]
|
||||
public string Title { get; set; }
|
||||
|
||||
[XmlAttribute("count", Namespace = "http://vaemendis.net/opds-pse/ns")]
|
||||
public int TotalPages { get; set; }
|
||||
|
||||
public bool ShouldSerializeTotalPages()
|
||||
{
|
||||
/// <summary>
|
||||
/// Relation on the Link
|
||||
/// </summary>
|
||||
[XmlAttribute("rel")]
|
||||
public string Rel { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Should be any of the types here <see cref="FeedLinkType"/>
|
||||
/// </summary>
|
||||
[XmlAttribute("type")]
|
||||
public string Type { get; set; }
|
||||
|
||||
[XmlAttribute("href")]
|
||||
public string Href { get; set; }
|
||||
|
||||
[XmlAttribute("title")]
|
||||
public string Title { get; set; }
|
||||
|
||||
[XmlAttribute("count", Namespace = "http://vaemendis.net/opds-pse/ns")]
|
||||
public int TotalPages { get; set; }
|
||||
|
||||
public bool ShouldSerializeTotalPages()
|
||||
{
|
||||
return TotalPages > 0;
|
||||
}
|
||||
return TotalPages > 0;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,24 +1,23 @@
|
|||
namespace API.DTOs.OPDS
|
||||
namespace API.DTOs.OPDS;
|
||||
|
||||
public static class FeedLinkRelation
|
||||
{
|
||||
public static class FeedLinkRelation
|
||||
{
|
||||
public const string Debug = "debug";
|
||||
public const string Search = "search";
|
||||
public const string Self = "self";
|
||||
public const string Start = "start";
|
||||
public const string Next = "next";
|
||||
public const string Prev = "prev";
|
||||
public const string Alternate = "alternate";
|
||||
public const string SubSection = "subsection";
|
||||
public const string Related = "related";
|
||||
public const string Image = "http://opds-spec.org/image";
|
||||
public const string Thumbnail = "http://opds-spec.org/image/thumbnail";
|
||||
/// <summary>
|
||||
/// This will allow for a download to occur
|
||||
/// </summary>
|
||||
public const string Acquisition = "http://opds-spec.org/acquisition/open-access";
|
||||
public const string Debug = "debug";
|
||||
public const string Search = "search";
|
||||
public const string Self = "self";
|
||||
public const string Start = "start";
|
||||
public const string Next = "next";
|
||||
public const string Prev = "prev";
|
||||
public const string Alternate = "alternate";
|
||||
public const string SubSection = "subsection";
|
||||
public const string Related = "related";
|
||||
public const string Image = "http://opds-spec.org/image";
|
||||
public const string Thumbnail = "http://opds-spec.org/image/thumbnail";
|
||||
/// <summary>
|
||||
/// This will allow for a download to occur
|
||||
/// </summary>
|
||||
public const string Acquisition = "http://opds-spec.org/acquisition/open-access";
|
||||
#pragma warning disable S1075
|
||||
public const string Stream = "http://vaemendis.net/opds-pse/stream";
|
||||
public const string Stream = "http://vaemendis.net/opds-pse/stream";
|
||||
#pragma warning restore S1075
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,11 +1,10 @@
|
|||
namespace API.DTOs.OPDS
|
||||
namespace API.DTOs.OPDS;
|
||||
|
||||
public static class FeedLinkType
|
||||
{
|
||||
public static class FeedLinkType
|
||||
{
|
||||
public const string Atom = "application/atom+xml";
|
||||
public const string AtomSearch = "application/opensearchdescription+xml";
|
||||
public const string AtomNavigation = "application/atom+xml;profile=opds-catalog;kind=navigation";
|
||||
public const string AtomAcquisition = "application/atom+xml;profile=opds-catalog;kind=acquisition";
|
||||
public const string Image = "image/jpeg";
|
||||
}
|
||||
public const string Atom = "application/atom+xml";
|
||||
public const string AtomSearch = "application/opensearchdescription+xml";
|
||||
public const string AtomNavigation = "application/atom+xml;profile=opds-catalog;kind=navigation";
|
||||
public const string AtomAcquisition = "application/atom+xml;profile=opds-catalog;kind=acquisition";
|
||||
public const string Image = "image/jpeg";
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,42 +1,41 @@
|
|||
using System.Xml.Serialization;
|
||||
|
||||
namespace API.DTOs.OPDS
|
||||
{
|
||||
[XmlRoot("OpenSearchDescription", Namespace = "http://a9.com/-/spec/opensearch/1.1/")]
|
||||
public class OpenSearchDescription
|
||||
{
|
||||
/// <summary>
|
||||
/// Contains a brief human-readable title that identifies this search engine.
|
||||
/// </summary>
|
||||
public string ShortName { get; set; }
|
||||
/// <summary>
|
||||
/// Contains an extended human-readable title that identifies this search engine.
|
||||
/// </summary>
|
||||
public string LongName { get; set; }
|
||||
/// <summary>
|
||||
/// Contains a human-readable text description of the search engine.
|
||||
/// </summary>
|
||||
public string Description { get; set; }
|
||||
/// <summary>
|
||||
/// https://github.com/dewitt/opensearch/blob/master/opensearch-1-1-draft-6.md#the-url-element
|
||||
/// </summary>
|
||||
public SearchLink Url { get; set; }
|
||||
/// <summary>
|
||||
/// Contains a set of words that are used as keywords to identify and categorize this search content.
|
||||
/// Tags must be a single word and are delimited by the space character (' ').
|
||||
/// </summary>
|
||||
public string Tags { get; set; }
|
||||
/// <summary>
|
||||
/// Contains a URL that identifies the location of an image that can be used in association with this search content.
|
||||
/// <example><Image height="64" width="64" type="image/png">http://example.com/websearch.png</Image></example>
|
||||
/// </summary>
|
||||
public string Image { get; set; }
|
||||
public string InputEncoding { get; set; } = "UTF-8";
|
||||
public string OutputEncoding { get; set; } = "UTF-8";
|
||||
/// <summary>
|
||||
/// Contains the human-readable name or identifier of the creator or maintainer of the description document.
|
||||
/// </summary>
|
||||
public string Developer { get; set; } = "kavitareader.com";
|
||||
namespace API.DTOs.OPDS;
|
||||
|
||||
[XmlRoot("OpenSearchDescription", Namespace = "http://a9.com/-/spec/opensearch/1.1/")]
|
||||
public class OpenSearchDescription
|
||||
{
|
||||
/// <summary>
|
||||
/// Contains a brief human-readable title that identifies this search engine.
|
||||
/// </summary>
|
||||
public string ShortName { get; set; }
|
||||
/// <summary>
|
||||
/// Contains an extended human-readable title that identifies this search engine.
|
||||
/// </summary>
|
||||
public string LongName { get; set; }
|
||||
/// <summary>
|
||||
/// Contains a human-readable text description of the search engine.
|
||||
/// </summary>
|
||||
public string Description { get; set; }
|
||||
/// <summary>
|
||||
/// https://github.com/dewitt/opensearch/blob/master/opensearch-1-1-draft-6.md#the-url-element
|
||||
/// </summary>
|
||||
public SearchLink Url { get; set; }
|
||||
/// <summary>
|
||||
/// Contains a set of words that are used as keywords to identify and categorize this search content.
|
||||
/// Tags must be a single word and are delimited by the space character (' ').
|
||||
/// </summary>
|
||||
public string Tags { get; set; }
|
||||
/// <summary>
|
||||
/// Contains a URL that identifies the location of an image that can be used in association with this search content.
|
||||
/// <example><Image height="64" width="64" type="image/png">http://example.com/websearch.png</Image></example>
|
||||
/// </summary>
|
||||
public string Image { get; set; }
|
||||
public string InputEncoding { get; set; } = "UTF-8";
|
||||
public string OutputEncoding { get; set; } = "UTF-8";
|
||||
/// <summary>
|
||||
/// Contains the human-readable name or identifier of the creator or maintainer of the description document.
|
||||
/// </summary>
|
||||
public string Developer { get; set; } = "kavitareader.com";
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,16 +1,15 @@
|
|||
using System.Xml.Serialization;
|
||||
|
||||
namespace API.DTOs.OPDS
|
||||
namespace API.DTOs.OPDS;
|
||||
|
||||
public class SearchLink
|
||||
{
|
||||
public class SearchLink
|
||||
{
|
||||
[XmlAttribute("type")]
|
||||
public string Type { get; set; }
|
||||
[XmlAttribute("type")]
|
||||
public string Type { get; set; }
|
||||
|
||||
[XmlAttribute("rel")]
|
||||
public string Rel { get; set; } = "results";
|
||||
[XmlAttribute("rel")]
|
||||
public string Rel { get; set; } = "results";
|
||||
|
||||
[XmlAttribute("template")]
|
||||
public string Template { get; set; }
|
||||
}
|
||||
[XmlAttribute("template")]
|
||||
public string Template { get; set; }
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue