mirror of
https://github.com/appwrite/appwrite
synced 2026-05-15 04:59:01 +00:00
63 lines
2.2 KiB
PHP
63 lines
2.2 KiB
PHP
<?php
|
|
|
|
namespace Appwrite\Deletes;
|
|
|
|
use Appwrite\Extend\Exception;
|
|
use Utopia\Console;
|
|
use Utopia\Database\Database;
|
|
use Utopia\Database\Document;
|
|
use Utopia\Database\Exception\Limit as LimitException;
|
|
use Utopia\Database\Query;
|
|
|
|
class Targets
|
|
{
|
|
public static function delete(Database $database, Query $query): void
|
|
{
|
|
$database->deleteDocuments(
|
|
'targets',
|
|
[
|
|
$query,
|
|
Query::orderAsc()
|
|
],
|
|
Database::DELETE_BATCH_SIZE,
|
|
fn (Document $target) => self::deleteSubscribers($database, $target)
|
|
);
|
|
}
|
|
|
|
public static function deleteSubscribers(Database $database, Document $target): void
|
|
{
|
|
$database->deleteDocuments(
|
|
'subscribers',
|
|
[
|
|
Query::equal('targetInternalId', [$target->getSequence()]),
|
|
Query::orderAsc(),
|
|
],
|
|
Database::DELETE_BATCH_SIZE,
|
|
function (Document $subscriber) use ($database, $target) {
|
|
$topicId = $subscriber->getAttribute('topicId');
|
|
$topicInternalId = $subscriber->getAttribute('topicInternalId');
|
|
$topic = $database->getDocument('topics', $topicId);
|
|
if (!$topic->isEmpty() && $topic->getSequence() === $topicInternalId) {
|
|
$totalAttribute = match ($target->getAttribute('providerType')) {
|
|
MESSAGE_TYPE_EMAIL => 'emailTotal',
|
|
MESSAGE_TYPE_SMS => 'smsTotal',
|
|
MESSAGE_TYPE_PUSH => 'pushTotal',
|
|
default => throw new Exception('Invalid target provider type'),
|
|
};
|
|
|
|
try {
|
|
$database->decreaseDocumentAttribute(
|
|
'topics',
|
|
$topicId,
|
|
$totalAttribute,
|
|
min: 0
|
|
);
|
|
} catch (LimitException $e) {
|
|
Console::error("Delete subscribers decreaseDocumentAttribute (topicId={$topicId}): {$e->getMessage()}");
|
|
}
|
|
}
|
|
}
|
|
);
|
|
}
|
|
|
|
}
|