-
Notifications
You must be signed in to change notification settings - Fork 162
/
DocsController.php
90 lines (68 loc) · 2.5 KB
/
DocsController.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
<?php
namespace App\Http\Controllers;
use App\Docs\Docs;
use App\Docs\DocumentationPage;
use Illuminate\Support\Collection;
class DocsController
{
public function index(Docs $docs)
{
return view('front.pages.docs.index', [
'repositories' => $docs->getRepositories(),
]);
}
public function repository(string $repository, ?string $alias = null, Docs $docs)
{
$repository = $docs->getRepository($repository);
abort_if(is_null($repository), 404, 'Repository not found');
if ($alias) {
$alias = $repository->getAlias($alias);
abort_if(is_null($alias), 404, 'Alias not found');
} else {
$alias = $repository->aliases->first();
}
return redirect()->action([DocsController::class, 'show'], [
$repository->slug,
$alias->slug,
$alias->pages->where('section', '_root')->first()->slug,
]);
}
public function show(string $repository, string $alias, string $slug, Docs $docs)
{
$repository = $docs->getRepository($repository);
abort_if(is_null($repository), 404, 'Repository not found');
$alias = $repository->getAlias($alias);
abort_if(is_null($alias), 404, 'Alias not found');
/** @var Collection $pages */
$pages = $alias->pages;
$page = $pages->firstWhere('slug', $slug);
if (! $page) {
return redirect()->action([DocsController::class, 'repository'], [$repository->slug, $alias->slug]);
}
$repositories = $docs->getRepositories();
$navigation = $this->getNavigation($pages);
$showBigTitle = $page->slug === $navigation['_root']['pages'][0]->slug;
return view('front.pages.docs.show', compact(
'page',
'repositories',
'repository',
'pages',
'navigation',
'alias',
'showBigTitle'
));
}
private function getNavigation(Collection $pages): Collection
{
$navigation = $pages
->reduce(function (array $navigation, DocumentationPage $page) {
if ($page->isIndex()) {
$navigation[$page->section]['_index'] = $page;
} else {
$navigation[$page->section]['pages'][] = $page;
}
return $navigation;
}, []);
return collect($navigation)->sortBy(fn (array $pages) => $pages['_index']->weight ?? -1);
}
}