Passed
Push — master ( 9aa048...898b5e )
by Mattia
04:05
created

JsonController   A

Complexity

Total Complexity 10

Size/Duplication

Total Lines 167
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 10
eloc 55
dl 0
loc 167
rs 10
c 0
b 0
f 0

6 Methods

Rating   Name   Duplication   Size   Complexity  
A updateUser() 0 29 3
A userWithUsername() 0 8 2
A __construct() 0 14 1
A getMostWantedUsers() 0 5 1
A userTypeahead() 0 11 1
A user() 0 22 2
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Minepic\Http\Controllers;
6
7
use Illuminate\Http\JsonResponse;
8
use Laravel\Lumen\Http\ResponseFactory;
9
use Laravel\Lumen\Routing\Controller as BaseController;
10
use League\Fractal;
11
use League\Fractal\Manager;
12
use League\Fractal\Serializer\ArraySerializer;
13
use Minepic\Exceptions\NotFoundHttpJsonException;
14
use Minepic\Models\AccountStats;
15
use Minepic\Repositories\AccountRepository;
16
use Minepic\Resolvers\UsernameResolver;
17
use Minepic\Resolvers\UuidResolver;
18
use Minepic\Transformers\Account\AccountBasicDataTransformer;
19
use Minepic\Transformers\Account\AccountTypeaheadTransformer;
20
21
class JsonController extends BaseController
22
{
23
    /**
24
     * @var ResponseFactory
25
     */
26
    private ResponseFactory $responseFactory;
27
    /**
28
     * @var UuidResolver
29
     */
30
    private UuidResolver $uuidResolver;
31
    /**
32
     * @var AccountRepository
33
     */
34
    private AccountRepository $accountRepository;
35
    /**
36
     * @var Manager
37
     */
38
    private Manager $dataManger;
39
    /**
40
     * @var UsernameResolver
41
     */
42
    private UsernameResolver $usernameResolver;
43
44
    /**
45
     * JsonController constructor.
46
     *
47
     * @param AccountRepository $accountRepository
48
     * @param UuidResolver      $uuidResolver
49
     * @param Manager           $dataManger
50
     * @param ResponseFactory   $responseFactory
51
     * @param UsernameResolver  $usernameResolver
52
     */
53
    public function __construct(
54
        AccountRepository $accountRepository,
55
        UuidResolver $uuidResolver,
56
        Manager $dataManger,
57
        ResponseFactory $responseFactory,
58
        UsernameResolver $usernameResolver
59
    ) {
60
        $this->accountRepository = $accountRepository;
61
        $this->uuidResolver = $uuidResolver;
62
        $this->dataManger = $dataManger;
63
        $this->responseFactory = $responseFactory;
64
        $this->usernameResolver = $usernameResolver;
65
66
        $this->dataManger->setSerializer(new ArraySerializer());
67
    }
68
69
    /**
70
     * User info.
71
     *
72
     * @param string $uuid
73
     *
74
     * @throws \Exception
75
     *
76
     * @return JsonResponse
77
     */
78
    public function user($uuid = ''): JsonResponse
79
    {
80
        if (!$this->uuidResolver->resolve($uuid)) {
81
            $httpStatus = 404;
82
            $response = [
83
                'ok' => false,
84
                'message' => 'User not found',
85
            ];
86
87
            return $this->responseFactory->json($response, $httpStatus);
88
        }
89
90
        $httpStatus = 200;
91
        $account = $this->uuidResolver->getAccount();
92
        $resource = new Fractal\Resource\Item($account, new AccountBasicDataTransformer());
93
94
        $response = [
95
            'ok' => true,
96
            'data' => $this->dataManger->createData($resource)->toArray(),
97
        ];
98
99
        return $this->responseFactory->json($response, $httpStatus);
100
    }
101
102
    /**
103
     * @param string $username
104
     *
105
     * @throws \Exception
106
     *
107
     * @return JsonResponse
108
     */
109
    public function userWithUsername(string $username): JsonResponse
110
    {
111
        $uuid = $this->usernameResolver->resolve($username);
112
        if ($uuid === null) {
113
            throw new NotFoundHttpJsonException('User not found');
114
        }
115
116
        return $this->user($uuid);
117
    }
118
119
    /**
120
     * Update User data.
121
     *
122
     * @param string $uuid
123
     *
124
     * @throws \Exception
125
     *
126
     * @return JsonResponse
127
     */
128
    public function updateUser(string $uuid): JsonResponse
129
    {
130
        // Force user update
131
        $this->uuidResolver->setForceUpdate(true);
132
133
        // Check if user exists
134
        if ($this->uuidResolver->resolve($uuid)) {
135
            // Check if data has been updated
136
            if ($this->uuidResolver->userDataUpdated()) {
137
                $response = ['ok' => true, 'message' => 'Data updated'];
138
                $httpStatus = 200;
139
            } else {
140
                $userdata = $this->uuidResolver->getAccount();
141
                $dateString = $userdata->updated_at->toW3cString();
142
143
                $response = [
144
                    'ok' => false,
145
                    'message' => 'Cannot update user, userdata has been updated recently',
146
                    'last_update' => $dateString,
147
                ];
148
149
                $httpStatus = 403;
150
            }
151
        } else {
152
            $response = ['ok' => false, 'message' => 'User not found'];
153
            $httpStatus = 404;
154
        }
155
156
        return $this->responseFactory->json($response, $httpStatus);
157
    }
158
159
    /**
160
     * Username Typeahead.
161
     *
162
     * @param $term
163
     *
164
     * @return JsonResponse
165
     */
166
    public function userTypeahead($term): JsonResponse
167
    {
168
        $accountsPagination = $this->accountRepository->filterPaginate(['term' => $term], 15);
169
170
        $resource = new Fractal\Resource\Collection(
171
            $accountsPagination->items(),
172
            new AccountTypeaheadTransformer()
173
        );
174
175
        return $this->responseFactory->json(
176
            $this->dataManger->createData($resource)->toArray()
177
        );
178
    }
179
180
    /**
181
     * Get most wanted account list.
182
     */
183
    public function getMostWantedUsers(): JsonResponse
184
    {
185
        return $this->responseFactory->json([
186
            'ok' => true,
187
            'data' => AccountStats::getMostWanted(),
188
        ]);
189
    }
190
}
191