feature/MAPG-235-basic-challenge-mode #48
@ -5,6 +5,7 @@ CREATE TABLE `challenges` (
|
||||
`no_move` tinyint(1) NOT NULL DEFAULT 0,
|
||||
`no_pan` tinyint(1) NOT NULL DEFAULT 0,
|
||||
`no_zoom` tinyint(1) NOT NULL DEFAULT 0,
|
||||
`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;
|
||||
|
||||
@ -15,6 +16,7 @@ CREATE TABLE `user_in_challenge` (
|
||||
`round` smallint(5) signed NOT NULL DEFAULT -1,
|
||||
`score` int(10) unsigned NOT NULL DEFAULT 0,
|
||||
`time_left` int(10) unsigned,
|
||||
`owner` tinyint(1) NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `user_id` (`user_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