A lot of things.

This commit is contained in:
2026-06-08 16:25:52 +02:00
parent 8eb94ff05d
commit 4415a2e8c4
55 changed files with 995 additions and 163 deletions

View File

@@ -0,0 +1,106 @@
<?php
namespace RomhackPlaza\Master\Service\Club;
use RomhackPlaza\Master\Entity\Club;
use XF\App;
use XF\Entity\User;
use XF\Service\AbstractService;
class ModeratorService extends AbstractService
{
public const int MAX_MODS = 5;
/**
* @var Club
*/
protected $club;
/**
* @var User
*/
protected $user;
public function __construct(App $app, Club $club, User $moderator)
{
parent::__construct($app);
$this->club = $club;
$this->user = $moderator;
}
protected function countMods( int $nodeId, int $excludeUserId = 0 )
{
return $this->finder('XF:ModeratorContent')
->where('content_type', 'node')
->where('content_id', $nodeId)
->where('user_id', '!=', $excludeUserId)
->total();
}
public function addModerator( string &$error ): bool
{
if( !$this->club->Forum || !$this->club->Forum->Node ) {
$error = "No node linked to this club.";
return false;
}
if( $this->countMods( $this->club->node_id, $this->club->user_id ) > self::MAX_MODS ) {
$error = "The limit of 5 moderators has been reached.";
return false;
}
$existingMod = $this->em()->findOne('XF:ModeratorContent', [
'content_type' => 'node',
'content_id' => $this->club->node_id,
'user_id' => $this->user->user_id
]);
if( $existingMod ){
$error = "This user is already a moderator.";
return false;
}
$modContent = $this->em()->create('XF:ModeratorContent');
$modContent->content_type = 'node';
$modContent->content_id = $this->club->node_id;
$modContent->user_id = $this->user->user_id;
$modContent->save();
$permissionUpdater = \XF::app()->service('XF:UpdatePermissions');
$permissionUpdater->setContent('node', $this->club->node_id);
$permissionUpdater->setUser($this->user);
$permissionUpdater->updatePermissions(Club::MOD_PERMISSIONS);
\XF::app()->jobManager()->enqueueUnique('permissionRebuild', 'XF:PermissionRebuild');
return true;
}
public function deleteModerator( string &$error ): bool
{
if( !$this->club->Forum || !$this->club->Forum->Node ) {
$error = "No node linked to this club.";
return false;
}
if( $this->user->user_id === $this->club->user_id ){
$error = "You cannot delete yourself.";
return false;
}
$mod = $this->em()->findOne('XF:ModeratorContent', [
'content_type' => 'node',
'content_id' => $this->club->node_id,
'user_id' => $this->user->user_id
]);
if( $mod ){
$mod->delete();
\XF::db()->delete('xf_permission_entry_content', 'content_type = ? AND content_id = ? AND user_id = ?', ['node', $this->club->node_id, $this->user->user_id]);
\XF::app()->jobManager()->enqueueUnique('permissionRebuild', 'XF:PermissionRebuild');
}
return true;
}
}