Skip to content

Commit

Permalink
GH-126 Create batch messages deletion function in Messages module
Browse files Browse the repository at this point in the history
  • Loading branch information
mdziekon committed Aug 1, 2020
1 parent cbd64cf commit 1fabb61
Show file tree
Hide file tree
Showing 4 changed files with 161 additions and 0 deletions.
13 changes: 13 additions & 0 deletions modules/messages/_includes.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php

// TODO: Migrate to IIFE once PHP 5 support is removed
call_user_func(function () {
global $_EnginePath;

$includePath = $_EnginePath . 'modules/messages/';

include($includePath . './commands/batchDeleteUserMessages.commands.php');

});

?>
138 changes: 138 additions & 0 deletions modules/messages/commands/batchDeleteUserMessages.commands.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
<?php

namespace UniEngine\Engine\Modules\Messages\Commands;

/**
* Soft deletes all messages of a specified user which were received up until the specified point in time.
* Admin messages are excluded from being batch deleted.
*
* @param array $params
* @param number $params['userID']
* The ID of a user whose messages should be deleted.
* @param number $params['untilTimestamp']
* Determines the cut-off point for deletion, meaning that all messages
* prior to this point in time (inclusive) will be deleted.
*/
function batchDeleteUserMessages($params) {
$ownerID = $params['userID'];
$utilTimestamp = $params['untilTimestamp'];

$excludedMessageTypesString = _getBatchDeletionExcludedMessageTypesQueryString();

$softDeleteMessagesQuery = (
"UPDATE {{table}} " .
"SET " .
"`deleted` = true " .
"WHERE " .
"`time` <= {$utilTimestamp} AND" .
"`id_owner` = {$ownerID} AND " .
"`type` NOT IN ({$excludedMessageTypesString}) " .
";"
);

doquery($softDeleteMessagesQuery, 'messages');

$deletedMessagesCount = getDBLink()->affected_rows;

_updateMessageThreadsAffectedByBatchDeletion($params);

return [
'deletedMessagesCount' => $deletedMessagesCount,
];
}

function _getBatchDeletionExcludedMessageTypes() {
return [ 80 ];
}

function _getBatchDeletionExcludedMessageTypesQueryString() {
$messageTypes = array_map(
function ($value) { return strval($value); },
_getBatchDeletionExcludedMessageTypes()
);

return implode(', ', $messageTypes);
}

/**
* @param array $params
* See batchDeleteUserMessages().
*/
function _updateMessageThreadsAffectedByBatchDeletion($params) {
$ownerID = $params['userID'];
$utilTimestamp = $params['untilTimestamp'];

$excludedMessageTypesString = _getBatchDeletionExcludedMessageTypesQueryString();

$fetchThreadedMessagesQuery = (
"SELECT `Thread_ID` FROM {{table}} " .
"WHERE " .
"`time` <= {$utilTimestamp} AND " .
"`id_owner` = {$ownerID} AND " .
"`type` NOT IN ({$excludedMessageTypesString}) AND " .
"`Thread_ID` > 0 " .
";"
);

$threadedMessagesResult = doquery($fetchThreadedMessagesQuery, 'messages');

if ($threadedMessagesResult->num_rows <= 0) {
return;
}

$threadsToUpdate = [];

while ($threadData = $threadedMessagesResult->fetch_assoc()) {
$threadID = $threadData['Thread_ID'];

if (in_array($threadID, $threadsToUpdate)) {
continue;
}

$threadsToUpdate[] = $threadID;
}

$threadsToUpdateString = implode(', ', $threadsToUpdate);

$fetchLastNonDeletedMessageIDsOfThreadsQuery = (
"SELECT MAX(`id`) AS `id` " .
"FROM {{table}} " .
"WHERE " .
"`Thread_ID` IN ({$threadsToUpdateString}) AND " .
"`id_owner` = {$ownerID} AND " .
"`deleted` = false " .
"GROUP BY `Thread_ID` " .
";"
);
$fetchLastNonDeletedMessageIDsOfThreadsResult = doquery(
$fetchLastNonDeletedMessageIDsOfThreadsQuery,
'messages'
);

if ($fetchLastNonDeletedMessageIDsOfThreadsResult->num_rows <= 0) {
return;
}

$threadMessagesToUpdate = [];

while ($messageEntry = $fetchLastNonDeletedMessageIDsOfThreadsResult->fetch_assoc()) {
$messageID = $messageEntry['id'];

$threadMessagesToUpdate[] = $messageID;
}

$threadMessagesToUpdateString = implode(', ', $threadMessagesToUpdate);

$updateThreadedMessagesQuery = (
"UPDATE {{table}} " .
"SET " .
"`Thread_IsLast` = 1 " .
"WHERE " .
"`id` IN ({$threadMessagesToUpdateString}) " .
";"
);

doquery($updateThreadedMessagesQuery, 'messages');
}

?>
5 changes: 5 additions & 0 deletions modules/messages/commands/index.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<?php

header("Location: ../index.php");

?>
5 changes: 5 additions & 0 deletions modules/messages/index.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<?php

header("Location: ../index.php");

?>

0 comments on commit 1fabb61

Please sign in to comment.