diff --git a/src/Controller/AuthController.php b/src/Controller/AuthController.php index 8c8c363..8608095 100644 --- a/src/Controller/AuthController.php +++ b/src/Controller/AuthController.php @@ -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']]); diff --git a/src/Controller/BotController.php b/src/Controller/BotController.php index 6a44e1d..09ffdf7 100644 --- a/src/Controller/BotController.php +++ b/src/Controller/BotController.php @@ -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 diff --git a/src/Controller/GuildController.php b/src/Controller/GuildController.php new file mode 100644 index 0000000..52967c0 --- /dev/null +++ b/src/Controller/GuildController.php @@ -0,0 +1,36 @@ +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); + } +} diff --git a/src/Controller/UserController.php b/src/Controller/UserController.php index 6380bc5..66ce81b 100644 --- a/src/Controller/UserController.php +++ b/src/Controller/UserController.php @@ -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); - } -} +} \ No newline at end of file diff --git a/src/Service/DiscordApiService.php b/src/Service/DiscordApiService.php index 5f9cbdb..b3e9774 100644 --- a/src/Service/DiscordApiService.php +++ b/src/Service/DiscordApiService.php @@ -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); + } + } } \ No newline at end of file