Passed
Push — dev ( 48fd2d...413832 )
by Mattia
03:24
created

JsonController::userTypeahead()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 13
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

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