Files
api/services/nginx/app/routes/departmentSelfserveConfigVersionsRoute.php
T

206 lines
9.5 KiB
PHP

<?php
/**
* Route for self-serve config draft/publish lifecycle
*/
namespace routes;
use classes\authentication;
use modules\selfserve\classes\selfserve_config_versioning;
use objects\logs_o;
use traits\route_t;
class departmentSelfserveConfigVersionsRoute
{
use route_t;
public function run(): void
{
$this->get('/department/selfserve/config/versions', function () {
global $response;
$this->requirePermission('list_department_selfserve_config_versions');
$user = (new authentication())->get_user();
if (!$user) {
$response->error('Invalid session', 400);
}
self::requireParameters(['department']);
$departmentId = (int)self::getParameter('department');
$authorizedDepartmentIds = $user->getGroup()->getDepartments();
if (!in_array($departmentId, $authorizedDepartmentIds, true) && !$this->hasPermission('view_all_department_selfserve_config_versions')) {
$this->forbidDepartmentAccess($departmentId, ['view_all_department_selfserve_config_versions']);
}
$service = new selfserve_config_versioning();
$versions = $service->listVersions($departmentId);
(new logs_o())->add('selfserve_config_versions', $departmentId, 1, $user->id, 'LIST_CONFIG_VERSIONS', 'User listed self-serve config versions');
$response->success($versions);
}, [
'list_department_selfserve_config_versions' => 'List self-serve config versions for a department',
'view_all_department_selfserve_config_versions' => 'List self-serve config versions across all departments',
]);
$this->get('/department/selfserve/config/history', function () {
global $response;
$this->requirePermission('list_department_selfserve_config_versions');
$user = (new authentication())->get_user();
if (!$user) {
$response->error('Invalid session', 400);
}
self::requireParameters(['department']);
$departmentId = (int)self::getParameter('department');
$authorizedDepartmentIds = $user->getGroup()->getDepartments();
if (!in_array($departmentId, $authorizedDepartmentIds, true) && !$this->hasPermission('view_all_department_selfserve_config_versions')) {
$this->forbidDepartmentAccess($departmentId, ['view_all_department_selfserve_config_versions']);
}
$service = new selfserve_config_versioning();
$response->success($service->listVersions($departmentId));
}, [
'list_department_selfserve_config_versions' => 'List self-serve config history for a department',
'view_all_department_selfserve_config_versions' => 'List self-serve config history across all departments',
]);
$this->get('/department/selfserve/config/active', function () {
global $response;
$this->requirePermission('list_department_selfserve_config_versions');
$user = (new authentication())->get_user();
if (!$user) {
$response->error('Invalid session', 400);
}
self::requireParameters(['department']);
$departmentId = (int)self::getParameter('department');
$authorizedDepartmentIds = $user->getGroup()->getDepartments();
if (!in_array($departmentId, $authorizedDepartmentIds, true) && !$this->hasPermission('view_all_department_selfserve_config_versions')) {
$this->forbidDepartmentAccess($departmentId, ['view_all_department_selfserve_config_versions']);
}
$service = new selfserve_config_versioning();
$published = $service->getPublishedConfig($departmentId);
if ($published === null) {
$response->success([
'version_id' => null,
'config' => null,
'source' => 'legacy',
]);
}
$response->success([
'version_id' => (int)$published['version_id'],
'config' => (array)$published['config'],
'source' => 'published',
]);
}, [
'list_department_selfserve_config_versions' => 'View active self-serve config version for a department',
'view_all_department_selfserve_config_versions' => 'View active self-serve config version across all departments',
]);
$this->post('/department/selfserve/config/draft', function () {
global $response;
$this->requirePermission('edit_department_selfserve_config_versions');
$user = (new authentication())->get_user();
if (!$user) {
$response->error('Invalid session', 400);
}
self::requireParameters(['department']);
$departmentId = (int)self::getParameter('department');
$this->assertDepartmentAccess($user, $departmentId);
$forceRefresh = self::isParametersSet(['force'])
? filter_var(self::getParameter('force'), FILTER_VALIDATE_BOOLEAN)
: false;
$service = new selfserve_config_versioning();
$draft = $service->ensureDraftFromLegacy($departmentId, (int)$user->id, $forceRefresh === true);
(new logs_o())->add('selfserve_config_versions', $departmentId, 1, $user->id, 'UPSERT_CONFIG_DRAFT', 'User upserted self-serve config draft');
$response->success($draft);
}, [
'edit_department_selfserve_config_versions' => 'Create or update a self-serve config draft for a department',
]);
$this->post('/department/selfserve/config/validate', function () {
global $response;
$this->requirePermission('edit_department_selfserve_config_versions');
$user = (new authentication())->get_user();
if (!$user) {
$response->error('Invalid session', 400);
}
self::requireParameters(['department']);
$departmentId = (int)self::getParameter('department');
$this->assertDepartmentAccess($user, $departmentId);
$service = new selfserve_config_versioning();
$validation = $service->validateDraft($departmentId);
(new logs_o())->add('selfserve_config_versions', $departmentId, 1, $user->id, 'VALIDATE_CONFIG_DRAFT', 'User validated self-serve config draft');
$response->success($validation);
}, [
'edit_department_selfserve_config_versions' => 'Validate a self-serve config draft for a department',
]);
$this->post('/department/selfserve/config/publish', function () {
global $response;
$this->requirePermission('publish_department_selfserve_config_versions');
$user = (new authentication())->get_user();
if (!$user) {
$response->error('Invalid session', 400);
}
self::requireParameters(['department']);
$departmentId = (int)self::getParameter('department');
$this->assertDepartmentAccess($user, $departmentId);
$service = new selfserve_config_versioning();
try {
$published = $service->publishDraft($departmentId, (int)$user->id);
(new logs_o())->add('selfserve_config_versions', $departmentId, 1, $user->id, 'PUBLISH_CONFIG_DRAFT', 'User published self-serve config draft');
$response->success($published);
} catch (\RuntimeException $exception) {
$response->error($exception->getMessage(), 422);
}
}, [
'publish_department_selfserve_config_versions' => 'Publish self-serve config draft for a department',
]);
$this->post('/department/selfserve/config/rollback', function () {
global $response;
$this->requirePermission('rollback_department_selfserve_config_versions');
$user = (new authentication())->get_user();
if (!$user) {
$response->error('Invalid session', 400);
}
self::requireParameters(['department', 'target_version_id']);
$departmentId = (int)self::getParameter('department');
$targetVersionId = (int)self::getParameter('target_version_id');
if ($targetVersionId <= 0) {
$response->error('Invalid target_version_id', 400);
}
$this->assertDepartmentAccess($user, $departmentId);
$service = new selfserve_config_versioning();
try {
$rolledBack = $service->rollbackToVersion($departmentId, $targetVersionId, (int)$user->id);
(new logs_o())->add('selfserve_config_versions', $departmentId, 1, $user->id, 'ROLLBACK_CONFIG_VERSION', 'User rolled back self-serve config to version ' . $targetVersionId);
$response->success($rolledBack);
} catch (\RuntimeException $exception) {
$response->error($exception->getMessage(), 422);
}
}, [
'rollback_department_selfserve_config_versions' => 'Rollback self-serve config to a previous version for a department',
]);
}
private function assertDepartmentAccess(object $user, int $departmentId): void
{
$authorizedDepartmentIds = $user->getGroup()->getDepartments();
if (!in_array($departmentId, $authorizedDepartmentIds, true)) {
$this->forbidDepartmentAccess($departmentId);
}
}
}