Merge branch 'dev' into feature/preserve-scanned-titles

This commit is contained in:
Alex Ling 2021-09-15 08:58:24 +00:00
commit 2c241a96bb
4 changed files with 65 additions and 83 deletions

View File

@ -49,7 +49,7 @@ class Entry
file.close file.close
end end
def to_slim_json : String def build_json(*, slim = false)
JSON.build do |json| JSON.build do |json|
json.object do json.object do
{% for str in ["zip_path", "title", "size", "id"] %} {% for str in ["zip_path", "title", "size", "id"] %}
@ -57,23 +57,15 @@ class Entry
{% end %} {% end %}
json.field "title_id", @book.id json.field "title_id", @book.id
json.field "pages" { json.number @pages } json.field "pages" { json.number @pages }
unless slim
json.field "display_name", @book.display_name @title
json.field "cover_url", cover_url
json.field "mtime" { json.number @mtime.to_unix }
end
end end
end end
end end
def to_json(json : JSON::Builder)
json.object do
{% for str in ["zip_path", "title", "size", "id"] %}
json.field {{str}}, @{{str.id}}
{% end %}
json.field "title_id", @book.id
json.field "display_name", @book.display_name @title
json.field "cover_url", cover_url
json.field "pages" { json.number @pages }
json.field "mtime" { json.number @mtime.to_unix }
end
end
def display_name def display_name
@book.display_name @title @book.display_name @title
end end

View File

@ -100,14 +100,14 @@ class Library
titles.flat_map &.deep_entries titles.flat_map &.deep_entries
end end
def to_slim_json : String def build_json(*, slim = false, shallow = false)
JSON.build do |json| JSON.build do |json|
json.object do json.object do
json.field "dir", @dir json.field "dir", @dir
json.field "titles" do json.field "titles" do
json.array do json.array do
self.titles.each do |title| self.titles.each do |title|
json.raw title.to_slim_json json.raw title.build_json(slim: slim, shallow: shallow)
end end
end end
end end
@ -115,15 +115,6 @@ class Library
end end
end end
def to_json(json : JSON::Builder)
json.object do
json.field "dir", @dir
json.field "titles" do
json.raw self.titles.to_json
end
end
end
def get_title(tid) def get_title(tid)
@title_hash[tid]? @title_hash[tid]?
end end

View File

@ -167,62 +167,50 @@ class Title
true # Fixed, reuse this true # Fixed, reuse this
end end
def to_slim_json : String alias SortContext = NamedTuple(username: String, opt: SortOptions)
def build_json(*, slim = false, shallow = false,
sort_context : SortContext? = nil)
JSON.build do |json| JSON.build do |json|
json.object do json.object do
{% for str in ["dir", "title", "id"] %} {% for str in ["dir", "title", "id"] %}
json.field {{str}}, @{{str.id}} json.field {{str}}, @{{str.id}}
{% end %} {% end %}
json.field "signature" { json.number @signature } json.field "signature" { json.number @signature }
json.field "titles" do unless slim
json.array do json.field "display_name", display_name
self.titles.each do |title| json.field "cover_url", cover_url
json.raw title.to_slim_json json.field "mtime" { json.number @mtime.to_unix }
end
end
end end
json.field "entries" do unless shallow
json.array do json.field "titles" do
@entries.each do |entry| json.array do
json.raw entry.to_slim_json self.titles.each do |title|
end json.raw title.build_json(slim: slim, shallow: shallow)
end
end
json.field "parents" do
json.array do
self.parents.each do |title|
json.object do
json.field "title", title.title
json.field "id", title.id
end end
end end
end end
end json.field "entries" do
end json.array do
end _entries = if sort_context
end sorted_entries sort_context[:username],
sort_context[:opt]
def to_json(json : JSON::Builder) else
json.object do @entries
{% for str in ["dir", "title", "id"] %} end
json.field {{str}}, @{{str.id}} _entries.each do |entry|
{% end %} json.raw entry.build_json(slim: slim)
json.field "signature" { json.number @signature } end
json.field "display_name", display_name end
json.field "cover_url", cover_url end
json.field "mtime" { json.number @mtime.to_unix } json.field "parents" do
json.field "titles" do json.array do
json.raw self.titles.to_json self.parents.each do |title|
end json.object do
json.field "entries" do json.field "title", title.title
json.raw @entries.to_json json.field "id", title.id
end end
json.field "parents" do end
json.array do
self.parents.each do |title|
json.object do
json.field "title", title.title
json.field "id", title.id
end end
end end
end end

View File

@ -133,24 +133,34 @@ struct APIRouter
end end
Koa.describe "Returns the book with title `tid`", <<-MD Koa.describe "Returns the book with title `tid`", <<-MD
Supply the `tid` query parameter to strip away "display_name", "cover_url", and "mtime" from the returned object to speed up the loading time - Supply the `slim` query parameter to strip away "display_name", "cover_url", and "mtime" from the returned object to speed up the loading time
- Supply the `shallow` query parameter to get only the title information, without the list of entries and nested titles
MD MD
Koa.path "tid", desc: "Title ID" Koa.path "tid", desc: "Title ID"
Koa.query "slim" Koa.query "slim"
Koa.query "shallow"
Koa.query "sort", desc: "Sorting option for entries. Can be one of 'auto', 'title', 'progress', 'time_added' and 'time_modified'"
Koa.query "ascend", desc: "Sorting direction for entries. Set to 0 for the descending order. Doesn't work without specifying 'sort'"
Koa.response 200, schema: "title" Koa.response 200, schema: "title"
Koa.response 404, "Title not found" Koa.response 404, "Title not found"
Koa.tag "library" Koa.tag "library"
get "/api/book/:tid" do |env| get "/api/book/:tid" do |env|
begin begin
username = get_username env
sort_opt = SortOptions.new
get_sort_opt
tid = env.params.url["tid"] tid = env.params.url["tid"]
title = Library.default.get_title tid title = Library.default.get_title tid
raise "Title ID `#{tid}` not found" if title.nil? raise "Title ID `#{tid}` not found" if title.nil?
if env.params.query["slim"]? slim = !env.params.query["slim"]?.nil?
send_json env, title.to_slim_json shallow = !env.params.query["shallow"]?.nil?
else
send_json env, title.to_json send_json env, title.build_json(slim: slim, shallow: shallow,
end sort_context: {username: username,
opt: sort_opt})
rescue e rescue e
Logger.error e Logger.error e
env.response.status_code = 404 env.response.status_code = 404
@ -159,20 +169,21 @@ struct APIRouter
end end
Koa.describe "Returns the entire library with all titles and entries", <<-MD Koa.describe "Returns the entire library with all titles and entries", <<-MD
Supply the `tid` query parameter to strip away "display_name", "cover_url", and "mtime" from the returned object to speed up the loading time - Supply the `slim` query parameter to strip away "display_name", "cover_url", and "mtime" from the returned object to speed up the loading time
- Supply the `shallow` query parameter to get only the top-level titles, without the nested titles and entries
MD MD
Koa.query "slim" Koa.query "slim"
Koa.query "shallow"
Koa.response 200, schema: { Koa.response 200, schema: {
"dir" => String, "dir" => String,
"titles" => ["title"], "titles" => ["title"],
} }
Koa.tag "library" Koa.tag "library"
get "/api/library" do |env| get "/api/library" do |env|
if env.params.query["slim"]? slim = !env.params.query["slim"]?.nil?
send_json env, Library.default.to_slim_json shallow = !env.params.query["shallow"]?.nil?
else
send_json env, Library.default.to_json send_json env, Library.default.build_json(slim: slim, shallow: shallow)
end
end end
Koa.describe "Triggers a library scan" Koa.describe "Triggers a library scan"