1
0
Fork 0
mirror of synced 2024-10-01 09:47:43 +13:00

Delete subscribers and update topic totals when deleting target

This commit is contained in:
Steven Nguyen 2024-01-04 21:44:33 +00:00
parent 7a17f102c4
commit d670c07ca4
No known key found for this signature in database
GPG key ID: 22EB8611C67E9E5C
2 changed files with 43 additions and 3 deletions

View file

@ -171,6 +171,7 @@ const DELETE_TYPE_CACHE_BY_TIMESTAMP = 'cacheByTimeStamp';
const DELETE_TYPE_CACHE_BY_RESOURCE = 'cacheByResource'; const DELETE_TYPE_CACHE_BY_RESOURCE = 'cacheByResource';
const DELETE_TYPE_SCHEDULES = 'schedules'; const DELETE_TYPE_SCHEDULES = 'schedules';
const DELETE_TYPE_TOPIC = 'topic'; const DELETE_TYPE_TOPIC = 'topic';
const DELETE_TYPE_TARGET = 'target';
// Mail Types // Mail Types
const MAIL_TYPE_VERIFICATION = 'verification'; const MAIL_TYPE_VERIFICATION = 'verification';
const MAIL_TYPE_MAGIC_SESSION = 'magicSession'; const MAIL_TYPE_MAGIC_SESSION = 'magicSession';

View file

@ -158,6 +158,9 @@ class Deletes extends Action
case DELETE_TYPE_TOPIC: case DELETE_TYPE_TOPIC:
$this->deleteTopic($project, $getProjectDB, $document); $this->deleteTopic($project, $getProjectDB, $document);
break; break;
case DELETE_TYPE_TARGET:
$this->deleteTarget($project, $getProjectDB, $document);
break;
default: default:
throw new \Exception('No delete operation for type: ' . \strval($type)); throw new \Exception('No delete operation for type: ' . \strval($type));
break; break;
@ -221,6 +224,35 @@ class Deletes extends Action
], $dbForProject); ], $dbForProject);
} }
/**
* @param Document $project
* @param callable $getProjectDB
* @param Document $target
* @throws Exception
*/
protected function deleteTarget(Document $project, callable $getProjectDB, Document $target)
{
/** @var Database */
$dbForProject = $getProjectDB($project);
// Delete subscribers and decrement topic counts
$this->deleteByGroup(
'subscribers',
[
Query::equal('targetInternalId', [$target->getInternalId()])
],
$dbForProject,
function (Document $subscriber) use ($dbForProject) {
$topicId = $subscriber->getAttribute('topicId');
$topicInternalId = $subscriber->getAttribute('topicInternalId');
$topic = $dbForProject->getDocument('topics', $topicId);
if (!$topic->isEmpty() && $topic->getInternalId() === $topicInternalId) {
$dbForProject->decreaseDocumentAttribute('topics', $topicId, 'total', min: 0);
}
}
);
}
/** /**
* @param Document $project * @param Document $project
* @param callable $getProjectDB * @param callable $getProjectDB
@ -563,9 +595,16 @@ class Deletes extends Action
], $dbForProject); ], $dbForProject);
// Delete targets // Delete targets
$this->deleteByGroup('targets', [ $this->listByGroup(
Query::equal('userInternalId', [$userInternalId]) 'targets',
], $dbForProject); [
Query::equal('userInternalId', [$userInternalId])
],
$dbForProject,
function (Document $target) use ($getProjectDB, $project) {
$this->deleteTarget($project, $getProjectDB, $target);
}
);
} }
/** /**