Initial import
This commit is contained in:
commit
1ff831f80d
19 changed files with 956 additions and 0 deletions
113
lib/PoorBooru/API/V0.pm
Normal file
113
lib/PoorBooru/API/V0.pm
Normal file
|
@ -0,0 +1,113 @@
|
|||
package PoorBooru::API::V0;
|
||||
use Dancer2;
|
||||
use Dancer2::Plugin::DBIC;
|
||||
|
||||
our $VERSION = v0;
|
||||
|
||||
set serializer => "JSON";
|
||||
set database => "db/booru.db";
|
||||
|
||||
my $DEFAULT_CONTENT_TYPE = "application/json";
|
||||
my @ROUTES = (
|
||||
{ path => "/meta", verb => "GET" },
|
||||
{ path => "/tags", verb => "GET" },
|
||||
{ path => "/tags/new", verb => "POST" },
|
||||
{ path => "/tag/:tag_id_or_name", verb => "GET" },
|
||||
{ path => "/random", verb => "GET" },
|
||||
{ path => "/media/:media_id", verb => "GET" },
|
||||
{ path => "/download/:media_id", verb => "GET" },
|
||||
);
|
||||
|
||||
get "/meta" => sub {
|
||||
return \@ROUTES;
|
||||
};
|
||||
|
||||
get "/tags" => sub {
|
||||
my @tags = schema("default")->resultset("TagsCountView")->all;
|
||||
|
||||
return [
|
||||
map +( {
|
||||
id => $_->tag_id,
|
||||
name => $_->name,
|
||||
count => $_->count,
|
||||
} ), @tags,
|
||||
];
|
||||
};
|
||||
|
||||
post "/tags/new" => sub {
|
||||
my $tag;
|
||||
|
||||
eval {
|
||||
$tag = schema("default")->resultset("Tag")
|
||||
->create({ name => body_parameters->get("name") });
|
||||
} or send_error("Tag exists", 409);
|
||||
|
||||
return {
|
||||
id => $tag->tag_id,
|
||||
name => $tag->name,
|
||||
};
|
||||
};
|
||||
|
||||
get "/tag/:tag_id_or_name" => sub {
|
||||
my ($tag, $tag_rset, @media);
|
||||
my $tag_id_or_name = route_parameters->get("tag_id_or_name");
|
||||
|
||||
$tag_rset = schema("default")->resultset("Tag");
|
||||
$tag = $tag_rset->single({ tag_id => $tag_id_or_name }) //
|
||||
$tag_rset->single({ name => $tag_id_or_name });
|
||||
|
||||
send_error("Tag not found", 404) if !defined($tag);
|
||||
|
||||
@media = map { $_->media_id } schema("default")->resultset("MediaTag")
|
||||
->search({ tag_id => $tag->tag_id })->all;
|
||||
|
||||
return {
|
||||
id => $tag->tag_id,
|
||||
name => $tag->name,
|
||||
media => [
|
||||
map +( {
|
||||
id => $_,
|
||||
uri => uri_for("/media/$_"),
|
||||
donwload_uri => uri_for("/download/$_"),
|
||||
} ), @media,
|
||||
],
|
||||
};
|
||||
};
|
||||
|
||||
get "/random" => 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;
|
||||
};
|
||||
|
||||
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_uri => uri_for("/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,
|
||||
);
|
||||
};
|
||||
|
||||
true;
|
Reference in a new issue