misuzu/src/Emoticons/EmotesApiRoutes.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),
);
}
}