WEBD-325-45/week-06/project/libraries/src/User/User.php

180 lines
4.7 KiB
PHP

<?php
/**
* @package Octoleo CMS
*
* @created 9th April 2022
* @author Llewellyn van der Merwe <https://git.vdm.dev/Llewellyn>
* @git WEBD-325-45 <https://git.vdm.dev/Llewellyn/WEBD-325-45>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Octoleo\CMS\User;
use Joomla\Registry\Registry;
use Joomla\Database\DatabaseInterface;
use Joomla\Database\ParameterType;
use Octoleo\CMS\Factory;
use Octoleo\CMS\Utilities\StringHelper;
use stdClass;
use Exception;
/**
* User class. Handles all application interaction with a user
*
* @since 1.0.0
*/
class User extends Registry
{
/**
* Constructor activating the default information of the language
*
* @param integer $identifier The primary key of the user to load (optional).
*
* @throws Exception
* @since 1.1.0
*/
public function __construct($identifier = 0)
{
// Load the user if it exists
if (!empty($identifier))
{
$data = $this->load($identifier);
// not a guest
$data->guest = 0;
}
else
{
// Initialise guest
$data = (object) ['id' => 0, 'sendEmail' => 0, 'block' => 1, 'aid' => 0, 'guest' => 1, 'groups' => []];
}
// set the data
parent::__construct($data);
}
/**
* Method to load a User object by user id number
*
* @param int $id The user id of the user to load
*
* @return stdClass on success
*
* @throws Exception
* @since 1.0.0
*/
protected function load(int $id): stdClass
{
// Get the database
$db = Factory::getContainer()->get(DatabaseInterface::class);
// Initialise some variables
$query = $db->getQuery(true)
->select('u.*')
->from($db->quoteName('#__users', 'u'))
->where($db->quoteName('u.id') . ' = :id')
->bind(':id', $id, ParameterType::INTEGER)
->setLimit(1);
$db->setQuery($query);
$user = $db->loadObject();
if ($user instanceof stdClass && isset($user->id))
{
// start admin details
$user->is_admin = false;
$user->is_admin_groups = [];
// start access
$user->access = new stdClass();
// Initialise some variables
$query = $db->getQuery(true)
->select($db->quoteName(array('g.id', 'g.title', 'g.params')))
->from($db->quoteName('#__user_usergroup_map', 'm'))
->join('INNER', $db->quoteName('#__usergroups', 'g'), 'g.id = m.group_id')
->where($db->quoteName('m.user_id') . ' = :user_id')
->bind(':user_id', $user->id, ParameterType::INTEGER);
$db->setQuery($query);
$groups = $db->loadObjectList();
if (is_array($groups) && count($groups) > 0)
{
// group bucket of id's
$groups_ids = [];
foreach ($groups as $group)
{
// add group ID
$groups_ids[] = $group->id;
// convert params to object
$params = json_decode($group->params);
// set the access
if (is_array($params) && count($params) > 0)
{
$counter = 0;
$checker = 0;
foreach ($params as $param)
{
// prep the area string
$area = StringHelper::safe($param->area);
// only tart object if not already set
if(empty($user->access->{$area}))
{
// start object
$user->access->{$area} = new stdClass();
}
// make sure we have upper case
$param->access = strtoupper($param->access);
// full access to area
if ($param->access === 'CRUD')
{
$checker++;
// add the full permissions
$user->access->{$area}->create = true;
$user->access->{$area}->read = true;
$user->access->{$area}->update = true;
$user->access->{$area}->delete = true;
}
else
{
// this user has fewer permissions
// set them one at a time
if (strpos($param->access, 'C') !== false)
{
$user->access->{$area}->create = true;
}
if (strpos($param->access, 'R') !== false)
{
$user->access->{$area}->read = true;
}
if (strpos($param->access, 'U') !== false)
{
$user->access->{$area}->update = true;
}
if (strpos($param->access, 'D') !== false)
{
$user->access->{$area}->delete = true;
}
}
$counter++;
}
// if this group has full access
if ($counter == $checker)
{
// we need to know when this is an admin user
$user->is_admin = true;
// we load the ids to use in user update, so we can prevent
// admin users from removing themselves from the admin group
$user->is_admin_groups[] = $group->id;
}
}
unset($group->params);
}
// keep the group details
$user->groups = $groups;
$user->groups_ids = $groups_ids;
}
return $user;
}
return (object) ['id' => 0, 'sendEmail' => 0, 'block' => 1, 'aid' => 0, 'guest' => 1, 'groups' => []];
}
}