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

WebsiteController::composeView()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 3
dl 0
loc 8
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 3
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Minepic\Http\Controllers;
6
7
use Minepic\Misc\SplashMessage;
8
use Minepic\Models\AccountStats;
9
use Minepic\Resolvers\UsernameResolver;
10
use Minepic\Resolvers\UuidResolver;
11
use Minepic\Transformers\Account\AccountBasicDataTransformer;
12
use Illuminate\Http\Response;
13
use Laravel\Lumen\Http\ResponseFactory;
14
use Laravel\Lumen\Routing\Controller as BaseController;
15
use League\Fractal;
16
use League\Fractal\Manager;
17
use League\Fractal\Serializer\ArraySerializer;
18
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
19
20
/**
21
 * Class WebsiteController.
22
 */
23
class WebsiteController extends BaseController
24
{
25
    /**
26
     * Default title.
27
     *
28
     * @var string
29
     */
30
    private const DEFAULT_PAGE_TITLE = 'Minecraft avatar generator - Minepic';
31
32
    /**
33
     * Default description.
34
     *
35
     * @var string
36
     */
37
    private const DEFAULT_PAGE_DESCRIPTION = 'MinePic is a free Minecraft avatar and skin viewer '.
38
    'that allow users and developers to pick them for their projects';
39
40
    /**
41
     * Default keywords.
42
     *
43
     * @var string
44
     */
45
    private const DEFAULT_PAGE_KEYWORDS = 'Minecraft, Minecraft avatar viewer, pic, minepic avatar viewer, skin, '.
46
    'minecraft skin, avatar, minecraft avatar, generator, skin generator, skin viewer';
47
48
    /**
49
     * @var ResponseFactory
50
     */
51
    private ResponseFactory $responseFactory;
52
    /**
53
     * @var UuidResolver
54
     */
55
    private UuidResolver $uuidResolver;
56
    /**
57
     * @var UsernameResolver
58
     */
59
    private UsernameResolver $usernameResolver;
60
    /**
61
     * @var Manager
62
     */
63
    private Manager $dataManager;
64
65
    /**
66
     * WebsiteController constructor.
67
     *
68
     * @param UuidResolver     $uuidResolver
69
     * @param ResponseFactory  $responseFactory
70
     * @param UsernameResolver $usernameResolver
71
     * @param Manager          $dataManager
72
     */
73
    public function __construct(
74
        UuidResolver $uuidResolver,
75
        ResponseFactory $responseFactory,
76
        UsernameResolver $usernameResolver,
77
        Manager $dataManager
78
    ) {
79
        $this->responseFactory = $responseFactory;
80
        $this->uuidResolver = $uuidResolver;
81
        $this->usernameResolver = $usernameResolver;
82
        $this->dataManager = $dataManager;
83
        $this->dataManager->setSerializer(new ArraySerializer());
84
    }
85
86
    /**
87
     * Compose view with header and footer.
88
     *
89
     * @param string $page
90
     * @param array  $bodyData
91
     * @param array  $headerData
92
     *
93
     * @return string
94
     */
95
    private function composeView(
96
        string $page = '',
97
        array $bodyData = [],
98
        array $headerData = []
99
    ): string {
100
        return view('public.template.header', $headerData).
101
            view('public.'.$page, $bodyData).
102
            view('public.template.footer');
103
    }
104
105
    /**
106
     * Render fullpage (headers, body, footer).
107
     *
108
     * @param string $page
109
     * @param array  $bodyData
110
     * @param array  $headerData
111
     *
112
     * @return Response
113
     */
114
    private function renderPage(
115
        string $page = '',
116
        array $bodyData = [],
117
        array $headerData = []
118
    ): Response {
119
        $realHeaderData = [];
120
        $realHeaderData['title'] = $headerData['title'] ?? self::DEFAULT_PAGE_TITLE;
121
        $realHeaderData['description'] = $headerData['description'] ?? self::DEFAULT_PAGE_DESCRIPTION;
122
        $realHeaderData['keywords'] = $headerData['keywords'] ?? self::DEFAULT_PAGE_KEYWORDS;
123
        $realHeaderData['randomMessage'] = SplashMessage::get();
124
125
        $view = $this->composeView($page, $bodyData, $realHeaderData);
126
127
        return $this->responseFactory->make(
128
            $view,
129
            Response::HTTP_OK
130
        );
131
    }
132
133
    /**
134
     * Index.
135
     */
136
    public function index(): Response
137
    {
138
        $bodyData = [
139
            'lastRequests' => AccountStats::getLastUsers(),
140
            'mostWanted' => AccountStats::getMostWanted(),
141
        ];
142
143
        return $this->renderPage('index', $bodyData);
144
    }
145
146
    /**
147
     * User stats page.
148
     *
149
     * @param string $uuid
150
     *
151
     * @throws \Exception
152
     *
153
     * @return Response
154
     */
155
    public function user(string $uuid): Response
156
    {
157
        if ($this->uuidResolver->resolve($uuid)) {
158
            $account = $this->uuidResolver->getAccount();
159
160
            $headerData = [
161
                'title' => $account->username.' usage statistics - Minepic',
162
                'description' => 'MinePic usage statistics for the user '.$account->username,
163
                'keywords' => 'Minecraft, Minecraft avatar viewer, pic, minepic avatar viewer, skin, '.
164
                    'minecraft skin, avatar, minecraft avatar, generator, skin generator, skin viewer',
165
            ];
166
167
            $accountResource = new Fractal\Resource\Item($account, new AccountBasicDataTransformer());
168
            $bodyData = [
169
                'user' => $this->dataManager->createData($accountResource)->toArray(),
170
            ];
171
172
            return $this->renderPage('user', $bodyData, $headerData);
173
        }
174
175
        throw new NotFoundHttpException();
176
    }
177
178
    /**
179
     * @param string $username
180
     *
181
     * @throws \Exception
182
     *
183
     * @return Response
184
     */
185
    public function userWithUsername(string $username): Response
186
    {
187
        $uuid = $this->usernameResolver->resolve($username);
188
        if ($uuid === null) {
189
            throw new NotFoundHttpException();
190
        }
191
192
        return $this->user($uuid);
193
    }
194
}
195