From f5c47ceaa67c342d591680e39008fd8d2f475874 Mon Sep 17 00:00:00 2001 From: Daniel-I-Am Date: Sat, 29 Aug 2020 19:20:02 +0200 Subject: [PATCH] Implement post routes on link controller --- .../Controllers/LodestoneLinkController.php | 8 +- app/Services/LodestoneLinkingService.php | 73 ++++++++++++++++++- 2 files changed, 73 insertions(+), 8 deletions(-) diff --git a/app/Http/Controllers/LodestoneLinkController.php b/app/Http/Controllers/LodestoneLinkController.php index a026007..3b9a89b 100644 --- a/app/Http/Controllers/LodestoneLinkController.php +++ b/app/Http/Controllers/LodestoneLinkController.php @@ -68,7 +68,7 @@ class LodestoneLinkController extends Controller ) { $lodestoneId = $this->lodestoneCacheService->getCharacterByName($server, $name, $this->lodestoneApiService)->lodestoneId; - return $this->lodestoneLinkingService->validateLinkDiscord($lodestoneId, $discordUserId, $request->post('code')); + return $this->lodestoneLinkingService->validateLinkDiscord($lodestoneId, $discordUserId, $request->json()->get('code')); } public function linkDiscordId( @@ -76,7 +76,7 @@ class LodestoneLinkController extends Controller int $discordUserId, Request $request ) { - return $this->lodestoneLinkingService->validateLinkDiscord($lodestoneId, $discordUserId, $request->post('code')); + return $this->lodestoneLinkingService->validateLinkDiscord($lodestoneId, $discordUserId, $request->json()->get('code')); } public function linkWebsiteName( @@ -88,7 +88,7 @@ class LodestoneLinkController extends Controller ) { $lodestoneId = $this->lodestoneCacheService->getCharacterByName($server, $name, $this->lodestoneApiService)->lodestoneId; - return $this->lodestoneLinkingService->validateLinkWebsite($lodestoneId, $hostname, $websiteUserId, $request->post('code')); + return $this->lodestoneLinkingService->validateLinkWebsite($lodestoneId, $hostname, $websiteUserId, $request->json()->get('code')); } public function linkWebsiteId( @@ -97,6 +97,6 @@ class LodestoneLinkController extends Controller int $websiteUserId, Request $request ) { - return $this->lodestoneLinkingService->validateLinkWebsite($lodestoneId, $hostname, $websiteUserId, $request->post('code')); + return $this->lodestoneLinkingService->validateLinkWebsite($lodestoneId, $hostname, $websiteUserId, $request->json()->get('code')); } } diff --git a/app/Services/LodestoneLinkingService.php b/app/Services/LodestoneLinkingService.php index 2e44b22..0388a0c 100644 --- a/app/Services/LodestoneLinkingService.php +++ b/app/Services/LodestoneLinkingService.php @@ -96,17 +96,82 @@ class LodestoneLinkingService ]; } - public function validateLinkDiscord($lodestoneId, int $discordUserId, string $code) + public function validateLinkDiscord($lodestoneId, $discordUserId, $code) { + $character = $this->lodestoneCacheService->getCharacterById($lodestoneId, $this->lodestoneApiService)->content; + + $linkCode = LinkCode::where('expires', '>', Carbon::now()) + ->where('lodestoneId', $lodestoneId) + ->where('discordUserId', $discordUserId) + ->first(); + + if ($linkCode === null) { + // There is no code for that user + return $this->getLinkDiscord($lodestoneId, $discordUserId); + } + + if ($linkCode->code !== $code) { + // The provided code is not valid + return [ + 'linked' => false, + 'error' => 'Invalid code' + ]; + } + + UserLink::updateOrCreate([ + 'lodestoneId' => $lodestoneId + ], [ + 'discordUserId' => $discordUserId + ]); + $linkCode->delete(); + return [ - 'error' => 'Not yet implemented' + 'linked' => true, + 'lodestoneId' => $character['Character']['ID'], + 'server' => $character['Character']['Server'], + 'name' => $character['Character']['Name'], + 'discordUserId' => $discordUserId ]; } - public function validateLinkWebsite($lodestoneId, string $hostname, int $websiteUserId, string $code) + public function validateLinkWebsite($lodestoneId, $hostname, $websiteUserId, $code) { + $character = $this->lodestoneCacheService->getCharacterById($lodestoneId, $this->lodestoneApiService)->content; + + $linkCode = LinkCode::where('expires', '>', Carbon::now()) + ->where('lodestoneId', $lodestoneId) + ->where('websiteHostname', $hostname) + ->where('websiteUserId', $websiteUserId) + ->first(); + + if ($linkCode === null) { + // There is no code for that user + return $this->getLinkWebsite($lodestoneId, $hostname, $websiteUserId); + } + + if ($linkCode->code !== $code) { + // The provided code is not valid + return [ + 'linked' => false, + 'error' => 'Invalid code' + ]; + } + + UserLink::updateOrCreate([ + 'lodestoneId' => $lodestoneId + ], [ + 'websiteHostname' => $hostname, + 'websiteUserId' => $websiteUserId + ]); + $linkCode->delete(); + return [ - 'error' => 'Not yet implemented' + 'linked' => true, + 'lodestoneId' => $character['Character']['ID'], + 'server' => $character['Character']['Server'], + 'name' => $character['Character']['Name'], + 'websiteHostname' => $hostname, + 'websiteUserId' => $websiteUserId ]; } }