You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
229 lines
7.2 KiB
229 lines
7.2 KiB
<?php
|
|
/**
|
|
* Nom du fichier: UserManager.php
|
|
*
|
|
* @author PEREDERII Antoine
|
|
* @date 2023-11-25
|
|
* @description Classe UserManager pour gérer les opérations liées aux utilisateurs.
|
|
*
|
|
* @package manager
|
|
*/
|
|
|
|
namespace Manager;
|
|
|
|
use Model\Athlete;
|
|
use Model\Coach;
|
|
use Model\RelationshipRequest;
|
|
use Model\User;
|
|
use Network\IAuthService;
|
|
use Network\IFriendRequestService;
|
|
use Shared\Validation;
|
|
use Stub\UserRepository;
|
|
|
|
class UserManager
|
|
{
|
|
private IAuthService $authService;
|
|
|
|
private ?User $currentUser;
|
|
|
|
private DataManager $dataManager;
|
|
|
|
private IFriendRequestService $relationshipService;
|
|
|
|
|
|
|
|
public function __construct(DataManager $dataManager, IAuthService $authService, IFriendRequestService $relationshipService)
|
|
{
|
|
$this->authService = $authService;
|
|
$this->dataManager = $dataManager;
|
|
$this->relationshipService = $relationshipService;
|
|
|
|
}
|
|
|
|
public function getCurrentUser(): ?User
|
|
{
|
|
return $this->currentUser;
|
|
}
|
|
|
|
/**
|
|
* Connecte un utilisateur avec les identifiants fournis.
|
|
*
|
|
* @param string $loginUser Le nom d'utilisateur.
|
|
* @param string $passwordUser Le mot de passe de l'utilisateur.
|
|
* @return bool Retourne true en cas de connexion réussie, sinon false.
|
|
* @throws \Exception En cas d'erreur dans les informations d'identification.
|
|
*/
|
|
public function login($emailUser, $passwordUser): bool
|
|
{
|
|
// Validate data format
|
|
if (!Validation::val_email($emailUser)) {
|
|
// The email is not valid
|
|
return false;
|
|
}
|
|
|
|
if (!Validation::val_password($passwordUser)) {
|
|
// The email is not valid
|
|
return false;
|
|
}
|
|
|
|
|
|
if ($this->authService->login($emailUser, $passwordUser)) {
|
|
$this->currentUser = $this->authService->getCurrentUser();
|
|
// Check if the current user is correctly set
|
|
if ($this->currentUser === null) {
|
|
return false;
|
|
}
|
|
return true;
|
|
} else {
|
|
// Handle unsuccessful login (e.g., log error, throw exception, etc.)
|
|
return false;
|
|
}
|
|
|
|
|
|
}
|
|
|
|
public function addFriend(string $newFriend): bool
|
|
{
|
|
$newFriend = $this->dataManager->userRepository->getItemByName($newFriend, 0, 1);
|
|
if ($newFriend === null) {
|
|
throw new \Exception("User not found.");
|
|
}
|
|
|
|
if (in_array($newFriend, $this->currentUser->getRole()->getUsersList())) {
|
|
throw new \Exception("Already friend");
|
|
}
|
|
if($this->relationshipService->sendRequest($this->currentUser, $newFriend)){
|
|
return true;
|
|
};
|
|
return false;
|
|
}
|
|
|
|
public function respondToFriendRequest(int $requestId, bool $choice): bool
|
|
{
|
|
|
|
foreach ($this->currentUser->getRole()->getUsersRequests() as $key => $friendRequest) {
|
|
/** @var RelationshipRequest $friendRequest */
|
|
if ($friendRequest->getId() === $requestId) {
|
|
/** @var User $userToAdd */
|
|
$userToAdd = $this->dataManager->userRepository->getItemById($friendRequest->getToUser());
|
|
if ($userToAdd === null) {
|
|
throw new \Exception("User not found with ID: " . $friendRequest->getFromUser());
|
|
}
|
|
if ($choice) {
|
|
try {
|
|
if($this->currentUser->getRole()->addUser($userToAdd)){
|
|
$this->dataManager->userRepository->addFriend($this->currentUser->getId(),$userToAdd->getId());
|
|
$this->relationshipService->acceptRequest($friendRequest);
|
|
$this->currentUser->getRole()->removeRequest($friendRequest);
|
|
};
|
|
}catch (\Exception $e){
|
|
$this->currentUser->getRole()->removeUser($userToAdd);
|
|
throw new \Exception("Failed to add friend" . $userToAdd->getUsername() );
|
|
}
|
|
} else {
|
|
$this->relationshipService->declineRequest($friendRequest);
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public function searchUsersByName(string $name): array
|
|
{
|
|
return $this->dataManager->userRepository->getItemsByName($name, 0, 10);
|
|
}
|
|
|
|
public function getFriends(): array {
|
|
return [
|
|
[
|
|
'nom' => 'John',
|
|
'prenom' => 'Doe',
|
|
'img' => 'test',
|
|
'username' => 'johndoe',
|
|
],
|
|
[
|
|
'nom' => 'Alice',
|
|
'prenom' => 'Smith',
|
|
'img' => 'test2',
|
|
'username' => 'alicesmith',
|
|
],
|
|
];
|
|
//return $this->currentUser->getRole()->getUsersList();
|
|
}
|
|
|
|
// NEED TO PERSIST
|
|
public function deleteFriend(int $id): bool
|
|
{
|
|
/** @var User $userToRemove */
|
|
$userToRemove = $this->dataManager->userRepository->getItemById($id);
|
|
|
|
if ($userToRemove === null) {
|
|
throw new \Exception("User not found with ID: " . $id);
|
|
}
|
|
|
|
if (!$this->currentUser->getRole()->removeUser($userToRemove)) {
|
|
throw new \Exception("User with ID: " . $id . " is not in the current user's friends list.");
|
|
}
|
|
|
|
try {
|
|
$this->dataManager->userRepository->deleteFriend($this->currentUser->getId(),$userToRemove->getId() );
|
|
}catch (\Exception $e){
|
|
throw new \Exception("Failed to delete friend" . $userToRemove->getUsername() );
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
// NEED TO PERSIST
|
|
/**
|
|
* Enregistre un nouvel utilisateur avec les informations fournies.
|
|
*
|
|
* @param string $loginUser Le nom d'utilisateur.
|
|
* @param string $passwordUser Le mot de passe de l'utilisateur.
|
|
* @param array $data Les données supplémentaires pour l'enregistrement.
|
|
* @return bool Retourne true en cas d'enregistrement réussi, sinon false.
|
|
* @throws \Exception En cas d'erreur lors de la validation des données ou de l'enregistrement.
|
|
*/
|
|
public function register($loginUser, $passwordUser, $data): bool
|
|
{
|
|
// foreach ($data as $entry) {
|
|
// $isValid = Validation::val_string($entry);
|
|
// if (!$isValid) {
|
|
// throw new \Exception( "Entry '$entry' is not a valid string.");
|
|
// }
|
|
// }
|
|
|
|
$roleName = $data['roleName'];
|
|
if ($roleName !== "Athlete" && $roleName !== "Coach") {
|
|
throw new \Exception("Rôle non valide");
|
|
}
|
|
|
|
if ($data['sexe'] !== "M" && $data['sexe'] !== "H") {
|
|
throw new \Exception("Sexe non valide");
|
|
}
|
|
|
|
if ($this->authService->register($loginUser, $passwordUser, $data)) {
|
|
$this->currentUser = $this->authService->getCurrentUser();
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Déconnecte l'utilisateur actuel.
|
|
*
|
|
* @return bool Retourne true en cas de déconnexion réussie, sinon false.
|
|
*/
|
|
public function deconnecter(): bool
|
|
{
|
|
if ($this->authService->logoutUser()) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
}
|
|
?>
|