Passed
Push — master ( 383bd4...f9b6da )
by Mattia
04:34
created

JsonController::check()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

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