/** * Delete all of the Vanilla related information for a specific user. * * @since 2.1 * * @param int $userID The ID of the user to delete. * @param array $options An array of options: * - DeleteMethod: One of delete, wipe, or NULL */ public function deleteUserData($userID, $options = array(), &$data = null) { $sql = Gdn::sql(); // Remove discussion watch records and drafts. $sql->delete('UserDiscussion', array('UserID' => $userID)); Gdn::userModel()->getDelete('Draft', array('InsertUserID' => $userID), $data); // Comment deletion depends on method selected $deleteMethod = val('DeleteMethod', $options, 'delete'); if ($deleteMethod == 'delete') { // Get a list of category IDs that has this user as the most recent poster. $discussionCats = $sql->select('cat.CategoryID')->from('Category cat')->join('Discussion d', 'd.DiscussionID = cat.LastDiscussionID')->where('d.InsertUserID', $userID)->get()->resultArray(); $commentCats = $sql->select('cat.CategoryID')->from('Category cat')->join('Comment c', 'c.CommentID = cat.LastCommentID')->where('c.InsertUserID', $userID)->get()->resultArray(); $categoryIDs = array_unique(array_merge(array_column($discussionCats, 'CategoryID'), array_column($commentCats, 'CategoryID'))); // Grab all of the discussions that the user has engaged in. $discussionIDs = $sql->select('DiscussionID')->from('Comment')->where('InsertUserID', $userID)->groupBy('DiscussionID')->get()->resultArray(); $discussionIDs = array_column($discussionIDs, 'DiscussionID'); Gdn::userModel()->getDelete('Comment', array('InsertUserID' => $userID), $data); // Update the comment counts. $commentCounts = $sql->select('DiscussionID')->select('CommentID', 'count', 'CountComments')->select('CommentID', 'max', 'LastCommentID')->whereIn('DiscussionID', $discussionIDs)->groupBy('DiscussionID')->get('Comment')->resultArray(); foreach ($commentCounts as $row) { $sql->put('Discussion', array('CountComments' => $row['CountComments'] + 1, 'LastCommentID' => $row['LastCommentID']), array('DiscussionID' => $row['DiscussionID'])); } // Update the last user IDs. $sql->update('Discussion d')->join('Comment c', 'd.LastCommentID = c.CommentID', 'left')->set('d.LastCommentUserID', 'c.InsertUserID', false, false)->set('d.DateLastComment', 'coalesce(c.DateInserted, d.DateInserted)', false, false)->whereIn('d.DiscussionID', $discussionIDs)->put(); // Update the last posts. $discussions = $sql->whereIn('DiscussionID', $discussionIDs)->where('LastCommentUserID', $userID)->get('Discussion'); // Delete the user's discussions. Gdn::userModel()->getDelete('Discussion', array('InsertUserID' => $userID), $data); // Update the appropriate recent posts in the categories. $categoryModel = new CategoryModel(); foreach ($categoryIDs as $categoryID) { $categoryModel->setRecentPost($categoryID); } } elseif ($deleteMethod == 'wipe') { // Erase the user's discussions. $sql->update('Discussion')->set('Body', t('The user and all related content has been deleted.'))->set('Format', 'Deleted')->where('InsertUserID', $userID)->put(); $sql->update('Comment')->set('Body', t('The user and all related content has been deleted.'))->set('Format', 'Deleted')->where('InsertUserID', $userID)->put(); } else { // Leave comments } // Remove the user's profile information related to this application $sql->update('User')->set(array('CountDiscussions' => 0, 'CountUnreadDiscussions' => 0, 'CountComments' => 0, 'CountDrafts' => 0, 'CountBookmarks' => 0))->where('UserID', $userID)->put(); }
/** * Update the CountDiscussions value on the category based on the CategoryID being saved. * * @param int $CategoryID Unique ID of category we are updating. * @param array|false $Discussion The discussion to update the count for or **false** for all of them. */ public function updateDiscussionCount($CategoryID, $Discussion = false) { $DiscussionID = val('DiscussionID', $Discussion, false); if (strcasecmp($CategoryID, 'All') == 0) { $Exclude = (bool) Gdn::config('Vanilla.Archive.Exclude'); $ArchiveDate = Gdn::config('Vanilla.Archive.Date'); $Params = []; $Where = ''; if ($Exclude && $ArchiveDate) { $Where = 'where d.DateLastComment > :ArchiveDate'; $Params[':ArchiveDate'] = $ArchiveDate; } // Update all categories. $Sql = "update :_Category c\n left join (\n select\n d.CategoryID,\n coalesce(count(d.DiscussionID), 0) as CountDiscussions,\n coalesce(sum(d.CountComments), 0) as CountComments\n from :_Discussion d\n {$Where}\n group by d.CategoryID\n ) d\n on c.CategoryID = d.CategoryID\n set\n c.CountDiscussions = coalesce(d.CountDiscussions, 0),\n c.CountComments = coalesce(d.CountComments, 0)"; $Sql = str_replace(':_', $this->Database->DatabasePrefix, $Sql); $this->Database->query($Sql, $Params, 'DiscussionModel_UpdateDiscussionCount'); } elseif (is_numeric($CategoryID)) { $this->SQL->select('d.DiscussionID', 'count', 'CountDiscussions')->select('d.CountComments', 'sum', 'CountComments')->from('Discussion d')->where('d.CategoryID', $CategoryID); $this->addArchiveWhere(); $Data = $this->SQL->get()->firstRow(); $CountDiscussions = (int) GetValue('CountDiscussions', $Data, 0); $CountComments = (int) GetValue('CountComments', $Data, 0); $CacheAmendment = ['CountDiscussions' => $CountDiscussions, 'CountComments' => $CountComments]; if ($DiscussionID) { $CacheAmendment = array_merge($CacheAmendment, ['LastDiscussionID' => $DiscussionID, 'LastCommentID' => null, 'LastDateInserted' => val('DateInserted', $Discussion)]); } $CategoryModel = new CategoryModel(); $CategoryModel->setField($CategoryID, $CacheAmendment); $CategoryModel->setRecentPost($CategoryID); } }