-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.php
More file actions
101 lines (88 loc) · 4.7 KB
/
Copy pathindex.php
File metadata and controls
101 lines (88 loc) · 4.7 KB
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
91
92
93
94
95
96
97
98
99
100
101
<?php
/**
* ИЗПИТИ – Транспортен факултет, Русенски университет „Ангел Кънчев“
* Единствена входна точка на приложението (front controller).
*/
require __DIR__ . '/app/bootstrap.php';
$route = current_route();
$method = $_SERVER['REQUEST_METHOD'] ?? 'GET';
/** Съответствие маршрут -> функция. {n} = число. */
$routes = [
// --- Публична част ------------------------------------------------
'GET ' . '' => ['public', 'home'],
'GET ' . 'izpiti' => ['public', 'exams'],
'GET ' . 'izpit/{n}' => ['public', 'exam_detail'],
'GET ' . 'informacia' => ['public', 'info'],
'GET ' . 'export/csv' => ['export', 'csv'],
'GET ' . 'export/ics' => ['export', 'ics'],
// --- Вход / изход -------------------------------------------------
'GET ' . 'admin/vhod' => ['auth_ctrl', 'login_form'],
'POST ' . 'admin/vhod' => ['auth_ctrl', 'login'],
'GET ' . 'admin/izhod' => ['auth_ctrl', 'logout'],
'POST ' . 'admin/izhod' => ['auth_ctrl', 'logout'],
'GET ' . 'admin/parola' => ['auth_ctrl', 'password_form'],
'POST ' . 'admin/parola' => ['auth_ctrl', 'password_save'],
// --- Панел --------------------------------------------------------
'GET ' . 'admin' => ['admin_dashboard', 'index'],
'GET ' . 'admin/izpiti' => ['admin_exams', 'index'],
'GET ' . 'admin/izpiti/nov' => ['admin_exams', 'create'],
'POST ' . 'admin/izpiti/nov' => ['admin_exams', 'store'],
'GET ' . 'admin/izpiti/{n}' => ['admin_exams', 'edit'],
'POST ' . 'admin/izpiti/{n}' => ['admin_exams', 'save'],
'POST ' . 'admin/izpiti/{n}/publikuvay' => ['admin_exams', 'publish'],
'POST ' . 'admin/izpiti/{n}/chernova' => ['admin_exams', 'unpublish'],
'POST ' . 'admin/izpiti/{n}/otmeni' => ['admin_exams', 'cancel'],
'POST ' . 'admin/izpiti/{n}/iztriy' => ['admin_exams', 'destroy'],
'GET ' . 'admin/izpiti/{n}/kopie' => ['admin_exams', 'duplicate'],
'GET ' . 'admin/disciplini' => ['admin_taxonomy', 'subjects'],
'POST ' . 'admin/disciplini' => ['admin_taxonomy', 'subject_save'],
'POST ' . 'admin/disciplini/{n}/iztriy' => ['admin_taxonomy', 'subject_delete'],
'GET ' . 'admin/specialnosti' => ['admin_taxonomy', 'programs'],
'POST ' . 'admin/specialnosti' => ['admin_taxonomy', 'program_save'],
'POST ' . 'admin/specialnosti/{n}/iztriy' => ['admin_taxonomy', 'program_delete'],
'GET ' . 'admin/grupi' => ['admin_taxonomy', 'groups'],
'POST ' . 'admin/grupi' => ['admin_taxonomy', 'group_save'],
'POST ' . 'admin/grupi/{n}/iztriy' => ['admin_taxonomy', 'group_delete'],
// --- Само администратор -------------------------------------------
'GET ' . 'admin/potrebiteli' => ['admin_users', 'index'],
'POST ' . 'admin/potrebiteli' => ['admin_users', 'save'],
'POST ' . 'admin/potrebiteli/{n}/iztriy' => ['admin_users', 'destroy'],
'POST ' . 'admin/potrebiteli/{n}/parola' => ['admin_users', 'reset_password'],
'GET ' . 'admin/odit' => ['admin_logs', 'audit'],
'GET ' . 'admin/odit/csv' => ['admin_logs', 'audit_csv'],
'GET ' . 'admin/poseshtenia' => ['admin_logs', 'visits'],
'POST ' . 'admin/dnevnici/izchisti' => ['admin_logs', 'cleanup'],
'GET ' . 'admin/nastroyki' => ['admin_settings', 'index'],
'POST ' . 'admin/nastroyki' => ['admin_settings', 'save'],
];
$handler = null;
$args = [];
foreach ($routes as $pattern => $target) {
[$m, $path] = explode(' ', $pattern, 2);
if ($m !== $method) {
continue;
}
if ($path === $route) {
$handler = $target;
break;
}
if (str_contains($path, '{n}')) {
$regex = '#^' . str_replace('\{n\}', '(\d+)', preg_quote($path, '#')) . '$#';
if (preg_match($regex, $route, $mm)) {
$handler = $target;
$args = array_map('intval', array_slice($mm, 1));
break;
}
}
}
// Записваме посещенията на публичните страници (не и на панела).
if (!str_starts_with($route, 'admin')) {
log_visit('/' . $route);
}
if ($handler === null) {
not_found();
}
[$file, $fn] = $handler;
require APP_DIR . '/controllers/' . $file . '.php';
$callable = $file . '_' . $fn;
$callable(...$args);