uri = 'https://api.phlsys.de/api/'; $this->client = Http::baseUrl($this->uri); } public function getPointsOfInterest(): Collection { $response = $this->client->get('pois'); $pois = collect($response->json()); // NOTE: Either poiNumber or poiNumberWinter is always null // TODO: Use a generic field name and fill in the one that is not null // TODO: Add a type if the poi is winter only // NOTE: we filter everything out that is not a ATTRACTIONS // NOTE: we filter everything out that is adminOnly = true $pois = $pois->filter(function ($poi) { return $poi['category'] === 'ATTRACTIONS' && $poi['adminOnly'] === false && $poi['poiNumber'] !== null && $poi["parkMonitorReferenceName"] !== null && in_array('SUMMER', $poi['seasons']); }); // sort by parkMonitorReferenceName $pois = $pois->sortBy('parkMonitorReferenceName'); return $pois->transform(function ($poi) { return new PointOfInterest( id: $poi['id'], poiNumber: $poi['poiNumber'], poiNumberWinter: $poi['poiNumberWinter'], category: $poi['category'], tags: $poi['tags'], area: $poi['area'], seasons: $poi['seasons'], title: $poi['_title']['de'], description: $poi['_description']['de'], entrance: $poi['_entrance']['world'], titleImage: key_exists('titleImage', $poi) ? $poi['titleImage']['url'] : null, ); }); } public function getLiveQueueTimes(): Collection { [ 'longitude' => $longitude, 'latitude' => $latitude ] = $this->getRandomLocation(); $latitude = number_format($latitude, 14); $longitude = number_format($longitude, 14); $user = $this->getThemeParkUser(); $user->authenticate(); $response = $this->client->get('signage-snapshots', [ 'loc' => "$latitude,$longitude", 'access_token' => $user->access_token, ]); return collect($response->json()); } private function getThemeParkUser(): ThemeParkUser { if(ThemeParkUser::query()->count() === 0) { $userData = $this->createUser(); return ThemeParkUser::query()->create([ 'username' => $userData['email'], 'password' => $userData['password'], ]); } return ThemeParkUser::query()->first(); } public function createUser(): array { $username = uuid_create().'@android.com'; $password = uuid_create(); $response = $this->client->post('app-users', [ 'email' => $username, 'password' => $password, 'language' => 'en', 'platform' => 'android', ]); return [ ...$response->json(), 'password' => $password, ]; } public function getAccessToken(ThemeParkUser $user): string { $response = $this->client->post('app-users/login', [ 'email' => $user->username, 'password' => $user->password, 'ttl' => now()->diffInSeconds(now()->addYear()), ]); return $response->json()['id']; } private function getRandomLocation(): array { // TODO: Its not random right now // $rnd = mt_rand() / mt_getrandmax(); return [ 'longitude' => 6.878342628, 'latitude' => 50.800659529, ]; } }