UNPKG

@esri/solution-common

Version:

Provides general helper functions for @esri/solution.js.

127 lines 6.12 kB
"use strict"; /** @license * Copyright 2021 Esri * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ Object.defineProperty(exports, "__esModule", { value: true }); exports.deleteSolutionContents = void 0; const tslib_1 = require("tslib"); const interfaces_1 = require("../interfaces"); const deleteEmptyGroups = tslib_1.__importStar(require("./deleteEmptyGroups")); const deleteSolutionFolder = tslib_1.__importStar(require("./deleteSolutionFolder")); const deleteSolutionItem = tslib_1.__importStar(require("./deleteSolutionItem")); const removeItems = tslib_1.__importStar(require("./removeItems")); const reportProgress = tslib_1.__importStar(require("./reportProgress")); // ------------------------------------------------------------------------------------------------------------------ // /** * Deletes a deployed Solution item and and all of the items that were created * as part of that deployment. * * @param solutionItemId Id of a deployed Solution * @param solutionSummary List of items in the solution that would be deleted * @param authentication Credentials for the request * @param options Progress reporting and deletion permanence options * @returns Promise that will resolve with a list of two solution summaries: successful deletions * and failed deletions. Ignored items (e.g., already deleted) and items shared with more than * one Solution will not be in either list. * Note that Solution item and its deployment folder will only be deleted if all of its deployed * items were deleted (the failure list is empty). This makes it possible to re-attempted * deletion using the solutionItemId. */ function deleteSolutionContents(solutionItemId, solutionSummary, authentication, options) { const deleteOptions = options || {}; let progressPercentStep = 0; let percentDone = 0; let solutionDeletedSummary; let solutionFailureSummary; let solutionIds = []; return new Promise((resolve) => { let removalPromise = Promise.resolve([ { id: solutionSummary.id, title: solutionSummary.title, folder: solutionSummary.folder, items: [], groups: [], }, { id: solutionSummary.id, title: solutionSummary.title, folder: solutionSummary.folder, items: [], groups: [], }, ]); if (solutionSummary.items.length > 0) { // Save a copy of the Solution item ids for the deleteSolutionFolder call because removeItems // destroys the solutionSummary.items list if (solutionItemId) { solutionIds = solutionSummary.items.map((item) => item.id).concat([solutionItemId]); } const hubSiteItemIds = solutionSummary.items .filter((item) => item.type === "Hub Site Application") .map((item) => item.id); // Delete the items progressPercentStep = 100 / (solutionSummary.items.length + 2); // one extra for starting plus one extra for solution itself reportProgress.reportProgress((percentDone += progressPercentStep), deleteOptions); // let the caller know that we've started // Proceed with the deletion removalPromise = removeItems.removeItems(solutionSummary, hubSiteItemIds, authentication, percentDone, progressPercentStep, deleteOptions); } removalPromise .then((results) => { [solutionDeletedSummary, solutionFailureSummary] = results; // Attempt to delete groups; we won't be checking success return new Promise((resolve2) => { // eslint-disable-next-line @typescript-eslint/no-floating-promises deleteEmptyGroups.deleteEmptyGroups(solutionSummary.groups, authentication).then(() => { resolve2(results); }); }); }) .then(() => { if (solutionItemId) { // If there were no failed deletes, it's OK to delete Solution item if (solutionFailureSummary.items.length === 0) { return deleteSolutionItem.deleteSolutionItem(solutionItemId, authentication); } else { // Not all items were deleted, so don't delete solution return Promise.resolve({ success: false, itemId: solutionItemId }); } } else { return Promise.resolve({ success: true, itemId: "" }); } }) .then((solutionItemDeleteStatus) => { // If all deletes succeeded, see if we can delete the folder that contained them if (solutionItemDeleteStatus.success) { reportProgress.reportProgress(99, deleteOptions, solutionItemId, interfaces_1.EItemProgressStatus.Finished); // Can't delete if folder contains non-solution items return deleteSolutionFolder.deleteSolutionFolder(solutionIds, solutionSummary.folder, authentication); } else { return Promise.resolve(false); } }) .then(() => { resolve([solutionDeletedSummary, solutionFailureSummary]); }) .catch(() => { resolve([solutionDeletedSummary, solutionFailureSummary]); }); }); } exports.deleteSolutionContents = deleteSolutionContents; //# sourceMappingURL=deleteSolutionContents.js.map