• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

mattiabasone / minepic / 4096419641

pending completion
4096419641

push

github

Mattia Basone
mockery

744 of 864 relevant lines covered (86.11%)

4.97 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

64.91
/app/Http/Controllers/JsonController.php
1
<?php
2

3
declare(strict_types=1);
4

5
namespace Minepic\Http\Controllers;
6

7
use Illuminate\Http\JsonResponse;
8
use Illuminate\Http\Response;
9
use Laravel\Lumen\Http\ResponseFactory;
10
use Laravel\Lumen\Routing\Controller as BaseController;
11
use League\Fractal;
12
use League\Fractal\Manager;
13
use League\Fractal\Serializer\ArraySerializer;
14
use Minepic\Exceptions\NotFoundHttpJsonException;
15
use Minepic\Models\Account;
16
use Minepic\Models\AccountStats;
17
use Minepic\Repositories\AccountRepository;
18
use Minepic\Resolvers\UsernameResolver;
19
use Minepic\Resolvers\UuidResolver;
20
use Minepic\Transformers\Account\AccountBasicDataTransformer;
21
use Minepic\Transformers\Account\AccountTypeaheadTransformer;
22

23
class JsonController extends BaseController
24
{
25
    private const USER_NOT_FOUND_MESSAGE = 'User not found';
26

27
    /**
28
     * @param AccountRepository $accountRepository
29
     * @param UuidResolver $uuidResolver
30
     * @param Manager $dataManger
31
     * @param ResponseFactory $responseFactory
32
     * @param UsernameResolver $usernameResolver
33
     */
34
    public function __construct(
35
        private AccountRepository $accountRepository,
36
        private UuidResolver $uuidResolver,
37
        private Manager $dataManger,
38
        private ResponseFactory $responseFactory,
39
        private UsernameResolver $usernameResolver
40
    ) {
41
        $this->dataManger->setSerializer(new ArraySerializer());
6✔
42
    }
43

44
    /**
45
     * User info.
46
     *
47
     * @param string $uuid
48
     *
49
     * @throws \Throwable
50
     * @return JsonResponse
51
     */
52
    public function user($uuid = ''): JsonResponse
53
    {
54
        if (!$this->uuidResolver->resolve($uuid)) {
3✔
55
            $httpStatus = 404;
1✔
56
            $response = [
1✔
57
                'ok' => false,
1✔
58
                'message' => self::USER_NOT_FOUND_MESSAGE,
1✔
59
            ];
1✔
60

61
            return $this->responseFactory->json($response, $httpStatus);
1✔
62
        }
63

64
        $httpStatus = 200;
2✔
65
        $account = $this->uuidResolver->getAccount();
2✔
66
        $resource = new Fractal\Resource\Item($account, new AccountBasicDataTransformer());
2✔
67

68
        $response = [
2✔
69
            'ok' => true,
2✔
70
            'data' => $this->dataManger->createData($resource)->toArray(),
2✔
71
        ];
2✔
72

73
        return $this->responseFactory->json($response, $httpStatus);
2✔
74
    }
75

76
    /**
77
     * @param string $username
78
     *
79
     * @throws \Throwable
80
     * @return JsonResponse
81
     */
82
    public function userWithUsername(string $username): JsonResponse
83
    {
84
        $uuid = $this->usernameResolver->resolve($username);
1✔
85
        if ($uuid === null) {
1✔
86
            throw new NotFoundHttpJsonException(self::USER_NOT_FOUND_MESSAGE);
×
87
        }
88

89
        return $this->user($uuid);
1✔
90
    }
91

92
    /**
93
     * Update User data.
94
     *
95
     * @param string $uuid
96
     *
97
     * @throws \Throwable
98
     * @return JsonResponse
99
     */
100
    public function updateUser(string $uuid): JsonResponse
101
    {
102
        // Force user update
103
        $this->uuidResolver->setForceUpdate(true);
1✔
104

105
        // Check if user exists
106
        if (!$this->uuidResolver->resolve($uuid)) {
1✔
107
            return $this->responseFactory->json(
1✔
108
                ['ok' => false, 'message' => self::USER_NOT_FOUND_MESSAGE],
1✔
109
                Response::HTTP_NOT_FOUND
1✔
110
            );
1✔
111
        }
112

113
        // Check if data has been updated
114
        if ($this->uuidResolver->userDataUpdated()) {
×
115
            return $this->responseFactory->json(
×
116
                ['ok' => true, 'message' => 'Data updated'],
×
117
                Response::HTTP_OK
×
118
            );
×
119
        }
120

121
        $userdata = $this->uuidResolver->getAccount();
×
122
        $dateString = $userdata->updated_at->toW3cString();
×
123

124
        $response = [
×
125
            'ok' => false,
×
126
            'message' => 'Cannot update user, userdata has been updated recently',
×
127
            'last_update' => $dateString,
×
128
        ];
×
129

130
        return $this->responseFactory->json($response, Response::HTTP_FORBIDDEN);
×
131
    }
132

133
    /**
134
     * Username Typeahead.
135
     *
136
     * @param string $username
137
     *
138
     * @return JsonResponse
139
     */
140
    public function userTypeahead(string $username): JsonResponse
141
    {
142
        $accountsPagination = $this->accountRepository->filterPaginate(['term' => $username], 15);
1✔
143

144
        $resource = new Fractal\Resource\Collection(
1✔
145
            $accountsPagination->items(),
1✔
146
            new AccountTypeaheadTransformer()
1✔
147
        );
1✔
148

149
        return $this->responseFactory->json(
1✔
150
            $this->dataManger->createData($resource)->toArray()
1✔
151
        );
1✔
152
    }
153

154
    /**
155
     * Get most wanted account list.
156
     *
157
     * @return JsonResponse
158
     */
159
    public function getMostWantedUsers(): JsonResponse
160
    {
161
        return $this->responseFactory->json([
1✔
162
            'ok' => true,
1✔
163
            'data' => AccountStats::getMostWanted(),
1✔
164
        ]);
1✔
165
    }
166

167
    /**
168
     * Check system status
169
     *
170
     * @return JsonResponse
171
     */
172
    public function check(): JsonResponse
173
    {
174
        $account = Account::whereUuid('be1cac3b60f04e0dba12c77cc8e0ec21')
×
175
            ->take(1)
×
176
            ->first();
×
177

178
        return $this->responseFactory->json([
×
179
            'ok' => $account instanceof Account,
×
180
        ]);
×
181
    }
182
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc