75 lines
2.6 KiB
PHP
75 lines
2.6 KiB
PHP
<?php namespace MapGuesser\Repository;
|
|
|
|
use Generator;
|
|
use MapGuesser\Database\Query\Select;
|
|
use MapGuesser\PersistentData\Model\Challenge;
|
|
use MapGuesser\PersistentData\Model\Place;
|
|
use MapGuesser\PersistentData\Model\User;
|
|
use MapGuesser\PersistentData\PersistentDataManager;
|
|
|
|
class ChallengeRepository
|
|
{
|
|
private PersistentDataManager $pdm;
|
|
|
|
public function __construct()
|
|
{
|
|
$this->pdm = new PersistentDataManager();
|
|
}
|
|
|
|
public function getById(int $challengeId): ?Challenge
|
|
{
|
|
return $this->pdm->selectFromDbById($challengeId, Challenge::class);
|
|
}
|
|
|
|
public function getByToken(int $token): ?Challenge
|
|
{
|
|
$select = new Select(\Container::$dbConnection);
|
|
$select->where('token', '=', $token);
|
|
|
|
return $this->pdm->selectFromDb($select, Challenge::class);
|
|
}
|
|
|
|
public function getByTokenStr(string $token_str): ?Challenge
|
|
{
|
|
// validate token string
|
|
foreach (str_split($token_str) as $char) {
|
|
if (!(('0' <= $char && $char <= '9') || ('a' <= $char && $char <= 'f'))) {
|
|
return null;
|
|
}
|
|
}
|
|
// convert token to int
|
|
$token = hexdec($token_str);
|
|
|
|
return $this->getByToken($token);
|
|
}
|
|
|
|
public function getAllByParticipant(User $user): Generator
|
|
{
|
|
$select = new Select(\Container::$dbConnection);
|
|
$select->innerJoin('user_in_challenge', ['challenge', 'id'], '=', ['user_in_challenge', 'challenge_id']);
|
|
$select->innerJoin('users', ['users', 'id'], '=', ['user_in_challenge', 'user_id']);
|
|
$select->where('user_id', '=', $user->getId());
|
|
|
|
yield from $this->pdm->selectMultipleFromDb($select, Challenge::class);
|
|
}
|
|
|
|
public function getAllByOwner(User $user): Generator
|
|
{
|
|
$select = new Select(\Container::$dbConnection);
|
|
$select->innerJoin('user_in_challenge', ['challenge', 'id'], '=', ['user_in_challenge', 'challenge_id']);
|
|
$select->innerJoin('users', ['users', 'id'], '=', ['user_in_challenge', 'user_id']);
|
|
$select->where('user_id', '=', $user->getId());
|
|
$select->where('is_owner', '=', true);
|
|
|
|
yield from $this->pdm->selectMultipleFromDb($select, Challenge::class);
|
|
}
|
|
|
|
public function getAllByPlace(Place $place): Generator
|
|
{
|
|
$select = new Select(\Container::$dbConnection);
|
|
$select->innerJoin('place_in_challenge', ['challenges', 'id'], '=', ['place_in_challenge', 'challenge_id']);
|
|
$select->where('place_id', '=', $place->getId());
|
|
|
|
yield from $this->pdm->selectMultipleFromDb($select, Challenge::class);
|
|
}
|
|
} |