Роуты /api/ и некоторые мелочи по контроллерам

This commit is contained in:
2025-07-19 21:20:30 +08:00
parent 36c3570e05
commit 5c4554b9f9
6 changed files with 36 additions and 42 deletions

View File

@@ -21,6 +21,30 @@ use Psr\Http\Message\ServerRequestInterface;
*/
class ApiController extends BasicController
{
/**
* Возвращает информацию о плейлисте
*
* @param ServerRequestInterface $request
* @param ResponseInterface $response
* @return ResponseInterface
* @throws Exception
*/
public function getOne(ServerRequestInterface $request, ResponseInterface $response): ResponseInterface
{
try {
$code = $request->getAttributes()['code'] ?? null;
empty($code) && throw new PlaylistNotFoundException('');
$playlist = ini()->getPlaylist($code);
if ($playlist['isOnline'] === true) {
unset($playlist['content']);
}
return $this->responseJson($response, 200, $playlist);
} catch (PlaylistNotFoundException $e) {
return $this->responseJsonError($response, 404, $e);
}
}
/**
* Возвращает информацию о каналов плейлиста
*
@@ -56,24 +80,4 @@ class ApiController extends BasicController
return $response->withStatus(200)
->withHeader('Content-Type', $mime);
}
/**
* Возвращает информацию о плейлисте
*
* @param ServerRequestInterface $request
* @param ResponseInterface $response
* @return ResponseInterface
* @throws Exception
*/
public function json(ServerRequestInterface $request, ResponseInterface $response): ResponseInterface
{
$code = $request->getAttributes()['code'];
try {
$playlist = ini()->getPlaylist($code);
return $this->responseJson($response, 200, $playlist);
} catch (PlaylistNotFoundException $e) {
return $this->responseJsonError($response, 404, $e);
}
}
}

View File

@@ -34,7 +34,7 @@ class BasicController
*/
public function notFound(ServerRequestInterface $request, ResponseInterface $response): ResponseInterface
{
$code = $request->getAttributes()['code'];
$code = $request->getAttributes()['code'] ?? '';
$response->withStatus(404);
$this->view($request, $response, 'notfound.twig', ['code' => $code]);

View File

@@ -63,21 +63,6 @@ class WebController extends BasicController
]);
}
/**
* Возвращает страницу FAQ
*
* @param ServerRequestInterface $request
* @param ResponseInterface $response
* @return ResponseInterface
* @throws LoaderError
* @throws RuntimeError
* @throws SyntaxError
*/
public function faq(ServerRequestInterface $request, ResponseInterface $response): ResponseInterface
{
return $this->view($request, $response, 'faq.twig');
}
/**
* Переадресует запрос на прямую ссылку плейлиста
*

View File

@@ -41,7 +41,11 @@ class IniFile
// сохраняем порядок
foreach (array_keys($ini) as $code) {
$data = redis()->get($code);
try {
$data = @redis()->get($code);
} catch (Throwable) {
$data = false;
}
if ($data === false) {
$raw = $ini[$code];
$data = [

View File

@@ -6,6 +6,7 @@
*/
use App\Controllers\ApiController;
use App\Controllers\BasicController;
use App\Controllers\BotController;
use App\Controllers\WebController;
@@ -56,13 +57,13 @@ return [
[
'method' => 'GET',
'path' => '/{code:[0-9a-zA-Z]+}/json',
'handler' => [ApiController::class, 'json'],
'name' => 'json',
'path' => '/api/playlists/{code:[0-9a-zA-Z]+}',
'handler' => [ApiController::class, 'getOne'],
'name' => 'api::getOne',
],
[
'method' => 'GET',
'path' => '/{code:[0-9a-zA-Z]+}/qrcode',
'path' => '/api/playlists/{code:[0-9a-zA-Z]+}/qrcode',
'handler' => [ApiController::class, 'makeQrCode'],
'name' => 'api::makeQrCode',
],

View File

@@ -175,7 +175,7 @@
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body text-center">
<img src="/{{ playlist.code }}/qrcode" alt="">
<img src="/api/playlists/{{ playlist.code }}/qrcode" alt="">
</div>
</div>
</div>