xref: /webtrees/app/Module/ModuleMapAutocompleteTrait.php (revision c9c6f2ec6e88594e58f14a6418e0de5aaa1484bd)
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