- added admin roles "SUPERADMIN", "CORPORATION" (access), and "MEMBER" (default role).

This commit is contained in:
Exodus4D
2017-06-04 16:09:33 +02:00
parent 433c555265
commit 23b837fb32
7 changed files with 185 additions and 110 deletions

View File

@@ -10,7 +10,6 @@ namespace Controller;
use Controller\Ccp\Sso;
use Model\BasicModel;
use Model\CharacterModel;
use Model\CorporationModel;
@@ -84,7 +83,9 @@ class Admin extends Controller{
$adminCharacter = null;
if( !$f3->exists(Sso::SESSION_KEY_SSO_ERROR) ){
if( $character = $this->getCharacter() ){
if($character->roleId == 1){
$this->setCharacterRole($character);
if($character->role != 'MEMBER'){
// current character is admin
$adminCharacter = $character;
}else{
@@ -103,6 +104,36 @@ class Admin extends Controller{
return $adminCharacter;
}
/**
* set temp "virtual" field with current admin role name for a $characterModel
* @param CharacterModel $character
*/
protected function setCharacterRole(CharacterModel $character){
$character->virtual('role', function($character){
// default role based on roleId (auto-detected)
if( ($role = array_search ($character->roleId, CharacterModel::ROLES)) === false ){
$role = 'MEMBER';
}
/**
* check config files for hardcoded character roles
* -> overwrites default role (e.g. auto detected by corp in-game roles)
*/
if($this->getF3()->exists('PATHFINDER.ADMIN.CHARACTER', $globalAdminData)){
foreach((array)$globalAdminData as $adminData){
if($adminData['ID'] === $character->_id){
if( CharacterModel::ROLES[$adminData['ROLE']] ){
$role = $adminData['ROLE'];
}
break;
}
}
}
return $role;
});
}
/**
* dispatch page events by URL $params
* @param \Base $f3
@@ -112,7 +143,6 @@ class Admin extends Controller{
public function dispatch(\Base $f3, $params, $character = null){
if($character instanceof CharacterModel){
// user logged in
$parts = array_values(array_filter(array_map('strtolower', explode('/', $params['*']))));
$f3->set('tplPage', $parts[0]);
@@ -233,12 +263,31 @@ class Admin extends Controller{
* @param CharacterModel $character
*/
protected function initMembers(\Base $f3, CharacterModel $character){
$data = (object) [];;
$data = (object) [];
$test = BasicModel::getNew('CharacterModel');
$test->getById( $character->_id, 0);
if($characterCorporation = $character->getCorporation()){
$corporations = [];
$data->members = $test->getCorporation()->getCharacters();
switch($character->role){
case 'SUPERADMIN':
if($accessCorporations = CorporationModel::getAll(['addNPC' => true])){
$corporations = $accessCorporations;
}
break;
case 'CORPORATION':
$corporations[] = $characterCorporation;
break;
}
foreach($corporations as $corporation){
$data->corpMembers[$corporation->name] = $corporation->getCharacters();
}
// sort corporation from current user first
if( !empty($data->corpMembers[$characterCorporation->name]) ){
$data->corpMembers = array($characterCorporation->name => $data->corpMembers[$characterCorporation->name]) + $data->corpMembers;
}
}
$f3->set('tplMembers', $data);
}

View File

@@ -605,7 +605,7 @@ abstract class BasicModel extends \DB\Cortex {
* @return false|null|string
*/
public function getFormattedColumn($column, $format = 'Y-m-d H:i'){
return $this->get($column) ? date($format, strtotime( $this->get($column) )) : null;;
return $this->get($column) ? date($format, strtotime( $this->get($column) )) : null;
}
/**

View File

@@ -33,6 +33,15 @@ class CharacterModel extends BasicModel {
'KICKED' => 'character is kicked',
'BANNED' => 'character is banned'
];
/**
* all admin roles and related roleId for a character
*/
const ROLES = [
'MEMBER' => 0,
'SUPERADMIN' => 1,
'CORPORATION' => 2
];
/**
* enables change for "kicked" column
@@ -582,13 +591,13 @@ class CharacterModel extends BasicModel {
* @return int
*/
public function requestRoleId(){
$roleId = 0;
$rolesData = $this->requestRoles();
if( !empty($rolesData) ){
$roleId = self::ROLES['MEMBER'];
if( !empty($rolesData = $this->requestRoles()) ){
// roles that grant admin access for this character
$adminRoles = array_intersect(CorporationModel::ADMIN_ROLES, $rolesData);
if( !empty($adminRoles) ){
$roleId = 1;
$roleId = self::ROLES['CORPORATION'];
}
}

View File

@@ -202,4 +202,23 @@ class CorporationModel extends BasicModel {
return $characterRolesData;
}
/**
* get all corporations
* @param array $options
* @return \DB\CortexCollection
*/
public static function getAll($options = []){
$query = [
'active = :active',
':active' => 1
];
if( !$options['addNPC'] ){
$query[0] .= ' AND isNPC = :isNPC';
$query[':isNPC'] = 1;
}
return (new self())->find($query);
}
}

View File

@@ -4,99 +4,102 @@
<h4><i class="fa fa-fw fa-users"></i>&nbsp;{{ ucfirst(@tplPage) }}</h4>
<div class="row text-center">
<div class="col-xs-12 pf-landing-pricing-panel">
<div class="panel panel-default pricing-big">
<div class="panel-heading text-left">
<h3 class="panel-title">Corporation</h3>
</div>
<div class="panel-body">
<table id="table_id" class="stripe order-column row-border dataTable" data-order="[1, &quot;asc&quot;]" data-length-change="0" data-paging-type="full_numbers">
<thead>
<tr>
<th data-width="50">id</th>
<th>name</th>
<th data-width="50">role</th>
<th data-width="50">share</th>
<th data-width="50">tracking</th>
<th data-width="50">security</th>
<th data-width="90">last login</th>
<th data-width="90">kicked until</th>
<th data-width="90" data-orderable="false">kick</th>
<th data-width="90">banned since</th>
<th data-width="30" data-orderable="false">ban</th>
</tr>
</thead>
<tbody>
<repeat group="{{ @tplMembers->members }}" value="{{ @member }}" counter="{{ @ctr }}">
<set disableRow = "{{@member->_id}} == {{@character->_id}}" />
<repeat group="{{ @tplMembers->corpMembers }}" value="{{ @corpMember }}" key="{{@corpName}}" counter="{{ @corpCount }}">
<div class="row text-center">
<div class="col-xs-12 pf-landing-pricing-panel">
<div class="panel panel-default pricing-big">
<div class="panel-heading text-left">
<h3 class="panel-title">{{ @corpCount }}. {{@corpName}}</h3>
</div>
<div class="panel-body">
<table id="table_id" class="stripe order-column row-border dataTable" data-order="[1, &quot;asc&quot;]" data-length-change="0" data-paging-type="full_numbers">
<thead>
<tr>
<td class="text-right">{{ @member->_id }}</td>
<td class="pf-table-button-sm-cell" data-order="{{ @member->name }}" data-search="{{ @member->name }}">
<img src="//image.eveonline.com/Character/{{ @member->_id }}_32.jpg" >&nbsp;{{ @member->name }}
</td>
<td class="text-right">
<check if="{{ @member->roleId }}">
<span class="label label-success">admin</span>
</check>
</td>
<td class="text-right">
<check if="{{ @member->shared }}">
<true>
<span class="label label-info">active</span>
</true>
<false>
<span class="label label-default">disabled</span>
</false>
</check>
</td>
<td class="text-right">
<check if="{{ @member->logLocation }}">
<true>
<span class="label label-success">active</span>
</true>
<false>
<span class="label label-warning">disabled</span>
</false>
</check>
</td>
<td class="text-right txt-color {{ @member->securityStatus >= 0 ? 'txt-color-green' : 'txt-color-orange' }}">{{ number_format(round(@member->securityStatus, 2), 2) }}</td>
<td class="text-right">{{ @member->getFormattedColumn('lastLogin') }}</td>
<td class="text-right txt-color txt-color-orange">{{ @member->getFormattedColumn('kicked') }}</td>
<td class="text-center pf-table-button-sm-cell">
<div class="btn-group btn-group-sm" role="group">
<check if="{{ @member->kicked }}">
<th data-width="50">id</th>
<th>name</th>
<th data-width="50">role</th>
<th data-width="50">share</th>
<th data-width="50">tracking</th>
<th data-width="50">security</th>
<th data-width="90">last login</th>
<th data-width="90">kicked until</th>
<th data-width="90" data-orderable="false">kick</th>
<th data-width="90">banned since</th>
<th data-width="30" data-orderable="false">ban</th>
</tr>
</thead>
<tbody>
<repeat group="{{ @corpMember }}" value="{{ @member }}" counter="{{ @memberCount }}">
<set disableRow = "{{@member->_id}} == {{@character->_id}}" />
<tr>
<td class="text-right">{{ @member->_id }}</td>
<td class="pf-table-button-sm-cell" data-order="{{ @member->name }}" data-search="{{ @member->name }}">
<img src="//image.eveonline.com/Character/{{ @member->_id }}_32.jpg" >&nbsp;{{ @member->name }}
</td>
<td class="text-right">
<check if="{{ @member->roleId }}">
<span class="label label-success">admin</span>
</check>
</td>
<td class="text-right">
<check if="{{ @member->shared }}">
<true>
<a class="btn btn-primary {{ @disableRow ? 'disabled' : '' }}" href="/admin/{{ @tplPage}}/kick/{{ @member->_id }}">revoke</a>
<span class="label label-info">active</span>
</true>
<false>
<repeat group="{{ @tplKickOptions }}" key="{{ @key }}" value="{{ @label }}">
<a class="btn btn-default {{ @disableRow ? 'disabled' : '' }}" href="/admin/{{ @tplPage}}/kick/{{ @member->_id }}/{{ @key }}">{{ @label }}</a>
</repeat>
<span class="label label-default">disabled</span>
</false>
</check>
</div>
</td>
<td class="text-right txt-color txt-color-danger">{{ @member->getFormattedColumn('banned') }}</td>
<td class="text-center pf-table-button-sm-cell">
<check if="{{ @member->banned }}">
<true>
<a class="btn btn-sm btn-primary {{ @disableRow ? 'disabled' : '' }}" href="/admin/{{ @tplPage}}/ban/{{ @member->_id }}">revoke</a>
</true>
<false>
<a class="btn btn-sm btn-danger {{ @disableRow ? 'disabled' : '' }}" href="/admin/{{ @tplPage}}/ban/{{ @member->_id }}/1">ban</a>
</false>
</check>
</td>
</tr>
</repeat>
</tbody>
</table>
</td>
<td class="text-right">
<check if="{{ @member->logLocation }}">
<true>
<span class="label label-success">active</span>
</true>
<false>
<span class="label label-warning">disabled</span>
</false>
</check>
</td>
<td class="text-right txt-color {{ @member->securityStatus >= 0 ? 'txt-color-green' : 'txt-color-orange' }}">{{ number_format(round(@member->securityStatus, 2), 2) }}</td>
<td class="text-right">{{ @member->getFormattedColumn('lastLogin') }}</td>
<td class="text-right txt-color txt-color-orange">{{ @member->getFormattedColumn('kicked') }}</td>
<td class="text-center pf-table-button-sm-cell">
<div class="btn-group btn-group-sm" role="group">
<check if="{{ @member->kicked }}">
<true>
<a class="btn btn-primary {{ @disableRow ? 'disabled' : '' }}" href="/admin/{{ @tplPage}}/kick/{{ @member->_id }}">revoke</a>
</true>
<false>
<repeat group="{{ @tplKickOptions }}" key="{{ @key }}" value="{{ @label }}">
<a class="btn btn-default {{ @disableRow ? 'disabled' : '' }}" href="/admin/{{ @tplPage}}/kick/{{ @member->_id }}/{{ @key }}">{{ @label }}</a>
</repeat>
</false>
</check>
</div>
</td>
<td class="text-right txt-color txt-color-danger">{{ @member->getFormattedColumn('banned') }}</td>
<td class="text-center pf-table-button-sm-cell">
<check if="{{ @member->banned }}">
<true>
<a class="btn btn-sm btn-primary {{ @disableRow ? 'disabled' : '' }}" href="/admin/{{ @tplPage}}/ban/{{ @member->_id }}">revoke</a>
</true>
<false>
<a class="btn btn-sm btn-danger {{ @disableRow ? 'disabled' : '' }}" href="/admin/{{ @tplPage}}/ban/{{ @member->_id }}/1">ban</a>
</false>
</check>
</td>
</tr>
</repeat>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</repeat>
</div>
</section>

View File

@@ -1,12 +1,7 @@
<div class="row text-center">
<div class="col-xs-12 pf-landing-pricing-panel">
<div class="panel panel-default pricing-big">
<div class="panel-heading text-left">
<h3 class="panel-title">Settings</h3>
</div>
<div class="panel-body">
<section>
<div class="container col-xs-12">
<div class="row"></div>
</div>
</div>
<h4><i class="fa fa-fw fa-gears"></i>&nbsp;{{ ucfirst(@tplPage) }}</h4>
</div>
</div>
</section>

View File

@@ -11,15 +11,15 @@
</span>
<p class="navbar-text">
{{ @character->name }}
{{ @character->name }}&nbsp;&nbsp;&nbsp;&nbsp;<span class="label label-success">{{ @character->role }}</span>
</p>
</div>
<div class="navbar-collapse">
<ul class="nav navbar-nav navbar-right" role="tablist">
<li class="{{ @tplPage == 'settings' ? 'active' : '' }}"><a href="/admin/settings">Settings</a></li>
<li class="{{ @tplPage == 'settings' ? 'active' : '' }}"><a href="/admin/settings"><i class="fa fa-fw fa-gears"></i>&nbsp;Settings</a></li>
<li class="{{ @tplPage == 'members' ? 'active' : '' }}"><a href="/admin/members"><i class="fa fa-fw fa-users"></i>&nbsp;Members</a></li>
<li class="{{ @tplPage == 'maps' ? 'active' : '' }}"><a href="/admin/maps">Maps</a></li>
<li class="{{ @tplPage == 'activity' ? 'active' : '' }}"><a href="/admin/activity">Activity</a></li>
<li class="{{ @tplPage == 'maps' ? 'active' : '' }} disabled"><a href="/admin/maps"><i class="fa fa-fw fa-code-fork"></i>&nbsp;Maps</a></li>
<li class="{{ @tplPage == 'activity' ? 'active' : '' }} disabled"><a href="/admin/activity"><i class="fa fa-fw fa-line-chart"></i>&nbsp;Activity</a></li>
<li class="{{ @tplPage == 'login' ? 'active' : '' }}"><a href="/admin/login"><i class="fa fa-fw fa-sign-in"></i>&nbsp;SSO</a></li>
</ul>
</div>