Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
34 / 34
100.00% covered (success)
100.00%
2 / 2
CRAP
100.00% covered (success)
100.00%
1 / 1
Routes
100.00% covered (success)
100.00%
34 / 34
100.00% covered (success)
100.00%
2 / 2
2
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 add
100.00% covered (success)
100.00%
33 / 33
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2
3declare(strict_types=1);
4
5namespace Cosray\Api;
6
7use Celema\Core\App;
8use Celema\Router\Group;
9use Celema\Router\Route;
10use Cosray\Users;
11
12final class Routes
13{
14    public function __construct(
15        private readonly Headers $headers,
16        private readonly Problems $problems,
17        private readonly Users $users,
18    ) {}
19
20    public function add(App $app, string $path): void
21    {
22        $app->group(
23            $path,
24            function (Group $api): void {
25                $api->middleware($this->headers, $this->problems, new Authenticate($this->users), new CheckLocale());
26
27                $uid = '{uid:[A-Za-z0-9-_.]{1,64}}';
28                $type = '{type:[a-z][a-z0-9-]{0,63}}';
29
30                $api->get('', [Controller\Index::class, 'index'], 'index');
31                $api->get('/types', [Controller\Types::class, 'list'], 'types');
32                $api->get("/types/{$type}", [Controller\Types::class, 'type'], 'type');
33                $api->get('/nodes', [Controller\Nodes::class, 'list'], 'nodes');
34                $api->post('/nodes/query', [Controller\Nodes::class, 'query'], 'nodes.query');
35                $api->post('/nodes', [Controller\Nodes::class, 'create'], 'nodes.create');
36                $api->get("/nodes/{$uid}", [Controller\Nodes::class, 'get'], 'node');
37                $api->put("/nodes/{$uid}", [Controller\Nodes::class, 'put'], 'node.put');
38                $api->patch("/nodes/{$uid}", [Controller\Nodes::class, 'patch'], 'node.patch');
39                $api->delete("/nodes/{$uid}", [Controller\Nodes::class, 'delete'], 'node.delete');
40                $api->get('/search', [Controller\Nodes::class, 'search'], 'search');
41                $api->get('/route', [Controller\Route::class, 'route'], 'route');
42                $api->get('/menus', [Controller\Menus::class, 'list'], 'menus');
43                $api->get('/menus/{menu:[a-z0-9-]{1,32}}', [Controller\Menus::class, 'menu'], 'menu');
44                $api->get('/assets', [Controller\Assets::class, 'list'], 'assets');
45                $api->post('/assets', [Controller\Assets::class, 'upload'], 'assets.upload');
46                $api->get("/assets/{$uid}", [Controller\Assets::class, 'get'], 'asset');
47                $api->post('/handoff', [Controller\Handoff::class, 'create'], 'handoff');
48
49                // Last, so a path the API does not know answers as a problem
50                // instead of reaching the page catchall.
51                $api->addRoute(Route::map(
52                    ['GET', 'HEAD', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'],
53                    '/...slug',
54                    [Controller\Index::class, 'missing'],
55                    'missing',
56                ));
57            },
58            'cms.api.',
59        );
60    }
61}