-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbootstrap.php
More file actions
executable file
·108 lines (102 loc) · 4.46 KB
/
Copy pathbootstrap.php
File metadata and controls
executable file
·108 lines (102 loc) · 4.46 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
102
103
104
105
106
107
108
<?php
declare(strict_types=1);
use CommunityMapMaker\Auth\AuthService;
use CommunityMapMaker\Auth\AdminUserRepository;
use CommunityMapMaker\Auth\AdminUserService;
use CommunityMapMaker\Auth\AuditLogRepository;
use CommunityMapMaker\Auth\Database;
use CommunityMapMaker\Auth\Http;
use CommunityMapMaker\Auth\NativeMailer;
use CommunityMapMaker\Auth\ProjectAccessService;
use CommunityMapMaker\Auth\RateLimiter;
use CommunityMapMaker\Auth\TokenRepository;
use CommunityMapMaker\Auth\UserRepository;
use CommunityMapMaker\Activity\ActivityRepository;
use CommunityMapMaker\Activity\ActivitySchema;
use CommunityMapMaker\Activity\ActivitySearchService;
use CommunityMapMaker\Activity\ActivityService;
use CommunityMapMaker\Activity\CsvActivityImport;
use CommunityMapMaker\Activity\ProjectRepository;
use CommunityMapMaker\Activity\ProjectService;
require_once __DIR__ . '/lib/Contracts.php';
require_once __DIR__ . '/lib/Database.php';
require_once __DIR__ . '/lib/UserRepository.php';
require_once __DIR__ . '/lib/AdminUserRepository.php';
require_once __DIR__ . '/lib/AuditLogRepository.php';
require_once __DIR__ . '/lib/TokenRepository.php';
require_once __DIR__ . '/lib/RateLimiter.php';
require_once __DIR__ . '/lib/NativeMailer.php';
require_once __DIR__ . '/lib/AuthService.php';
require_once __DIR__ . '/lib/ConsoleSession.php';
require_once __DIR__ . '/lib/AdminUserService.php';
require_once __DIR__ . '/lib/ProjectAccessService.php';
require_once __DIR__ . '/lib/Http.php';
require_once __DIR__ . '/lib/ActivityRepository.php';
require_once __DIR__ . '/lib/ProjectRepository.php';
require_once __DIR__ . '/lib/ActivitySchema.php';
require_once __DIR__ . '/lib/ActivitySearchService.php';
require_once __DIR__ . '/lib/ActivityService.php';
require_once __DIR__ . '/lib/ProjectService.php';
require_once __DIR__ . '/lib/CsvActivityImport.php';
try {
$configFile = getenv('CMM_AUTH_CONFIG') ?: __DIR__ . '/config/config.php';
if (!is_file($configFile)) {
throw new RuntimeException('Backend config is missing. Copy config/config.example.php to config/config.php.');
}
$config = require $configFile;
if (!is_array($config)) throw new RuntimeException('Backend config must return an array.');
$authConfig = (array)($config['auth'] ?? []);
Http::prepare($authConfig);
$database = new Database((array)($config['db'] ?? []));
$userRepo = new UserRepository($database->pdo());
$authService = new AuthService(
$userRepo,
new TokenRepository($database->pdo()),
new RateLimiter($database->pdo(), (string)($authConfig['rate_limit_secret'] ?? '')),
$database,
new NativeMailer((array)($config['mail'] ?? [])),
$authConfig
);
$activityConfig = (array)($config['activity'] ?? []);
$projectRepo = new ProjectRepository($database->pdo());
$activitySchema = new ActivitySchema((array)($activityConfig['apps'] ?? []), $projectRepo);
$activityRepo = new ActivityRepository($database->pdo());
$activityService = new ActivityService(
$activityRepo,
$activitySchema,
$database
);
$projectService = new ProjectService(
$projectRepo,
$activitySchema
);
$adminUserRepo = new AdminUserRepository($database->pdo());
$auditLogs = new AuditLogRepository($database->pdo());
$adminUsers = new AdminUserService($adminUserRepo, $authService, $auditLogs, $database);
$projectAccess = new ProjectAccessService($adminUserRepo);
return [
'auth' => $authService,
'user_repo' => $userRepo,
'auth_config' => $authConfig,
'admin_users' => $adminUsers,
'project_access' => $projectAccess,
'audit_logs' => $auditLogs,
'activity' => $activityService,
'activity_search' => new ActivitySearchService(
$activityRepo,
$activitySchema,
(array)($activityConfig['apps'] ?? [])
),
'activity_schema' => $activitySchema,
'activity_config' => $activityConfig,
'project_repo' => $projectRepo,
'project_service' => $projectService,
'csv_activity_import' => new CsvActivityImport($activitySchema),
];
} catch (Throwable $error) {
header('Content-Type: application/json; charset=UTF-8');
header('Cache-Control: no-store');
$requestId = bin2hex(random_bytes(8));
error_log(sprintf('Backend bootstrap error [%s]: %s', $requestId, $error->getMessage()));
Http::respond(500, ['status' => 'error', 'code' => 'server_error', 'request_id' => $requestId]);
}