Skip to content
Snippets Groups Projects

Resolve "Backend code update"

Merged Lidiya Gelemeev requested to merge 4-backend-code-update into main
2 files
+ 76
76
Compare changes
  • Side-by-side
  • Inline
Files
2
+ 55
43
@@ -6,14 +6,15 @@ use OCA\SccuotNC\Db\ExtMapper;
use OCA\SccuotNC\Util\FileSize;
use OCP\DB\Exception;
use OCP\IConfig;
use OCP\IDBConnection;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCA\SccuotNC\Service\ConfigService;
use PDO;
class AccountsMapper extends ExtMapper {
const PREFERENCES_TABLE = 'preferences';
private ConfigService $configService;
private string $activeUsersFile = '/tmp/active_users.txt';
public function __construct(IDBConnection $db, int $chunkSize, ConfigService $configService ) {
parent::__construct($db, self::PREFERENCES_TABLE, $chunkSize);
@@ -21,20 +22,23 @@ class AccountsMapper extends ExtMapper {
}
public function queryTotalCount(string $state): int {
$users = $this->configService->config()->getUsersForUserValue('core', 'enabled', 'false');
$deactivatedUsers = array_map('strval', $this->configService->config()->getUsersForUserValue('core', 'enabled', 'false'));
if ($state === 'false'){
return count($users);
return count($deactivatedUsers);
}
$qb = $this->db->getQueryBuilder();
$qb->selectAlias($qb->createFunction('COUNT(DISTINCT uid)'), 'c')
$qb->select('uid')
->from('accounts');
$stmt = $qb->execute();
$result = $stmt->fetch();
$result = $stmt->fetchAll(PDO::FETCH_COLUMN);
$stmt->closeCursor();
$result = array_map('strval', $result);
$count = (int)$result['c'] - count($users);
return $count;
$activerUsers = array_diff($result, $deactivatedUsers);
$fileContent = implode(PHP_EOL, $activerUsers);
file_put_contents($this->activeUsersFile, $fileContent);
return count($result) - count($deactivatedUsers);
}
/**
@@ -54,79 +58,74 @@ class AccountsMapper extends ExtMapper {
return (int) $result['c'];
}
/**
* @throws \Exception
*/
public function queryUserStorages(): array {
$activeUsers = $this->getActiveUsersFromFile($this->activeUsersFile);
$data = [
'storages' => []
];
$this->chunkedQuery('userid', array($this, 'queryUserStoragesCallback'), $data, true);
$this->chunkedQueryArray(function ($query, $userChunk, &$data) use ($activeUsers) {
return $this->queryUserStoragesCallback($query, $userChunk, $data);
}, $data, $activeUsers);
return $data['storages'];
}
protected function queryUserStoragesCallback(IQueryBuilder $query, $offset, &$data): string {
protected function queryUserStoragesCallback(IQueryBuilder $query, array $userChunk, &$data): string {
$storages = &$data['storages'];
$qb = $this->getQueryBuilder();
$qb->selectDistinct('userid')
->from(self::PREFERENCES_TABLE)
->where($qb->expr()->eq('configkey', $qb->expr()->literal('enabled')))
->andWhere($qb->expr()->eq('configvalue', $qb->expr()->literal('false')));
if (empty($userChunk)) {
return '0';
}
$query->selectAlias('fc.size', 's')
->selectAlias('p.userid', 'i')
->from(self::PREFERENCES_TABLE, 'p')
->join('p', StoragesMapper::STORAGES_TABLE, 's', "s.id = CONCAT('home::', p.userid)")
->selectAlias('a.uid', 'i')
->from('accounts', 'a')
->join('a', StoragesMapper::STORAGES_TABLE, 's', "s.id = CONCAT('home::', a.uid)")
->join('s', FilecacheMapper::FILECACHE_TABLE, 'fc', 'fc.storage = s.numeric_id')
->where($query->expr()->notIn('p.userid', $query->createFunction($qb->getSQL())))
->where($query->expr()->eq('p.configkey', $query->createPositionalParameter('quota')))
->andWhere($query->expr()->eq('fc.path', $query->createPositionalParameter('files')));
$this->addAlphabeticalChunkCondition($query,'p.userid', $offset);
->where($query->expr()->eq('fc.path', $query->createPositionalParameter('files')))
->andWhere($query->expr()->in('a.uid', $query->createPositionalParameter($userChunk, IQueryBuilder::PARAM_STR_ARRAY)));
// Add storages and get highest ID
$highestID = '0';
foreach ($this->queryRows($query) as $row) {
$storages[] = intval($row['s']);
$highestID = max($row['i'], $highestID);
}
return $highestID;
return '';
}
public function queryUserQuotas($defaultQuotas) {
$activeUsers = $this->getActiveUsersFromFile($this->activeUsersFile);
$data = [
'defaultQuotas' => $defaultQuotas,
'quotas' => []
];
$this->chunkedQuery('userid', array($this, 'queryUserQuotasCallback'), $data, true);
$this->chunkedQueryArray(function ($query, $userChunk, &$data) use ($activeUsers) {
return $this->queryUserQuotasCallback($query, $userChunk, $data);
}, $data, $activeUsers);
return $data['quotas'];
}
protected function queryUserQuotasCallback(IQueryBuilder $query, $offset, &$data): string {
protected function queryUserQuotasCallback(IQueryBuilder $query, $userChunk, &$data): string {
$defaultQuotas = $data['defaultQuotas'];
$quotas = &$data['quotas'];
$qb = $this->getQueryBuilder();
$qb->selectDistinct('userid')
->from(self::PREFERENCES_TABLE)
->where($qb->expr()->eq('configkey', $qb->expr()->literal('enabled')))
->andWhere($qb->expr()->eq('configvalue', $qb->expr()->literal('false')));
if (empty($userChunk)) {
return '0';
}
$query->selectDistinct('p.userid')
->selectAlias('p1.configvalue', 'quota')
->from(self::PREFERENCES_TABLE, 'p')
->join('p', self::PREFERENCES_TABLE, 'p1', 'p1.userid = p.userid')
->where($query->expr()->notIn('p.userid', $query->createFunction($qb->getSQL())))
->andWhere($query->expr()->eq('p1.configkey', $query->createPositionalParameter('quota')));
$this->addAlphabeticalChunkCondition($query,'p.userid', $offset);
->andWhere($query->expr()->eq('p1.configkey', $query->createPositionalParameter('quota')))
->andWhere($query->expr()->in('p.userid', $query->createPositionalParameter($userChunk, IQueryBuilder::PARAM_STR_ARRAY)));
// Add quotas and get highest ID
$highestID = '';
foreach ($this->queryRows($query) as $row) {
$defaultQuota = $this->findDefaultQuota($defaultQuotas, $row['quota']);
if (($quota = FileSize::ParseQuotaString($row['quota'], $defaultQuota)) !== false) {
$quotas[$row['userid']] = $quota;
}
$highestID = max($row['userid'], $highestID);
}
return $highestID;
return '';
}
private function findDefaultQuota($defaultQuotas, $backend) {
@@ -138,4 +137,17 @@ class AccountsMapper extends ExtMapper {
}
return false;
}
/**
* @throws \Exception
*/
protected function getActiveUsersFromFile(string $filePath): array {
if (!file_exists($filePath)) {
throw new \Exception("Active users file not found at: {$filePath}");
}
$activeUsers = file($filePath, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
return array_map('trim', $activeUsers); // Ensure no extra whitespace
}
}
Loading