Passed
Push — dev ( 413832...706930 )
by Mattia
03:15
created

JsonController::getMostWantedUsers()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 3
nc 1
nop 0
dl 0
loc 5
rs 10
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace App\Http\Controllers;
6
7
use App\Core as MinepicCore;
8
use App\Database\Accounts;
9
use App\Database\AccountsStats;
10
use App\Helpers\Date as DateHelper;
11
use Illuminate\Http\JsonResponse;
12
use Laravel\Lumen\Http\ResponseFactory;
13
use Laravel\Lumen\Routing\Controller as BaseController;
14
15
class JsonController extends BaseController
16
{
17
    /**
18
     * @var ResponseFactory
19
     */
20
    private $responseFactory;
21
    /**
22
     * @var MinepicCore
23
     */
24
    private $minepicCore;
25
26
    public function __construct(MinepicCore $minepicCore, ResponseFactory $responseFactory)
27
    {
28
        $this->minepicCore = $minepicCore;
29
        $this->responseFactory = $responseFactory;
30
    }
31
32
    /**
33
     * User info.
34
     *
35
     * @param string $uuidOrName
36
     *
37
     * @return JsonResponse
38
     */
39
    public function user($uuidOrName = ''): JsonResponse
40
    {
41
        if ($this->minepicCore->initialize($uuidOrName)) {
42
            $httpStatus = 200;
43
            [$userdata, $userstats] = $this->minepicCore->getFullUserdata();
44
45
            $response = [
46
                'ok' => true,
47
                'userdata' => [
48
                    'uuid' => $userdata->uuid,
49
                    'username' => $userdata->username,
50
                    'count_request' => $userstats->count_request,
51
                    'count_search' => $userstats->count_search,
52
                    'last_request' => DateHelper::humanizeTimestamp($userstats->time_request),
53
                    'last_search' => DateHelper::humanizeTimestamp($userstats->time_search),
54
                ],
55
            ];
56
        } else {
57
            $httpStatus = 404;
58
            $response = [
59
                'ok' => false,
60
                'message' => 'User not found',
61
            ];
62
        }
63
64
        return $this->responseFactory->json($response, $httpStatus);
65
    }
66
67
    /**
68
     * Update User data.
69
     *
70
     * @param string $uuidOrName
71
     *
72
     * @return JsonResponse
73
     */
74
    public function updateUser(string $uuidOrName): JsonResponse
75
    {
76
        // Force user update
77
        $this->minepicCore->setForceUpdate(true);
78
79
        // Check if user exists
80
        if ($this->minepicCore->initialize($uuidOrName)) {
81
            // Check if data has been updated
82
            if ($this->minepicCore->userDataUpdated()) {
83
                $response = ['ok' => true, 'message' => 'Data updated'];
84
                $httpStatus = 200;
85
            } else {
86
                $userdata = $this->minepicCore->getUserdata();
87
                $dateString = $userdata->updated_at->toW3cString();
88
89
                $response = [
90
                    'ok' => false,
91
                    'message' => 'Cannot update user, userdata has been updated recently',
92
                    'last_update' => $dateString,
93
                ];
94
95
                $httpStatus = 403;
96
            }
97
        } else {
98
            $response = ['ok' => false, 'message' => 'User not found'];
99
            $httpStatus = 404;
100
        }
101
102
        return $this->responseFactory->json($response, $httpStatus);
103
    }
104
105
    /**
106
     * Username Typeahead.
107
     *
108
     * @param $term
109
     *
110
     * @return JsonResponse
111
     */
112
    public function userTypeahead($term): JsonResponse
113
    {
114
        $response = [];
115
        $accounts = Accounts::query()
116
            ->select(['username'])
117
            ->where('username', 'LIKE', $term.'%')
118
            ->take(15)
119
            ->get();
120
        foreach ($accounts as $account) {
121
            $response[]['value'] = $account->username;
122
        }
123
124
        return $this->responseFactory->json($response);
125
    }
126
127
    /**
128
     * @return JsonResponse
129
     */
130
    public function getMostWantedUsers(): JsonResponse
131
    {
132
        return $this->responseFactory->json([
133
            'ok' => true,
134
            'data' => AccountsStats::getMostWanted(),
135
        ]);
136
    }
137
}
138