Files
nextcloud-forum/lib/Migration/Version3Date20251119193455.php

120 lines
3.6 KiB
PHP

<?php
declare(strict_types=1);
// SPDX-FileCopyrightText: Chen Asraf <contact@casraf.dev>
// SPDX-License-Identifier: AGPL-3.0-or-later
namespace OCA\Forum\Migration;
use Closure;
use OCP\DB\ISchemaWrapper;
use OCP\Migration\IOutput;
use OCP\Migration\SimpleMigrationStep;
class Version3Date20251119193455 extends SimpleMigrationStep {
/**
* @param IOutput $output
* @param Closure(): ISchemaWrapper $schemaClosure
* @param array $options
*/
public function preSchemaChange(IOutput $output, Closure $schemaClosure, array $options): void {
}
/**
* @param IOutput $output
* @param Closure(): ISchemaWrapper $schemaClosure
* @param array $options
* @return null|ISchemaWrapper
*/
public function changeSchema(IOutput $output, Closure $schemaClosure, array $options): ?ISchemaWrapper {
/** @var ISchemaWrapper $schema */
$schema = $schemaClosure();
// TODO add migration logic
return $schema;
}
/**
* @param IOutput $output
* @param Closure(): ISchemaWrapper $schemaClosure
* @param array $options
*/
public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $options): void {
// Fix admin role assignments for existing installations
$this->fixAdminRoleAssignments();
}
/**
* Fix admin role assignments for users who ran the migration before the isAdmin() fix
*/
private function fixAdminRoleAssignments(): void {
$db = \OC::$server->get(\OCP\IDBConnection::class);
$userManager = \OC::$server->get(\OCP\IUserManager::class);
$groupManager = \OC::$server->get(\OCP\IGroupManager::class);
$timestamp = time();
// Get the Admin role ID
$qb = $db->getQueryBuilder();
$qb->select('id')
->from('forum_roles')
->where($qb->expr()->eq('name', $qb->createNamedParameter('Admin')));
$result = $qb->executeQuery();
$adminRole = $result->fetch();
$result->closeCursor();
if (!$adminRole) {
// Admin role doesn't exist, nothing to fix
return;
}
$adminRoleId = $adminRole['id'];
// Check if there are any users already assigned to the Admin role
$qb = $db->getQueryBuilder();
$qb->select('id')
->from('forum_user_roles')
->where($qb->expr()->eq('role_id', $qb->createNamedParameter($adminRoleId, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT)))
->setMaxResults(1);
$result = $qb->executeQuery();
$hasAdmins = $result->fetch();
$result->closeCursor();
if ($hasAdmins) {
// Admin roles are already assigned, nothing to fix
return;
}
// No admins found - assign Admin role to all Nextcloud admins
$userManager->callForAllUsers(function ($user) use ($db, $timestamp, $adminRoleId, $groupManager) {
$userId = $user->getUID();
$isAdmin = $groupManager->isAdmin($userId);
if ($isAdmin) {
// Check if this user already has the admin role (shouldn't happen, but be safe)
$qb = $db->getQueryBuilder();
$qb->select('id')
->from('forum_user_roles')
->where($qb->expr()->eq('user_id', $qb->createNamedParameter($userId)))
->andWhere($qb->expr()->eq('role_id', $qb->createNamedParameter($adminRoleId, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT)));
$result = $qb->executeQuery();
$exists = $result->fetch();
$result->closeCursor();
if (!$exists) {
// Assign Admin role
$qb = $db->getQueryBuilder();
$qb->insert('forum_user_roles')
->values([
'user_id' => $qb->createNamedParameter($userId),
'role_id' => $qb->createNamedParameter($adminRoleId, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT),
'created_at' => $qb->createNamedParameter($timestamp, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT),
])
->executeStatement();
}
}
});
}
}