1
0
Fork 0
mirror of https://codeberg.org/demostf/api.git synced 2026-06-03 18:04:08 +02:00

filter by backend

This commit is contained in:
Robin Appelman 2017-08-08 00:29:24 +02:00
commit df83a46e20
17 changed files with 265 additions and 38 deletions

View file

@ -19,6 +19,8 @@ use Demostf\API\Providers\PlayerProvider;
use Demostf\API\Providers\UploadProvider;
use Demostf\API\Providers\UserProvider;
use Doctrine\DBAL\Connection;
use flight\net\Request;
use flight\net\Response;
use RandomLib\Generator;
class Container {
@ -30,8 +32,12 @@ class Container {
private $storeUrl;
private $apiRoot;
private $editKey;
private $request;
private $response;
public function __construct(
Request $request,
Response $response,
Connection $connection,
Generator $generator,
string $baseUrl,
@ -41,6 +47,8 @@ class Container {
string $apiRoot,
string $editKey
) {
$this->request = $request;
$this->response = $response;
$this->connection = $connection;
$this->generator = $generator;
$this->baseUrl = $baseUrl;
@ -129,4 +137,12 @@ class Container {
public function getConnection(): Connection {
return $this->connection;
}
public function getRequest(): Request {
return $this->request;
}
public function getResponse(): Response {
return $this->response;
}
}

View file

@ -7,6 +7,8 @@ namespace Demostf\API\Controllers;
use Ehesp\SteamLogin\SteamLogin;
use Demostf\API\Providers\AuthProvider;
use Demostf\API\Providers\UserProvider;
use flight\net\Request;
use flight\net\Response;
class AuthController extends BaseController {
/**
@ -24,7 +26,15 @@ class AuthController extends BaseController {
private $apiRoot;
public function __construct(UserProvider $userProvider, AuthProvider $authProvider, string $host, string $apiRoot) {
public function __construct(
Request $request,
Response $response,
UserProvider $userProvider,
AuthProvider $authProvider,
string $host,
string $apiRoot
) {
parent::__construct($request, $response);
$this->userProvider = $userProvider;
$this->authProvider = $authProvider;
$this->host = $host;

View file

@ -4,22 +4,37 @@ declare(strict_types=1);
namespace Demostf\API\Controllers;
class BaseController {
protected function query($name, $default) {
$request = \Flight::request();
use flight\net\Request;
use flight\net\Response;
return isset($request->query[$name]) ? $request->query[$name] : $default;
class BaseController {
private $request;
private $response;
public function __construct(Request $request, Response $response) {
$this->request = $request;
$this->response = $response;
}
protected function query($name, $default) {
return isset($this->request->query[$name]) ? $this->request->query[$name] : $default;
}
protected function file($name) {
$request = \Flight::request();
return $request->files[$name];
return $this->request->files[$name];
}
protected function post($name, $default = null) {
$request = \Flight::request();
return isset($this->request->data[$name]) ? $this->request->data[$name] : $default;
}
return isset($request->data[$name]) ? $request->data[$name] : $default;
protected function json($data, $code = 200, $encode = true, $charset = 'utf-8', $option = 0) {
$json = ($encode) ? json_encode($data, $option) : $data;
$this->response
->status($code)
->header('Content-Type', 'application/json; charset=' . $charset)
->write($json)
->send();
}
}

View file

@ -7,6 +7,8 @@ namespace Demostf\API\Controllers;
use Demostf\API\Providers\ChatProvider;
use Demostf\API\Providers\DemoListProvider;
use Demostf\API\Providers\DemoProvider;
use flight\net\Request;
use flight\net\Response;
class DemoController extends BaseController {
/** @var DemoProvider */
@ -20,11 +22,14 @@ class DemoController extends BaseController {
private $editKey;
public function __construct(
Request $request,
Response $response,
DemoProvider $demoProvider,
ChatProvider $chatProvider,
DemoListProvider $demoListProvider,
string $editKey
) {
parent::__construct($request, $response);
$this->demoProvider = $demoProvider;
$this->chatProvider = $chatProvider;
$this->demoListProvider = $demoListProvider;
@ -35,17 +40,21 @@ class DemoController extends BaseController {
* @param string $id
*/
public function get($id) {
\Flight::json($this->demoProvider->get(intval($id, 10)));
$this->json($this->demoProvider->get(intval($id, 10)));
}
protected function getFilter() {
$map = $this->query('map', '');
$players = $this->query('players', '');
$type = $this->query('type', '');
$backend = $this->query('backend', '');
$filter = [];
if ($map) {
$filter['map'] = $map;
}
if ($backend) {
$filter['backend'] = $backend;
}
if ($players) {
if (!is_array($players)) {
$players = explode(',', $players);
@ -71,39 +80,39 @@ class DemoController extends BaseController {
public function listDemos() {
$page = $this->query('page', 1);
$order = $this->query('order', 'DESC') === 'ASC' ? 'ASC' : 'DESC';
\Flight::json($this->demoListProvider->listDemos((int)$page, $this->getFilter(), $order));
$this->json($this->demoListProvider->listDemos((int) $page, $this->getFilter(), $order));
}
public function listProfile($steamId) {
$page = $this->query('page', 1);
$where = $this->getFilter();
$where['players'][] = $steamId;
\Flight::json($this->demoListProvider->listProfile((int)$page, $where));
$this->json($this->demoListProvider->listProfile((int) $page, $where));
}
public function listUploads($steamId) {
$page = $this->query('page', 1);
\Flight::json($this->demoListProvider->listUploads($steamId, (int)$page, $this->getFilter()));
$this->json($this->demoListProvider->listUploads($steamId, (int) $page, $this->getFilter()));
}
public function chat($demoId) {
\Flight::json($this->chatProvider->getChat((int)$demoId));
$this->json($this->chatProvider->getChat((int) $demoId));
}
public function setDemoUrl($id) {
$hash = (string)$this->post('hash', '');
$backend = (string)$this->post('backend', '');
$path = (string)$this->post('path', '');
$url = (string)$this->post('url', '');
$editKey = (string)$this->post('key', '');
$hash = (string) $this->post('hash', '');
$backend = (string) $this->post('backend', '');
$path = (string) $this->post('path', '');
$url = (string) $this->post('url', '');
$editKey = (string) $this->post('key', '');
if ($editKey !== $this->editKey || $editKey === '') {
throw new \InvalidArgumentException('Invalid key');
}
$demo = $this->demoProvider->get((int)$id);
$demo = $this->demoProvider->get((int) $id);
$existingHash = $demo->getHash();
if ($existingHash === '' || $existingHash === $hash) {
$this->demoProvider->setDemoUrl((int)$id, $backend, $url, $path);
$this->demoProvider->setDemoUrl((int) $id, $backend, $url, $path);
} else {
throw new \InvalidArgumentException('Invalid demo hash');
}

View file

@ -5,12 +5,15 @@ declare(strict_types=1);
namespace Demostf\API\Controllers;
use Demostf\API\Providers\InfoProvider;
use flight\net\Request;
use flight\net\Response;
class InfoController extends BaseController {
/** @var InfoProvider */
private $infoProvider;
public function __construct(InfoProvider $infoProvider) {
public function __construct(Request $request, Response $response, InfoProvider $infoProvider) {
parent::__construct($request, $response);
$this->infoProvider = $infoProvider;
}

View file

@ -5,11 +5,14 @@ declare(strict_types=1);
namespace Demostf\API\Controllers;
use Demostf\API\Providers\UploadProvider;
use flight\net\Request;
use flight\net\Response;
class UploadController extends BaseController {
private $uploadProvider;
public function __construct(UploadProvider $uploadProvider) {
public function __construct(Request $request, Response $response, UploadProvider $uploadProvider) {
parent::__construct($request, $response);
$this->uploadProvider = $uploadProvider;
}

View file

@ -5,6 +5,8 @@ declare(strict_types=1);
namespace Demostf\API\Controllers;
use Demostf\API\Providers\UserProvider;
use flight\net\Request;
use flight\net\Response;
class UserController extends BaseController {
/**
@ -12,7 +14,8 @@ class UserController extends BaseController {
*/
private $userProvider;
public function __construct(UserProvider $userProvider) {
public function __construct(Request $request, Response $response, UserProvider $userProvider) {
parent::__construct($request, $response);
$this->userProvider = $userProvider;
}

View file

@ -61,7 +61,7 @@ class Parser {
foreach ($data['chat'] as $message) {
if (isset($message['from'])) {
$chat[] = new ChatMessage($message['from'],
(int)floor(($message['tick'] - $data['startTick']) * $intervalPerTick), $message['text']);
(int) floor(($message['tick'] - $data['startTick']) * $intervalPerTick), $message['text']);
}
}
@ -80,7 +80,7 @@ class Parser {
$player['userId'],
$this->convertSteamIdToCommunityId($player['steamId']),
$player['team'],
$this->getClassName((int)$class)
$this->getClassName((int) $class)
);
}
}

View file

@ -23,10 +23,11 @@ class BaseProvider {
/**
* BaseProvider constructor.
* @param Connection $connection
*
* @param connection $connection
*
* The DBAL connection used will always be a PDO
* but phan isn't aware of this.
* but phan isn't aware of this
*
* @suppress PhanTypeMismatchArgument
*/

View file

@ -25,7 +25,7 @@ class DemoListProvider extends BaseProvider {
$in = implode(', ', array_fill(0, count($userIds), '?'));
$sql = 'SELECT demos.id FROM demos INNER JOIN players ON players.demo_id = demos.id
WHERE players.user_id IN (' . $in . ') GROUP BY demos.id HAVING COUNT(user_id) = ? ORDER BY demos.id DESC LIMIT 50 OFFSET ' . ((int)$page - 1) * 50;
WHERE players.user_id IN (' . $in . ') GROUP BY demos.id HAVING COUNT(user_id) = ? ORDER BY demos.id DESC LIMIT 50 OFFSET ' . ((int) $page - 1) * 50;
$params = $userIds;
$params[] = count($userIds);
@ -70,6 +70,10 @@ class DemoListProvider extends BaseProvider {
$query->where($query->expr()->in('uploader',
$query->createNamedParameter($where['uploader'], \PDO::PARAM_INT)));
}
if (isset($where['backend'])) {
$query->where($query->expr()->eq('backend',
$query->createNamedParameter($where['backend'])));
}
$query->orderBy('d.id', $order)
->setMaxResults(50)
->setFirstResult($offset);

View file

@ -55,7 +55,7 @@ class DemoProvider extends BaseProvider {
->from('demos')
->where($query->expr()->eq('hash', $query->createNamedParameter($hash)));
return (int)$query->execute()->fetchColumn();
return (int) $query->execute()->fetchColumn();
}
public function storeDemo(Demo $demo, string $backend, string $path): int {
@ -68,7 +68,7 @@ class DemoProvider extends BaseProvider {
'red' => $query->createNamedParameter($demo->getRed()),
'blu' => $query->createNamedParameter($demo->getBlue()),
'uploader' => $query->createNamedParameter($demo->getUploader(), \PDO::PARAM_INT),
'duration' => $query->createNamedParameter((int)$demo->getDuration(), \PDO::PARAM_INT),
'duration' => $query->createNamedParameter((int) $demo->getDuration(), \PDO::PARAM_INT),
'created_at' => $query->createNamedParameter($demo->getTime()->format(\DATE_ATOM)),
'updated_at' => 'now()',
'backend' => $query->createNamedParameter($backend),
@ -83,7 +83,7 @@ class DemoProvider extends BaseProvider {
])
->execute();
return (int)$this->connection->lastInsertId();
return (int) $this->connection->lastInsertId();
}
public function setDemoUrl(int $id, string $backend, string $url, string $path) {

View file

@ -10,19 +10,25 @@ use Flight;
$container = require __DIR__ . '/init.php';
$demoController = new Controllers\DemoController(
$container->getRequest(),
$container->getResponse(),
$container->getDemoProvider(),
$container->getChatProvider(),
$container->getDemoListProvider(),
$container->getEditKey()
);
$authController = new Controllers\AuthController(
$container->getRequest(),
$container->getResponse(),
$container->getUserProvider(),
$container->getAuthProvider(),
$container->getBaseUrl(),
$container->getApiRoot()
);
$userController = new Controllers\UserController($container->getUserProvider());
$infoController = new Controllers\InfoController($container->getInfoProvider());
$userController = new Controllers\UserController($container->getRequest(), $container->getResponse(),
$container->getUserProvider());
$infoController = new Controllers\InfoController($container->getRequest(), $container->getResponse(),
$container->getInfoProvider());
Flight::route('/*', function () {
header('Access-Control-Allow-Origin: *');

View file

@ -33,6 +33,8 @@ $factory = new \RandomLib\Factory();
$generator = $factory->getMediumStrengthGenerator();
$container = new Container(
Flight::request(),
Flight::response(),
$db,
$generator,
'https://' . $host,

View file

@ -4,13 +4,16 @@ declare(strict_types=1);
namespace Demostf\API;
use Demostf\API\Providers\Container;
use Flight;
/** @var Container $container */
$container = require __DIR__ . '/init.php';
$uploadController = new Controllers\UploadController($container->getUploadProvider());
$uploadController = new Controllers\UploadController(
$container->getRequest(),
$container->getResponse(),
$container->getUploadProvider()
);
Flight::route('/*', function () {
header('Access-Control-Allow-Origin: *');