68 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			68 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php namespace MapGuesser\Repository;
 | 
						|
 | 
						|
use Generator;
 | 
						|
use SokoWeb\Database\Query\Select;
 | 
						|
use MapGuesser\PersistentData\Model\Challenge;
 | 
						|
use MapGuesser\PersistentData\Model\Place;
 | 
						|
use MapGuesser\PersistentData\Model\User;
 | 
						|
 | 
						|
class ChallengeRepository
 | 
						|
{
 | 
						|
    public function getById(int $challengeId): ?Challenge
 | 
						|
    {
 | 
						|
        return \Container::$persistentDataManager->selectFromDbById($challengeId, Challenge::class);
 | 
						|
    }
 | 
						|
 | 
						|
    public function getByToken(int $token): ?Challenge
 | 
						|
    {
 | 
						|
        $select = new Select(\Container::$dbConnection);
 | 
						|
        $select->where('token', '=', $token);
 | 
						|
 | 
						|
        return \Container::$persistentDataManager->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 \Container::$persistentDataManager->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 \Container::$persistentDataManager->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 \Container::$persistentDataManager->selectMultipleFromDb($select, Challenge::class);
 | 
						|
    }
 | 
						|
}
 |