WebsiteController   A
last analyzed

Complexity

Total Complexity 8

Size/Duplication

Total Lines 116
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 8
eloc 39
dl 0
loc 116
rs 10
c 0
b 0
f 0

6 Methods

Rating   Name   Duplication   Size   Complexity  
A composeView() 0 8 1
A user() 0 21 2
A renderPage() 0 16 1
A __construct() 0 7 1
A userWithUsername() 0 8 2
A index() 0 7 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Minepic\Http\Controllers;
6
7
use Illuminate\Http\Response;
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\Misc\SplashMessage;
14
use Minepic\Models\AccountStats;
15
use Minepic\Resolvers\UsernameResolver;
16
use Minepic\Resolvers\UuidResolver;
17
use Minepic\Transformers\Account\AccountBasicDataTransformer;
18
use Symfony\Component\HttpFoundation\Response as SymfonyResponse;
19
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
20
21
class WebsiteController extends BaseController
22
{
23
    /**
24
     * Default title.
25
     *
26
     * @var string
27
     */
28
    private const DEFAULT_PAGE_TITLE = 'Minecraft avatar generator - MinePic';
29
30
    /**
31
     * Default description.
32
     *
33
     * @var string
34
     */
35
    private const DEFAULT_PAGE_DESCRIPTION = 'MinePic is a free Minecraft avatar and skin viewer '.
36
    'that allow users and developers to pick them for their projects';
37
38
    /**
39
     * Default keywords.
40
     *
41
     * @var string
42
     */
43
    private const DEFAULT_PAGE_KEYWORDS = 'Minecraft, Minecraft avatar viewer, pic, minepic avatar viewer, skin, '.
44
    'minecraft skin, avatar, minecraft avatar, generator, skin generator, skin viewer, minecraft pfp generator';
45
46
    public function __construct(
47
        private readonly UuidResolver $uuidResolver,
48
        private readonly ResponseFactory $responseFactory,
49
        private readonly UsernameResolver $usernameResolver,
50
        private readonly Manager $dataManager
51
    ) {
52
        $this->dataManager->setSerializer(new ArraySerializer());
53
    }
54
55
    public function index(): Response
56
    {
57
        return $this->renderPage(
58
            'index',
59
            [
60
                'lastRequests' => AccountStats::getLastUsers(),
61
                'mostWanted' => AccountStats::getMostWanted(),
62
            ]
63
        );
64
    }
65
66
    /**
67
     * User stats page.
68
     */
69
    public function user(string $uuid): Response
70
    {
71
        if ($this->uuidResolver->resolve($uuid)) {
72
            $account = $this->uuidResolver->getAccount();
73
74
            $headerData = [
75
                'title' => $account->username.' usage statistics - Minepic',
76
                'description' => 'MinePic usage statistics for the user '.$account->username,
77
                'keywords' => 'Minecraft, Minecraft avatar viewer, pic, minepic avatar viewer, skin, '.
78
                    'minecraft skin, avatar, minecraft avatar, generator, skin generator, skin viewer',
79
            ];
80
81
            $accountResource = new Fractal\Resource\Item($account, new AccountBasicDataTransformer());
82
            $bodyData = [
83
                'user' => $this->dataManager->createData($accountResource)->toArray(),
84
            ];
85
86
            return $this->renderPage('user', $bodyData, $headerData);
87
        }
88
89
        throw new NotFoundHttpException();
90
    }
91
92
    /**
93
     * @throws \Throwable
94
     */
95
    public function userWithUsername(string $username): Response
96
    {
97
        $uuid = $this->usernameResolver->resolve($username);
98
        if ($uuid === null) {
99
            throw new NotFoundHttpException();
100
        }
101
102
        return $this->user($uuid);
103
    }
104
105
    /**
106
     * Compose view with header and footer.
107
     */
108
    private function composeView(
109
        string $page = '',
110
        array $bodyData = [],
111
        array $headerData = []
112
    ): string {
113
        return view('public.template.header', $headerData).
114
            view('public.'.$page, $bodyData).
115
            view('public.template.footer');
116
    }
117
118
    /**
119
     * Render full page (headers, body, footer).
120
     */
121
    private function renderPage(
122
        string $page = '',
123
        array $bodyData = [],
124
        array $headerData = []
125
    ): Response {
126
        $realHeaderData = [];
127
        $realHeaderData['title'] = $headerData['title'] ?? self::DEFAULT_PAGE_TITLE;
128
        $realHeaderData['description'] = $headerData['description'] ?? self::DEFAULT_PAGE_DESCRIPTION;
129
        $realHeaderData['keywords'] = $headerData['keywords'] ?? self::DEFAULT_PAGE_KEYWORDS;
130
        $realHeaderData['randomMessage'] = SplashMessage::get();
131
132
        $view = $this->composeView($page, $bodyData, $realHeaderData);
133
134
        return $this->responseFactory->make(
135
            $view,
136
            SymfonyResponse::HTTP_OK
137
        );
138
    }
139
}
140