From 43c5061011369a48c8c586a05f5e44d1c6545ea6 Mon Sep 17 00:00:00 2001 From: Daniel-I-Am Date: Sat, 29 Aug 2020 01:21:51 +0200 Subject: [PATCH] Register services to deal with lodestone --- app/Services/CodeGeneratorService.php | 30 ++++++++++ app/Services/LodestoneApiService.php | 61 ++++++++++++++++++++ app/Services/LodestoneCacheService.php | 80 ++++++++++++++++++++++++++ 3 files changed, 171 insertions(+) create mode 100644 app/Services/CodeGeneratorService.php create mode 100644 app/Services/LodestoneApiService.php create mode 100644 app/Services/LodestoneCacheService.php diff --git a/app/Services/CodeGeneratorService.php b/app/Services/CodeGeneratorService.php new file mode 100644 index 0000000..5cef633 --- /dev/null +++ b/app/Services/CodeGeneratorService.php @@ -0,0 +1,30 @@ +completeCurlRequest($ch); + } + + public function getCharacterByName($server, $name) { + $ch = curl_init(); + + curl_setopt($ch, CURLOPT_URL, 'https://xivapi.com/character/search?name='.$name.'&server='.$server); + $characterResults = $this->completeCurlRequest($ch); + + if ($characterResults->Pagination->Results === 0) + throw new NotFoundHttpException(); + + return $this->getCharacterById($characterResults->Results[0]->ID); + } + + public function getFreeCompanyById($id) { + $ch = curl_init(); + + curl_setopt($ch, CURLOPT_URL, 'https://xivapi.com/freecompany/'.$id); + return $this->completeCurlRequest($ch); + } + + public function getFreeCompanyByName($server, $name) { + $ch = curl_init(); + + curl_setopt($ch, CURLOPT_URL, 'https://xivapi.com/freecompany/search?name='.$name.'&server='.$server); + $characterResults = $this->completeCurlRequest($ch); + + if ($characterResults->Pagination->Results === 0) + throw new NotFoundHttpException(); + + return $this->getFreeCompanyById($characterResults->Results[0]->ID); + } + + private function completeCurlRequest($ch) + { + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + + $result = curl_exec($ch); + if (curl_errno($ch)) { + throw new Exception('Error:' . curl_error($ch)); + } + curl_close($ch); + return json_decode($result); + } +} diff --git a/app/Services/LodestoneCacheService.php b/app/Services/LodestoneCacheService.php new file mode 100644 index 0000000..c58d042 --- /dev/null +++ b/app/Services/LodestoneCacheService.php @@ -0,0 +1,80 @@ +where('lodestoneId', $id)->first(); + if ($character !== null && $character->updated_at > $this->getCacheFreshTime()) return $character; + $fetchedCharacter = $lodestoneApiService->getCharacterById($id); + $character = LodestoneCache::updateOrCreate([ + 'type' => LodestoneCacheType::character, + 'lodestoneId' => $fetchedCharacter->Character->ID, + 'server' => $fetchedCharacter->Character->Server, + 'name' => $fetchedCharacter->Character->Name, + ],[ + 'content' => $fetchedCharacter + ]); + return $character; + } + + public function getCharacterByName($server, $name, $lodestoneApiService) { + $character = LodestoneCache::where('type', LodestoneCacheType::character)->where('server', $server)->where('name', $name)->first(); + if ($character !== null && $character->updated_at > $this->getCacheFreshTime()) return $character; + $fetchedCharacter = $lodestoneApiService->getCharacterByName($server, $name); + $character = LodestoneCache::updateOrCreate([ + 'type' => LodestoneCacheType::character, + 'lodestoneId' => $fetchedCharacter->Character->ID, + 'server' => $fetchedCharacter->Character->Server, + 'name' => $fetchedCharacter->Character->Name, + ],[ + 'content' => $fetchedCharacter + ]); + return $character; + } + + public function getFreeCompanyById($id, $lodestoneApiService) { + $freeCompany = LodestoneCache::where('type', LodestoneCacheType::freeCompany)->where('lodestoneId', $id)->first(); + if ($freeCompany !== null && $freeCompany->updated_at > $this->getCacheFreshTime()) return $freeCompany; + $fetchedFreeCompany = $lodestoneApiService->getFreeCompanyById($id); + $freeCompany = LodestoneCache::updateOrCreate([ + 'type' => LodestoneCacheType::freeCompany, + 'lodestoneId' => $fetchedFreeCompany->FreeCompany->ID, + 'server' => $fetchedFreeCompany->FreeCompany->Server, + 'name' => $fetchedFreeCompany->FreeCompany->Name, + ],[ + 'content' => $fetchedFreeCompany + ]); + return $freeCompany; + } + + public function getFreeCompanyByName($server, $name, $lodestoneApiService) { + $freeCompany = LodestoneCache::where('type', LodestoneCacheType::freeCompany)->where('server', $server)->where('name', $name)->first(); + if ($freeCompany !== null && $freeCompany->updated_at > $this->getCacheFreshTime()) return $freeCompany; + $fetchedFreeCompany = $lodestoneApiService->getFreeCompanyByName($server, $name); + $freeCompany = LodestoneCache::updateOrCreate([ + 'type' => LodestoneCacheType::freeCompany, + 'lodestoneId' => $fetchedFreeCompany->FreeCompany->ID, + 'server' => $fetchedFreeCompany->FreeCompany->Server, + 'name' => $fetchedFreeCompany->FreeCompany->Name, + ],[ + 'content' => $fetchedFreeCompany + ]); + return $freeCompany; + } + + private function getCacheFreshTime() { + return Carbon::now()->subMinutes(config('chaosapi.cachetime', 60)); + } +} + +abstract class LodestoneCacheType { + public const character = 0; + public const freeCompany = 1; +}