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

hook everything up into a working system

This commit is contained in:
Robin Appelman 2017-04-11 01:00:21 +02:00
commit 9024e368c7
12 changed files with 204 additions and 81 deletions

View file

@ -3,6 +3,7 @@
use Ehesp\SteamLogin\SteamLogin; use Ehesp\SteamLogin\SteamLogin;
use Demostf\API\Providers\AuthProvider; use Demostf\API\Providers\AuthProvider;
use Demostf\API\Providers\UserProvider; use Demostf\API\Providers\UserProvider;
use flight\Engine;
class AuthController extends BaseController { class AuthController extends BaseController {
/** /**
@ -18,17 +19,13 @@ class AuthController extends BaseController {
/** @var string */ /** @var string */
private $host; private $host;
/** private $apiRoot;
* AuthController constructor.
* public function __construct(UserProvider $userProvider, AuthProvider $authProvider, string $host, string $apiRoot) {
* @param UserProvider $userProvider
* @param AuthProvider $authProvider
* @param string $host
*/
public function __construct(UserProvider $userProvider, AuthProvider $authProvider, string $host) {
$this->userProvider = $userProvider; $this->userProvider = $userProvider;
$this->authProvider = $authProvider; $this->authProvider = $authProvider;
$this->host = $host; $this->host = $host;
$this->apiRoot = $apiRoot;
} }
public function token() { public function token() {
@ -48,7 +45,7 @@ class AuthController extends BaseController {
public function login($token) { public function login($token) {
$_SESSION['return'] = $this->query('return', 'https://' . $this->host); $_SESSION['return'] = $this->query('return', 'https://' . $this->host);
$steam = new SteamLogin(); $steam = new SteamLogin();
$url = $steam->url($_ENV['APP_ROOT'] . '/auth/handle/' . urlencode($token)); $url = $steam->url($this->apiRoot . '/auth/handle/' . urlencode($token));
\Flight::redirect(str_replace('&', '&', $url)); // headers make no sense \Flight::redirect(str_replace('&', '&', $url)); // headers make no sense
} }
@ -63,7 +60,7 @@ class AuthController extends BaseController {
} }
public function handle($token) { public function handle($token) {
$return = isset($_SESSION['return']) ? $_SESSION['return'] : 'http://demos.tf'; $return = isset($_SESSION['return']) ? $_SESSION['return'] : 'https://' . $this->host;
unset($_SESSION['return']); unset($_SESSION['return']);
$steam = new SteamLogin(); $steam = new SteamLogin();
$steamId = $steam->validate(); $steamId = $steam->validate();

View file

@ -1,6 +1,8 @@
<?php namespace Demostf\API\Controllers; <?php namespace Demostf\API\Controllers;
class BaseController { class BaseController {
protected function query($name, $default) { protected function query($name, $default) {
$request = \Flight::request(); $request = \Flight::request();
return isset($request->query[$name]) ? $request->query[$name] : $default; return isset($request->query[$name]) ? $request->query[$name] : $default;

View file

@ -1,7 +1,9 @@
<?php namespace Demostf\API\Controllers; <?php namespace Demostf\API\Controllers;
use Demostf\API\Providers\ChatProvider; use Demostf\API\Providers\ChatProvider;
use Demostf\API\Providers\DemoListProvider;
use Demostf\API\Providers\DemoProvider; use Demostf\API\Providers\DemoProvider;
use flight\Engine;
class DemoController extends BaseController { class DemoController extends BaseController {
/** @var DemoProvider */ /** @var DemoProvider */
@ -10,9 +12,12 @@ class DemoController extends BaseController {
/** @var ChatProvider */ /** @var ChatProvider */
private $chatProvider; private $chatProvider;
public function __construct(DemoProvider $demoProvider, ChatProvider $chatProvider) { private $demoListProvider;
public function __construct(DemoProvider $demoProvider, ChatProvider $chatProvider, DemoListProvider $demoListProvider) {
$this->demoProvider = $demoProvider; $this->demoProvider = $demoProvider;
$this->chatProvider = $chatProvider; $this->chatProvider = $chatProvider;
$this->demoListProvider = $demoListProvider;
} }
/** /**
@ -53,19 +58,19 @@ class DemoController extends BaseController {
public function listDemos() { public function listDemos() {
$page = $this->query('page', 1); $page = $this->query('page', 1);
\Flight::json($this->demoProvider->listDemos($page, $this->getFilter())); \Flight::json($this->demoListProvider->listDemos($page, $this->getFilter()));
} }
public function listProfile($steamid) { public function listProfile($steamid) {
$page = $this->query('page', 1); $page = $this->query('page', 1);
$where = $this->getFilter(); $where = $this->getFilter();
$where['players'][] = $steamid; $where['players'][] = $steamid;
\Flight::json($this->demoProvider->listProfile($page, $where)); \Flight::json($this->demoListProvider->listProfile($page, $where));
} }
public function listUploads($steamid) { public function listUploads($steamid) {
$page = $this->query('page', 1); $page = $this->query('page', 1);
\Flight::json($this->demoProvider->listUploads($steamid, $page, $this->getFilter())); \Flight::json($this->demoListProvider->listUploads($steamid, $page, $this->getFilter()));
} }
public function chat($demoId) { public function chat($demoId) {

View file

@ -1,16 +1,12 @@
<?php namespace Demostf\API\Controllers; <?php namespace Demostf\API\Controllers;
use Demostf\API\Providers\InfoProvider; use Demostf\API\Providers\InfoProvider;
use flight\Engine;
class InfoController extends BaseController { class InfoController extends BaseController {
/** @var InfoProvider */ /** @var InfoProvider */
private $infoProvider; private $infoProvider;
/**
* InfoController constructor.
*
* @param InfoProvider $infoProvider
*/
public function __construct(InfoProvider $infoProvider) { public function __construct(InfoProvider $infoProvider) {
$this->infoProvider = $infoProvider; $this->infoProvider = $infoProvider;
} }

View file

@ -1,6 +1,7 @@
<?php namespace Demostf\API\Controllers; <?php namespace Demostf\API\Controllers;
use Demostf\API\Providers\UploadProvider; use Demostf\API\Providers\UploadProvider;
use flight\Engine;
class UploadController extends BaseController { class UploadController extends BaseController {
private $uploadProvider; private $uploadProvider;
@ -17,6 +18,6 @@ class UploadController extends BaseController {
$demo = $this->file('demo'); $demo = $this->file('demo');
$demoFile = $demo['tmp_name']; $demoFile = $demo['tmp_name'];
return $this->uploadProvider->upload($key, $red, $blu, $name, $demoFile); echo $this->uploadProvider->upload($key, $red, $blu, $name, $demoFile);
} }
} }

View file

@ -3,6 +3,7 @@
use Ehesp\SteamLogin\SteamLogin; use Ehesp\SteamLogin\SteamLogin;
use Demostf\API\Providers\AuthProvider; use Demostf\API\Providers\AuthProvider;
use Demostf\API\Providers\UserProvider; use Demostf\API\Providers\UserProvider;
use flight\Engine;
class UserController extends BaseController { class UserController extends BaseController {
/** /**
@ -10,11 +11,6 @@ class UserController extends BaseController {
*/ */
private $userProvider; private $userProvider;
/**
* UserController constructor.
*
* @param UserProvider $userProvider
*/
public function __construct(UserProvider $userProvider) { public function __construct(UserProvider $userProvider) {
$this->userProvider = $userProvider; $this->userProvider = $userProvider;
} }

View file

@ -22,6 +22,6 @@ class RawParser {
$response = $client->post($this->parserUrl, [ $response = $client->post($this->parserUrl, [
'body' => fopen($path, 'r') 'body' => fopen($path, 'r')
]); ]);
return json_decode($response->getBody(), true); return json_decode($response->getBody()->getContents(), true);
} }
} }

110
src/Providers/Container.php Normal file
View file

@ -0,0 +1,110 @@
<?php declare(strict_types=1);
namespace Demostf\API\Providers;
use Demostf\API\Demo\DemoSaver;
use Demostf\API\Demo\DemoStore;
use Demostf\API\Demo\HeaderParser;
use Demostf\API\Demo\Parser;
use Demostf\API\Demo\RawParser;
use Doctrine\DBAL\Connection;
use RandomLib\Generator;
class Container {
private $connection;
private $generator;
private $baseUrl;
private $parserUrl;
private $storeRoot;
private $storeUrl;
private $apiRoot;
public function __construct(
Connection $connection,
Generator $generator,
string $baseUrl,
string $parserUrl,
string $storeRoot,
string $storeUrl,
string $apiRoot
) {
$this->connection = $connection;
$this->generator = $generator;
$this->baseUrl = $baseUrl;
$this->parserUrl = $parserUrl;
$this->storeRoot = $storeRoot;
$this->storeUrl = $storeUrl;
$this->apiRoot = $apiRoot;
}
public function getAuthProvider(): AuthProvider {
return new AuthProvider($this->connection, $this->generator);
}
public function getChatProvider(): ChatProvider {
return new ChatProvider($this->connection);
}
public function getDemoListProvider(): DemoListProvider {
return new DemoListProvider($this->connection);
}
public function getDemoProvider(): DemoProvider {
return new DemoProvider($this->connection);
}
public function getInfoProvider(): InfoProvider {
return new InfoProvider($this->connection);
}
public function getKillProvider(): KillProvider {
return new KillProvider($this->connection);
}
public function getPlayerProvider(): PlayerProvider {
return new PlayerProvider($this->connection);
}
public function getUploadProvider(): UploadProvider {
return new UploadProvider(
$this->connection,
$this->baseUrl,
new HeaderParser(),
new Parser(new RawParser($this->parserUrl)),
new DemoStore($this->storeRoot, $this->storeUrl),
$this->getUserProvider(),
$this->getDemoProvider(),
new DemoSaver(
$this->getKillProvider(),
$this->getPlayerProvider(),
$this->getChatProvider(),
$this->getUserProvider(),
$this->getDemoProvider()
)
);
}
public function getUserProvider(): UserProvider {
return new UserProvider($this->connection, $this->generator);
}
public function getBaseUrl(): string {
return $this->baseUrl;
}
public function getParserUrl(): string {
return $this->parserUrl;
}
public function getStoreRoot(): string {
return $this->storeRoot;
}
public function getStoreUrl(): string {
return $this->storeUrl;
}
public function getApiRoot(): string {
return $this->apiRoot;
}
}

View file

@ -78,9 +78,7 @@ class UserProvider extends BaseProvider {
} }
} }
return array_map(function (array $row) { return array_values($result);
return User::fromRow($row);
}, array_values($result));
} }
public function byKey($key): ?User { public function byKey($key): ?User {

View file

@ -1,38 +1,26 @@
<?php declare(strict_types = 1); <?php declare(strict_types=1);
namespace Demostf\API; namespace Demostf\API;
use Demostf\API\Providers\Container;
use Flight; use Flight;
require_once __DIR__ . '/init.php'; /** @var Container $container */
$container = require __DIR__ . '/init.php';
$demoController = new Controllers\DemoController(
$connectionParams = array( $container->getDemoProvider(),
'dbname' => getenv('DB_DATABASE'), $container->getChatProvider(),
'user' => getenv('DB_USERNAME'), $container->getDemoListProvider()
'password' => getenv('DB_PASSWORD'),
'host' => getenv('DB_HOST'),
'port' => getenv('DB_PORT'),
'driver' => getenv('DB_TYPE'),
); );
if ($connectionParams['driver'] === 'pgsql') { $authController = new Controllers\AuthController(
$connectionParams['driver'] = 'pdo_pgsql'; $container->getUserProvider(),
} $container->getAuthProvider(),
$db = \Doctrine\DBAL\DriverManager::getConnection($connectionParams); $container->getBaseUrl(),
$host = getenv('BASE_HOST'); $container->getApiRoot()
);
$demoProvider = new Providers\DemoProvider($db); $userController = new Controllers\UserController($container->getUserProvider());
$infoController = new Controllers\InfoController($container->getInfoProvider());
$factory = new \RandomLib\Factory;
$generator = $factory->getMediumStrengthGenerator();
$authProvider = new Providers\AuthProvider($db, $generator);
$userProvider = new Providers\UserProvider($db, $generator);
$infoProvider = new Providers\InfoProvider($db);
$chatProvider = new Providers\ChatProvider($db);
$demoController = new Controllers\DemoController($demoProvider, $chatProvider);
$authController = new Controllers\AuthController($userProvider, $authProvider, $host);
$userController = new Controllers\UserController($userProvider);
$infoController = new Controllers\InfoController($infoProvider);
Flight::route('/*', function () { Flight::route('/*', function () {
header('Access-Control-Allow-Origin: *'); header('Access-Control-Allow-Origin: *');

View file

@ -1,6 +1,42 @@
<?php <?php declare(strict_types=1);
use Demostf\API\Providers\Container;
$autoloader = require __DIR__ . '/../vendor/autoload.php'; $autoloader = require __DIR__ . '/../vendor/autoload.php';
if (!getenv('DB_TYPE')) { if (!getenv('DB_TYPE')) {
Dotenv::load(__DIR__ . '/../'); Dotenv::load(__DIR__ . '/../');
} }
$connectionParams = array(
'dbname' => getenv('DB_DATABASE'),
'user' => getenv('DB_USERNAME'),
'password' => getenv('DB_PASSWORD'),
'host' => getenv('DB_HOST'),
'port' => getenv('DB_PORT'),
'driver' => getenv('DB_TYPE'),
);
if ($connectionParams['driver'] === 'pgsql') {
$connectionParams['driver'] = 'pdo_pgsql';
}
$db = \Doctrine\DBAL\DriverManager::getConnection($connectionParams);
$host = getenv('BASE_HOST');
$storeRoot = getenv('DEMO_ROOT');
$storeHost = getenv('DEMO_HOST');
$parserUrl = getenv('PARSER_URL');
$appRoot = getenv('APP_ROOT');
$factory = new \RandomLib\Factory;
$generator = $factory->getMediumStrengthGenerator();
$container = new Container(
$db,
$generator,
'https://' . $host,
$parserUrl,
$storeRoot,
'https://' . $storeHost,
$appRoot
);
return $container;

View file

@ -1,27 +1,21 @@
<?php declare(strict_types = 1); <?php declare(strict_types=1);
namespace Demostf\API; namespace Demostf\API;
require_once __DIR__ . '/init.php'; use Demostf\API\Providers\Container;
use Flight;
$connectionParams = array( /** @var Container $container */
'dbname' => getenv('DB_DATABASE'), $container = require __DIR__ . '/init.php';
'user' => getenv('DB_USERNAME'),
'password' => getenv('DB_PASSWORD'),
'host' => getenv('DB_HOST'),
'driver' => getenv('DB_TYPE'),
);
if ($connectionParams['driver'] === 'pgsql') {
$connectionParams['driver'] = 'pdo_pgsql';
}
$db = \Doctrine\DBAL\DriverManager::getConnection($connectionParams);
$host = getenv('BASE_HOST');
$storeRoot = getenv('DEMO_ROOT');
$demoProvider = new Providers\DemoProvider($db); $uploadController = new Controllers\UploadController($container->getUploadProvider());
$factory = new \RandomLib\Factory; Flight::route('/*', function () {
$generator = $factory->getMediumStrengthGenerator(); header('Access-Control-Allow-Origin: *');
$userProvider = new Providers\UserProvider($db, $generator); return true;
$store = new Demo\DemoStore($storeRoot, 'static.' . $host); });
$uploadController = new Controllers\UploadController($demoProvider, $userProvider, new Demo\Parser(), $store);
$uploadController->upload(); Flight::route('/upload', [$uploadController, 'upload']);
Flight::route('/do_upload', [$uploadController, 'upload']);
Flight::start();