Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
6 / 6
CRAP
100.00% covered (success)
100.00%
21 / 21
AbstractService
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
6 / 6
8
100.00% covered (success)
100.00%
21 / 21
 query
n/a
0 / 0
0
n/a
0 / 0
 __construct
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
5 / 5
 boot
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 input
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 value
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 output
100.00% covered (success)
100.00%
1 / 1
3
100.00% covered (success)
100.00%
6 / 6
 hydrate
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
5 / 5
1<?php
2
3
4namespace Qmp\Laravel\Geolocation\Services\GeolocApiServices;
5
6use Qmp\Laravel\Geolocation\Models\Location;
7use Illuminate\Support\Collection;
8
9abstract class AbstractService implements ServiceInterface
10{
11    protected $credentials;
12    protected $input;
13    protected $value;
14
15    abstract protected function query();
16
17    /**
18     * AbstractService constructor.
19     * @param $input
20     * @param $value
21     * @param Collection $config
22     */
23    public function __construct($input, $value, Collection $config)
24    {
25        $this->input($input);
26        $this->value($value);
27
28        $this->credentials = collect($config->get('credentials'));
29
30        $this->boot();
31    }
32
33    /**
34     *  Additional actions to create service's instance
35     *
36     */
37    protected function boot()
38    {
39        //
40    }
41
42    /**
43     *  Set input attribute
44     *
45     * @param $value
46     */
47    public function input($value)
48    {
49        $this->input = $value;
50    }
51
52    /**
53     *  Set value attribute
54     *
55     * @param $value
56     */
57    public function value($value)
58    {
59        $this->value = $value;
60    }
61
62    /**
63     *  Return the geolocation from the request
64     *
65     * @param array|null $value
66     * @return array|Collection
67     */
68    public function output(array $value = null)
69    {
70        $model = Location::where($this->input, $this->value)->first();
71
72        if (is_null($model)) {
73            $model = $this->hydrate($this->query());
74        }
75
76        if ($value) {
77            return $model->only($value);
78        }
79
80        return $model->toArray();
81    }
82
83    /**
84     *  Create model Location from geolocation service datas
85     *
86     * @param array $attributes
87     * @return Collection
88     * @throws \Exception
89     */
90    protected function hydrate(array $attributes = [])
91    {
92        $model = Location::create($attributes);
93
94        $model->push('history', [
95            'datetime' => (new \DateTime())->format('Y-m-d H:i:s'),
96            'service' => get_called_class()
97        ]);
98
99        return $model;
100    }
101}