Passed
Pull Request — master (#73)
by Dmitriy
24:13 queued 09:14
created

AppRouterFactory   A

Complexity

Total Complexity 4

Size/Duplication

Total Lines 90
Duplicated Lines 0 %

Importance

Changes 14
Bugs 1 Features 0
Metric Value
wmc 4
eloc 59
c 14
b 1
f 0
dl 0
loc 90
rs 10

1 Method

Rating   Name   Duplication   Size   Complexity  
B __invoke() 0 88 4
1
<?php
2
3
namespace App\Factory;
4
5
use App\Blog\Archive\ArchiveController;
6
use App\Blog\BlogController;
7
use App\Blog\Post\PostController;
8
use App\Blog\Tag\TagController;
9
use App\Controller\ApiInfo;
10
use App\Controller\ApiUserController;
11
use App\Controller\AuthController;
12
use App\Controller\ContactController;
13
use App\Controller\SiteController;
14
use App\Controller\UserController;
15
use App\JsonResponseFormatter;
16
use App\Response;
17
use App\ResponseFactory;
18
use App\ResponseFormatter;
19
use App\DeferredResponseFormatter;
20
use App\XmlResponseFormatter;
21
use Psr\Container\ContainerInterface;
22
use Psr\Http\Message\ServerRequestInterface;
23
use Psr\Http\Server\RequestHandlerInterface;
24
use Yiisoft\Http\Method;
25
use Yiisoft\Router\FastRoute\UrlMatcher;
26
use Yiisoft\Router\Group;
27
use Yiisoft\Router\Route;
28
use Yiisoft\Router\RouteCollection;
29
use Yiisoft\Router\RouteCollectorInterface;
30
31
class AppRouterFactory
32
{
33
    public function __invoke(ContainerInterface $container)
34
    {
35
        $routes = [
36
            // Lonely pages of site
37
            Route::get('/', [SiteController::class, 'index'])
38
                ->name('site/index'),
39
            Route::methods([Method::GET, Method::POST], '/contact', [ContactController::class, 'contact'])
40
                 ->name('site/contact'),
41
            Route::methods([Method::GET, Method::POST], '/login', [AuthController::class, 'login'])
42
                 ->name('site/login'),
43
            Route::get('/logout', [AuthController::class, 'logout'])
44
                 ->name('site/logout'),
45
46
            // User
47
            Group::create('/user', [
48
                // Index
49
                Route::get('[/page-{page:\d+}]', [UserController::class, 'index'])
50
                    ->name('user/index'),
51
                // Profile page
52
                Route::get('/{login}', [UserController::class, 'profile'])
53
                     ->name('user/profile'),
54
            ]),
55
56
            // User
57
            Group::create('/api', [
58
                Route::get('/info/v1', function (ResponseFactory $responseFactory) {
59
                    return $responseFactory->createResponse(200, '', ['version' => '1.0', 'author' => 'yiiliveext']);
60
                }),
61
                Route::get('/info/v2', ApiInfo::class)
62
                    ->addMiddleware(new ResponseFormatter($container->get(JsonResponseFormatter::class))),
63
                Route::get('/user', [ApiUserController::class, 'index'])
64
                    ->name('api/user/index'),
65
                Route::get('/user/{login}', [ApiUserController::class, 'profile'])
66
                    ->addMiddleware(new DeferredResponseFormatter($container->get(JsonResponseFormatter::class)))
67
                    ->name('api/user/profile'),
68
            ], $container)->addMiddleware(function (ServerRequestInterface $request, RequestHandlerInterface $handler) {
69
                $response = $handler->handle($request);
70
                if ($response instanceof Response) {
71
                    $data = $response->getData();
72
                    if ($response->getStatusCode() !== 200) {
73
                        if (!empty($data)) {
74
                            $message = $data;
75
                        } else {
76
                            $message = 'Unknown error';
77
                        }
78
                        return $response->withData(
79
                            ['status' => 'failed',
80
                                'error' => ['message' => $message, 'status' => $response->getStatusCode()]]);
81
                    }
82
                    return $response->withData(['status' => 'success', 'data' => $data]);
83
                }
84
85
                return $response;
86
            })->addMiddleware(new DeferredResponseFormatter($container->get(XmlResponseFormatter::class))),
87
88
            // Blog routes
89
            Group::create('/blog', [
90
                // Index
91
                Route::get('[/page{page:\d+}]', [BlogController::class, 'index'])
92
                     ->name('blog/index'),
93
                // Post page
94
                Route::get('/page/{slug}', [PostController::class, 'index'])
95
                     ->name('blog/post'),
96
                // Tag page
97
                Route::get('/tag/{label}[/page{page:\d+}]', [TagController::class, 'index'])
98
                     ->name('blog/tag'),
99
                // Archive
100
                Group::create('/blog', [
101
                    // Index page
102
                    Route::get('', [ArchiveController::class, 'index'])
103
                         ->name('blog/archive/index'),
104
                    // Yearly page
105
                    Route::get('/{year:\d+}', [ArchiveController::class, 'yearlyArchive'])
106
                         ->name('blog/archive/year'),
107
                    // Monthly page
108
                    Route::get('/{year:\d+}-{month:\d+}[/page{page:\d+}]', [ArchiveController::class, 'monthlyArchive'])
109
                         ->name('blog/archive/month')
110
                ]),
111
            ]),
112
        ];
113
114
        $collector =  $container->get(RouteCollectorInterface::class);
115
        $collector->addGroup(
116
            Group::create(null, $routes)
117
                ->addMiddleware($container->get(DeferredResponseFormatter::class))
118
        );
119
120
        return new UrlMatcher(new RouteCollection($collector));
121
    }
122
}
123