diff --git a/Admin/Routes/Web/Api.php b/Admin/Routes/Web/Api.php index 02bc106..d107319 100644 --- a/Admin/Routes/Web/Api.php +++ b/Admin/Routes/Web/Api.php @@ -6,7 +6,7 @@ use phpOMS\Account\PermissionType; use phpOMS\Router\RouteVerb; return [ - '^.*/admin/settings.*$' => [ + '^.*/admin/settings(\?.*|$)' => [ [ 'dest' => '\Modules\Admin\Controller\ApiController:apiSettingsSet', 'verb' => RouteVerb::SET, @@ -66,7 +66,7 @@ return [ ], ], - '^.*/admin/find/account.*$' => [ + '^.*/admin/find/account(\?.*|$)' => [ [ 'dest' => '\Modules\Admin\Controller\ApiController:apiAccountFind', 'verb' => RouteVerb::GET, @@ -100,7 +100,7 @@ return [ ], ], - '^.*/admin/account$' => [ + '^.*/admin/account(\?.*|$)' => [ [ 'dest' => '\Modules\Admin\Controller\ApiController:apiAccountCreate', 'verb' => RouteVerb::PUT, diff --git a/Controller/ApiController.php b/Controller/ApiController.php index 7535965..6c38731 100644 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -24,6 +24,7 @@ use Modules\Admin\Models\Group; use Modules\Admin\Models\GroupMapper; use Modules\Admin\Models\GroupPermission; use Modules\Admin\Models\GroupPermissionMapper; +use Modules\Admin\Models\LocalizationMapper; use Modules\Admin\Models\ModuleStatusUpdateType; use Modules\Admin\Models\NullAccount; @@ -49,6 +50,8 @@ use phpOMS\Uri\HttpUri; use phpOMS\Utils\Parser\Markdown\Markdown; use phpOMS\Validation\Network\Email; use phpOMS\Version\Version; +use phpOMS\Account\PermissionType; +use Modules\Admin\Models\PermissionState; /** * Admin controller class. @@ -131,13 +134,145 @@ final class ApiController extends Controller $this->app->appSettings->get($id, $name, $module, $group, $account), $data, function() use($id, $name, $content, $module, $group, $account) : void { - $this->app->appSettings->set([['id' => $id, 'name' => $name, 'content' => $content, 'module' => $module, 'group' => $group, 'account' => $account]], true); + $this->app->appSettings->set([ + [ + 'id' => $id, + 'name' => $name, + 'content' => $content, + 'module' => $module, + 'group' => $group, + 'account' => $account + ] + ], true); }, 'settings' ); } - $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Settigns', 'Settings successfully modified', $dataSettings); + $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Settings', 'Settings successfully modified', $dataSettings); + } + + /** + * Api method for modifying account localization + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return void + * + * @api + * + * @since 1.0.0 + */ + public function apiSettingsAccountLocalizationSet(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + { + $requestAccount = $request->getHeader()->getAccount(); + $accountId = (int) $request->getData('account_id'); + + if ($requestAccount !== $accountId + && !$this->app->accountManager->get($accountId)->hasPermission( + PermissionType::MODIFY, $this->app->orgId, $this->app->appName, self::MODULE_NAME, PermissionState::ACCOUNT_SETTINGS, $accountId) + ) { + $this->fillJsonResponse($request, $response, NotificationLevel::HIDDEN, '', '', []); + return; + } + + /** @var Localization #l11n */ + $l11n = AccountMapper::get($accountId)->getL11n(); + + if ((bool) ($request->getData('load') ?? false)) { + $locale = \explode('_', $request->getData('localization_load')); + $l11n->loadFromLanguage($locale[0], $locale[1]); + + LocalizationMapper::update($l11n); + + $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Localization', 'Localization successfully modified', $l11n); + + return; + } + + $dataSettings = $request->getLike('settings_(.*)'); + + $l11n->setCountry($dataSettings['settings_country']); + $l11n->setLanguage($dataSettings['settings_language']); + $l11n->setTemperature($dataSettings['settings_temperature']); + + $l11n->setTimezone($dataSettings['settings_timezone']); + $l11n->setDatetime( + [ + 'very_short' => $dataSettings['settings_timeformat_vs'], + 'short' => $dataSettings['settings_timeformat_s'], + 'medium' => $dataSettings['settings_timeformat_m'], + 'long' => $dataSettings['settings_timeformat_l'], + 'very_long' => $dataSettings['settings_timeformat_vl'], + ] + ); + + $l11n->setCurrency($dataSettings['settings_currency']); + $l11n->setCurrencyFormat($dataSettings['settings_currencyformat']); + + $l11n->setDecimal($dataSettings['settings_decimal']); + $l11n->setThousands($dataSettings['settings_thousands']); + + $l11n->setWeight( + [ + 'very_light' => $dataSettings['settings_weight_vl'], + 'light' => $dataSettings['settings_weight_l'], + 'medium' => $dataSettings['settings_weight_m'], + 'heavy' => $dataSettings['settings_weight_h'], + 'very_heavy' => $dataSettings['settings_weight_vh'], + ] + ); + + $l11n->setSpeed( + [ + 'very_slow' => $dataSettings['settings_speed_vs'], + 'slow' => $dataSettings['settings_speed_s'], + 'medium' => $dataSettings['settings_speed_m'], + 'fast' => $dataSettings['settings_speed_f'], + 'very_fast' => $dataSettings['settings_speed_vf'], + 'sea' => $dataSettings['settings_speed_sea'], + ] + ); + + $l11n->setLength( + [ + 'very_short' => $dataSettings['settings_length_vs'], + 'short' => $dataSettings['settings_length_s'], + 'medium' => $dataSettings['settings_length_m'], + 'long' => $dataSettings['settings_length_l'], + 'very_long' => $dataSettings['settings_length_vl'], + 'sea' => $dataSettings['settings_length_sea'], + ] + ); + + $l11n->setArea( + [ + 'very_small' => $dataSettings['settings_area_vs'], + 'small' => $dataSettings['settings_area_s'], + 'medium' => $dataSettings['settings_area_m'], + 'large' => $dataSettings['settings_area_l'], + 'very_large' => $dataSettings['settings_area_vl'], + ] + ); + + $l11n->setVolume( + [ + 'very_small' => $dataSettings['settings_volume_vs'], + 'small' => $dataSettings['settings_volume_s'], + 'medium' => $dataSettings['settings_volume_m'], + 'large' => $dataSettings['settings_volume_l'], + 'very_large' => $dataSettings['settings_volume_vl'], + 'tablespoon' => $dataSettings['settings_volume_tablespoon'], + 'teaspoon' => $dataSettings['settings_volume_teaspoon'], + 'glass' => $dataSettings['settings_volume_glass'], + ] + ); + + LocalizationMapper::update($l11n); + + $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Localization', 'Localization successfully modified', $l11n); } /** diff --git a/Controller/BackendController.php b/Controller/BackendController.php index 0827bd1..b5d73bc 100644 --- a/Controller/BackendController.php +++ b/Controller/BackendController.php @@ -114,8 +114,12 @@ final class BackendController extends Controller $view = new View($this->app->l11nManager, $request, $response); $view->setTemplate('/Modules/Admin/Theme/Backend/accounts-list'); $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1000104001, $request, $response)); - $view->setData('list:elements', AccountMapper::getNewest(50, null, RelationType::NONE)); - $view->setData('list:count', 1); + + if ($request->getData('ptype') === '-') { + $view->setData('accounts', AccountMapper::getBeforePivot((int) ($request->getData('id') ?? 0), null, 25)); + } else { + $view->setData('accounts', AccountMapper::getAfterPivot((int) ($request->getData('id') ?? 0), null, 25)); + } return $view; } diff --git a/Models/AccountMapper.php b/Models/AccountMapper.php index 59d9414..b1fd9ff 100644 --- a/Models/AccountMapper.php +++ b/Models/AccountMapper.php @@ -14,6 +14,7 @@ declare(strict_types=1); namespace Modules\Admin\Models; +use phpOMS\Account\AccountStatus; use phpOMS\Auth\LoginReturnType; use phpOMS\DataStorage\Database\DataMapperAbstract; use phpOMS\DataStorage\Database\Query\Builder; @@ -115,7 +116,12 @@ final class AccountMapper extends DataMapperAbstract public static function getWithPermissions(int $id) : Account { $account = self::get($id); - $groupPermissions = GroupPermissionMapper::getFor(\array_keys($account->getGroups()), 'group', RelationType::ALL, 2); + $groupPermissions = GroupPermissionMapper::getFor( + \array_keys($account->getGroups()), + 'group', + RelationType::ALL, + 2 + ); if (\is_array($groupPermissions)) { foreach ($groupPermissions as $permission) { @@ -158,10 +164,11 @@ final class AccountMapper extends DataMapperAbstract $result = null; $query = new Builder(self::$db); - $result = $query->select('account_id', 'account_login', 'account_password', 'account_password_temp', 'account_tries') + $result = $query->select('account_id', 'account_login', 'account_password', 'account_password_temp', 'account_tries', 'account_status') ->from('account') ->where('account_login', '=', $login) - ->execute()->fetchAll(); + ->execute() + ->fetchAll(); if (!isset($result[0])) { return LoginReturnType::WRONG_USERNAME; @@ -174,16 +181,33 @@ final class AccountMapper extends DataMapperAbstract return LoginReturnType::WRONG_INPUT_EXCEEDED; } + if ($result['account_status'] !== AccountStatus::ACTIVE) { + return LoginReturnType::INACTIVE; + } + if (empty($result['account_password'])) { return LoginReturnType::EMPTY_PASSWORD; } if (\password_verify($password, $result['account_password'] ?? '')) { + $query->update('account') + ->set(['account_lactive' => new \DateTime('now')]) + ->where('account_login', '=', $login) + ->execute(); + return $result['account_id']; } - if (!empty($result['account_password_temp']) && \password_verify($password, $result['account_password_temp'] ?? '')) { - $query->update('account')->set(['account_password_temp' => ''])->where('account_login', '=', $login)->execute(); + if (!empty($result['account_password_temp']) + && \password_verify($password, $result['account_password_temp'] ?? '') + ) { + $query->update('account') + ->set([ + 'account_password_temp' => '', + 'account_lactive' => new \DateTime('now'), + ]) + ->where('account_login', '=', $login) + ->execute(); return $result['account_id']; } diff --git a/Models/PermissionState.php b/Models/PermissionState.php index 4314814..278d7a5 100644 --- a/Models/PermissionState.php +++ b/Models/PermissionState.php @@ -26,11 +26,12 @@ use phpOMS\Stdlib\Base\Enum; */ abstract class PermissionState extends Enum { - public const SETTINGS = 1; - public const ACCOUNT = 2; - public const GROUP = 3; - public const MODULE = 4; - public const LOG = 5; - public const ROUTE = 6; - public const APP = 7; + public const SETTINGS = 1; + public const ACCOUNT = 2; + public const GROUP = 3; + public const MODULE = 4; + public const LOG = 5; + public const ROUTE = 6; + public const APP = 7; + public const ACCOUNT_SETTINGS = 8; } diff --git a/Theme/Backend/accounts-list.tpl.php b/Theme/Backend/accounts-list.tpl.php index 1dd00ec..5af9fc8 100644 --- a/Theme/Backend/accounts-list.tpl.php +++ b/Theme/Backend/accounts-list.tpl.php @@ -12,12 +12,18 @@ */ declare(strict_types=1); +use \phpOMS\Account\AccountStatus; +use phpOMS\Uri\UriFactory; - use \phpOMS\Account\AccountStatus; - - /** - * @var \phpOMS\Views\View $this +/** + * @var \phpOMS\Views\View $this + * @var \Modules\Admin\Models\Account[] $accounts */ +$accounts = $this->getData('accounts') ?? []; + +$previous = empty($accounts) ? '{/prefix}admin/account/list' : '{/prefix}admin/account/list?{?}&id=' . \reset($accounts)->getId() . '&ptype=-'; +$next = empty($accounts) ? '{/prefix}admin/account/list' : '{/prefix}admin/account/list?{?}&id=' . \end($accounts)->getId() . '&ptype=+'; + echo $this->getData('nav')->render(); ?>