baseUrl = config('services.wikipedia.url', 'https://en.wikipedia.org/api/rest_v1'); $this->cacheTtl = config('services.wikipedia.cache_ttl', 30) * 24 * 60; // Convert days to minutes } /** * Get city summary from Wikipedia * * @param string $cityName * @return array|null */ public function getCitySummary(string $cityName): ?array { $cacheKey = "wikipedia:summary:{$cityName}"; return Cache::remember($cacheKey, $this->cacheTtl, function () use ($cityName) { try { $response = Http::withHeaders([ 'User-Agent' => 'WikiTravelApp/1.0 (contact@example.com)' ]) ->timeout(10) ->get("{$this->baseUrl}/page/summary/" . urlencode($cityName)); if ($response->successful()) { $data = $response->json(); Log::info("Wiki message ". json_encode($data)); return [ 'title' => $data['title'] ?? null, 'country' => $data['description'] ?? null, 'summary' => $data['extract'] ?? null, 'url' => $data['content_urls']['desktop']['page'] ?? null, 'page_id' => $data['pageid'] ?? null, 'thumbnail' => $data['thumbnail']['source'] ?? null, 'image' => $data['originalimage']['source'] ?? null, 'latitude' => $data['coordinates']['lat'] ?? null, 'longitude' => $data['coordinates']['lon'] ?? null, ]; } Log::warning("Wikipedia API request failed for city: {$cityName}", [ 'status' => $response->status(), ]); return null; } catch (\Exception $e) { Log::error("Wikipedia API error for city: {$cityName}", [ 'error' => $e->getMessage(), ]); return null; } }); } /** * Search for cities on Wikipedia * * @param string $query * @param int $limit * @return array */ public function searchCities(string $query, int $limit = 10): array { try { $response = Http::withHeaders([ 'User-Agent' => 'WikiTravelApp/1.0 (contact@example.com)' ]) ->timeout(10) ->get("{$this->baseUrl}/../w/api.php", [ 'action' => 'opensearch', 'search' => $query, 'limit' => $limit, 'namespace' => 0, 'format' => 'json', ]); if ($response->successful()) { $data = $response->json(); $results = []; $titles = $data[1] ?? []; $descriptions = $data[2] ?? []; $urls = $data[3] ?? []; foreach ($titles as $index => $title) { $results[] = [ 'title' => $title, 'description' => $descriptions[$index] ?? '', 'url' => $urls[$index] ?? '', ]; } return $results; } return []; } catch (\Exception $e) { Log::error("Wikipedia search error for query: {$query}", [ 'error' => $e->getMessage(), ]); return []; } } /** * Clear cache for a specific city * * @param string $cityName * @return void */ public function clearCache(string $cityName): void { Cache::forget("wikipedia:summary:{$cityName}"); } }