diff --git a/Admin/Install/db.json b/Admin/Install/db.json index 7fbfa2b..a7c5542 100755 --- a/Admin/Install/db.json +++ b/Admin/Install/db.json @@ -850,6 +850,14 @@ "name": "app_type", "type": "TINYINT", "null": false + }, + "app_unit_default": { + "name": "app_unit_default", + "type": "INT", + "default": null, + "null": true, + "foreignTable": "unit", + "foreignKey": "unit_id" } } }, diff --git a/Controller/ApiController.php b/Controller/ApiController.php index 53b6334..0c3752d 100755 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -68,8 +68,6 @@ use phpOMS\Message\NotificationLevel; use phpOMS\Message\RequestAbstract; use phpOMS\Message\ResponseAbstract; use phpOMS\Model\Message\FormValidation; -use phpOMS\Model\Message\Notify; -use phpOMS\Model\Message\NotifyType; use phpOMS\Model\Message\Reload; use phpOMS\Module\ModuleInfo; use phpOMS\Module\ModuleStatus; @@ -122,7 +120,7 @@ final class ApiController extends Controller $request->getDataString('pass') ?? '' ); - if ($login >= LoginReturnType::OK) { + if ($login > LoginReturnType::OK) { $this->app->sessionManager->set('UID', $login, true); $this->app->sessionManager->save(); $response->set($request->uri->__toString(), new Reload()); @@ -978,6 +976,7 @@ final class ApiController extends Controller $this->createModel($request->header->account, $app, AppMapper::class, 'application', $request->getOrigin()); $this->createDefaultAppSettings($app, $request); + /** @var \Model\Setting $setting */ $setting = $this->app->appSettings->get(null, SettingsEnum::GROUP_GENERATE_AUTOMATICALLY_APP); if ($setting->content === '1') { @@ -1049,9 +1048,10 @@ final class ApiController extends Controller */ private function createApplicationFromRequest(RequestAbstract $request) : App { - $app = new App(); - $app->name = $request->getDataString('name') ?? ''; - $app->type = $request->getDataInt('type') ?? ApplicationType::WEB; + $app = new App(); + $app->name = $request->getDataString('name') ?? ''; + $app->type = $request->getDataInt('type') ?? ApplicationType::WEB; + $app->defaultUnit = $request->getDataInt('default_unit'); return $app; } @@ -1519,7 +1519,9 @@ final class ApiController extends Controller module: 'Admin' ); - $defaultGroupIds = \array_merge($defaultGroupIds, \json_decode($defaultGroupSettings->content, true)); + if (!empty($defaultGroupSettings)) { + $defaultGroupIds = \array_merge($defaultGroupIds, \json_decode($defaultGroupSettings->content, true)); + } } if ($request->hasData('unit')) { @@ -1530,7 +1532,9 @@ final class ApiController extends Controller module: 'Admin' ); - $defaultGroupIds = \array_merge($defaultGroupIds, \json_decode($defaultGroupSettings->content, true)); + if (!empty($defaultGroupSettings)) { + $defaultGroupIds = \array_merge($defaultGroupIds, \json_decode($defaultGroupSettings->content, true)); + } } if (!empty($defaultGroupIds)) { @@ -1645,10 +1649,14 @@ final class ApiController extends Controller // Check if account already exists /** @var Account $emailAccount */ - $emailAccount = AccountMapper::get()->where('email', (string) $request->getData('email'))->execute(); + $emailAccount = AccountMapper::get() + ->where('email', (string) $request->getData('email')) + ->execute(); /** @var Account $loginAccount */ - $loginAccount = AccountMapper::get()->where('login', (string) ($request->getData('user') ?? $request->getData('email')))->execute(); + $loginAccount = AccountMapper::get() + ->where('login', (string) ($request->getData('user') ?? $request->getData('email'))) + ->execute(); /** @var null|Account $account */ $account = null; @@ -1705,32 +1713,40 @@ final class ApiController extends Controller // Already registered if ($account !== null) { - $defaultGroupIds = []; - - /** @var \Model\Setting $defaultGroupSettings */ - $defaultGroupSettings = $this->app->appSettings->get( - names: SettingsEnum::APP_DEFAULT_GROUPS, - app: (int) $request->getData('app'), - module: 'Admin' - ); - - $defaultGroupIds = \array_merge($defaultGroupIds, \json_decode($defaultGroupSettings->content, true)); - - /** @var \Model\Setting $defaultGroupSettings */ - $defaultGroupSettings = $this->app->appSettings->get( - names: SettingsEnum::UNIT_DEFAULT_GROUPS, - unit: (int) $request->getData('unit'), - module: 'Admin' - ); - - $defaultGroupIds = \array_merge($defaultGroupIds, \json_decode($defaultGroupSettings->content, true)); - /** @var Account $account */ $account = AccountMapper::get() ->with('groups') ->where('id', $account->getId()) ->execute(); + $defaultGroupIds = []; + + if ($request->hasData('app')) { + /** @var \Model\Setting $defaultGroupSettings */ + $defaultGroupSettings = $this->app->appSettings->get( + names: SettingsEnum::APP_DEFAULT_GROUPS, + app: (int) $request->getDataInt('app'), + module: 'Admin' + ); + + if (!empty($defaultGroupSettings)) { + $defaultGroupIds = \array_merge($defaultGroupIds, \json_decode($defaultGroupSettings->content, true)); + } + } + + if ($request->hasData('unit')) { + /** @var \Model\Setting $defaultGroupSettings */ + $defaultGroupSettings = $this->app->appSettings->get( + names: SettingsEnum::UNIT_DEFAULT_GROUPS, + app: (int) $request->getDataInt('unit'), + module: 'Admin' + ); + + if (!empty($defaultGroupSettings)) { + $defaultGroupIds = \array_merge($defaultGroupIds, \json_decode($defaultGroupSettings->content, true)); + } + } + foreach ($defaultGroupIds as $index => $id) { if ($account->hasGroup($id)) { unset($defaultGroupIds[$index]); @@ -1738,24 +1754,6 @@ final class ApiController extends Controller } if (empty($defaultGroupIds) - && $account->getStatus() === AccountStatus::ACTIVE - ) { - $response->header->status = RequestStatusCode::R_400; - - // Already set up - $this->fillJsonResponse( - $request, - $response, - NotificationLevel::ERROR, - $this->app->l11nManager->getText($response->getLanguage(), 'Admin', 'Api', 'RegistrationTitle'), - $this->app->l11nManager->getText($response->getLanguage(), 'Admin', 'Api', 'RegistrationAlreadyRegistered'), - [] - ); - - $response->header->status = RequestStatusCode::R_403; - - return; - } elseif (empty($defaultGroupIds) && $account->getStatus() === AccountStatus::INACTIVE ) { $response->header->status = RequestStatusCode::R_400; @@ -1775,8 +1773,18 @@ final class ApiController extends Controller return; } - // Create missing account / group relationships - $this->createModelRelation($account->getId(), $account->getId(), $defaultGroupIds, AccountMapper::class, 'groups', 'registration', $request->getOrigin()); + if (!empty($defaultGroupIds)) { + // Create missing account / group relationships + $this->createModelRelation( + $account->getId(), + $account->getId(), + $defaultGroupIds, + AccountMapper::class, + 'groups', + 'registration', + $request->getOrigin() + ); + } } else { // New account $request->setData('status', AccountStatus::INACTIVE, true); @@ -1818,7 +1826,10 @@ final class ApiController extends Controller } // Create client - if ($request->hasData('client')) { + if ($request->hasData('client') && $account->getStatus() !== AccountStatus::ACTIVE) { + // @todo: only create if no client exists at the specified unit + // The check !== ACTIVE above is only a bad, wrong and specific solution to the problem + $internalRequest = new HttpRequest(); $internalResponse = new HttpResponse(); @@ -1831,6 +1842,7 @@ final class ApiController extends Controller $internalRequest->setData('country', $request->getDataString('country') ?? ''); $internalRequest->setData('state', $request->getDataString('state') ?? ''); $internalRequest->setData('vat_id', $request->getDataString('vat_id') ?? ''); + $internalRequest->setData('unit', $request->getDataInt('unit')); $this->app->moduleManager->get('ClientManagement')->apiClientCreate($internalRequest, $internalResponse); } @@ -2126,14 +2138,6 @@ final class ApiController extends Controller $new = $this->updateAccountFromRequest($request, clone $old); $this->updateModel($request->header->account, $old, $new, AccountMapper::class, 'account', $request->getOrigin()); - $profile = \Modules\Profile\Models\ProfileMapper::get() - ->where('account', $new->getId()) - ->execute(); - - if ($profile instanceof \Modules\Profile\Models\NullProfile) { - $this->createProfileForAccount($new, $request); - } - $this->fillJsonResponse( $request, $response, @@ -2157,10 +2161,10 @@ final class ApiController extends Controller */ private function updateAccountFromRequest(RequestAbstract $request, Account $account, bool $allowPassword = false) : Account { - $account->login = (string) ($request->getData('user') ?? $account->login); - $account->name1 = (string) ($request->getData('name1') ?? $account->name1); - $account->name2 = (string) ($request->getData('name2') ?? $account->name2); - $account->name3 = (string) ($request->getData('name3') ?? $account->name3); + $account->login = $request->getDataString('user') ?? $account->login; + $account->name1 = $request->getDataString('name1') ?? $account->name1; + $account->name2 = $request->getDataString('name2') ?? $account->name2; + $account->name3 = $request->getDataString('name3') ?? $account->name3; $account->setEmail($request->getDataString('email') ?? $account->getEmail()); $account->setStatus($request->getDataInt('status') ?? $account->getStatus()); $account->setType($request->getDataInt('type') ?? $account->getType()); @@ -2647,19 +2651,19 @@ final class ApiController extends Controller public function createPermissionFromRequest(RequestAbstract $request) : PermissionAbstract { /** @var AccountPermission|GroupPermission $permission */ - $permission = ((int) $request->getData('permissionowner')) === PermissionOwner::GROUP + $permission = ($request->getDataInt('permissionowner')) === PermissionOwner::GROUP ? new GroupPermission((int) $request->getData('permissionref')) : new AccountPermission((int) $request->getData('permissionref')); - $permission->setUnit(empty($request->getData('permissionunit')) ? null : (int) $request->getData('permissionunit')); - $permission->setApp(empty($request->getData('permissionapp')) ? null : (string) $request->getData('permissionapp')); - $permission->setModule(empty($request->getData('permissionmodule')) ? null : (string) $request->getData('permissionmodule')); - $permission->setCategory(empty($request->getData('permissioncategory')) ? null : (int) $request->getData('permissioncategory')); - $permission->setElement(empty($request->getData('permissionelement')) ? null : (int) $request->getData('permissionelement')); - $permission->setComponent(empty($request->getData('permissioncomponent')) ? null : (int) $request->getData('permissioncomponent')); + $permission->setUnit($request->getDataInt('permissionunit')); + $permission->setApp($request->getDataString('permissionapp')); + $permission->setModule($request->getDataString('permissionmodule')); + $permission->setCategory($request->getDataInt('permissioncategory')); + $permission->setElement($request->getDataInt('permissionelement')); + $permission->setComponent($request->getDataInt('permissioncomponent')); $permission->setPermission( - ($request->getDataInt('permissioncreate') ?? 0) - | ($request->getDataInt('permissionread') ?? 0) + ($request->getDataInt('permissionread') ?? 0) + | ($request->getDataInt('permissioncreate') ?? 0) | ($request->getDataInt('permissionupdate') ?? 0) | ($request->getDataInt('permissiondelete') ?? 0) | ($request->getDataInt('permissionpermission') ?? 0) diff --git a/Models/App.php b/Models/App.php index 90a2dba..e36780a 100755 --- a/Models/App.php +++ b/Models/App.php @@ -67,6 +67,14 @@ class App implements \JsonSerializable */ public int $type = ApplicationType::WEB; + /** + * Default unit + * + * @var null|int + * @since 1.0.0 + */ + public ?int $defaultUnit = null; + /** * Get id * diff --git a/Models/AppMapper.php b/Models/AppMapper.php index aa7adae..21fa0cc 100755 --- a/Models/AppMapper.php +++ b/Models/AppMapper.php @@ -38,6 +38,7 @@ final class AppMapper extends DataMapperFactory 'app_theme' => ['name' => 'app_theme', 'type' => 'string', 'internal' => 'theme'], 'app_status' => ['name' => 'app_status', 'type' => 'int', 'internal' => 'status'], 'app_type' => ['name' => 'app_type', 'type' => 'int', 'internal' => 'type'], + 'app_unit_default' => ['name' => 'app_unit_default', 'type' => 'int', 'internal' => 'defaultUnit'], ]; /**