feature/MAPG-235-basic-challenge-mode #48
@ -5,6 +5,7 @@ CREATE TABLE `challenges` (
|
|||||||
`no_move` tinyint(1) NOT NULL DEFAULT 0,
|
`no_move` tinyint(1) NOT NULL DEFAULT 0,
|
||||||
`no_pan` tinyint(1) NOT NULL DEFAULT 0,
|
`no_pan` tinyint(1) NOT NULL DEFAULT 0,
|
||||||
`no_zoom` tinyint(1) NOT NULL DEFAULT 0,
|
`no_zoom` tinyint(1) NOT NULL DEFAULT 0,
|
||||||
|
`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
PRIMARY KEY (`id`)
|
PRIMARY KEY (`id`)
|
||||||
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;
|
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;
|
||||||
|
|
||||||
@ -15,6 +16,7 @@ CREATE TABLE `user_in_challenge` (
|
|||||||
`round` smallint(5) signed NOT NULL DEFAULT -1,
|
`round` smallint(5) signed NOT NULL DEFAULT -1,
|
||||||
`score` int(10) unsigned NOT NULL DEFAULT 0,
|
`score` int(10) unsigned NOT NULL DEFAULT 0,
|
||||||
`time_left` int(10) unsigned,
|
`time_left` int(10) unsigned,
|
||||||
|
`owner` tinyint(1) NOT NULL DEFAULT 0,
|
||||||
PRIMARY KEY (`id`),
|
PRIMARY KEY (`id`),
|
||||||
KEY `user_id` (`user_id`),
|
KEY `user_id` (`user_id`),
|
||||||
KEY `challenge_id` (`challenge_id`),
|
KEY `challenge_id` (`challenge_id`),
|
||||||
|
94
src/PersistentData/Model/Challenge.php
Normal file
94
src/PersistentData/Model/Challenge.php
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
<?php namespace MapGuesser\PersistentData\Model;
|
||||||
|
|
||||||
|
use DateTime;
|
||||||
|
|
||||||
|
class Challenge extends Model
|
||||||
|
{
|
||||||
|
protected static string $table = 'challenge';
|
||||||
|
|
||||||
|
protected static array $fields = ['token', 'timer_sec', 'no_move', 'no_pan', 'no_zoom', 'created'];
|
||||||
|
|
||||||
|
protected static array $relations = [];
|
||||||
|
|
||||||
|
private int $token;
|
||||||
|
|
||||||
|
private int $timerSec;
|
||||||
|
|
||||||
|
private bool $noMove;
|
||||||
|
|
||||||
|
private bool $noPan;
|
||||||
|
|
||||||
|
private bool $noZoom;
|
||||||
|
|
||||||
|
private DateTime $created;
|
||||||
|
|
||||||
|
public function setToken(int $token): void
|
||||||
|
{
|
||||||
|
$this->token = $token;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setTimerSec(int $timerSec): void
|
||||||
|
{
|
||||||
|
$this->timerSec = $timerSec;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setNoMove(bool $noMove): void
|
||||||
|
{
|
||||||
|
$this->$noMove = $noMove;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setNoPan(bool $noPan): void
|
||||||
|
{
|
||||||
|
$this->$noPan = $noPan;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setNoZoom(bool $noZoom): void
|
||||||
|
{
|
||||||
|
$this->$noZoom = $noZoom;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setCreatedDate(DateTime $created): void
|
||||||
|
{
|
||||||
|
$this->created = $created;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setCreated(string $created): void
|
||||||
|
{
|
||||||
|
$this->created = new DateTime($created);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getToken(): int
|
||||||
|
{
|
||||||
|
return $this->token;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getTimerSec(): int
|
||||||
|
{
|
||||||
|
return $this->timerSec;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getNoMove(): bool
|
||||||
|
{
|
||||||
|
return $this->noMove;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getNoPan(): bool
|
||||||
|
{
|
||||||
|
return $this->noPan;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getNoZoom(): bool
|
||||||
|
{
|
||||||
|
return $this->noZoom;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getCreatedDate(): DateTime
|
||||||
|
{
|
||||||
|
return $this->created;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getCreated(): string
|
||||||
|
{
|
||||||
|
return $this->created->format('Y-m-d H:i:s');
|
||||||
|
}
|
||||||
|
}
|
104
src/PersistentData/Model/Guess.php
Normal file
104
src/PersistentData/Model/Guess.php
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
<?php namespace MapGuesser\PersistentData\Model;
|
||||||
|
|
||||||
|
use MapGuesser\Util\Geo\Position;
|
||||||
|
|
||||||
|
class Guess extends Model
|
||||||
|
{
|
||||||
|
protected static string $table = 'guess';
|
||||||
|
|
||||||
|
protected static array $fields = ['user_id', 'place_in_challenge_id', 'lat', 'lng', 'time_spent'];
|
||||||
|
|
||||||
|
protected static array $relations = ['user' => User::class, 'place_in_challenge' => PlaceInChallenge::class];
|
||||||
|
|
||||||
|
private ?User $user = null;
|
||||||
|
|
||||||
|
private ?int $userId = null;
|
||||||
|
|
||||||
|
private ?PlaceInChallenge $placeInChallenge = null;
|
||||||
|
|
||||||
|
private ?int $placeInChallengeId = null;
|
||||||
|
|
||||||
|
private Position $position;
|
||||||
|
|
||||||
|
private int $timeSpent;
|
||||||
|
|
||||||
|
public function setUser(User $user): void
|
||||||
|
{
|
||||||
|
$this->user = $user;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setUserId(int $userId): void
|
||||||
|
{
|
||||||
|
$this->userId = $userId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setPlaceInChallenge(PlaceInChallenge $placeInChallenge): void
|
||||||
|
{
|
||||||
|
$this->placeInChallenge = $placeInChallenge;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setPlaceInChallengeId(int $placeInChallengeId): void
|
||||||
|
{
|
||||||
|
$this->placeInChallengeId = $placeInChallengeId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setPosition(Position $position): void
|
||||||
|
{
|
||||||
|
$this->position = $position;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setLat(float $lat): void
|
||||||
|
{
|
||||||
|
$this->position->setLat($lat);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setLng(float $lng): void
|
||||||
|
{
|
||||||
|
$this->position->setLng($lng);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setTimeSpent(int $timeSpent): void
|
||||||
|
{
|
||||||
|
$this->timeSpent = $timeSpent;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getUser(): ?User
|
||||||
|
{
|
||||||
|
return $this->user;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getUserId(): ?int
|
||||||
|
{
|
||||||
|
return $this->userId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getPlaceInChallenge(): ?PlaceInChallenge
|
||||||
|
{
|
||||||
|
return $this->placeInChallenge;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getPlaceInChallengeId(): ?int
|
||||||
|
{
|
||||||
|
return $this->placeInChallengeId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getPosition(): Position
|
||||||
|
{
|
||||||
|
return $this->position;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getLat(): float
|
||||||
|
{
|
||||||
|
return $this->position->getLat();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getLng(): float
|
||||||
|
{
|
||||||
|
return $this->position->getLng();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getTimeSpent(): ?int
|
||||||
|
{
|
||||||
|
return $this->timeSpent;
|
||||||
|
}
|
||||||
|
}
|
70
src/PersistentData/Model/PlaceInChallenge.php
Normal file
70
src/PersistentData/Model/PlaceInChallenge.php
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
<?php namespace MapGuesser\PersistentData\Model;
|
||||||
|
|
||||||
|
class PlaceInChallenge extends Model
|
||||||
|
{
|
||||||
|
protected static string $table = 'place_in_challenge';
|
||||||
|
|
||||||
|
protected static array $fields = ['place_id', 'challenge_id', 'order'];
|
||||||
|
|
||||||
|
protected static array $relations = ['place' => Place::class, 'challenge' => Challenge::class];
|
||||||
|
|
||||||
|
private ?Place $place = null;
|
||||||
|
|
||||||
|
private ?int $placeId = null;
|
||||||
|
|
||||||
|
private ?Challenge $challenge = null;
|
||||||
|
|
||||||
|
private ?int $challengeId = null;
|
||||||
|
|
||||||
|
private int $order;
|
||||||
|
|
||||||
|
public function setPlace(Place $place): void
|
||||||
|
{
|
||||||
|
$this->place = $place;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setPlaceId(int $placeId): void
|
||||||
|
{
|
||||||
|
$this->placeId = $placeId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setChallenge(Challenge $challenge): void
|
||||||
|
{
|
||||||
|
$this->challenge = $challenge;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setChallengeId(int $challengeId): void
|
||||||
|
{
|
||||||
|
$this->challengeId = $challengeId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setOrder(int $order): void
|
||||||
|
{
|
||||||
|
$this->order = $order;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getPlace(): ?Place
|
||||||
|
{
|
||||||
|
return $this->place;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getPlaceId(): ?int
|
||||||
|
{
|
||||||
|
return $this->placeId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getChallenge(): ?Challenge
|
||||||
|
{
|
||||||
|
return $this->challenge;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getChallengeId(): ?int
|
||||||
|
{
|
||||||
|
return $this->challengeId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getOrder(): int
|
||||||
|
{
|
||||||
|
return $this->order;
|
||||||
|
}
|
||||||
|
}
|
106
src/PersistentData/Model/UserInChallenge.php
Normal file
106
src/PersistentData/Model/UserInChallenge.php
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
<?php namespace MapGuesser\PersistentData\Model;
|
||||||
|
|
||||||
|
class UserInChallenge extends Model
|
||||||
|
{
|
||||||
|
protected static string $table = 'user_in_challenge';
|
||||||
|
|
||||||
|
protected static array $fields = ['user_id', 'challenge_id', 'round', 'score', 'time_left', 'is_owner'];
|
||||||
|
|
||||||
|
protected static array $relations = ['user' => User::class, 'challenge' => Challenge::class];
|
||||||
|
|
||||||
|
private ?User $user = null;
|
||||||
|
|
||||||
|
private ?int $userId = null;
|
||||||
|
|
||||||
|
private ?Challenge $challenge = null;
|
||||||
|
|
||||||
|
private ?int $challengeId = null;
|
||||||
|
|
||||||
|
private int $round;
|
||||||
|
|
||||||
|
private int $score;
|
||||||
|
|
||||||
|
private int $timeLeft;
|
||||||
|
|
||||||
|
private bool $isOwner;
|
||||||
|
|
||||||
|
public function setUser(User $user): void
|
||||||
|
{
|
||||||
|
$this->user = $user;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setUserId(int $userId): void
|
||||||
|
{
|
||||||
|
$this->userId = $userId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setChallenge(Challenge $challenge): void
|
||||||
|
{
|
||||||
|
$this->challenge = $challenge;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setChallengeId(int $challengeId): void
|
||||||
|
{
|
||||||
|
$this->challengeId = $challengeId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setRound(int $round): void
|
||||||
|
{
|
||||||
|
$this->round = $round;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setScore(int $score): void
|
||||||
|
{
|
||||||
|
$this->score = $score;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setTimeLeft(int $timeLeft): void
|
||||||
|
{
|
||||||
|
$this->timeLeft = $timeLeft;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setIsOwner(bool $isOwner): void
|
||||||
|
{
|
||||||
|
$this->isOwner = $isOwner;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getUser(): ?User
|
||||||
|
{
|
||||||
|
return $this->user;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getUserId(): ?int
|
||||||
|
{
|
||||||
|
return $this->userId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getChallenge(): ?Challenge
|
||||||
|
{
|
||||||
|
return $this->challenge;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getChallengeId(): ?int
|
||||||
|
{
|
||||||
|
return $this->challengeId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getRound(): int
|
||||||
|
{
|
||||||
|
return $this->round;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getScore(): int
|
||||||
|
{
|
||||||
|
return $this->score;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getTimeLeft(): ?int
|
||||||
|
{
|
||||||
|
return $this->timeLeft;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getIsOwner(): bool
|
||||||
|
{
|
||||||
|
return $this->isOwner;
|
||||||
|
}
|
||||||
|
}
|
51
src/Repository/ChallengeRepository.php
Normal file
51
src/Repository/ChallengeRepository.php
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
<?php namespace MapGuesser\Repository;
|
||||||
|
|
||||||
|
use Generator;
|
||||||
|
use MapGuesser\Database\Query\Select;
|
||||||
|
use MapGuesser\PersistentData\Model\Challenge;
|
||||||
|
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 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);
|
||||||
|
}
|
||||||
|
}
|
41
src/Repository/GuessRepository.php
Normal file
41
src/Repository/GuessRepository.php
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
<?php namespace MapGuesser\Repository;
|
||||||
|
|
||||||
|
use Generator;
|
||||||
|
use MapGuesser\Database\Query\Select;
|
||||||
|
use MapGuesser\PersistentData\Model\Challenge;
|
||||||
|
use MapGuesser\PersistentData\Model\Guess;
|
||||||
|
use MapGuesser\PersistentData\Model\User;
|
||||||
|
use MapGuesser\PersistentData\Model\UserInChallenge;
|
||||||
|
use MapGuesser\PersistentData\Model\Place;
|
||||||
|
use MapGuesser\PersistentData\PersistentDataManager;
|
||||||
|
|
||||||
|
class GuessRepository
|
||||||
|
{
|
||||||
|
private PersistentDataManager $pdm;
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
$this->pdm = new PersistentDataManager();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getAllByUserAndChallenge(User $user, Challenge $challenge) : Generator
|
||||||
|
{
|
||||||
|
$select = new Select(\Container::$dbConnection);
|
||||||
|
$select->innerJoin('place_in_challenge', ['place_in_challenge', 'id'], '=', ['guess', 'place_in_challenge_id']);
|
||||||
|
$select->where('user_id', '=', $user->getId());
|
||||||
|
$select->where('challenge_id', '=', $challenge->getId());
|
||||||
|
|
||||||
|
yield from $this->pdm->selectMultipleFromDb($select, Guess::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getByUserAndPlaceInChallenge(User $user, Challenge $challenge, Place $place) : ?Guess
|
||||||
|
{
|
||||||
|
$select = new Select(\Container::$dbConnection);
|
||||||
|
$select->innerJoin('place_in_challenge', ['place_in_challenge', 'id'], '=', ['guess', 'place_in_challenge_id']);
|
||||||
|
$select->where('user_id', '=', $user->getId());
|
||||||
|
$select->where('challenge_id', '=', $challenge->getId());
|
||||||
|
$select->where('place_id', '=', $place->getId());
|
||||||
|
|
||||||
|
return $this->pdm->selectFromDb($select, Guess::class);
|
||||||
|
}
|
||||||
|
}
|
34
src/Repository/PlaceInChallengeRepository.php
Normal file
34
src/Repository/PlaceInChallengeRepository.php
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
<?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\PlaceInChallenge;
|
||||||
|
use MapGuesser\PersistentData\PersistentDataManager;
|
||||||
|
|
||||||
|
class PlaceInChallengeRepository
|
||||||
|
{
|
||||||
|
private PersistentDataManager $pdm;
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
$this->pdm = new PersistentDataManager();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getAllByPlace(Place $place) : Generator
|
||||||
|
{
|
||||||
|
$select = new Select(\Container::$dbConnection);
|
||||||
|
$select->where('place_id', '=', $place->getId());
|
||||||
|
|
||||||
|
yield from $this->pdm->selectMultipleFromDb($select, PlaceInChallenge::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getAllByChallenge(Challenge $challenge) : Generator
|
||||||
|
{
|
||||||
|
$select = new Select(\Container::$dbConnection);
|
||||||
|
$select->where('challenge_id', '=', $challenge->getId());
|
||||||
|
|
||||||
|
yield from $this->pdm->selectMultipleFromDb($select, PlaceInChallenge::class);
|
||||||
|
}
|
||||||
|
}
|
34
src/Repository/UserInChallengeRepository.php
Normal file
34
src/Repository/UserInChallengeRepository.php
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
<?php namespace MapGuesser\Repository;
|
||||||
|
|
||||||
|
use Generator;
|
||||||
|
use MapGuesser\Database\Query\Select;
|
||||||
|
use MapGuesser\PersistentData\Model\Challenge;
|
||||||
|
use MapGuesser\PersistentData\Model\User;
|
||||||
|
use MapGuesser\PersistentData\Model\UserInChallenge;
|
||||||
|
use MapGuesser\PersistentData\PersistentDataManager;
|
||||||
|
|
||||||
|
class UserInChallengeRepository
|
||||||
|
{
|
||||||
|
private PersistentDataManager $pdm;
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
$this->pdm = new PersistentDataManager();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getAllByUser(User $user) : Generator
|
||||||
|
{
|
||||||
|
$select = new Select(\Container::$dbConnection);
|
||||||
|
$select->where('user_id', '=', $user->getId());
|
||||||
|
|
||||||
|
yield from $this->pdm->selectMultipleFromDb($select, UserInChallenge::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getAllByChallenge(Challenge $challenge) : Generator
|
||||||
|
{
|
||||||
|
$select = new Select(\Container::$dbConnection);
|
||||||
|
$select->where('challenge_id', '=', $challenge->getId());
|
||||||
|
|
||||||
|
yield from $this->pdm->selectMultipleFromDb($select, UserInChallenge::class);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user