116 lines
3.5 KiB
PHP
116 lines
3.5 KiB
PHP
<?php
|
|
namespace Misuzu\Emoticons;
|
|
|
|
use RuntimeException;
|
|
use Index\XArray;
|
|
use Index\Http\{HttpRequest,HttpResponseBuilder};
|
|
use Index\Http\Routing\{RouteHandler,RouteHandlerCommon};
|
|
use Index\Http\Routing\AccessControl\AccessControl;
|
|
use Index\Http\Routing\Routes\{ExactRoute,PatternRoute};
|
|
use Misuzu\FieldTransformer;
|
|
|
|
final class EmotesApiRoutes implements RouteHandler {
|
|
use RouteHandlerCommon;
|
|
|
|
public function __construct(
|
|
private EmotesContext $emotesCtx
|
|
) {}
|
|
|
|
/** @return FieldTransformer<EmoteInfo> */
|
|
private function createEmoteTransformer(): FieldTransformer {
|
|
return new FieldTransformer([
|
|
'id' => [
|
|
'transform' => fn($emote) => $emote->id,
|
|
],
|
|
'order' => [
|
|
'transform' => fn($emote) => $emote->order,
|
|
],
|
|
'url' => [
|
|
'default' => true,
|
|
'transform' => fn($emote) => $emote->url,
|
|
],
|
|
'strings' => [
|
|
'default' => true,
|
|
'transform' => fn($emote) => XArray::select(
|
|
$this->emotesCtx->emotes->getEmoteStrings($emote),
|
|
fn($string) => $string->string
|
|
),
|
|
],
|
|
'min_rank' => [
|
|
'default' => true,
|
|
'transform' => fn($emote) => $emote->minRank,
|
|
'include' => fn($value) => $value !== 0,
|
|
],
|
|
]);
|
|
}
|
|
|
|
/** @return int|mixed[] */
|
|
#[AccessControl]
|
|
#[ExactRoute('GET', '/api/v1/emotes')]
|
|
public function getEmotes(HttpRequest $request): array|int {
|
|
$transformer = $this->createEmoteTransformer();
|
|
if(!$transformer->filter($request))
|
|
return 400;
|
|
|
|
return XArray::select(
|
|
$this->emotesCtx->emotes->getEmotes(orderBy: 'order'),
|
|
fn($emote) => $transformer->convert($emote),
|
|
);
|
|
}
|
|
|
|
/** @return int|mixed[] */
|
|
#[AccessControl]
|
|
#[PatternRoute('GET', '/api/v1/emotes/([0-9]+)')]
|
|
public function getEmote(HttpRequest $request, string $id): array|int {
|
|
if(empty($id))
|
|
return 404;
|
|
|
|
$transformer = $this->createEmoteTransformer();
|
|
if(!$transformer->filter($request))
|
|
return 400;
|
|
|
|
try {
|
|
$emote = $this->emotesCtx->emotes->getEmote($id);
|
|
} catch(RuntimeException $ex) {
|
|
return 404;
|
|
}
|
|
|
|
return $transformer->convert($emote);
|
|
}
|
|
|
|
/** @return FieldTransformer<EmoteStringInfo> */
|
|
private function createEmoteStringTransformer(): FieldTransformer {
|
|
return new FieldTransformer([
|
|
'order' => [
|
|
'transform' => fn($string) => $string->order,
|
|
],
|
|
'string' => [
|
|
'default' => true,
|
|
'transform' => fn($string) => $string->string,
|
|
],
|
|
]);
|
|
}
|
|
|
|
/** @return int|mixed[] */
|
|
#[AccessControl]
|
|
#[PatternRoute('GET', '/api/v1/emotes/([0-9]+)/strings')]
|
|
public function getEmoteStrings(HttpRequest $request, string $id): array|int {
|
|
if(empty($id))
|
|
return 404;
|
|
|
|
$transformer = $this->createEmoteStringTransformer();
|
|
if(!$transformer->filter($request))
|
|
return 400;
|
|
|
|
try {
|
|
$emote = $this->emotesCtx->emotes->getEmote($id);
|
|
} catch(RuntimeException $ex) {
|
|
return 404;
|
|
}
|
|
|
|
return XArray::select(
|
|
$this->emotesCtx->emotes->getEmoteStrings($emote),
|
|
fn($emote) => $transformer->convert($emote),
|
|
);
|
|
}
|
|
}
|