Réorganisation des controllers et services et ajout GuildController

This commit is contained in:
Angels-dev
2024-08-31 19:34:05 +02:00
parent 2c6129dbcf
commit dde5f02449
5 changed files with 130 additions and 78 deletions

View File

@@ -12,7 +12,6 @@ use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Routing\Attribute\Route;
class AuthController extends AbstractController
@@ -54,7 +53,7 @@ class AuthController extends AbstractController
$tokenExpiresAt = (new DateTime())->add(new DateInterval('PT' . $expiresIn . 'S'));
// Obtenir les informations utilisateur depuis Discord
$discordUser = $this->discordApiService->getUserData($accessToken);
$discordUser = $this->discordApiService->getCurrentUserData($accessToken);
// Chercher l'utilisateur dans la base de données par son discordId
$user = $entityManager->getRepository(User::class)->findOneBy(['discordId' => $discordUser['id']]);

View File

@@ -2,14 +2,10 @@
namespace App\Controller;
use DateTime;
use DateInterval;
use App\Entity\User;
use App\Service\DiscordApiService;
use App\Exception\DiscordApiException;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
@@ -24,32 +20,10 @@ class BotController extends AbstractController
$this->discordApiService = $discordApiService;
}
private function getUserToken(SessionInterface $session, EntityManagerInterface $entityManager): ?User
{
// Vérifier si une session est en cours
if (!$session->has('user_id')) throw new DiscordApiException(Response::HTTP_UNAUTHORIZED, 'Non authentifié');
$user = $entityManager->getRepository(User::class)->find($session->get('user_id'));
if (!$user) throw new DiscordApiException(Response::HTTP_NOT_FOUND, 'Utilisateur non trouvé');
// Vérifier si l'utilisateur a un token d'accès et qu'il n'est pas expiré
if (!$user->getAccessToken() || $user->getTokenExpiresAt() < new DateTime()) {
if ($user->getRefreshToken()) {
// Rafraîchir le token d'accès
$tokenData = $this->discordApiService->refreshToken($user->getRefreshToken());
$user->setAccessToken($tokenData['access_token']);
$user->setRefreshToken($tokenData['refresh_token']);
$user->setTokenExpiresAt((new DateTime())->add(new DateInterval('PT' . $tokenData['expires_in'] . 'S')));
} throw new DiscordApiException(Response::HTTP_UNAUTHORIZED, "Token d'accès expiré et/ou token de refresh invalide");
}
return $user;
}
#[Route('/discord/bots', name: 'discord_bots')]
public function getBotsDetails(SessionInterface $session, EntityManagerInterface $entityManager): Response
{
try { $user = $this->getUserToken($session, $entityManager); }
try { $this->discordApiService->getUserToken($session, $entityManager); }
catch (DiscordApiException $e) { return new JsonResponse(['error' => $e->getMessage()], $e->getStatusCode());}
// Obtenir les informations des bots depuis Discord

View File

@@ -0,0 +1,36 @@
<?php
namespace App\Controller;
use App\Service\DiscordApiService;
use App\Exception\DiscordApiException;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Routing\Attribute\Route;
class GuildController extends AbstractController
{
private $discordApiService;
public function __construct(DiscordApiService $discordApiService)
{
$this->discordApiService = $discordApiService;
}
#[Route('/discord/guild/{guildId<\d+>}', name: 'discord_guild')]
public function getGuildDetails(String $guildId, SessionInterface $session, EntityManagerInterface $entityManager): Response
{
try { $user = $this->discordApiService->getUserToken($session, $entityManager); }
catch (DiscordApiException $e) { return new JsonResponse(['error' => $e->getMessage()], $e->getStatusCode());}
// Obtenir les informations de la guild depuis Discord
try { $discordBots = $this->discordApiService->getGuildData($guildId, $user->getAccessToken()); }
catch (DiscordApiException $e) { return new JsonResponse(['error' => $e->getMessage()], $e->getStatusCode());}
// Renvoyer les détails de la guild en JSON
return new JsonResponse($discordBots);
}
}

View File

@@ -2,14 +2,10 @@
namespace App\Controller;
use DateTime;
use DateInterval;
use App\Entity\User;
use App\Service\DiscordApiService;
use App\Exception\DiscordApiException;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
@@ -24,60 +20,51 @@ class UserController extends AbstractController
$this->discordApiService = $discordApiService;
}
private function getUserToken(SessionInterface $session, EntityManagerInterface $entityManager): ?User
#[Route('/discord/user', name: 'discord_current_user')]
public function getCurrentUserDetails(SessionInterface $session, EntityManagerInterface $entityManager): Response
{
// Vérifier si une session est en cours
if (!$session->has('user_id')) throw new DiscordApiException(Response::HTTP_UNAUTHORIZED, 'Non authentifié');
$user = $entityManager->getRepository(User::class)->find($session->get('user_id'));
if (!$user) throw new DiscordApiException(Response::HTTP_NOT_FOUND, 'Utilisateur non trouvé');
// Vérifier si l'utilisateur a un token d'accès et qu'il n'est pas expiré
if (!$user->getAccessToken() || $user->getTokenExpiresAt() < new DateTime()) {
if ($user->getRefreshToken()) {
// Rafraîchir le token d'accès
$tokenData = $this->discordApiService->refreshToken($user->getRefreshToken());
$user->setAccessToken($tokenData['access_token']);
$user->setRefreshToken($tokenData['refresh_token']);
$user->setTokenExpiresAt((new DateTime())->add(new DateInterval('PT' . $tokenData['expires_in'] . 'S')));
} throw new DiscordApiException(Response::HTTP_UNAUTHORIZED, "Token d'accès expiré et/ou token de refresh invalide");
}
return $user;
}
#[Route('/discord/user', name: 'discord_user')]
public function getUserDetails(SessionInterface $session, EntityManagerInterface $entityManager): Response
{
try { $user = $this->getUserToken($session, $entityManager); }
try { $user = $this->discordApiService->getUserToken($session, $entityManager); }
catch (DiscordApiException $e) { return new JsonResponse(['error' => $e->getMessage()], $e->getStatusCode());}
// Obtenir les informations utilisateur supplémentaires depuis Discord
try { $discordUser = $this->discordApiService->getUserData($user->getAccessToken()); }
// Obtenir les informations de l'utilisateur actuel depuis Discord
try { $discordUser = $this->discordApiService->getCurrentUserData($user->getAccessToken()); }
catch (DiscordApiException $e) { return new JsonResponse(['error' => $e->getMessage()], $e->getStatusCode());}
// Mettre à jour les informations utilisateur dans la base de données
// Mettre à jour les informations utilisateur actuel dans la base de données
$user->setUsername($discordUser['username']);
$user->setEmail($discordUser['email'] ?? null);
$entityManager->persist($user);
$entityManager->flush();
// Renvoyer les détails de l'utilisateur actuel en JSON
return new JsonResponse($discordUser);
}
#[Route('/discord/user/guilds', name: 'discord_current_user_guilds')]
public function getCurrentUserGuildsDetails(SessionInterface $session, EntityManagerInterface $entityManager): Response
{
try { $user = $this->discordApiService->getUserToken($session, $entityManager); }
catch (DiscordApiException $e) { return new JsonResponse(['error' => $e->getMessage()], $e->getStatusCode());}
// Obtenir les informations des guilds de l'utilisateur actuel depuis Discord
try { $discordUserGuilds = $this->discordApiService->getCurrentUserGuildsData($user->getAccessToken()); }
catch (DiscordApiException $e) { return new JsonResponse(['error' => $e->getMessage()], $e->getStatusCode());}
// Renvoyer les détails des guilds de l'utilisateur actuel en JSON
return new JsonResponse($discordUserGuilds);
}
#[Route('/discord/user/{userId}', name: 'discord_user', requirements: ['userId' => '\d+'])]
public function getUserDetails(String $userId, SessionInterface $session, EntityManagerInterface $entityManager): Response
{
try { $this->discordApiService->getUserToken($session, $entityManager); }
catch (DiscordApiException $e) { return new JsonResponse(['error' => $e->getMessage()], $e->getStatusCode());}
// Obtenir les informations de l'utilisateur depuis Discord
try { $discordUser = $this->discordApiService->getUserData($userId); }
catch (DiscordApiException $e) { return new JsonResponse(['error' => $e->getMessage()], $e->getStatusCode());}
// Renvoyer les détails de l'utilisateur en JSON
return new JsonResponse($discordUser);
}
#[Route('/discord/user/guilds', name: 'discord_user_guilds')]
public function getUserGuilds(SessionInterface $session, EntityManagerInterface $entityManager): Response
{
try { $user = $this->getUserToken($session, $entityManager); }
catch (DiscordApiException $e) { return new JsonResponse(['error' => $e->getMessage()], $e->getStatusCode());}
// Obtenir les informations utilisateur supplémentaires depuis Discord
try { $discordUserGuilds = $this->discordApiService->getUserGuilds($user->getAccessToken()); }
catch (DiscordApiException $e) { return new JsonResponse(['error' => $e->getMessage()], $e->getStatusCode());}
// Renvoyer les détails de l'utilisateur en JSON
return new JsonResponse($discordUserGuilds);
}
}
}

View File

@@ -2,12 +2,18 @@
namespace App\Service;
use DateTime;
use DateInterval;
use App\Entity\User;
use App\Exception\DiscordApiException;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Contracts\HttpClient\HttpClientInterface;
use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
use Symfony\Contracts\HttpClient\Exception\ClientExceptionInterface;
use Symfony\Contracts\HttpClient\Exception\ServerExceptionInterface;
use Symfony\Contracts\HttpClient\Exception\RedirectionExceptionInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
class DiscordApiService
{
@@ -64,6 +70,28 @@ class DiscordApiService
}
}
public function getUserToken(SessionInterface $session, EntityManagerInterface $entityManager): ?User
{
// Vérifier si une session est en cours
if (!$session->has('user_id')) throw new DiscordApiException(Response::HTTP_UNAUTHORIZED, 'Non authentifié');
$user = $entityManager->getRepository(User::class)->find($session->get('user_id'));
if (!$user) throw new DiscordApiException(Response::HTTP_NOT_FOUND, 'Utilisateur non trouvé');
// Vérifier si l'utilisateur a un token d'accès et qu'il n'est pas expiré
if (!$user->getAccessToken() || $user->getTokenExpiresAt() < new DateTime()) {
if ($user->getRefreshToken()) {
// Rafraîchir le token d'accès
$tokenData = $this->refreshToken($user->getRefreshToken());
$user->setAccessToken($tokenData['access_token']);
$user->setRefreshToken($tokenData['refresh_token']);
$user->setTokenExpiresAt((new DateTime())->add(new DateInterval('PT' . $tokenData['expires_in'] . 'S')));
} throw new DiscordApiException(Response::HTTP_UNAUTHORIZED, "Token d'accès expiré et/ou token de refresh invalide");
}
return $user;
}
public function getBotsData(): array
{
$output = array();
@@ -98,7 +126,7 @@ class DiscordApiService
*/
}
public function getUserData(string $accessToken): array
public function getCurrentUserData(string $accessToken): array
{
try {
$response = $this->client->request('GET', $this->baseUrl . '/users/@me', [
@@ -112,7 +140,7 @@ class DiscordApiService
}
}
public function getUserGuilds(string $accessToken): array
public function getCurrentUserGuildsData(string $accessToken): array
{
try {
$response = $this->client->request('GET', $this->baseUrl . '/users/@me/guilds', [
@@ -125,4 +153,32 @@ class DiscordApiService
throw new DiscordApiException($e->getCode(), 'Erreur lors de la requête à l\'API Discord: ' . $e->getMessage(), $e);
}
}
public function getUserData(string $userId): array
{
try {
$response = $this->client->request('GET', $this->baseUrl . '/users/' . $userId, [
'headers' => [
'Authorization' => 'Bot ' . $this->clientToken,
],
]);
return $response->toArray();
} catch (ClientExceptionInterface | ServerExceptionInterface | RedirectionExceptionInterface | TransportExceptionInterface $e) {
throw new DiscordApiException($e->getCode(), 'Erreur lors de la requête à l\'API Discord: ' . $e->getMessage(), $e);
}
}
public function getGuildData(string $guildId, string $accessToken): array
{
try {
$response = $this->client->request('GET', $this->baseUrl . '/guilds/' . $guildId, [
'headers' => [
'Authorization' => 'Bearer ' . $accessToken,
],
]);
return $response->toArray();
} catch (ClientExceptionInterface | ServerExceptionInterface | RedirectionExceptionInterface | TransportExceptionInterface $e) {
throw new DiscordApiException($e->getCode(), 'Erreur lors de la requête à l\'API Discord: ' . $e->getMessage(), $e);
}
}
}