1*c9c6f2ecSGreg Roach<?php 2*c9c6f2ecSGreg Roach 3*c9c6f2ecSGreg Roach/** 4*c9c6f2ecSGreg Roach * webtrees: online genealogy 5*c9c6f2ecSGreg Roach * Copyright (C) 2021 webtrees development team 6*c9c6f2ecSGreg Roach * This program is free software: you can redistribute it and/or modify 7*c9c6f2ecSGreg Roach * it under the terms of the GNU General Public License as published by 8*c9c6f2ecSGreg Roach * the Free Software Foundation, either version 3 of the License, or 9*c9c6f2ecSGreg Roach * (at your option) any later version. 10*c9c6f2ecSGreg Roach * This program is distributed in the hope that it will be useful, 11*c9c6f2ecSGreg Roach * but WITHOUT ANY WARRANTY; without even the implied warranty of 12*c9c6f2ecSGreg Roach * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13*c9c6f2ecSGreg Roach * GNU General Public License for more details. 14*c9c6f2ecSGreg Roach * You should have received a copy of the GNU General Public License 15*c9c6f2ecSGreg Roach * along with this program. If not, see <https://www.gnu.org/licenses/>. 16*c9c6f2ecSGreg Roach */ 17*c9c6f2ecSGreg Roach 18*c9c6f2ecSGreg Roachdeclare(strict_types=1); 19*c9c6f2ecSGreg Roach 20*c9c6f2ecSGreg Roachnamespace Fisharebest\Webtrees\Module; 21*c9c6f2ecSGreg Roach 22*c9c6f2ecSGreg Roachuse Fig\Http\Message\StatusCodeInterface; 23*c9c6f2ecSGreg Roachuse Fisharebest\Webtrees\Registry; 24*c9c6f2ecSGreg Roachuse GuzzleHttp\Client; 25*c9c6f2ecSGreg Roachuse GuzzleHttp\Exception\RequestException; 26*c9c6f2ecSGreg Roachuse GuzzleHttp\Psr7\Request; 27*c9c6f2ecSGreg Roachuse Psr\Http\Message\RequestInterface; 28*c9c6f2ecSGreg Roachuse Psr\Http\Message\ResponseInterface; 29*c9c6f2ecSGreg Roach 30*c9c6f2ecSGreg Roach/** 31*c9c6f2ecSGreg Roach * Trait ModuleMapAutocompleteTrait - default implementation of ModuleMapAutocompleteInterface 32*c9c6f2ecSGreg Roach */ 33*c9c6f2ecSGreg Roachtrait ModuleMapAutocompleteTrait 34*c9c6f2ecSGreg Roach{ 35*c9c6f2ecSGreg Roach /** 36*c9c6f2ecSGreg Roach * @param string $place 37*c9c6f2ecSGreg Roach * 38*c9c6f2ecSGreg Roach * @return array<string> 39*c9c6f2ecSGreg Roach */ 40*c9c6f2ecSGreg Roach public function searchPlaceNames(string $place): array 41*c9c6f2ecSGreg Roach { 42*c9c6f2ecSGreg Roach if (strlen($place) <= 2) { 43*c9c6f2ecSGreg Roach return []; 44*c9c6f2ecSGreg Roach } 45*c9c6f2ecSGreg Roach 46*c9c6f2ecSGreg Roach $key = $this->name() . $place; 47*c9c6f2ecSGreg Roach $cache = Registry::cache()->file(); 48*c9c6f2ecSGreg Roach $ttl = 86400; 49*c9c6f2ecSGreg Roach 50*c9c6f2ecSGreg Roach try { 51*c9c6f2ecSGreg Roach return $cache->remember($key, function () use ($place) { 52*c9c6f2ecSGreg Roach $request = $this->createPlaceNameSearchRequest($place); 53*c9c6f2ecSGreg Roach 54*c9c6f2ecSGreg Roach $client = new Client([ 55*c9c6f2ecSGreg Roach 'timeout' => 3, 56*c9c6f2ecSGreg Roach ]); 57*c9c6f2ecSGreg Roach 58*c9c6f2ecSGreg Roach $response = $client->send($request); 59*c9c6f2ecSGreg Roach 60*c9c6f2ecSGreg Roach if ($response->getStatusCode() === StatusCodeInterface::STATUS_OK) { 61*c9c6f2ecSGreg Roach return $this->parsePlaceNameSearchResponse($response); 62*c9c6f2ecSGreg Roach } 63*c9c6f2ecSGreg Roach 64*c9c6f2ecSGreg Roach return []; 65*c9c6f2ecSGreg Roach }, $ttl); 66*c9c6f2ecSGreg Roach } catch (RequestException $ex) { 67*c9c6f2ecSGreg Roach // Service down? Quota exceeded? 68*c9c6f2ecSGreg Roach // Don't try for another hour. 69*c9c6f2ecSGreg Roach $cache->remember($key, fn () => [], 3600); 70*c9c6f2ecSGreg Roach return []; 71*c9c6f2ecSGreg Roach } 72*c9c6f2ecSGreg Roach } 73*c9c6f2ecSGreg Roach 74*c9c6f2ecSGreg Roach /** 75*c9c6f2ecSGreg Roach * @param string $place 76*c9c6f2ecSGreg Roach * 77*c9c6f2ecSGreg Roach * @return RequestInterface 78*c9c6f2ecSGreg Roach */ 79*c9c6f2ecSGreg Roach protected function createPlaceNameSearchRequest(string $place): RequestInterface 80*c9c6f2ecSGreg Roach { 81*c9c6f2ecSGreg Roach return new Request('GET', ''); 82*c9c6f2ecSGreg Roach } 83*c9c6f2ecSGreg Roach 84*c9c6f2ecSGreg Roach /** 85*c9c6f2ecSGreg Roach * @param ResponseInterface $response 86*c9c6f2ecSGreg Roach * 87*c9c6f2ecSGreg Roach * @return array<string> 88*c9c6f2ecSGreg Roach */ 89*c9c6f2ecSGreg Roach protected function parsePlaceNameSearchResponse(ResponseInterface $response): array 90*c9c6f2ecSGreg Roach { 91*c9c6f2ecSGreg Roach return []; 92*c9c6f2ecSGreg Roach } 93*c9c6f2ecSGreg Roach} 94