BaseApi   A
last analyzed

Complexity

Total Complexity 28

Size/Duplication

Total Lines 298
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 2
Bugs 1 Features 0
Metric Value
eloc 67
c 2
b 1
f 0
dl 0
loc 298
ccs 70
cts 70
cp 1
rs 10
wmc 28

20 Methods

Rating   Name   Duplication   Size   Complexity  
A first() 0 5 1
A with() 0 3 1
A all() 0 3 1
A buildEndpoint() 0 11 3
A order() 0 5 1
A fromSlug() 0 10 2
A getResource() 0 3 1
A find() 0 10 2
A paginate() 0 7 2
A buildParams() 0 10 3
A formats() 0 5 1
A orderBy() 0 3 1
A filter() 0 5 1
A setResource() 0 5 1
A handleResponse() 0 7 2
A fields() 0 5 1
A limit() 0 5 1
A include() 0 5 1
A page() 0 5 1
A makeApiUrl() 0 3 1
1
<?php
2
3
namespace Igorsgm\Ghost\Apis;
4
5
use Igorsgm\Ghost\Models\Resources\BaseResource;
6
use Igorsgm\Ghost\Responses\ErrorResponse;
7
use Igorsgm\Ghost\Responses\SuccessResponse;
8
use Illuminate\Support\Collection;
9
10
abstract class BaseApi
11
{
12
    /**
13
     * @var string
14
     */
15
    protected $baseUrl;
16
17
    /**
18
     * @var BaseResource
19
     */
20
    protected $resource;
21
22
    public string $resourceId = '';
23
24
    public string $resourceSlug = '';
25
26
    public string $include = '';
27
28
    public string $fields = '';
29
30
    public string $formats = '';
31
32
    /**
33
     * @var string
34
     */
35
    protected $source = '';
36
37
    public string $limit = '';
38
39
    public string $filter = '';
40
41
    public string $page = '';
42
43
    public string $order = '';
44
45
    protected string $key;
46
47
    protected string $domain;
48
49
    protected string $version;
50
51 105
    protected function buildEndpoint(): string
52
    {
53 105
        $endpoint = $this->resource->getResourceName();
54
55 105
        if (! empty($this->resourceId)) {
56 28
            $endpoint .= "/$this->resourceId";
57 78
        } elseif (! empty($this->resourceSlug)) {
58 10
            $endpoint .= "/slug/$this->resourceSlug";
59
        }
60
61 105
        return $endpoint;
62
    }
63
64
    /**
65
     * @param  string  $suffix
66
     */
67 104
    protected function makeApiUrl($suffix = ''): string
68
    {
69 104
        return sprintf('%s/%s/?%s', $this->baseUrl, $this->buildEndpoint().$suffix, $this->buildParams());
70
    }
71
72 114
    protected function buildParams(): string
73
    {
74 114
        $params = ['include', 'fields', 'formats', 'source', 'filter', 'limit', 'page', 'order', 'key'];
75
76 114
        $queryParams = [];
77 114
        foreach ($params as $param) {
78 114
            $queryParams[$param] = $this->{$param} ?: null;
79
        }
80
81 114
        return http_build_query($queryParams);
82
    }
83
84
    /**
85
     * @return ErrorResponse|SuccessResponse
86
     */
87 102
    protected function handleResponse($response)
88
    {
89 102
        if ($response->failed()) {
90 4
            return new ErrorResponse($response);
91
        }
92
93 98
        return new SuccessResponse($this, $this->resource, $response);
94
    }
95
96
    /**
97
     * Return resource from slug
98
     *
99
     *
100
     * @return array|ErrorResponse|mixed
101
     */
102 9
    public function fromSlug(string $slug)
103
    {
104 9
        $this->resourceSlug = $slug;
105 9
        $response = $this->get();
0 ignored issues
show
Bug introduced by
The method get() does not exist on Igorsgm\Ghost\Apis\BaseApi. Since it exists in all sub-types, consider adding an abstract or default implementation to Igorsgm\Ghost\Apis\BaseApi. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

105
        /** @scrutinizer ignore-call */ 
106
        $response = $this->get();
Loading history...
106
107 9
        if ($response instanceof ErrorResponse) {
108 1
            return $response;
109
        }
110
111 8
        return data_get($response->data, 0, []);
112
    }
113
114
    /**
115
     * @return Collection|array[]
116
     */
117 15
    public function all()
118
    {
119 15
        return $this->limit('all')->get();
120
    }
121
122
    /**
123
     * @return BaseResource|ErrorResponse
124
     */
125 5
    public function first()
126
    {
127 5
        $response = $this->limit(1)->get();
128
129 5
        return $response->data->first();
130
    }
131
132
    /**
133
     * @return array
134
     */
135 22
    public function paginate($limit = null)
136
    {
137 22
        if (isset($limit)) {
138 22
            $this->limit = $limit;
139
        }
140
141 22
        return $this->get();
142
    }
143
144
    /**
145
     * Return resource from ID
146
     *
147
     *
148
     * @return BaseResource|ErrorResponse
149
     */
150 17
    public function find(string $id)
151
    {
152 17
        $this->resourceId = $id;
153 17
        $response = $this->get();
154
155 17
        if ($response instanceof ErrorResponse) {
156 3
            return $response;
157
        }
158
159 14
        return data_get($response->data, 0, []);
160
    }
161
162
    /**
163
     * Apply fine-grained filters to target specific data.
164
     *
165
     * @param  string  $filter
166
     * @return $this
167
     *
168
     * @see https://ghost.org/docs/content-api/#filtering
169
     * @see https://gist.github.com/ErisDS/f516a859355d515aa6ad
170
     */
171 1
    public function filter($filter): BaseApi
172
    {
173 1
        $this->filter = $filter;
174
175 1
        return $this;
176
    }
177
178
    /**
179
     * Limit how many records are returned at once
180
     *
181
     * @param  int|string  $limit
182
     * @return $this
183
     *
184
     * @see https://ghost.org/docs/content-api/#limit
185
     */
186 34
    public function limit($limit): BaseApi
187
    {
188 34
        $this->limit = strval($limit);
189
190 34
        return $this;
191
    }
192
193
    /**
194
     * @return $this
195
     */
196 123
    public function setResource(string $resourceClass): BaseApi
197
    {
198 123
        $this->resource = resolve($resourceClass);
0 ignored issues
show
Documentation Bug introduced by
It seems like resolve($resourceClass) can also be of type Illuminate\Contracts\Foundation\Application. However, the property $resource is declared as type Igorsgm\Ghost\Models\Resources\BaseResource. Maybe add an additional type check?

Our type inference engine has found a suspicous assignment of a value to a property. This check raises an issue when a value that can be of a mixed type is assigned to a property that is type hinted more strictly.

For example, imagine you have a variable $accountId that can either hold an Id object or false (if there is no account id yet). Your code now assigns that value to the id property of an instance of the Account class. This class holds a proper account, so the id value must no longer be false.

Either this assignment is in error or a type check should be added for that assignment.

class Id
{
    public $id;

    public function __construct($id)
    {
        $this->id = $id;
    }

}

class Account
{
    /** @var  Id $id */
    public $id;
}

$account_id = false;

if (starsAreRight()) {
    $account_id = new Id(42);
}

$account = new Account();
if ($account instanceof Id)
{
    $account->id = $account_id;
}
Loading history...
199
200 123
        return $this;
201
    }
202
203
    /**
204
     * @return BaseResource
205
     */
206 19
    public function getResource()
207
    {
208 19
        return $this->resource;
209
    }
210
211
    /**
212
     * Alias for Ghost's include.
213
     *
214
     * The following includes are available:
215
     * Posts & Pages: authors, tags
216
     * Authors: count.posts
217
     * Tags: count.posts
218
     * Tiers: monthly_price, yearly_price, benefits
219
     *
220
     * @param  string|array  ...$includes
221
     * @return $this
222
     *
223
     * @see https://ghost.org/docs/content-api/#include
224
     */
225 11
    public function include(...$includes): BaseApi
226
    {
227 11
        $this->include = collect($includes)->flatten()->implode(',');
228
229 11
        return $this;
230
    }
231
232
    /**
233
     * Alias for include method
234
     *
235
     * @return $this
236
     */
237 2
    public function with(...$includes): BaseApi
238
    {
239 2
        return $this->include(...$includes);
240
    }
241
242
    /**
243
     * Limit the fields returned to the response object
244
     *
245
     * @param  string|array  ...$fields
246
     * @return $this
247
     *
248
     * @see https://ghost.org/docs/content-api/#fields
249
     */
250 3
    public function fields(...$fields): BaseApi
251
    {
252 3
        $this->fields = collect($fields)->flatten()->implode(',');
253
254 3
        return $this;
255
    }
256
257
    /**
258
     * Optionally request different format for posts and pages
259
     * By default, Admin API expects and returns content in the mobiledoc format only.
260
     * To include html in the response use this parameter.
261
     *
262
     * Possible formats: html, plaintext, mobiledoc.
263
     *
264
     *
265
     * @return $this
266
     *
267
     * @see https://ghost.org/docs/content-api/#formats
268
     */
269 2
    public function formats(string $format): BaseApi
270
    {
271 2
        $this->formats = $format;
272
273 2
        return $this;
274
    }
275
276
    /**
277
     * @return $this
278
     *
279
     * @see https://ghost.org/docs/content-api/#page
280
     */
281 14
    public function page(int $page): BaseApi
282
    {
283 14
        $this->page = strval($page);
284
285 14
        return $this;
286
    }
287
288
    /**
289
     * @return $this
290
     *
291
     * @see https://ghost.org/docs/content-api/#order
292
     */
293 3
    public function order(string $attr, string $order = 'DESC'): BaseApi
294
    {
295 3
        $this->order = $attr.' '.strtolower($order);
296
297 3
        return $this;
298
    }
299
300
    /**
301
     * Alias for order method
302
     *
303
     * @return $this
304
     */
305 1
    public function orderBy(string $attr, string $order = 'DESC'): BaseApi
306
    {
307 1
        return $this->order($attr, $order);
308
    }
309
}
310