feat: add production-ready site reset maintenance actions
Create Release / Build Release Package (push) Failing after 3s

Add 8 new one-shot maintenance toggles for resetting a site after
development: reset votes, normalize publish dates, clear action logs,
clear redirect logs, clear user notes, flush mail queue, flush sessions,
and set robots to index/follow.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Jonathan Miller
2026-04-30 10:21:18 -05:00
parent bc157dbecd
commit 1712291df1
4 changed files with 438 additions and 0 deletions
+318
View File
@@ -749,6 +749,150 @@ class MokoWaaS extends CMSPlugin
);
}
if ((int) $params->get('reset_votes', 0) === 1)
{
$count = $this->resetAllVotes();
$params->set('reset_votes', '0');
$changed = true;
$app->enqueueMessage(
sprintf('Deleted %d article rating records.', $count),
'message'
);
Log::add(
sprintf('All article ratings/votes purged (%d rows) by MokoWaaS', $count),
Log::WARNING,
'mokowaas'
);
}
if ((int) $params->get('normalize_publish_dates', 0) === 1)
{
$count = $this->normalizePublishDates();
$params->set('normalize_publish_dates', '0');
$changed = true;
$app->enqueueMessage(
sprintf('Normalized publish dates on %d published articles.', $count),
'message'
);
Log::add(
sprintf('Publish dates normalized to today on %d articles by MokoWaaS', $count),
Log::WARNING,
'mokowaas'
);
}
if ((int) $params->get('clear_action_logs', 0) === 1)
{
$count = $this->clearActionLogs();
$params->set('clear_action_logs', '0');
$changed = true;
$app->enqueueMessage(
sprintf('Cleared %d action log entries.', $count),
'message'
);
Log::add(
sprintf('All action logs cleared (%d rows) by MokoWaaS', $count),
Log::WARNING,
'mokowaas'
);
}
if ((int) $params->get('clear_redirects', 0) === 1)
{
$count = $this->clearRedirects();
$params->set('clear_redirects', '0');
$changed = true;
$app->enqueueMessage(
sprintf('Cleared %d redirect entries.', $count),
'message'
);
Log::add(
sprintf('All redirect links cleared (%d rows) by MokoWaaS', $count),
Log::WARNING,
'mokowaas'
);
}
if ((int) $params->get('clear_user_notes', 0) === 1)
{
$count = $this->clearUserNotes();
$params->set('clear_user_notes', '0');
$changed = true;
$app->enqueueMessage(
sprintf('Cleared %d user notes.', $count),
'message'
);
Log::add(
sprintf('All user notes cleared (%d rows) by MokoWaaS', $count),
Log::WARNING,
'mokowaas'
);
}
if ((int) $params->get('flush_mail_queue', 0) === 1)
{
$count = $this->flushMailQueue();
$params->set('flush_mail_queue', '0');
$changed = true;
$app->enqueueMessage(
sprintf('Flushed %d queued mail messages.', $count),
'message'
);
Log::add(
sprintf('Mail queue flushed (%d rows) by MokoWaaS', $count),
Log::WARNING,
'mokowaas'
);
}
if ((int) $params->get('flush_sessions', 0) === 1)
{
$count = $this->flushSessions();
$params->set('flush_sessions', '0');
$changed = true;
$app->enqueueMessage(
sprintf('Flushed %d sessions. All users will need to log in again.', $count),
'message'
);
Log::add(
sprintf('All sessions flushed (%d rows) by MokoWaaS', $count),
Log::WARNING,
'mokowaas'
);
}
if ((int) $params->get('set_robots_index_follow', 0) === 1)
{
$this->setRobotsIndexFollow();
$params->set('set_robots_index_follow', '0');
$changed = true;
$app->enqueueMessage(
'Global robots meta tag set to "index, follow".',
'message'
);
Log::add(
'Robots meta set to index,follow by MokoWaaS',
Log::WARNING,
'mokowaas'
);
}
if ($changed)
{
$db = Factory::getDbo();
@@ -806,6 +950,180 @@ class MokoWaaS extends CMSPlugin
return $db->getAffectedRows();
}
/**
* Delete all article rating/vote records.
*
* @return int Number of rows deleted
*
* @since 02.01.22
*/
protected function resetAllVotes()
{
$db = Factory::getDbo();
$db->setQuery(
$db->getQuery(true)
->delete($db->quoteName('#__content_rating'))
);
$db->execute();
return $db->getAffectedRows();
}
/**
* Normalize publish dates on all published articles.
*
* Sets publish_up to today and clears publish_down so articles
* appear freshly published with no expiry. Only affects articles
* with state = 1 (published).
*
* @return int Number of rows affected
*
* @since 02.01.22
*/
protected function normalizePublishDates()
{
$db = Factory::getDbo();
$now = Factory::getDate()->toSql();
$db->setQuery(
$db->getQuery(true)
->update($db->quoteName('#__content'))
->set($db->quoteName('publish_up') . ' = ' . $db->quote($now))
->set($db->quoteName('publish_down') . ' = NULL')
->where($db->quoteName('state') . ' = 1')
);
$db->execute();
return $db->getAffectedRows();
}
/**
* Clear all action log entries.
*
* @return int Number of rows deleted
*
* @since 02.01.22
*/
protected function clearActionLogs()
{
$db = Factory::getDbo();
$db->setQuery(
$db->getQuery(true)
->delete($db->quoteName('#__action_logs'))
);
$db->execute();
return $db->getAffectedRows();
}
/**
* Clear all redirect link entries.
*
* @return int Number of rows deleted
*
* @since 02.01.22
*/
protected function clearRedirects()
{
$db = Factory::getDbo();
$db->setQuery(
$db->getQuery(true)
->delete($db->quoteName('#__redirect_links'))
);
$db->execute();
return $db->getAffectedRows();
}
/**
* Clear all user notes.
*
* @return int Number of rows deleted
*
* @since 02.01.22
*/
protected function clearUserNotes()
{
$db = Factory::getDbo();
$db->setQuery(
$db->getQuery(true)
->delete($db->quoteName('#__user_notes'))
);
$db->execute();
return $db->getAffectedRows();
}
/**
* Flush all queued mail messages.
*
* @return int Number of rows deleted
*
* @since 02.01.22
*/
protected function flushMailQueue()
{
$db = Factory::getDbo();
$db->setQuery(
$db->getQuery(true)
->delete($db->quoteName('#__mail_queue'))
);
$db->execute();
return $db->getAffectedRows();
}
/**
* Flush all sessions, forcing all users to log in again.
*
* @return int Number of rows deleted
*
* @since 02.01.22
*/
protected function flushSessions()
{
$db = Factory::getDbo();
$db->setQuery(
$db->getQuery(true)
->delete($db->quoteName('#__session'))
);
$db->execute();
return $db->getAffectedRows();
}
/**
* Set the global robots meta tag to "index, follow" in Joomla
* global configuration.
*
* @return void
*
* @since 02.01.22
*/
protected function setRobotsIndexFollow()
{
$config = Factory::getApplication()->getConfig();
$configFile = JPATH_CONFIGURATION . '/configuration.php';
$config->set('robots', 'index, follow');
$contents = file_get_contents($configFile);
$contents = preg_replace(
'/public\s+\$robots\s*=\s*[\'"].*?[\'"]\s*;/',
"public \$robots = 'index, follow';",
$contents
);
file_put_contents($configFile, $contents);
}
/**
* Event triggered after the route has been determined.
*
@@ -62,6 +62,22 @@ PLG_SYSTEM_MOKOWAAS_RESET_HITS_LABEL="Reset All Hits"
PLG_SYSTEM_MOKOWAAS_RESET_HITS_DESC="Set all article hit counters to zero across the site. This action executes on save and resets to No."
PLG_SYSTEM_MOKOWAAS_DELETE_VERSIONS_LABEL="Delete All Versions"
PLG_SYSTEM_MOKOWAAS_DELETE_VERSIONS_DESC="Purge all content version history from the database. This action executes on save and resets to No."
PLG_SYSTEM_MOKOWAAS_RESET_VOTES_LABEL="Reset All Votes"
PLG_SYSTEM_MOKOWAAS_RESET_VOTES_DESC="Delete all article ratings and votes. This action executes on save and resets to No."
PLG_SYSTEM_MOKOWAAS_NORMALIZE_DATES_LABEL="Normalize Publish Dates"
PLG_SYSTEM_MOKOWAAS_NORMALIZE_DATES_DESC="Set publish_up to today and clear publish_down on all published articles. Makes articles appear freshly published with no expiry. This action executes on save and resets to No."
PLG_SYSTEM_MOKOWAAS_CLEAR_ACTION_LOGS_LABEL="Clear Action Logs"
PLG_SYSTEM_MOKOWAAS_CLEAR_ACTION_LOGS_DESC="Delete all admin action log entries. Removes the development activity trail. This action executes on save and resets to No."
PLG_SYSTEM_MOKOWAAS_CLEAR_REDIRECTS_LABEL="Clear Redirect Logs"
PLG_SYSTEM_MOKOWAAS_CLEAR_REDIRECTS_DESC="Delete all redirect link entries. Removes 404 tracking from development. This action executes on save and resets to No."
PLG_SYSTEM_MOKOWAAS_CLEAR_USER_NOTES_LABEL="Clear User Notes"
PLG_SYSTEM_MOKOWAAS_CLEAR_USER_NOTES_DESC="Delete all user notes. Removes development notes attached to user accounts. This action executes on save and resets to No."
PLG_SYSTEM_MOKOWAAS_FLUSH_MAIL_QUEUE_LABEL="Flush Mail Queue"
PLG_SYSTEM_MOKOWAAS_FLUSH_MAIL_QUEUE_DESC="Delete all queued outbound emails. Prevents unsent test emails from being delivered. This action executes on save and resets to No."
PLG_SYSTEM_MOKOWAAS_FLUSH_SESSIONS_LABEL="Flush All Sessions"
PLG_SYSTEM_MOKOWAAS_FLUSH_SESSIONS_DESC="Delete all active sessions. Forces every user to log in again. This action executes on save and resets to No."
PLG_SYSTEM_MOKOWAAS_SET_ROBOTS_LABEL="Set Robots to Index, Follow"
PLG_SYSTEM_MOKOWAAS_SET_ROBOTS_DESC="Update the global configuration robots meta tag to 'index, follow'. Enables search engine indexing for production. This action executes on save and resets to No."
; ===== Visual Branding fieldset =====
PLG_SYSTEM_MOKOWAAS_FIELDSET_VISUAL_LABEL="Visual Branding"
@@ -62,6 +62,22 @@ PLG_SYSTEM_MOKOWAAS_RESET_HITS_LABEL="Reset All Hits"
PLG_SYSTEM_MOKOWAAS_RESET_HITS_DESC="Set all article hit counters to zero across the site. This action executes on save and resets to No."
PLG_SYSTEM_MOKOWAAS_DELETE_VERSIONS_LABEL="Delete All Versions"
PLG_SYSTEM_MOKOWAAS_DELETE_VERSIONS_DESC="Purge all content version history from the database. This action executes on save and resets to No."
PLG_SYSTEM_MOKOWAAS_RESET_VOTES_LABEL="Reset All Votes"
PLG_SYSTEM_MOKOWAAS_RESET_VOTES_DESC="Delete all article ratings and votes. This action executes on save and resets to No."
PLG_SYSTEM_MOKOWAAS_NORMALIZE_DATES_LABEL="Normalize Publish Dates"
PLG_SYSTEM_MOKOWAAS_NORMALIZE_DATES_DESC="Set publish_up to today and clear publish_down on all published articles. Makes articles appear freshly published with no expiry. This action executes on save and resets to No."
PLG_SYSTEM_MOKOWAAS_CLEAR_ACTION_LOGS_LABEL="Clear Action Logs"
PLG_SYSTEM_MOKOWAAS_CLEAR_ACTION_LOGS_DESC="Delete all admin action log entries. Removes the development activity trail. This action executes on save and resets to No."
PLG_SYSTEM_MOKOWAAS_CLEAR_REDIRECTS_LABEL="Clear Redirect Logs"
PLG_SYSTEM_MOKOWAAS_CLEAR_REDIRECTS_DESC="Delete all redirect link entries. Removes 404 tracking from development. This action executes on save and resets to No."
PLG_SYSTEM_MOKOWAAS_CLEAR_USER_NOTES_LABEL="Clear User Notes"
PLG_SYSTEM_MOKOWAAS_CLEAR_USER_NOTES_DESC="Delete all user notes. Removes development notes attached to user accounts. This action executes on save and resets to No."
PLG_SYSTEM_MOKOWAAS_FLUSH_MAIL_QUEUE_LABEL="Flush Mail Queue"
PLG_SYSTEM_MOKOWAAS_FLUSH_MAIL_QUEUE_DESC="Delete all queued outbound emails. Prevents unsent test emails from being delivered. This action executes on save and resets to No."
PLG_SYSTEM_MOKOWAAS_FLUSH_SESSIONS_LABEL="Flush All Sessions"
PLG_SYSTEM_MOKOWAAS_FLUSH_SESSIONS_DESC="Delete all active sessions. Forces every user to log in again. This action executes on save and resets to No."
PLG_SYSTEM_MOKOWAAS_SET_ROBOTS_LABEL="Set Robots to Index, Follow"
PLG_SYSTEM_MOKOWAAS_SET_ROBOTS_DESC="Update the global configuration robots meta tag to 'index, follow'. Enables search engine indexing for production. This action executes on save and resets to No."
; ===== Visual Branding fieldset =====
PLG_SYSTEM_MOKOWAAS_FIELDSET_VISUAL_LABEL="Visual Branding"
+88
View File
@@ -190,6 +190,94 @@
<option value="1">JYES</option>
<option value="0">JNO</option>
</field>
<field
name="reset_votes"
type="radio"
label="PLG_SYSTEM_MOKOWAAS_RESET_VOTES_LABEL"
description="PLG_SYSTEM_MOKOWAAS_RESET_VOTES_DESC"
default="0"
class="btn-group btn-group-yesno"
>
<option value="1">JYES</option>
<option value="0">JNO</option>
</field>
<field
name="normalize_publish_dates"
type="radio"
label="PLG_SYSTEM_MOKOWAAS_NORMALIZE_DATES_LABEL"
description="PLG_SYSTEM_MOKOWAAS_NORMALIZE_DATES_DESC"
default="0"
class="btn-group btn-group-yesno"
>
<option value="1">JYES</option>
<option value="0">JNO</option>
</field>
<field
name="clear_action_logs"
type="radio"
label="PLG_SYSTEM_MOKOWAAS_CLEAR_ACTION_LOGS_LABEL"
description="PLG_SYSTEM_MOKOWAAS_CLEAR_ACTION_LOGS_DESC"
default="0"
class="btn-group btn-group-yesno"
>
<option value="1">JYES</option>
<option value="0">JNO</option>
</field>
<field
name="clear_redirects"
type="radio"
label="PLG_SYSTEM_MOKOWAAS_CLEAR_REDIRECTS_LABEL"
description="PLG_SYSTEM_MOKOWAAS_CLEAR_REDIRECTS_DESC"
default="0"
class="btn-group btn-group-yesno"
>
<option value="1">JYES</option>
<option value="0">JNO</option>
</field>
<field
name="clear_user_notes"
type="radio"
label="PLG_SYSTEM_MOKOWAAS_CLEAR_USER_NOTES_LABEL"
description="PLG_SYSTEM_MOKOWAAS_CLEAR_USER_NOTES_DESC"
default="0"
class="btn-group btn-group-yesno"
>
<option value="1">JYES</option>
<option value="0">JNO</option>
</field>
<field
name="flush_mail_queue"
type="radio"
label="PLG_SYSTEM_MOKOWAAS_FLUSH_MAIL_QUEUE_LABEL"
description="PLG_SYSTEM_MOKOWAAS_FLUSH_MAIL_QUEUE_DESC"
default="0"
class="btn-group btn-group-yesno"
>
<option value="1">JYES</option>
<option value="0">JNO</option>
</field>
<field
name="flush_sessions"
type="radio"
label="PLG_SYSTEM_MOKOWAAS_FLUSH_SESSIONS_LABEL"
description="PLG_SYSTEM_MOKOWAAS_FLUSH_SESSIONS_DESC"
default="0"
class="btn-group btn-group-yesno"
>
<option value="1">JYES</option>
<option value="0">JNO</option>
</field>
<field
name="set_robots_index_follow"
type="radio"
label="PLG_SYSTEM_MOKOWAAS_SET_ROBOTS_LABEL"
description="PLG_SYSTEM_MOKOWAAS_SET_ROBOTS_DESC"
default="0"
class="btn-group btn-group-yesno"
>
<option value="1">JYES</option>
<option value="0">JNO</option>
</field>
</fieldset>
<fieldset name="visual_branding"
label="PLG_SYSTEM_MOKOWAAS_FIELDSET_VISUAL_LABEL"