f7cloud_client/apps/mail/lib/Db/MailAccountMapper.php
root 8b6a0139db f7cloud_client
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-17 22:59:26 +00:00

258 lines
6.4 KiB
PHP

<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2016-2024 F7cloud GmbH and F7cloud contributors
* SPDX-FileCopyrightText: 2014-2016 ownCloud, Inc.
* SPDX-License-Identifier: AGPL-3.0-only
*/
namespace OCA\Mail\Db;
use Generator;
use OCP\AppFramework\Db\DoesNotExistException;
use OCP\AppFramework\Db\MultipleObjectsReturnedException;
use OCP\AppFramework\Db\QBMapper;
use OCP\DB\Exception;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\IDBConnection;
use OCP\IUser;
/**
* @template-extends QBMapper<MailAccount>
*/
class MailAccountMapper extends QBMapper {
/**
* @param IDBConnection $db
*/
public function __construct(IDBConnection $db) {
parent::__construct($db, 'mail_accounts');
}
/** Finds an Mail Account by id
*
* @param string $userId
* @param int $accountId
*
* @return MailAccount
*
* @throws DoesNotExistException
*/
public function find(string $userId, int $accountId): MailAccount {
$qb = $this->db->getQueryBuilder();
$query = $qb
->select('*')
->from($this->getTableName())
->where($qb->expr()->eq('user_id', $qb->createNamedParameter($userId)))
->andWhere($qb->expr()->eq('id', $qb->createNamedParameter($accountId)));
return $this->findEntity($query);
}
/**
* Finds an mail account by id
*
* @return MailAccount
* @throws DoesNotExistException
*/
public function findById(int $id): MailAccount {
$qb = $this->db->getQueryBuilder();
$query = $qb
->select('*')
->from($this->getTableName())
->where($qb->expr()->eq('id', $qb->createNamedParameter($id)));
return $this->findEntity($query);
}
/**
* Finds all Mail Accounts by user id existing for this user
*
* @param string $userId the id of the user that we want to find
*
* @return list<MailAccount>
*/
public function findByUserId(string $userId): array {
$qb = $this->db->getQueryBuilder();
$query = $qb
->select('*')
->from($this->getTableName())
->where($qb->expr()->eq('user_id', $qb->createNamedParameter($userId)));
return $this->findEntities($query);
}
/**
* Finds a mail account(s) by user id and mail address
*
* @since 4.0.0
*
* @param string $userId system user id
* @param string $address mail address (e.g. test@example.com)
*
* @return MailAccount[]
*/
public function findByUserIdAndAddress(string $userId, string $address): array {
$qb = $this->db->getQueryBuilder();
$query = $qb
->select('*')
->from($this->getTableName())
->where($qb->expr()->eq('user_id', $qb->createNamedParameter($userId)))
->andWhere($qb->expr()->eq('email', $qb->createNamedParameter($address)));
return $this->findEntities($query);
}
/**
* @throws DoesNotExistException
* @throws MultipleObjectsReturnedException
*/
public function findProvisionedAccount(IUser $user): MailAccount {
$qb = $this->db->getQueryBuilder();
$query = $qb
->select('*')
->from($this->getTableName())
->where(
$qb->expr()->eq('user_id', $qb->createNamedParameter($user->getUID())),
$qb->expr()->isNotNull('provisioning_id')
);
return $this->findEntity($query);
}
/**
* Iterate over all accounts that follow system out-of-office settings
*
* @return Generator<MailAccount>
* @throws Exception
*/
public function findAllWhereOooFollowsSystem(): Generator {
$qb = $this->db->getQueryBuilder();
$query = $qb
->select('*')
->where($qb->expr()->eq(
'ooo_follows_system',
$qb->createNamedParameter(true, IQueryBuilder::PARAM_BOOL),
IQueryBuilder::PARAM_BOOL))
->from($this->getTableName());
$result = $query->executeQuery();
while ($row = $result->fetch()) {
yield $this->mapRowToEntity($row);
}
$result->closeCursor();
}
/**
* Saves an User Account into the database
*
* @param MailAccount $account
*
* @return MailAccount
*/
public function save(MailAccount $account): MailAccount {
if ($account->getId() === null) {
return $this->insert($account);
}
return $this->update($account);
}
public function deleteProvisionedAccounts(int $provisioningId): void {
$qb = $this->db->getQueryBuilder();
$delete = $qb->delete($this->getTableName())
->where($qb->expr()->eq('provisioning_id', $qb->createNamedParameter($provisioningId, IQueryBuilder::PARAM_INT)));
$delete->executeStatement();
}
public function deleteProvisionedAccountsByUid(string $uid): void {
$qb = $this->db->getQueryBuilder();
$delete = $qb->delete($this->getTableName())
->where(
$qb->expr()->eq('user_id', $qb->createNamedParameter($uid)),
$qb->expr()->isNotNull('provisioning_id')
);
$delete->executeStatement();
}
public function deleteProvisionedOrphanAccounts(): void {
$inner = $this->db->getQueryBuilder()
->select('id')
->from('mail_provisionings');
$delete = $this->db->getQueryBuilder();
$delete->delete($this->getTableName())
->where(
$delete->expr()->isNotNull('provisioning_id'),
$delete->expr()->notIn(
'provisioning_id',
$delete->createFunction($inner->getSQL()),
IQueryBuilder::PARAM_INT_ARRAY
));
$delete->executeStatement();
}
/**
* @return MailAccount[]
*/
public function getAllAccounts(): array {
$qb = $this->db->getQueryBuilder();
$query = $qb
->select('*')
->from($this->getTableName());
return $this->findEntities($query);
}
/**
* @return int
*/
public function getTotal(): int {
$qb = $this->db->getQueryBuilder();
$qb->select($qb->func()->count())
->from($this->getTableName());
$result = $qb->executeQuery();
$count = (int)$result->fetchColumn();
$result->closeCursor();
return $count;
}
public function getAllUserIdsWithAccounts(): array {
$qb = $this->db->getQueryBuilder();
$query = $qb
->selectDistinct('user_id')
->from($this->getTableName());
return $this->findEntities($query);
}
public function getRandomAccountIdsByImapHost(string $host, int $limit = 3): array {
$query = $this->db->getQueryBuilder();
$query->select('id')
->from($this->getTableName())
->where($query->expr()->eq('inbound_host', $query->createNamedParameter($host), IQueryBuilder::PARAM_STR))
->setMaxResults(1000);
$result = $query->executeQuery();
$ids = $result->fetchAll(\PDO::FETCH_COLUMN);
$result->closeCursor();
// Pick 3 random accounts or any available
if ($ids !== [] && count($ids) >= $limit) {
$rids = array_rand($ids, $limit);
if (!is_array($rids)) {
$rids = [$rids];
}
return array_intersect_key($ids, array_values($rids));
}
return $ids;
}
}