2026-02-05 17:08:59 +03:00

145 lines
5.4 KiB
JavaScript

/* eslint complexity: ["error", 100] */
let apibackups_bulkMaxThreads = 1; // rate limiting.
let apibackups_bulkTotalThreads = 0;
let apibackups_bulkCurrentThreads = 0;
let apibackups_bulkFinishedThreads = 0;
let mainwp_api_backups_do_backups = function (pObj) {
// init queue status.
jQuery('#mainwp-3rd-party-backups-table tbody td.check-column INPUT[type=checkbox]').each(function () {
jQuery(this).attr('status', 'queue');
});
// Add loading icon to all selected sites.
jQuery('#mainwp-3rd-party-backups-table tbody td.check-column INPUT[type=checkbox]:checked').each(function () {
let parent = jQuery(this).closest('tr');
let statusEl = parent.find('.running');
statusEl.html('<i class="clock outline icon"></i>');
});
// Get selected sites.
let selector = '#mainwp-3rd-party-backups-table tbody td.check-column INPUT[type=checkbox]:checked[status=queue]';
let selectedIds = jQuery.map(jQuery(selector), function (el) {
return jQuery(el).val();
});
// Check if there are selected sites.
if (selectedIds.length == 0) {
// Show message.
jQuery('#mainwp-api-backups-message-zone').addClass('red').show();
jQuery('#mainwp-api-backups-message-zone .content .message')
.html('Please select at least one website.')
;
return;
}
// Set queue metadata and proceed.
apibackups_bulkTotalThreads = selectedIds.length;
apibackups_bulkCurrentThreads = 0;
apibackups_bulkFinishedThreads = 0;
jQuery(pObj).addClass('disabled');
mainwp_api_backups_do_backups_specific_next(selector);
}
let mainwp_api_backups_do_backups_specific_next = function (selector) {
let objProcess = jQuery(selector + ':first');
while (objProcess && objProcess.length > 0 && apibackups_bulkCurrentThreads < apibackups_bulkMaxThreads) { // NOSONAR - variables modified outside the function.
objProcess.attr('status', 'proceed');
mainwp_api_backups_do_backups_specific(objProcess, true, selector);
objProcess = jQuery(selector + ':first');
}
if (apibackups_bulkTotalThreads > 0 && apibackups_bulkFinishedThreads == apibackups_bulkTotalThreads) {
jQuery('#action_backup_selected_sites').removeClass('disabled');
// Show message.
jQuery('#mainwp-api-backups-message-zone').removeClass('red').addClass('green').show();
jQuery('#mainwp-api-backups-message-zone .content .message')
.html('API Backup requests sent. Please allow some time for the backup to complete, then Refresh Available Backups.')
;
}
}
/**
* Do backup for specific site.
*
* This function is triggered by the mainwp_api_backups_do_backups_specific_next() function & is called recursively
* until all sites are processed.
*
* mainwp_api_backups_selected_websites() `action` is defined in assets/classes/class-api-backups-handler.php admin_init(),
* & fires off ajax_backups_selected_websites() function also defined in assets/classes/class-api-backups-handler.php
*/
let mainwp_api_backups_do_backups_specific = function (pObj, bulk, selector) {
let parent = pObj.closest('tr');
let statusEl = parent.find('.running');
let providerName = parent.attr('provider-name');
let data = mainwp_secure_data({
action: 'mainwp_api_backups_selected_websites',
websiteId: parent.attr('website-id'),
bulk_backups: 1,
});
if (bulk) {
apibackups_bulkCurrentThreads++;
}
jQuery(pObj).prop('checked', false);
statusEl.html('<i class="notched circle loading icon"></i>');
jQuery.post(ajaxurl, data, function (response) {
statusEl.html('');
let err_msg = '';
let succ_msg = '';
let rsp = '';
if (response && !response.success) {
rsp = response.data;
console.log(rsp);
// Check for gridPane error..
if (rsp && rsp['0'].code === 429) {
err_msg = 'API rate limit has been met. Please wait 30 seconds and try again.';
} else {
// Everything else. (API provided error message)
err_msg = rsp['0'].message;
}
} else if (response?.success) {
succ_msg = __('Successfull');
} else if (response?.error) { // Check for cPanel error..
err_msg = __(response.error);
} else {
err_msg = _('Undefined error.');
}
if ('' != err_msg) {
statusEl.html('<span data-inverted="" data-position="right center" data-tooltip="' + err_msg + '"><i class="red times icon"></i></span>');
} else if ('' != succ_msg) {
statusEl.html('<span data-inverted="" data-position="right center" data-tooltip="' + succ_msg + '"><i class="green check icon"></i></span>');
}
if (bulk) {
apibackups_bulkCurrentThreads--;
apibackups_bulkFinishedThreads++;
if (providerName === 'GridPane') {
// GridPane API BETA has Strict rate limits. However, rate limits will increase and vary between
// endpoints once the API is out of BETA.
setTimeout(function () {
mainwp_api_backups_do_backups_specific_next(selector);
}, 30000); // 30 second Rate limit.
} else {
mainwp_api_backups_do_backups_specific_next(selector);
}
}
}, 'json');
return false;
}