· 4 years ago · Aug 06, 2021, 09:40 AM
1<?php /** @noinspection StaticClosureCanBeUsedInspection */
2
3namespace API;
4
5use Aws\Sdk;
6use Controllers\ActionLogController;
7use Controllers\ArchiveSettingsController;
8use Controllers\AuditChecklistController;
9use Controllers\AuditController;
10use Controllers\AuditFileController;
11use Controllers\AuthController;
12use Controllers\ChecklistController;
13use Controllers\CommitController;
14use Controllers\EnquiryController;
15use Controllers\EnquiryFileController;
16use Controllers\FileController;
17use Controllers\FileLabelController;
18use Controllers\FileStoreController;
19use Controllers\FolderController;
20use Controllers\FolderPermissionController;
21use Controllers\FolderPropertiesController;
22use Controllers\InspectionChecklistController;
23use Controllers\InspectionController;
24use Controllers\InspectionFileController;
25use Controllers\ModuleFileController;
26use Controllers\ModulesController;
27use Controllers\NotificationController;
28use Controllers\ProjectController;
29use Controllers\ResourceController;
30use Controllers\SecurityGroupController;
31use Controllers\ShareController;
32use Controllers\ShareKeyController;
33use Controllers\TemplateController;
34use Controllers\TemplateFolderController;
35use Controllers\TemplateFolderPermissionController;
36use Controllers\UsersController;
37use Controllers\UserSettingsController;
38use Controllers\VersionedFileController;
39use Controllers\WorkgroupController;
40use Data\ArchiveService;
41use Data\Behaviors\ConcurrencyBehavior;
42use Data\Behaviors\TimestampBehavior;
43use Data\FileMigration\FileServiceSelector;
44use Data\FileService;
45use Data\LegacyFileServiceFactory;
46use Data\NotificationService;
47use Data\Repositories\ActionLogService;
48use Data\Repositories\Actions;
49use Data\Repositories\Actors;
50use Data\Repositories\Commits;
51use Data\Repositories\Files;
52use Data\Repositories\FolderPermissions;
53use Data\Repositories\FolderProperties;
54use Data\Repositories\Folders;
55use Data\Repositories\ModuleFiles;
56use Data\Repositories\Modules;
57use Data\Repositories\Notifications;
58use Data\Repositories\ResourceService;
59use Data\Repositories\ShareKeys;
60use Data\Repositories\TemplateFolderPermissions;
61use Data\Repositories\TemplateFolders;
62use Data\Repositories\Templates;
63use Data\Repositories\UserService;
64use Data\Repositories\UserSettings;
65use Data\Repositories\VersionedFiles;
66use Data\SecurityGroupService;
67use Data\TimeService;
68use Data\WorkgroupService;
69use Doctrine\Common\Annotations\AnnotationReader;
70use Doctrine\Common\Annotations\AnnotationRegistry;
71use Doctrine\Common\Annotations\CachedReader;
72use Doctrine\Common\Annotations\Reader;
73use Doctrine\Common\Cache\FilesystemCache;
74use Jose\Component\Checker\AlgorithmChecker;
75use Jose\Component\Checker\AudienceChecker;
76use Jose\Component\Checker\ExpirationTimeChecker;
77use Jose\Component\Checker\IssuedAtChecker;
78use Jose\Component\Checker\NotBeforeChecker;
79use Jose\Component\Core\Util\RSAKey;
80use Jose\Component\KeyManagement\JWKFactory;
81use Jose\Component\Signature\Algorithm\RS256;
82use Lib\ApiInvocationStrategy;
83use Lib\AuditStatusApiFilter;
84use Lib\Container;
85use Lib\Data\ModelService;
86use Lib\Data\Query\QueryBuilder;
87use Lib\Data\Query\Records\MetaRecordFactory;
88use Lib\Data\RepositoryBehavior;
89use Lib\Data\Tree;
90use Lib\EnquirySectorApiFilter;
91use Lib\EnquiryStatusApiFilter;
92use Lib\File;
93use Lib\Http\CorsMiddleware;
94use Lib\Http\Tus\TusConfig;
95use Lib\Http\Tus\TusConfigBuilder;
96use Lib\Http\Tus\TusCreationMiddleware;
97use Lib\Http\Tus\TusHeadMiddleware;
98use Lib\Http\Tus\TusMiddleware;
99use Lib\Http\Tus\TusOptionsMiddleware;
100use Lib\Http\Tus\TusPatchMiddleware;
101use Lib\InspectionStatusApiFilter;
102use Lib\IO\BucketFactory;
103use Lib\IO\S3BucketFactory;
104use Lib\Logging\ActionLog;
105use Lib\Logging\AuditLogService;
106use Lib\Logging\EnquiryLogService;
107use Lib\Logging\InspectionLogService;
108use Lib\Logging\SystemLog;
109use Lib\Mail\MailService;
110use Lib\Resources;
111use Middleware\AuditMiddleware;
112use Middleware\CustomerAuthMiddleware;
113use Middleware\EnquiryMiddleware;
114use Middleware\FolderPermissionMiddleware;
115use Middleware\InspectionMiddlware;
116use Middleware\JwtMiddleware;
117use Middleware\ModuleAuthMiddleware;
118use Middleware\NonblockingJwtMiddleware;
119use Middleware\ProjectAuthMiddleware;
120use Models\FilterEnum;
121use Phpfastcache\Core\Pool\ExtendedCacheItemPoolInterface;
122use Psr\Cache\CacheItemPoolInterface;
123use Psr\Http\Message\ResponseFactoryInterface;
124use Psr\Http\Message\ServerRequestInterface;
125use Psr\Http\Server\RequestHandlerInterface;
126use Server;
127use Services\ApiFilterService;
128use Services\Archives;
129use Services\AuditChecklistService;
130use Services\AuditService;
131use Services\ChecklistService;
132use Services\DataIntegrityService;
133use Services\EnquiryService;
134use Services\IModelIntegrityService;
135use Services\InspectionChecklistService;
136use Services\InspectionService;
137use Services\IRecordIntegrityService;
138use Services\ProjectService;
139use Services\RegistrationService;
140use Services\SecurityGroups;
141use Services\Shares;
142use Services\TokenService;
143use Slim\Exception\HttpMethodNotAllowedException;
144use Slim\Exception\HttpNotFoundException;
145use Slim\Factory\AppFactory;
146use Slim\Middleware\ErrorMiddleware;
147use Slim\Routing\RouteCollectorProxy;
148use Throwable;
149
150try {
151 require __DIR__ . '/autoloader.php';
152
153 if (enum(['local'])->contains(Server::getSysMode())) {
154 define('DEBUG', true);
155 assert_options(ASSERT_ACTIVE, 1);
156 assert_options(ASSERT_EXCEPTION, 1);
157 }
158 else {
159 define('DEBUG', false);
160 }
161
162 if (Server::getSysMode() === 'aws_tester') {
163 ini_set('error_log', '/var/www/log/api_error.log');
164 }
165
166 AnnotationRegistry::registerLoader(static function () {
167 static $loaded = null;
168 if (!$loaded) {
169 $path = Server::getPath('Lib/Annotations');
170 $loaded = File::getAll($path);
171 foreach ($loaded as $item) {
172 /** @noinspection PhpIncludeInspection */
173 require_once "$path/$item";
174 }
175 }
176 return false;
177 });
178
179 $key_path = __DIR__ . '/Resources/rsa_key.pem';
180 if (File::exists($key_path)) {
181 $jwk = JWKFactory::createFromKeyFile($key_path);
182 }
183 else {
184 $jwk = JWKFactory::createRSAKey(2048);
185 $key = RSAKey::createFromJWK($jwk);
186 $pem = $key->toPEM();
187 File::writeAllText($key_path, $pem);
188 }
189
190 $container = new Container();
191
192 $container->registerFactory(SystemLog::class, function () { return new SystemLog(DEBUG); });
193
194 $predis = Server::getCache();
195 $container->registerFactory(CacheItemPoolInterface::class, static function () use ($predis) { return $predis; });
196 $container->registerFactory(ExtendedCacheItemPoolInterface::class, static function () use ($predis) { return $predis; });
197
198 $container->registerClass(Resources::class);
199 /** @var Resources $resources */
200 $resources = $container->get(Resources::class);
201 $resources->setRoot(__DIR__ . '/Resources');
202
203 $container->registerFactory(Reader::class, static function () {
204 return new CachedReader(
205 new AnnotationReader(),
206 new FilesystemCache(__DIR__ . '/cache'),
207 DEBUG
208 );
209 });
210
211 $data_integrity = new DataIntegrityService(dict(require __DIR__ . '/Resources/data_integrity_whitelist.php'));
212 $container->registerFactory(IModelIntegrityService::class, static function () use ($data_integrity) { return $data_integrity; });
213 $container->registerFactory(IRecordIntegrityService::class, static function () use ($data_integrity) { return $data_integrity; });
214
215 $container->registerClass(QueryBuilder::class);
216 $container->registerClass(AuthController::class);
217 $container->registerClass(EnquiryController::class);
218 $container->registerClass(EnquiryFileController::class);
219 $container->registerClass(AuditController::class);
220 $container->registerClass(AuditChecklistController::class);
221 $container->registerClass(AuditFileController::class);
222 $container->registerClass(InspectionController::class);
223 $container->registerClass(InspectionChecklistController::class);
224 $container->registerClass(InspectionFileController::class);
225 $container->registerClass(FileStoreController::class);
226 $container->registerClass(ChecklistController::class);
227
228 $container->registerClass(LegacyFileServiceFactory::class);
229
230 $container->registerClass(ProjectController::class);
231 $container->registerClass(ShareController::class);
232 $container->registerClass(ShareKeyController::class);
233 $container->registerClass(FolderController::class);
234 $container->registerClass(FolderPermissionController::class);
235 $container->registerClass(FolderPropertiesController::class);
236 $container->registerClass(VersionedFileController::class);
237 $container->registerClass(ActionLogController::class);
238 $container->registerClass(NotificationController::class);
239 $container->registerClass(CommitController::class);
240 $container->registerClass(SecurityGroupController::class);
241 $container->registerClass(TemplateController::class);
242 $container->registerClass(TemplateFolderController::class);
243 $container->registerClass(ShareKeyController::class);
244 $container->registerClass(TemplateFolderPermissionController::class);
245 $container->registerClass(ArchiveSettingsController::class);
246 $container->registerClass(ModuleFileController::class);
247 $container->registerClass(UserSettingsController::class);
248 $container->registerClass(UsersController::class);
249 $container->registerClass(ModulesController::class);
250 $container->registerClass(WorkgroupController::class);
251 $container->registerClass(ResourceController::class);
252 $container->registerClass(EnquiryService::class);
253 $container->registerClass(AuditService::class);
254 $container->registerClass(AuditChecklistService::class);
255 $container->registerClass(InspectionService::class);
256 $container->registerClass(ChecklistService::class);
257 $container->registerClass(SecurityGroups::class);
258 $container->registerClass(VersionedFiles::class);
259 $container->registerClass(ResourceService::class);
260 $container->registerClass(Notifications::class);
261 $container->registerClass(ActionLogService::class);
262 $container->registerClass(UserSettings::class);
263 $container->registerClass(Folders::class);
264 $container->registerClass(FolderPermissions::class);
265 $container->registerClass(FolderProperties::class);
266 $container->registerClass(Commits::class);
267 $container->registerClass(Files::class);
268 $container->registerClass(Templates::class);
269 $container->registerClass(TemplateFolders::class);
270 $container->registerClass(ShareKeys::class);
271 $container->registerClass(TemplateFolderPermissions::class);
272 $container->registerClass(SecurityGroupService::class);
273 $container->registerClass(Archives::class);
274 $container->registerClass(ModuleFiles::class);
275 $container->registerClass(Modules::class);
276
277 $container->registerFactory(TokenService::class, static function () use ($jwk) { return new TokenService($jwk); });
278 $container->registerClass(TimeService::class);
279 $container->registerClass(UserService::class);
280 $container->registerClass(RegistrationService::class);
281 $container->registerClass(ArchiveService::class);
282 $container->registerClass(ModelService::class);
283 $container->registerClass(FileService::class);
284 $container->registerClass(FileServiceSelector::class);
285 $container->registerClass(InspectionChecklistService::class);
286 $container->registerClass(Tree::class);
287 $container->registerClass(MetaRecordFactory::class);
288 $container->registerClass(WorkgroupService::class);
289
290 $container->registerClass(ProjectService::class);
291 $container->registerClass(Shares::class);
292 $container->registerClass(ShareKeys::class);
293
294 $container->registerClass(CorsMiddleware::class);
295 $container->registerClass(ModuleAuthMiddleware::class);
296 $container->registerClass(ProjectAuthMiddleware::class);
297 $container->registerClass(CustomerAuthMiddleware::class);
298 $container->registerClass(FolderPermissionMiddleware::class);
299
300 $container->registerClass(EnquiryLogService::class);
301 $container->registerClass(AuditLogService::class);
302 $container->registerClass(InspectionLogService::class);
303 $container->registerClass(NotificationService::class);
304 $container->registerClass(MailService::class);
305
306 $container->registerClass(ActionLog::class);
307 $container->registerClass(Actions::class);
308 $container->registerClass(Actors::class);
309
310 $container->registerFactory(Sdk::class, function () {
311 return new Sdk([
312 'profile' => 'default',
313 'region' => 'eu-west-1',
314 'version' => 'latest',
315 ]);
316 });
317 $container->registerService(BucketFactory::class, S3BucketFactory::class);
318
319 // TUS
320 $container->registerFactory(TusConfig::class, function () {
321 return TusConfigBuilder::new()
322 ->withResumable('1.0.0')
323 ->withVersions(['1.0.0'])
324 ->withMaxSize(1024 * 1024 * 1024 * 2)
325 ->withCreation()
326 ->build();
327 });
328 $container->registerClass(TusMiddleware::class);
329 $container->registerClass(TusOptionsMiddleware::class);
330 $container->registerClass(TusHeadMiddleware::class);
331 $container->registerClass(TusPatchMiddleware::class);
332 $container->registerClass(TusCreationMiddleware::class);
333
334 $container->registerClass(FileController::class);
335
336 $filter_service = new ApiFilterService();
337 $filter_service->offsetSet(FilterEnum::SECTORS()->getValue(), new EnquirySectorApiFilter());
338 $filter_service->offsetSet(FilterEnum::ENQUIRY_STATUS()->getValue(), new EnquiryStatusApiFilter());
339 $filter_service->offsetSet(FilterEnum::AUDIT_STATUS()->getValue(), new AuditStatusApiFilter());
340 $filter_service->offsetSet(FilterEnum::INSPECTION_STATUS()->getValue(), new InspectionStatusApiFilter());
341 $container->registerFactory(ApiFilterService::class, static function () use ($filter_service) { return $filter_service; });
342
343 $container->registerFactory(RepositoryBehavior::class, function () {
344 return TimestampBehavior::new()->add(ConcurrencyBehavior::new());
345 });
346
347 if (DEBUG) {
348 $predis->clear();
349 }
350
351 /** @var QueryBuilder $query */
352 $query = $container->getInstance(QueryBuilder::class);
353 $query->getReader()->set_charset('utf8mb4');
354 $query->getWriter()->set_charset('utf8mb4');
355
356 AppFactory::setContainer($container);
357 $app = AppFactory::create();
358
359 $container->registerFactory(ResponseFactoryInterface::class, function () use ($app) { return $app->getResponseFactory(); });
360
361 $app->setBasePath('/c-web/api/v1');
362
363 $app->getRouteCollector()
364 ->setDefaultInvocationStrategy(new ApiInvocationStrategy($app->getContainer()));
365
366 // Middleware
367 // Last added gets called first and last.
368 $jwt_middleware = (new JwtMiddleware($container->get(UserService::class)))
369 ->setWhitelist('localhost', 'cweb.devo', 'c-web.dk', 'next.c-web.dk', 'staging.c-web.dk', 'dev.c-web.dk', 'app.c-web.dk')
370 ->addHeaderChecker('alg', new AlgorithmChecker(['RS256']))
371 ->addClaimChecker('iat', new IssuedAtChecker())
372 ->addClaimChecker('nbf', new NotBeforeChecker())
373 ->addClaimChecker('exp', new ExpirationTimeChecker())
374 ->addClaimChecker('aud', new AudienceChecker('https://c-web.dk'))
375 ->setRequiredClaims('sub')
376 ->setAlgorithm(new RS256())
377 ->setKey(File::readAllText($key_path));
378
379 $container->registerFactory(JwtMiddleware::class, function () use ($jwt_middleware) { return $jwt_middleware; });
380 $container->registerClass(NonblockingJwtMiddleware::class);
381
382 if (DEBUG) {
383 $app->add(function (ServerRequestInterface $request, RequestHandlerInterface $handler) {
384 try {
385 return $handler->handle($request);
386 }
387 catch (HttpNotFoundException $e) {
388 error_log('404:' . $request->getMethod() . ':' . $request->getUri()->getPath());
389 throw $e;
390 }
391 catch (HttpMethodNotAllowedException $e) {
392 error_log('405:' . $request->getMethod() . ':' . $request->getUri()->getPath());
393 throw $e;
394 }
395 });
396 }
397 $app->add(new ErrorMiddleware(
398 $app->getCallableResolver(),
399 $app->getResponseFactory(),
400 DEBUG,
401 true,
402 true
403 ));
404
405 // Routes
406 // auth
407 $app->group('/auth', function (RouteCollectorProxy $group) use ($jwt_middleware) {
408 $group->post('/login', AuthController::class . ':login');
409
410 $group->group('/user_settings', function (RouteCollectorProxy $group) {
411 $group->get('', UserSettingsController::class . ':getUserSettings');
412 $group->put('', UserSettingsController::class . ':putUserSettings');
413 })->add($jwt_middleware);
414
415 $group->group('/check_token', function (RouteCollectorProxy $group) {
416 $group->get('', AuthController::class . ':checkToken');
417 })->add($jwt_middleware);
418 });
419
420 //resource
421 $app->group('/resource', function (RouteCollectorProxy $group) use ($jwt_middleware) {
422 $group->get('/unit_types', ResourceController::class . ':getUnitTypes');
423 $group->get('/highlights', ResourceController::class . ':getHighlights');
424 })->add($jwt_middleware);
425
426
427 // notification
428 $app->group('/notification', function (RouteCollectorProxy $group) use ($jwt_middleware) {
429 $group->get('/{project_id:[0-9]+}', NotificationController::class . ':getNotificationMailQueue');
430 $group->put('/mail_que', NotificationController::class . ':updateStateOfEmailQueue');
431 })->add($jwt_middleware);
432
433 // store
434 $app->group('/store/{guid:[0-9a-fA-F]{32}}', function (RouteCollectorProxy $group) use ($jwt_middleware) {
435 $group->get('', FileStoreController::class . ':get')->add($jwt_middleware);
436 $group->options('', FileStoreController::class . ':options');
437 });
438
439 // shares
440 $app->group('/shares', function (RouteCollectorProxy $group) {
441 $group->get('', ShareController::class . ':getShares');
442 $group->post('', ShareController::class . ':postShare');
443
444 $group->group('/{share_id:[A-Fa-f0-9]+}', function (RouteCollectorProxy $group) {
445 $group->get('', ShareController::class . ':getShare');
446 $group->put('', ShareController::class . ':putShare');
447
448 $group->group('/share_keys', function (RouteCollectorProxy $group) {
449 $group->get('', ShareKeyController::class . ':getShareKeys');
450 $group->post('', ShareKeyController::class . ':postShareKey');
451
452 $group->group('/{share_key_id:[A-Fa-f0-9]+}', function (RouteCollectorProxy $group) {
453 $group->get('', ShareKeyController::class . ':getShareKey');
454 $group->put('', ShareKeyController::class . ':putShareKey');
455 });
456 });
457
458 $group->group('/files', function (RouteCollectorProxy $group) {
459 $group->get('', ShareController::class . ':getFiles');
460 $group->put('', ShareController::class . ':putFiles');
461
462 $group->group('/{file_id:[A-Fa-f0-9]+}', function (RouteCollectorProxy $group) {
463 $group->get('', ShareController::class . ':getFile');
464 });
465 });
466 });
467 })->add(new NonblockingJwtMiddleware($jwt_middleware));
468
469 // files
470 $app->group('/files', function (RouteCollectorProxy $group) {
471 $group->post('', FileController::class . ':post')->add(TusCreationMiddleware::class);
472 $group->get('', FileController::class . ':getAll');
473
474 $group->group('/{guid:[0-9a-fA-F]{32}}', function (RouteCollectorProxy $group) {
475 $group->get('', FileController::class . ':get');
476 $group->map(['HEAD'], '', FileController::class . ':head')->add(TusHeadMiddleware::class);
477 $group->patch('', FileController::class . ':patch')->add(TusPatchMiddleware::class);
478 });
479 })->add(TusOptionsMiddleware::class)->add(TusMiddleware::class)->add(NonblockingJwtMiddleware::class);
480
481 // customers
482 $app->group('/customers', function (RouteCollectorProxy $group) {
483 $group->group('/{customer_id:[0-9]+}', function (RouteCollectorProxy $group) {
484 $group->group('/templates', function (RouteCollectorProxy $group) {
485 $group->post('', TemplateController::class . ':postTemplate');
486 $group->get('', TemplateController::class . ':getTemplates');
487
488 $group->group('/{template_id:[0-9]+}', function (RouteCollectorProxy $group) {
489 $group->get('', TemplateController::class . ':getTemplate');
490 $group->put('', TemplateController::class . ':putTemplate');
491 $group->delete('', TemplateController::class . ':deleteTemplate');
492
493 $group->group('/folders', function (RouteCollectorProxy $group) {
494 $group->post('', TemplateFolderController::class . ':postTemplateFolder');
495 $group->get('', TemplateFolderController::class . ':getTemplateFolders');
496
497 $group->group('/{folder_id:[0-9]+}', function (RouteCollectorProxy $group) {
498 $group->get('', TemplateFolderController::class . ':getTemplateFolder');
499 $group->put('', TemplateFolderController::class . ':putTemplateFolder');
500 $group->delete('', TemplateFolderController::class . ':deleteTemplateFolder');
501 });
502 });
503 $group->group('/folder_permissions', function (RouteCollectorProxy $group) {
504 $group->post('', TemplateFolderPermissionController::class . ':postTemplateFolderPermission');
505 $group->get('', TemplateFolderPermissionController::class . ':getTemplateFolderPermissions');
506
507 $group->group('/{folder_permission_id:[0-9]+}', function (RouteCollectorProxy $group) {
508 $group->get('', TemplateFolderPermissionController::class . ':getTemplateFolderPermission');
509 $group->put('', TemplateFolderPermissionController::class . ':putTemplateFolderPermission');
510 $group->delete('', TemplateFolderPermissionController::class . ':deleteTemplateFolderPermission');
511 });
512 });
513 });
514 });
515 })->add(CustomerAuthMiddleware::class);
516 })->add($jwt_middleware);
517
518 // projects
519 $app->group('/projects', function (RouteCollectorProxy $group) {
520 $group->post('', ProjectController::class . ':postProject');
521 $group->get('', ProjectController::class . ':getProjects');
522
523 $group->group('/{project_id:[0-9]+}', function (RouteCollectorProxy $group) {
524 $group->get('', ProjectController::class . ':getProject');
525 $group->put('', ProjectController::class . ':putProject');
526
527 $group->group('/action_log', function (RouteCollectorProxy $group) {
528 $group->post('', ActionLogController::class . ':getActionLogCSV');
529 $group->get('/commit/{commit_id:[0-9]+}', ActionLogController::class . ':getCommitWithFullVersion');
530
531 //versionfile action log
532 $group->group('/versionedfile', function (RouteCollectorProxy $group) { // TODO Martin
533 $group->get('', ActionLogController::class . ':getVersionedFileLog');
534 $group->group('/{versionedfile_id:[0-9]+}', function (RouteCollectorProxy $group) {
535 $group->get('', ActionLogController::class . ':getVersionedFileLog');
536 });
537 });
538 //folder action log
539 $group->group('/folder', function (RouteCollectorProxy $group) {
540 $group->get('', ActionLogController::class . ':getFolderLog');
541 $group->group('/{folder_id:[0-9]+}', function (RouteCollectorProxy $group) {
542 $group->get('', ActionLogController::class . ':getFolderLog');
543 });
544 });
545 //file action log
546 $group->group('/file', function (RouteCollectorProxy $group) {
547 $group->get('', ActionLogController::class . ':getFileLog');
548 $group->group('/{file_id:[0-9a-fA-F]{32}}', function (RouteCollectorProxy $group) {
549 $group->get('', ActionLogController::class . ':getFileLog');
550 });
551 });
552 //folder permission
553 $group->group('/folder_permission', function (RouteCollectorProxy $group) {
554 $group->get('', ActionLogController::class . ':getFolderPermissionLog');
555 $group->group('/{folder_id:[0-9]+}', function (RouteCollectorProxy $group) {
556 $group->get('', ActionLogController::class . ':getFolderPermissionLog');
557 });
558 });
559 //auth login action log
560 $group->group('/auth_login', function (RouteCollectorProxy $group) {
561 $group->get('', ActionLogController::class . ':getAuthLoginLog');
562 $group->group('/{user_id:[0-9]+}', function (RouteCollectorProxy $group) {
563 $group->get('', ActionLogController::class . ':getAuthLoginLog');
564 });
565 });
566 //security group action log
567 $group->group('/security_group', function (RouteCollectorProxy $group) {
568 $group->get('', ActionLogController::class . ':getSecurityGroupLog');
569 $group->group('/{security_group_id:[0-9]+}', function (RouteCollectorProxy $group) {
570 $group->get('', ActionLogController::class . ':getSecurityGroupLog');
571 });
572 });
573 //varchive settings project aciton log
574 $group->get('/archive_settings_project', ActionLogController::class . ':getArchiveSettingsProjectLog');
575 //share action log
576 $group->group('/share', function (RouteCollectorProxy $group) {
577 $group->get('', ActionLogController::class . ':getShareLog');
578 $group->group('/{share_id:[0-9a-fA-F]{32}}', function (RouteCollectorProxy $group) {
579 $group->get('', ActionLogController::class . ':getShareLog');
580 });
581 });
582 });
583
584 $group->group('/enquiries', function (RouteCollectorProxy $group) {
585 $group->post('', EnquiryController::class . ':postEnquiry');
586 $group->get('', EnquiryController::class . ':getEnquiries');
587
588 $group->group('/{enquiry_id:[0-9]+}', function (RouteCollectorProxy $group) {
589 $group->get('', EnquiryController::class . ':getEnquiry');
590 $group->put('', EnquiryController::class . ':putEnquiry');
591 $group->delete('', EnquiryController::class . ':deleteEnquiry');
592
593 $group->get('/notified_users', EnquiryController::class . ':getEnquiryNotifiedUsers');
594 $group->put('/notified_users', EnquiryController::class . ':putEnquiryNotifiedUsers');
595
596 $group->get('/reshare_users', EnquiryController::class . ':getEnquiryReshareUsers');
597 $group->put('/reshare_users', EnquiryController::class . ':putEnquiryReshareUsers');
598
599 $group->get('/assigned_users', EnquiryController::class . ':getEnquiryAssignedUsers');
600 $group->put('/assigned_users', EnquiryController::class . ':putEnquiryAssignedUsers');
601
602 $group->get('/positions', EnquiryController::class . ':getEnquiryPositions');
603 $group->put('/positions', EnquiryController::class . ':putEnquiryPositions');
604
605 $group->group('/files', function (RouteCollectorProxy $group) {
606 $group->post('', EnquiryFileController::class . ':postEnquiryFile');
607 $group->get('', EnquiryFileController::class . ':getEnquiryFiles');
608 $group->get('/{file_id:[0-9]+}', EnquiryFileController::class . ':getEnquiryFile');
609 });
610 $group->group('/pictures', function (RouteCollectorProxy $group) {
611 $group->post('', EnquiryFileController::class . ':postEnquiryPicture');
612 $group->get('', EnquiryFileController::class . ':getEnquiryPictures');
613
614 $group->group('/{file_id:[0-9]+}', function (RouteCollectorProxy $group) {
615 $group->get('', EnquiryFileController::class . ':getEnquiryPicture');
616 $group->put('', EnquiryFileController::class . ':putEnquiryPicture');
617 $group->delete('', EnquiryFileController::class . ':deleteEnquiryPicture');
618
619 $group->group('/drawings', function (RouteCollectorProxy $group) {
620 $group->post('', EnquiryFileController::class . ':postEnquiryDrawing');
621 $group->get('', EnquiryFileController::class . ':getEnquiryDrawings');
622 $group->get('/{drawing_id:[0-9]+}', EnquiryFileController::class . ':getEnquiryDrawing');
623 });
624 });
625 });
626 $group->group('/comments', function (RouteCollectorProxy $group) {
627 $group->get('', EnquiryController::class . ':getEnquiryComments');
628 $group->post('', EnquiryController::class . ':postEnquiryComment');
629
630 $group->group('/{comment_id:[0-9]+}', function (RouteCollectorProxy $group) {
631 $group->get('', EnquiryController::class . ':getEnquiryComment');
632 $group->put('', EnquiryController::class . ':putEnquiryComment');
633
634 $group->group('/files', function (RouteCollectorProxy $group) {
635 $group->post('', EnquiryFileController::class . ':postEnquiryCommentFile');
636 $group->get('', EnquiryFileController::class . ':getEnquiryCommentFiles');
637 $group->get('/{file_id:[0-9]+}', EnquiryFileController::class . ':getEnquiryCommentFile');
638 });
639 $group->group('/pictures', function (RouteCollectorProxy $group) {
640 $group->post('', EnquiryFileController::class . ':postEnquiryCommentPicture');
641 $group->get('', EnquiryFileController::class . ':getEnquiryCommentPictures');
642
643 $group->group('/{file_id:[0-9]+}', function (RouteCollectorProxy $group) {
644 $group->get('', EnquiryFileController::class . ':getEnquiryCommentPicture');
645
646 $group->group('/drawings', function (RouteCollectorProxy $group) {
647 $group->post('', EnquiryFileController::class . ':postEnquiryCommentDrawing');
648 $group->get('', EnquiryFileController::class . ':getEnquiryCommentDrawings');
649 $group->get('/{drawing_id:[0-9]+}', EnquiryFileController::class . ':getEnquiryCommentDrawing');
650 });
651 });
652 });
653 });
654 });
655 });
656 })->add(ModuleAuthMiddleware::class)->add(new EnquiryMiddleware());
657 $group->group('/audits', function (RouteCollectorProxy $group) {
658 $group->post('', AuditController::class . ':postAudit');
659 $group->get('', AuditController::class . ':getAudits');
660
661 $group->group('/{audit_id:[0-9]+}', function (RouteCollectorProxy $group) {
662 $group->get('', AuditController::class . ':getAudit');
663 $group->put('', AuditController::class . ':putAudit');
664 $group->delete('', AuditController::class . ':deleteAudit');
665
666 $group->get('/notified_users', AuditController::class . ':getAuditNotifiedUsers');
667 $group->put('/notified_users', AuditController::class . ':putAuditNotifiedUsers');
668
669 $group->get('/reshare_workgroups', AuditController::class . ':getAuditReshareWorkgroups');
670 $group->put('/reshare_workgroups', AuditController::class . ':putAuditReshareWorkgroups');
671
672 $group->get('/assigned_workgroups', AuditController::class . ':getAuditAssignedWorkgroups');
673 $group->put('/assigned_workgroups', AuditController::class . ':putAuditAssignedWorkgroups');
674
675 $group->get('/positions', AuditController::class . ':getAuditPositions');
676 $group->put('/positions', AuditController::class . ':putAuditPositions');
677
678 $group->group('/files', function (RouteCollectorProxy $group) {
679 $group->post('', AuditFileController::class . ':postAuditFile');
680 $group->get('', AuditFileController::class . ':getAuditFiles');
681 $group->get('/{file_id:[0-9]+}', AuditFileController::class . ':getAuditFile');
682 });
683 $group->group('/pictures', function (RouteCollectorProxy $group) {
684 $group->post('', AuditFileController::class . ':postAuditPicture');
685 $group->get('', AuditFileController::class . ':getAuditPictures');
686
687 $group->group('/{file_id:[0-9]+}', function (RouteCollectorProxy $group) {
688 $group->get('', AuditFileController::class . ':getAuditPicture');
689 $group->put('', AuditFileController::class . ':putAuditPicture'); // TODO: martin, this route is for editing description
690 $group->delete('', AuditFileController::class . ':deleteAuditPicture');
691
692 $group->group('/drawings', function (RouteCollectorProxy $group) {
693 $group->post('', AuditFileController::class . ':postAuditDrawing');
694 $group->get('', AuditFileController::class . ':getAuditDrawings');
695 $group->get('/{drawing_id:[0-9]+}', AuditFileController::class . ':getAuditDrawing');
696 });
697 });
698 });
699 $group->group('/comments', function (RouteCollectorProxy $group) {
700 $group->get('', AuditController::class . ':getAuditComments');
701 $group->post('', AuditController::class . ':postAuditComment');
702
703 $group->group('/{comment_id:[0-9]+}', function (RouteCollectorProxy $group) {
704 $group->get('', AuditController::class . ':getAuditComment');
705
706 $group->group('/files', function (RouteCollectorProxy $group) {
707 $group->post('', AuditFileController::class . ':postAuditCommentFile');
708 $group->get('', AuditFileController::class . ':getAuditCommentFiles');
709 $group->get('/{file_id:[0-9]+}', AuditFileController::class . ':getAuditCommentFile');
710 });
711 $group->group('/pictures', function (RouteCollectorProxy $group) {
712 $group->post('', AuditFileController::class . ':postAuditCommentPicture');
713 $group->get('', AuditFileController::class . ':getAuditCommentPictures');
714
715 $group->group('/{file_id:[0-9]+}', function (RouteCollectorProxy $group) {
716 $group->get('', AuditFileController::class . ':getAuditCommentPicture');
717
718 $group->group('/drawings', function (RouteCollectorProxy $group) {
719 $group->post('', AuditFileController::class . ':postAuditCommentDrawing');
720 $group->get('', AuditFileController::class . ':getAuditCommentDrawings');
721 $group->get('/{drawing_id:[0-9]+}', AuditFileController::class . ':getAuditCommentDrawing');
722 });
723 });
724 });
725 });
726 });
727
728 $group->group('/items', function (RouteCollectorProxy $group) {
729 $group->post('', AuditChecklistController::class . ':postItem');
730 $group->get('', AuditChecklistController::class . ':getItems');
731
732 $group->group('/{item_id:[0-9]+}', function (RouteCollectorProxy $group) {
733 $group->get('', AuditChecklistController::class . ':getItem');
734 $group->put('', AuditChecklistController::class . ':putItem');
735
736 $group->group('/pictures', function (RouteCollectorProxy $group) {
737 $group->post('', AuditChecklistController::class . ':postPicture');
738 $group->get('', AuditChecklistController::class . ':getPictures');
739
740 $group->group('/{picture_id:[0-9]+}', function (RouteCollectorProxy $group) {
741 $group->get('', AuditChecklistController::class . ':getPicture');
742 $group->put('', AuditChecklistController::class . ':putPicture');
743 $group->delete('', AuditChecklistController::class . ':deletePicture');
744
745 $group->group('/drawings', function (RouteCollectorProxy $group) {
746 $group->post('', AuditChecklistController::class . ':postDrawing');
747 $group->get('', AuditChecklistController::class . ':getDrawings');
748 $group->get('/{drawing_id:[0-9]+}', AuditChecklistController::class . ':getDrawing');
749 });
750 });
751 });
752 });
753 });
754 });
755 })->add(ModuleAuthMiddleware::class)->add(new AuditMiddleware());
756 $group->group('/inspections', function (RouteCollectorProxy $group) {
757 $group->post('', InspectionController::class . ':postInspection');
758 $group->get('', InspectionController::class . ':getInspections');
759
760 $group->group('/{inspection_id:[0-9]+}', function (RouteCollectorProxy $group) {
761 $group->get('', InspectionController::class . ':getInspection');
762 $group->put('', InspectionController::class . ':putInspection');
763 $group->delete('', InspectionController::class . ':deleteInspection');
764
765 $group->get('/assigned_workgroups', InspectionController::class . ':getInspectionAssignedWorkgroups');
766 $group->put('/assigned_workgroups', InspectionController::class . ':putInspectionAssignedWorkgroups');
767
768 $group->get('/positions', InspectionController::class . ':getInspectionPositions');
769 $group->put('/positions', InspectionController::class . ':putInspectionPositions');
770
771 $group->group('/files', function (RouteCollectorProxy $group) {
772 $group->post('', InspectionFileController::class . ':postInspectionFile');
773 $group->get('', InspectionFileController::class . ':getInspectionFiles');
774 $group->get('/{file_id:[0-9]+}', InspectionFileController::class . ':getInspectionFile');
775 });
776 $group->group('/pictures', function (RouteCollectorProxy $group) {
777 $group->post('', InspectionFileController::class . ':postInspectionPicture');
778 $group->get('', InspectionFileController::class . ':getInspectionPictures');
779
780 $group->group('/{file_id:[0-9]+}', function (RouteCollectorProxy $group) {
781 $group->get('', InspectionFileController::class . ':getInspectionPicture');
782 $group->put('', InspectionFileController::class . ':putInspectionPicture'); // TODO: martin, this route is for editing description
783 $group->delete('', InspectionFileController::class . ':deleteInspectionPicture');
784
785 $group->group('/drawings', function (RouteCollectorProxy $group) {
786 $group->post('', InspectionFileController::class . ':postInspectionDrawing');
787 $group->get('', InspectionFileController::class . ':getInspectionDrawings');
788 $group->get('/{drawing_id:[0-9]+}', InspectionFileController::class . ':getInspectionDrawing');
789 });
790 });
791 });
792 $group->group('/comments', function (RouteCollectorProxy $group) {
793 $group->get('', InspectionController::class . ':getInspectionComments');
794 $group->post('', InspectionController::class . ':postInspectionComment');
795
796 $group->group('/{comment_id:[0-9]+}', function (RouteCollectorProxy $group) {
797 $group->get('', InspectionController::class . ':getInspectionComment');
798
799 $group->group('/files', function (RouteCollectorProxy $group) {
800 $group->post('', InspectionFileController::class . ':postInspectionCommentFile');
801 $group->get('', InspectionFileController::class . ':getInspectionCommentFiles');
802 $group->get('/{file_id:[0-9]+}', InspectionFileController::class . ':getInspectionCommentFile');
803 });
804 $group->group('/pictures', function (RouteCollectorProxy $group) {
805 $group->post('', InspectionFileController::class . ':postInspectionCommentPicture');
806 $group->get('', InspectionFileController::class . ':getInspectionCommentPictures');
807
808 $group->group('/{file_id:[0-9]+}', function (RouteCollectorProxy $group) {
809 $group->get('', InspectionFileController::class . ':getInspectionCommentPicture');
810
811 $group->group('/drawings', function (RouteCollectorProxy $group) {
812 $group->post('', InspectionFileController::class . ':postInspectionCommentDrawing');
813 $group->get('', InspectionFileController::class . ':getInspectionCommentDrawings');
814 $group->get('/{drawing_id:[0-9]+}', InspectionFileController::class . ':getInspectionCommentDrawing');
815 });
816 });
817 });
818 });
819 });
820
821 $group->group('/items', function (RouteCollectorProxy $group) {
822 $group->post('', InspectionChecklistController::class . ':postItem');
823 $group->get('', InspectionChecklistController::class . ':getItems');
824
825 $group->group('/{item_id:[0-9]+}', function (RouteCollectorProxy $group) {
826 $group->get('', InspectionChecklistController::class . ':getItem');
827 $group->put('', InspectionChecklistController::class . ':putItem');
828
829 $group->group('/pictures', function (RouteCollectorProxy $group) {
830 $group->post('', InspectionChecklistController::class . ':postPicture');
831 $group->get('', InspectionChecklistController::class . ':getPictures');
832
833 $group->group('/{picture_id:[0-9]+}', function (RouteCollectorProxy $group) {
834 $group->get('', InspectionChecklistController::class . ':getPicture');
835 $group->put('', InspectionChecklistController::class . ':putPicture');
836 $group->delete('', InspectionChecklistController::class . ':deletePicture');
837
838 $group->group('/drawings', function (RouteCollectorProxy $group) {
839 $group->post('', InspectionChecklistController::class . ':postDrawing');
840 $group->get('', InspectionChecklistController::class . ':getDrawings');
841 $group->get('/{drawing_id:[0-9]+}', InspectionChecklistController::class . ':getDrawing');
842 });
843 });
844 });
845 });
846 });
847 });
848 })->add(ModuleAuthMiddleware::class)->add(new InspectionMiddlware());
849 $group->group('/checklists', function (RouteCollectorProxy $group) {
850 // $group->post('', ChecklistController::class . ':postChecklist');
851 $group->get('', ChecklistController::class . ':getChecklists');
852
853 $group->group('/{checklist_id:[0-9]+}', function (RouteCollectorProxy $group) {
854 $group->get('', ChecklistController::class . ':getChecklist');
855
856 $group->group('/items', function (RouteCollectorProxy $group) {
857 // $group->post('', ChecklistController::class . ':postChecklistItem');
858 $group->get('', ChecklistController::class . ':getChecklistItems');
859
860 $group->group('/{item_id:[0-9]+}', function (RouteCollectorProxy $group) {
861 $group->get('', ChecklistController::class . ':getChecklistItem');
862
863 $group->group('/answers', function (RouteCollectorProxy $group) {
864 // $group->post('', ChecklistController::class . ':postChecklistItemAnswer');
865 $group->get('', ChecklistController::class . ':getChecklistItemAnswers');
866
867 $group->group('/{answer_id:[0-9]+}', function (RouteCollectorProxy $group) {
868 $group->get('', ChecklistController::class . ':getChecklistItemAnswer');
869 });
870 });
871 });
872 });
873 });
874 });
875
876 $group->group('/versioned_files', function (RouteCollectorProxy $group) {
877 $group->post('', VersionedFileController::class . ':postVersionedFile')->add(FolderPermissionMiddleware::class);
878 $group->get('', VersionedFileController::class . ':getVersionedFiles')->add(FolderPermissionMiddleware::class);
879 $group->put('', VersionedFileController::class . ':putVersionedFiles');
880
881 $group->group('/{versioned_file_id:[0-9]+}', function (RouteCollectorProxy $group) {
882 $group->get('', VersionedFileController::class . ':getVersionedFile');
883 $group->put('', VersionedFileController::class . ':putVersionedFile');
884 $group->delete('', VersionedFileController::class . ':deleteVersionedFile');
885
886 $group->group('/notify', function (RouteCollectorProxy $group) {
887 $group->put('', VersionedFileController::class . ':putNotify');
888 });
889 });
890 });
891
892 $group->group('/module_files', function (RouteCollectorProxy $group) {
893 $group->get('', ModuleFileController::class . ':getModuleFiles');
894
895 $group->group('/{module_file_id:[0-9]+}', function (RouteCollectorProxy $group) {
896 $group->get('', ModuleFileController::class . ':getModuleFile');
897 });
898 });
899
900 $group->group('/file_labels', function (RouteCollectorProxy $group) {
901 $group->post('', FileLabelController::class . ':postFileLabel');
902 $group->get('', FileLabelController::class . ':getFileLabels');
903
904 $group->group('/{file_label_id:[0-9]+}', function (RouteCollectorProxy $group) {
905 $group->get('', FileLabelController::class . ':getFileLabel');
906 $group->put('', FileLabelController::class . ':putFileLabel');
907 });
908 });
909
910 $group->group('/folders', function (RouteCollectorProxy $group) {
911 $group->post('', FolderController::class . ':postFolder')->add(FolderPermissionMiddleware::class);
912 $group->get('', FolderController::class . ':getFolders');
913
914 $group->group('/{folder_id:[0-9]+}', function (RouteCollectorProxy $group) {
915 $group->get('', FolderController::class . ':getFolder');
916 $group->put('', FolderController::class . ':putFolder')->add(FolderPermissionMiddleware::class);
917 $group->delete('', FolderController::class . ':deleteFolder')->add(FolderPermissionMiddleware::class);
918
919 $group->group('/notify', function (RouteCollectorProxy $group) {
920 $group->put('', FolderController::class . ':putNotify');
921 });
922
923 $group->group('/properties', function (RouteCollectorProxy $group) {
924 $group->get('', FolderPropertiesController::class . ':getFolderProperties');
925 });
926 });
927 });
928
929 $group->group('/folder_permissions', function (RouteCollectorProxy $group) {
930 $group->post('', FolderPermissionController::class . ':postFolderPermission');
931 $group->get('', FolderPermissionController::class . ':getFolderPermissions');
932
933 $group->group('/{folder_permission_id:[0-9]+}', function (RouteCollectorProxy $group) {
934 $group->get('', FolderPermissionController::class . ':getFolderPermission');
935 $group->put('', FolderPermissionController::class . ':putFolderPermission');
936 $group->delete('', FolderPermissionController::class . ':deleteFolderPermission');
937 });
938 });
939
940 $group->group('/security_groups', function (RouteCollectorProxy $group) {
941 $group->post('', SecurityGroupController::class . ':postSecurityGroup');
942 $group->get('', SecurityGroupController::class . ':getSecurityGroups');
943
944 $group->group('/{security_group_id:[0-9]+}', function (RouteCollectorProxy $group) {
945 $group->get('', SecurityGroupController::class . ':getSecurityGroup');
946 $group->put('', SecurityGroupController::class . ':putSecurityGroup');
947 $group->delete('', SecurityGroupController::class . ':deleteSecurityGroup');
948 });
949 });
950
951 $group->group('/commits', function (RouteCollectorProxy $group) {
952 $group->post('', CommitController::class . ':postCommit');
953 $group->get('', CommitController::class . ':getCommits');
954
955 $group->group('/{commit_id:[0-9]+}', function (RouteCollectorProxy $group) {
956 $group->get('', CommitController::class . ':getCommit');
957 $group->put('', CommitController::class . ':putCommit');
958 });
959 });
960
961 $group->group('/archive_settings', function (RouteCollectorProxy $group) {
962 $group->get('', ArchiveSettingsController::class . ':getArchiveSettings');
963 $group->put('', ArchiveSettingsController::class . ':putArchiveSettings');
964
965 $group->group('/workgroups', function (RouteCollectorProxy $group) {
966 $group->get('', ArchiveSettingsController::class . ':getArchiveSettingWorkgroups');
967
968 $group->group('/{workgroup_id:[0-9]+}', function (RouteCollectorProxy $group) {
969 $group->get('', ArchiveSettingsController::class . ':getArchiveSettingWorkgroup');
970 $group->put('', ArchiveSettingsController::class . ':putArchiveSettingWorkgroup');
971 });
972 });
973 $group->group('/users', function (RouteCollectorProxy $group) {
974 $group->get('', ArchiveSettingsController::class . ':getArchiveSettingUsers');
975 $group->put('', ArchiveSettingsController::class . ':putArchiveSettingUsers');
976
977 $group->group('/{user_id:[0-9]+}', function (RouteCollectorProxy $group) {
978 $group->get('', ArchiveSettingsController::class . ':getArchiveSettingUser');
979 $group->put('', ArchiveSettingsController::class . ':putArchiveSettingUser');
980 });
981 });
982 });
983
984 $group->group('/modules', function (RouteCollectorProxy $group) {
985 $group->get('', ModulesController::class . ':getModules');
986 });
987
988 $group->group('/users', function (RouteCollectorProxy $group) {
989 $group->get('', UsersController::class . ':getUsersInfo');
990
991 $group->group('/{user_id:[0-9]+}', function (RouteCollectorProxy $group) {
992 $group->get('', UsersController::class . ':getUserInfo');
993 });
994
995 });
996
997
998 $group->group('/workgroups', function (RouteCollectorProxy $group) {
999 $group->get('', WorkgroupController::class . ':getWorkgroups');
1000
1001 $group->group('/{workgroup_id:[0-9]+}', function (RouteCollectorProxy $group) {
1002 $group->get('', WorkgroupController::class . ':getWorkgroup');
1003 });
1004 });
1005
1006
1007 })->add(ProjectAuthMiddleware::class);
1008 })->add($jwt_middleware);
1009
1010 $app->addRoutingMiddleware();
1011 $app->add(CorsMiddleware::class);
1012 // Run
1013 $app->run();
1014}
1015catch (Throwable $e) {
1016 /** @noinspection ForgottenDebugOutputInspection */
1017 error_log("Catastrophic failure: \n{$e->getMessage()}\n{$e->getTraceAsString()}");
1018 http_response_code(500);
1019}