1
0
Fork 0
mirror of https://codeberg.org/demostf/api.git synced 2026-06-03 09:54:17 +02:00

extract chat handling

This commit is contained in:
Robin Appelman 2017-03-21 21:24:18 +01:00
commit 9c963fd3af
7 changed files with 149 additions and 29 deletions

View file

@ -1,17 +1,18 @@
<?php namespace Demostf\API\Controllers;
use Demostf\API\Providers\ChatProvider;
use Demostf\API\Providers\DemoProvider;
use Demostf\API\Providers\MatchProvider;
class DemoController extends BaseController {
/**
* @var \Providers\DemoProvider
*/
/** @var DemoProvider */
private $demoProvider;
public function __construct(DemoProvider $demoProvider) {
/** @var ChatProvider */
private $chatProvider;
public function __construct(DemoProvider $demoProvider, ChatProvider $chatProvider) {
$this->demoProvider = $demoProvider;
$this->chatProvider = $chatProvider;
}
/**
@ -68,6 +69,6 @@ class DemoController extends BaseController {
}
public function chat($demoId) {
\Flight::json($this->demoProvider->getChat($demoId));
\Flight::json($this->chatProvider->getChat($demoId));
}
}

46
src/Demo/ChatMessage.php Normal file
View file

@ -0,0 +1,46 @@
<?php namespace Demostf\API\Demo;
class ChatMessage {
/** @var string */
private $user;
/** @var integer */
private $time;
/** @var string */
private $message;
/**
* ChatMessage constructor.
*
* @param string $user
* @param int $time
* @param string $message
*/
public function __construct(string $user, int $time, string $message) {
$this->user = $user;
$this->time = $time;
$this->message = $message;
}
/**
* @return string
*/
public function getUser(): string {
return $this->user;
}
/**
* @return int
*/
public function getTime(): int {
return $this->time;
}
/**
* @return string
*/
public function getMessage(): string {
return $this->message;
}
}

View file

@ -0,0 +1,35 @@
<?php namespace Demostf\API\Providers;
use Demostf\API\Demo\ChatMessage;
class ChatProvider extends BaseProvider {
public function getChat(int $demoId) {
$query = $this->getQueryBuilder();
$query->select('text', '"from"', 'time')
->from('chat')
->where($query->expr()->eq('demo_id', $query->createNamedParameter($demoId, \PDO::PARAM_INT)));
$result = $query->execute();
return array_map(function (array $row) {
return new ChatMessage(
$row['from'],
(int)$row['time'],
$row['text']
);
}, $result->fetchAll());
}
public function storeChatMessage(int $demoId, ChatMessage $message) {
$query = $this->getQueryBuilder();
$query->insert('chat')
->values([
'demo_id' => $query->createNamedParameter($demoId, \PDO::PARAM_INT),
'text' => $query->createNamedParameter($message->getMessage()),
'"from"' => $query->createNamedParameter($message->getUser()),
'time' => $query->createNamedParameter($message->getTime(), \PDO::PARAM_INT),
'created_at' => 'now()',
'updated_at' => 'now()',
]);
$query->execute();
}
}

View file

@ -5,11 +5,6 @@ use Doctrine\DBAL\Connection;
class DemoProvider extends BaseProvider {
const VERSION = 4;
public function __construct(Connection $connection) {
parent::__construct($connection);
}
public function get($id) {
$demo = $this->db->demo()->where('id', $id);
@ -40,13 +35,13 @@ class DemoProvider extends BaseProvider {
return $formattedDemo;
}
public function listUploads($steamid, $page, $where = []) {
public function listUploads(string $steamid, int $page, array $where = []) {
$user = $this->db->user()->where('steamid', $steamid);
$where['uploader'] = $user->fetch()->id;
return $this->listDemos($page, $where);
}
public function listProfile($page, $where = []) {
public function listProfile(int $page, array $where = []) {
$users = $this->db->user()->where('steamid', $where['players']);
unset($where['players']);
$userIds = [];
@ -70,7 +65,7 @@ class DemoProvider extends BaseProvider {
return $this->formatList($demos);
}
public function listDemos($page, $where = []) {
public function listDemos(int $page, $where = []) {
if (isset($where['players']) and is_array($where['players']) and count($where['players']) > 0) {
return $this->listProfile($page, $where);
}
@ -96,19 +91,6 @@ class DemoProvider extends BaseProvider {
return $this->formatList($demos);
}
public function getChat($demoId) {
$chat = $this->db->chat()->where('demo_id', $demoId);
$result = [];
foreach ($chat as $message) {
$result[] = [
'message' => $message['text'],
'user' => $message['from'],
'time' => $message['time']
];
}
return $result;
}
protected function formatList($demos) {
$result = [];
foreach ($demos as $demo) {

View file

@ -26,7 +26,8 @@ $generator = $factory->getMediumStrengthGenerator();
$authProvider = new Providers\AuthProvider($db, $generator);
$userProvider = new Providers\UserProvider($db, $generator);
$infoProvider = new Providers\InfoProvider($db);
$demoController = new Controllers\DemoController($demoProvider);
$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);

View file

@ -0,0 +1,37 @@
<?php namespace Demostf\API\Test\Providers;
use Demostf\API\Demo\ChatMessage;
use Demostf\API\Providers\ChatProvider;
use Demostf\API\Test\TestCase;
class ChatProviderTest extends TestCase {
/** @var ChatProvider */
private $provider;
public function setUp() {
parent::setUp();
$this->provider = new ChatProvider($this->getDatabaseConnection());
}
public function testGetEmptyChat() {
$this->assertCount(0, $this->provider->getChat(1));
}
public function testStoreRetrieve() {
$message1 = new ChatMessage('foo', 2, 'bar');
$message2 = new ChatMessage('foo2', 2, 'bar2');
$message3 = new ChatMessage('foo2', 2, 'bar2');
$this->provider->storeChatMessage(1, $message1);
$this->provider->storeChatMessage(1, $message2);
$this->provider->storeChatMessage(2, $message3);
$result = $this->provider->getChat(1);
sort($result);
$this->assertCount(2, $result);
$this->assertEquals($message1, $result[0]);
$this->assertEquals($message2, $result[1]);
}
}

View file

@ -0,0 +1,18 @@
<?php namespace Demostf\API\Test\Providers;
use Demostf\API\Providers\InfoProvider;
use Demostf\API\Test\TestCase;
class InfoProviderTest extends TestCase {
/** @var InfoProvider */
private $provider;
public function setUp() {
parent::setUp();
$this->provider = new InfoProvider($this->getDatabaseConnection());
}
public function testGetStats() {
}
}