* Changed admin list processing

This commit is contained in:
Visman 2018-11-12 21:25:25 +07:00
parent feb06dd233
commit 7ff2129ede
9 changed files with 92 additions and 51 deletions

View file

@ -32,8 +32,8 @@ class Primary
public function check()
{
if ($this->c->config->o_maintenance && ! $this->c->MAINTENANCE_OFF) {
if (! \in_array($this->c->Cookie->uId, $this->c->admins->list) //????
|| ! \in_array($this->c->user->id, $this->c->admins->list) //????
if (! isset($this->c->admins->list[$this->c->Cookie->uId])
|| ! isset($this->c->admins->list[$this->c->user->id])
) {
if (! $this->c->isInit('user')) {
$this->c->user = $this->c->users->create(['id' => 1, 'group_id' => $this->c->GROUP_GUEST]);

View file

@ -1,23 +0,0 @@
<?php
namespace ForkBB\Models;
use ForkBB\Models\Model;
class AdminList extends Model
{
/**
* Загружает список id админов из кеша/БД
*
* @return AdminList
*/
public function init()
{
if ($this->c->Cache->has('admins')) {
$this->list = $this->c->Cache->get('admins');
} else {
$this->load();
}
return $this;
}
}

View file

@ -1,23 +0,0 @@
<?php
namespace ForkBB\Models\AdminList;
use ForkBB\Models\Method;
use PDO;
class Load extends Method
{
/**
* Заполняет модель данными из БД
* Создает кеш
*
* @return AdminList
*/
public function load()
{
$list = $this->c->DB->query('SELECT u.id FROM ::users AS u WHERE u.group_id=?i', [$this->c->GROUP_ADMIN])->fetchAll(PDO::FETCH_COLUMN);
$this->model->list = $list;
$this->c->Cache->set('admins', $list);
return $this->model;
}
}

View file

@ -0,0 +1,35 @@
<?php
namespace ForkBB\Models\AdminList;
use ForkBB\Models\Model as BaseModel;
class Model extends BaseModel
{
/**
* Загружает список id админов из кеша/БД
*
* @return Models\AdminList
*/
public function init()
{
if ($this->c->Cache->has('admins')) {
$this->list = $this->c->Cache->get('admins');
} else {
$this->list = \array_flip($this->c->users->adminsIds());
$this->c->Cache->set('admins', $this->list);
}
return $this;
}
/**
* Сбрасывает кеш списка id админов
*
* @return Models\AdminList
*/
public function reset()
{
$this->c->Cache->delete('admins');
return $this;
}
}

View file

@ -0,0 +1,24 @@
<?php
namespace ForkBB\Models\User;
use ForkBB\Models\Action;
use PDO;
class AdminsIds extends Action
{
/**
* Загружает список id админов из БД
*
* @return array
*/
public function adminsIds()
{
$vars = [
':gid' => $this->c->GROUP_ADMIN,
];
$sql = 'SELECT u.id FROM ::users AS u WHERE u.group_id=?i:gid';
return $this->c->DB->query($sql, $vars)->fetchAll(PDO::FETCH_COLUMN);
}
}

View file

@ -28,6 +28,7 @@ class ChangeGroup extends Action
$ids = [];
$moderators = [];
$adminPresent = $newGroup->groupAdmin;
foreach ($users as $user) {
if (! $user instanceof User) {
throw new InvalidArgumentException('Expected User');
@ -39,6 +40,9 @@ class ChangeGroup extends Action
if (1 != $newGroup->g_moderator && $user->isAdmMod) {
$moderators[$user->id] = $user;
}
if ($user->isAdmin) {
$adminPresent = true;
}
$ids[] = $user->id;
$user->__group_id = $newGroupId;
@ -62,5 +66,9 @@ class ChangeGroup extends Action
SET u.group_id = ?i:new
WHERE u.id IN (?ai:ids)';
$this->c->DB->exec($sql, $vars);
if ($adminPresent) {
$this->c->admins->reset();
}
}
}

View file

@ -27,6 +27,7 @@ class Delete extends Action
$ids = [];
$moderators = [];
$adminPresent = false;
foreach ($users as $user) {
if (! $user instanceof User) {
throw new InvalidArgumentException('Expected User');
@ -40,6 +41,9 @@ class Delete extends Action
if ($user->isAdmMod) {
$moderators[$user->id] = $user;
}
if ($user->isAdmin) {
$adminPresent = true;
}
}
if (! empty($moderators)) {
@ -69,5 +73,9 @@ class Delete extends Action
$sql = 'DELETE FROM ::users
WHERE id IN (?ai:users)';
$this->c->DB->exec($sql, $vars);
if ($adminPresent) {
$this->c->admins->reset();
}
}
}

View file

@ -38,12 +38,16 @@ class Save extends Action
$where = 'id=?i';
}
$set = $vars = [];
$resAdmins = false;
foreach ($modified as $name) {
if (! isset($fileds[$name])) {
continue;
}
$vars[] = $values[$name];
$set[] = $name . '=?' . $fileds[$name];
if ('group_id' === $name) {
$resAdmins = true;
}
}
if (empty($set)) {
return $user;
@ -56,6 +60,10 @@ class Save extends Action
$this->c->DB->query('UPDATE ::' . $table . ' SET ' . \implode(', ', $set) . ' WHERE ' . $where, $vars);
$user->resModified();
if ($resAdmins) {
$this->c->admins->reset();
}
return $user;
}
@ -91,6 +99,10 @@ class Save extends Action
$user->id = $this->c->DB->lastInsertId();
$user->resModified();
if ($user->isAdmin) {
$this->c->admins->reset();
}
return $user->id;
}
}

View file

@ -89,7 +89,7 @@ return [
'bans' => '@ModelBanList:init',
'censorship' => '@CensorshipModel:init',
'stats' => '@ModelStats:init',
'admins' => '@ModelAdminList:init',
'admins' => '@AdminListModel:init',
'smilies' => '@ModelSmileyList:init',
'dbMap' => '@ModelDBMap:init',
'stopwords' => '@ModelStopwords:init',
@ -194,8 +194,7 @@ return [
'ModelStats' => \ForkBB\Models\Stats::class,
'StatsLoad' => \ForkBB\Models\Stats\Load::class,
'ModelAdminList' => \ForkBB\Models\AdminList::class,
'AdminListLoad' => \ForkBB\Models\AdminList\Load::class,
'AdminListModel' => \ForkBB\Models\AdminList\Model::class,
'ModelSmileyList' => \ForkBB\Models\SmileyList::class,
'SmileyListLoad' => \ForkBB\Models\SmileyList\Load::class,
@ -217,6 +216,7 @@ return [
'UserManagerFilter' => \ForkBB\Models\User\Filter::class,
'UserManagerDelete' => \ForkBB\Models\User\Delete::class,
'UserManagerChangeGroup' => \ForkBB\Models\User\ChangeGroup::class,
'UserManagerAdminsIds' => \ForkBB\Models\User\AdminsIds::class,
'ForumModel' => \ForkBB\Models\Forum\Model::class,
'ForumModelCalcStat' => \ForkBB\Models\Forum\CalcStat::class,