use v6.d.PREVIEW;
use Cro::HTTP::Router;
use Cro::HTTP::Request;
use Cro::HTTP::Response;
use Cro::Transform;
use Cro;
class Ultramarine::Controller {
has $.license is required;
has $.authorisation is required;
has $.collection is required;
sub respond(*@body) {
response.status = 200;
response.set-body(@body);
}
my class URLRewrite does Cro::Transform {
method consumes() { Cro::HTTP::Request }
method produces() { Cro::HTTP::Request }
my token prefix { '/rest' }
my token api-method { '/' \w+ }
my token suffix { '.view' }
my token query { '?' .* }
my token api-url { ^ <prefix> <api-method> <suffix>? <query> $ }
method transformer(Supply $requests --> Supply) {
supply whenever $requests -> $request {
with $request {
if (.target ~~ /<api-url>/) {
emit .clone(
original-target => .original-target // .target,
target => ($<api-url><prefix api-method query>).join,
);
}
else {
emit $_;
}
}
}
}
}
submethod inner-routes() {
return route {
before $!authorisation;
post -> 'ping' { respond [] }
post -> 'getLicense' {
respond [
:status<ok>,
license => [ |%($!license.status) ],
],
}
post -> 'getMusicFolders' {
respond [
:status<ok>,
musicFolders => [
musicFolder => [ :id<0>, :name<Music> ],
]
],
}
post -> 'dakkarList' {
await $!collection.is-ready;
respond [
:status<ok>,
songs => $!collection.all-songs,
];
}
}
}
method routes() {
return Cro.compose(
URLRewrite,
route { include 'rest' => self.inner-routes() },
);
}
}