Remove Dancer2 files
This commit is contained in:
parent
ff22b71fa1
commit
fbcaea8bfc
13 changed files with 0 additions and 581 deletions
169
lib/PoorBooru.pm
169
lib/PoorBooru.pm
|
@ -1,169 +0,0 @@
|
|||
package PoorBooru;
|
||||
use v5.32;
|
||||
use Dancer2;
|
||||
use HTTP::Tiny;
|
||||
|
||||
|
||||
our $VERSION = v0.0.1;
|
||||
|
||||
my $POORBOORU_API = setting("poorbooru_api");
|
||||
|
||||
|
||||
sub validate_page_number ($) { $_[0] =~ /^[1-9][0-9]*$/ }
|
||||
|
||||
sub api_request ($$;%)
|
||||
{
|
||||
my ($method, $path, $params_hashref) = @_;
|
||||
|
||||
my $http = HTTP::Tiny->new(
|
||||
timeout => 15,
|
||||
verify_SSL => true,
|
||||
agent => setting("appname") . " backend " .
|
||||
version::->parse($VERSION)->normal,
|
||||
|
||||
default_headers => {
|
||||
"Accept" => "application/json",
|
||||
"Content-Type" => "application/json",
|
||||
},
|
||||
);
|
||||
my $params = $http->www_form_urlencode($params_hashref // {});
|
||||
|
||||
return $http->request($method, "$POORBOORU_API$path" .
|
||||
($params ne "" ? "?$params" : ""));
|
||||
}
|
||||
|
||||
sub api_get ($;%) { api_request("GET", shift, @_) }
|
||||
|
||||
sub nav_pager ($$)
|
||||
{
|
||||
my ($p, $uri) = @_;
|
||||
|
||||
my (%pager, %res);
|
||||
%pager = %$p;
|
||||
$res{first} = $pager{first} != $pager{cur} ?
|
||||
uri_for($uri, { page => $pager{first} }) : undef;
|
||||
$res{prev} = defined($pager{prev}) && $pager{prev} != $pager{first} ?
|
||||
uri_for($uri, { page => $pager{prev} }) : undef;
|
||||
$res{cur} = $pager{cur};
|
||||
$res{next} = defined($pager{next}) && $pager{next} != $pager{last} ?
|
||||
uri_for($uri, { page => $pager{next} }) : undef;
|
||||
$res{last} = $pager{last} != $pager{cur} ?
|
||||
uri_for($uri, { page => $pager{last} }) : undef;
|
||||
|
||||
return \%res;
|
||||
}
|
||||
|
||||
|
||||
hook before_template_render => sub {
|
||||
my $tokens = shift;
|
||||
|
||||
$tokens->{uris}->{root} = uri_for("/");
|
||||
$tokens->{uris}->{login} = uri_for("/login");
|
||||
$tokens->{uris}->{logout} = uri_for("/logout");
|
||||
$tokens->{uris}->{random} = uri_for("/random/media");
|
||||
$tokens->{uris}->{tags} = uri_for("/tags");
|
||||
};
|
||||
|
||||
get "/" => sub {
|
||||
my $page = query_parameters->get("page") // 1;
|
||||
send_error("Invalid page number", 400) if !validate_page_number($page);
|
||||
|
||||
my $res = api_get("/media", { page => $page });
|
||||
send_error("API error", 500) if !$res->{success};
|
||||
|
||||
my $data = decode_json($res->{content});
|
||||
my @media = map +{
|
||||
# XXX point to a cache
|
||||
image_src => "$POORBOORU_API/download/$_",
|
||||
media_uri => uri_for("/media/$_"),
|
||||
}, @{$data->{media}};
|
||||
|
||||
template "gallery" => {
|
||||
title => "PoorBooru",
|
||||
media => \@media,
|
||||
pager => nav_pager($data->{pager}, "/"),
|
||||
};
|
||||
};
|
||||
|
||||
get "/tags" => sub {
|
||||
my $page = query_parameters->get("page") // 1;
|
||||
send_error("Invalid page number", 400) if !validate_page_number($page);
|
||||
|
||||
my $res = api_get("/tags", { page => $page });
|
||||
send_error("API error", 500) if !$res->{success};
|
||||
|
||||
my $data = decode_json($res->{content});
|
||||
my @tags = map +{
|
||||
name => $_->{name},
|
||||
count => $_->{count},
|
||||
uri => uri_for("/tag/$_->{name}"),
|
||||
}, @{$data->{tags}};
|
||||
|
||||
template "tags" => {
|
||||
title => "Tags",
|
||||
tags => \@tags,
|
||||
pager => nav_pager($data->{pager}, "/tags"),
|
||||
};
|
||||
};
|
||||
|
||||
get "/tag/:tag_id_or_name" => sub {
|
||||
my $page = query_parameters->get("page") // 1;
|
||||
send_error("Invalid page number", 400) if !validate_page_number($page);
|
||||
|
||||
my $tag_id_or_name = route_parameters->get("tag_id_or_name");
|
||||
|
||||
my $res = api_get("/tag/$tag_id_or_name", { page => $page });
|
||||
send_error("API error", 500) if !$res->{success};
|
||||
|
||||
my $data = decode_json($res->{content});
|
||||
my @media = map +{
|
||||
# XXX point to a cache
|
||||
image_src => "$POORBOORU_API/download/$_",
|
||||
media_uri => uri_for("/media/$_"),
|
||||
}, @{$data->{media}};
|
||||
|
||||
template "gallery" => {
|
||||
title => $data->{name},
|
||||
media => \@media,
|
||||
pager => nav_pager($data->{pager}, "/tag/$tag_id_or_name"),
|
||||
};
|
||||
};
|
||||
|
||||
get "/media/:media_id" => sub {
|
||||
my $media_id = route_parameters->get("media_id");
|
||||
|
||||
my $res = api_get("/media/$media_id");
|
||||
send_error("API error", 500) if !$res->{success};
|
||||
|
||||
my $data = decode_json($res->{content});
|
||||
|
||||
template "media" => {
|
||||
no_title => 1,
|
||||
title => $data->{id},
|
||||
image_src => "$POORBOORU_API/download/$data->{id}",
|
||||
media_id => $data->{id},
|
||||
media_filename => $data->{filename},
|
||||
media_size => $data->{size},
|
||||
media_tags => [],
|
||||
};
|
||||
};
|
||||
|
||||
get "/random/media" => sub {
|
||||
my $res = api_get("/random/media");
|
||||
send_error("API error", 500) if !$res->{success};
|
||||
|
||||
my $data = decode_json($res->{content});
|
||||
# XXX body content.
|
||||
redirect "/media/$data->{id}";
|
||||
};
|
||||
|
||||
get "/random/tag" => sub {
|
||||
my $res = api_get("/random/tag");
|
||||
send_error("API error", 500) if !$res->{success};
|
||||
|
||||
my $data = decode_json($res->{content});
|
||||
# XXX body content.
|
||||
redirect "/tag/$data->{name}";
|
||||
};
|
||||
|
||||
true;
|
|
@ -1,176 +0,0 @@
|
|||
package PoorBooru::API::V0;
|
||||
use v5.32;
|
||||
use Dancer2;
|
||||
use Dancer2::Plugin::DBIC;
|
||||
|
||||
|
||||
use constant {
|
||||
DEFAULT_CONTENT_TYPE => "application/json",
|
||||
};
|
||||
|
||||
our $VERSION = v0.0.1;
|
||||
|
||||
my $MEDIA_SEARCH_OPTS = {
|
||||
order_by => { -desc => "media_id" },
|
||||
rows => 20,
|
||||
};
|
||||
my $TAGS_COUNT_VIEW_SEARCH_OPTS = {
|
||||
order_by => { -desc => "count" },
|
||||
rows => 100,
|
||||
};
|
||||
|
||||
|
||||
sub validate_page_number ($) { $_[0] =~ /^[1-9][0-9]*$/ }
|
||||
sub validate_tag_name ($) { $_[0] !~ /^[1-9][0-9]*$/ && $_[0] =~ /^\w+$/ }
|
||||
|
||||
sub mkpager ($)
|
||||
{
|
||||
my $pager = $_[0]->pager;
|
||||
return {
|
||||
first => $pager->first_page,
|
||||
prev => $pager->previous_page,
|
||||
cur => $pager->current_page,
|
||||
next => $pager->next_page,
|
||||
last => $pager->last_page,
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
set serializer => "JSON";
|
||||
|
||||
|
||||
get "/meta" => sub {
|
||||
return [
|
||||
{ path => "/meta", verb => "GET" },
|
||||
{ path => "/tags", verb => "GET" },
|
||||
{ path => "/tags", verb => "POST" },
|
||||
{ path => "/tag/:tag_id_or_name", verb => "GET" },
|
||||
{ path => "/media/:media_id", verb => "GET" },
|
||||
{ path => "/download/:media_id", verb => "GET" },
|
||||
{ path => "/random", verb => "GET" },
|
||||
],
|
||||
};
|
||||
|
||||
get "/tags" => sub {
|
||||
my $page = query_parameters->get("page") // 1;
|
||||
send_error("Invalid page number", 400) if !validate_page_number($page);
|
||||
|
||||
my $paged_tags = schema("default")->resultset("TagsCountView")
|
||||
->search({}, $TAGS_COUNT_VIEW_SEARCH_OPTS)->page($page);
|
||||
my @tags = map +{
|
||||
id => $_->tag_id,
|
||||
name => $_->name,
|
||||
count => $_->count,
|
||||
}, $paged_tags->all;
|
||||
|
||||
return {
|
||||
pager => mkpager($paged_tags),
|
||||
tags => \@tags,
|
||||
}
|
||||
};
|
||||
|
||||
post "/tags" => sub {
|
||||
my @tag_names = body_parameters->get_all("name");
|
||||
send_error("No tags provided", 400) if @tag_names == 0;
|
||||
send_error("Too many tags provided", 400) if @tag_names > 100;
|
||||
send_error("Invalid tag names", 400) if
|
||||
grep { validate_tag_name($_) } @tag_names;
|
||||
|
||||
my @tags;
|
||||
eval {
|
||||
@tags = map +{
|
||||
id => $_->tag_id,
|
||||
name => $_->name,
|
||||
}, schema("default")->resultset("Tag")
|
||||
->populate([map +{ name => $_ }, @tag_names]);
|
||||
} or send_error("Tag exists", 409);
|
||||
|
||||
return \@tags;
|
||||
};
|
||||
|
||||
get "/tag/:tag_id_or_name" => sub {
|
||||
my $page = query_parameters->get("page") // 1;
|
||||
send_error("Invalid page number", 400) if !validate_page_number($page);
|
||||
|
||||
my $tag_id_or_name = route_parameters->get("tag_id_or_name");
|
||||
|
||||
my $query = [
|
||||
{ tag_id => $tag_id_or_name },
|
||||
{ name => $tag_id_or_name },
|
||||
];
|
||||
my $tag = schema("default")->resultset("Tag")->single($query);
|
||||
send_error("Tag not found", 404) if !defined($tag);
|
||||
|
||||
my $paged_media = schema("default")->resultset("MediaTag")
|
||||
->search({ tag_id => $tag->tag_id }, $MEDIA_SEARCH_OPTS)
|
||||
->page($page);
|
||||
my @media = map { $_->media_id } $paged_media->all;
|
||||
|
||||
return {
|
||||
id => $tag->tag_id,
|
||||
name => $tag->name,
|
||||
pager => mkpager($paged_media),
|
||||
media => \@media,
|
||||
};
|
||||
};
|
||||
|
||||
get "/random/tag" => sub {
|
||||
my $tag = schema("default")->resultset("Tag")
|
||||
->search({}, { order_by => \"random()", limit => 1 })->single;
|
||||
|
||||
send_error("Tag not found", 404) if !defined($tag);
|
||||
|
||||
forward "/tag/" . $tag->tag_id;
|
||||
};
|
||||
|
||||
get "/media" => sub {
|
||||
my $page = query_parameters->get("page") // 1;
|
||||
send_error("Invalid page number", 400) if !validate_page_number($page);
|
||||
|
||||
my $paged_media = schema("default")->resultset("Media")
|
||||
->search({}, $MEDIA_SEARCH_OPTS)->page($page);
|
||||
my @media = map { $_->media_id } $paged_media->all;
|
||||
|
||||
return {
|
||||
pager => mkpager($paged_media),
|
||||
media => \@media,
|
||||
};
|
||||
};
|
||||
|
||||
get "/media/:media_id" => sub {
|
||||
my $media = schema("default")->resultset("Media")
|
||||
->single({ media_id => route_parameters->get("media_id") });
|
||||
|
||||
send_error("Media not found", 404) if !defined($media);
|
||||
|
||||
return {
|
||||
id => $media->media_id,
|
||||
filename => $media->filename,
|
||||
size => length($media->content),
|
||||
download_path => "/download/" . $media->media_id,
|
||||
};
|
||||
};
|
||||
|
||||
get "/download/:media_id" => sub {
|
||||
my $media = schema("default")->resultset("Media")
|
||||
->single({ media_id => route_parameters->get("media_id") });
|
||||
|
||||
send_error("Media not found", 404) if !defined($media);
|
||||
|
||||
send_file(
|
||||
\$media->content,
|
||||
content_type => $media->content_type // DEFAULT_CONTENT_TYPE,
|
||||
filename => $media->filename,
|
||||
);
|
||||
};
|
||||
|
||||
get "/random/media" => sub {
|
||||
my $media = schema("default")->resultset("Media")
|
||||
->search({}, { order_by => \"random()", limit => 1 })->single;
|
||||
|
||||
send_error("Media not found", 404) if !defined($media);
|
||||
|
||||
forward "/media/" . $media->media_id;
|
||||
};
|
||||
|
||||
true;
|
Reference in a new issue