chimera-mark2-core-release/core/fox/userGroupMembership.php

235 lines
6.9 KiB
PHP

<?php
namespace fox;
/**
*
* Class fox\userGroupMembership
*
* @copyright MX STAR LLC 2021
* @version 4.0.0
* @author Pavel Dmitriev
* @license GPLv3
*
*/
class userGroupMembership extends baseClass implements externalCallable
{
protected $id;
public $groupId;
public $userId;
protected user $__user;
protected userGroup $__group;
public static $sqlTable = "tblUserGroupLink";
public static $allowDeleteFromDB = true;
public static $sqlColumns = [
"groupId" => [
"type" => "INT",
"index" => "INDEX",
"nullable" => false
],
"userId" => [
"type" => "INT",
"index" => "INDEX",
"nullable" => false
]
];
public static function getUsersInGroup(?userGroup $group = null, ?sql $sql = null)
{
if (empty($sql)) {
$sql = new sql();
}
$res = $sql->quickExec("select * from `" . self::$sqlTable . "`" . ($group === null ? "" : " where `groupId` = '" . $group->id . "'"));
$rv = [];
while ($row = mysqli_fetch_assoc($res)) {
$item = new self($row);
if ($item->user !== null) {
$rv[] = $item;
}
}
return $rv;
}
public function loadUser()
{
if (empty($this->__user) && ! empty($this->userId)) {
try {
$this->__user = new user(id: $this->userId, loadDeleted: true);
} catch (\Exception $e) {
return null;
}
}
return $this->__user;
}
public function loadGroup()
{
if (empty($this->__group) && ! empty($this->groupId)) {
$this->__group = new userGroup($this->groupId);
}
return $this->__group;
}
public static function getGroupsForUser(?user $user = null, ?sql $sql = null)
{
// if user===null -> get all items, else - get only items for user
if (empty($sql)) {
$sql = new sql();
}
$res = $sql->quickExec("select * from `" . self::$sqlTable . "`" . ($user === null ? "" : " where `userId` = '" . $user->id . "'"));
$rv = [];
while ($row = mysqli_fetch_assoc($res)) {
$item = new self($row);
if ($item->group !== null) {
$rv[] = $item;
}
}
return $rv;
}
public function __get($key)
{
switch ($key) {
case "user":
return $this->loadUser();
case "group":
return $this->loadGroup();
default:
return parent::__get($key);
}
}
public function export()
{
$rv = parent::export();
if (! empty($this->__user)) {
$rv["user"] = $this->__user;
}
if (! empty($this->__group)) {
$rv["group"] = $this->__group;
}
return $rv;
}
public static function API_POST_search(request $request)
{
if (! $request->user->checkAccess("adminUserGroups", "core")) {
throw new foxException("Forbidden", 403);
}
@$page=common::clearInput($request->requestBody->page);
if (empty($page) || !(is_numeric($page))) {$page=0;}
@$pageSize=common::clearInput($request->requestBody->pageSize);
if (empty($pageSize) || !(is_numeric($pageSize))) {$pageSize=$request->user->config["pageSize"];}
if (!empty($request->requestBody->userId)) {
$user = new user(id: $userId=common::clearInput($request->requestBody->userId,"0-9"), loadDeleted: true);
} else {
$user=null;
$userId=null;
}
if (!empty($request->requestBody->groupId)) {
$group=new userGroup($groupId=common::clearInput($request->requestBody->groupId,"0-9"));
} else {
$group=null;
$groupId=null;
}
if (!$user && !$group) {
throw new foxException("Invalid request",400);
}
$res=static::search(null,$pageSize,$page,[
"user"=>$user,
"group"=>$group,
])->result;
$rv=[];
foreach ($res as $ugm) {
$rv[]=[
"ugmId"=>$ugm->id,
"user"=>($userId==$ugm->userId)?$user:$ugm->user,
"group"=>($groupId==$ugm->groupId)?$group:$ugm->group,
];
}
return $rv;
}
protected static function xSearch($where, $pattern, ?array $options, sql $sql) {
if (!empty($options["user"])) {
$xWhere="`i`.`userId`='".$options["user"]->id."'";
}
if (!empty($options["group"])) {
$xWhere.=(empty($xWhere)?"":" AND ")."`i`.`groupId`='".$options["group"]->id."'";
}
return ["where"=>empty($where)?$xWhere:"(".$where.") AND ".$xWhere, "join"=>null];
}
public static function APICall(request $request) {
if (! $request->user->checkAccess("adminUserGroups", "core")) {
throw new foxException("Forbidden", 403);
}
$user=new user(common::clearInput($request->requestBody->userId,"0-9"));
$userGroup=new userGroup(common::clearInput($request->requestBody->groupId,"0-9"));
$userGroupMembership=null;
foreach (static::getGroupsForUser($user) as $ugm) {
if ($ugm->groupId==$userGroup->id) {
$userGroupMembership=$ugm;
break;
}
}
switch ($request->method) {
case "PUT":
if ($userGroupMembership!==null) {
foxException::throw("ERR", "Already exists", 409, "UGX");
}
$userGroupMembership=new userGroupMembership();
$userGroupMembership->userId=$user->id;
$userGroupMembership->groupId=$userGroup->id;
$userGroupMembership->save();
$user->flushACRCache();
static::log($request->instance,__FUNCTION__, "User ".$user->login ." join group ".$userGroup->name,$request->user,"user",$user->id,null,logEntry::sevInfo);
foxRequestResult::throw("201", "Created");
break;
case "DELETE":
if ($userGroupMembership==null) {
foxException::throw("ERR", "Not found", 404, "UGN");
}
static::log($request->instance,__FUNCTION__, "User ".$userGroupMembership->user->login ." left group ".$userGroupMembership->group->name,$request->user,"user",$userGroupMembership->user->id,null,logEntry::sevInfo);
$userGroupMembership->delete();
$user->flushACRCache();
break;
default:
throw new foxException("Method not allowed",405);
break;
}
}
}
?>