Viewing File: /usr/local/cpanel/whostmgr/docroot/templates/convert_addon_to_account/services/ConvertAddonData.js

/*
# templates/convert_addon_to_account/services/ConvertAddonData.js Copyright(c) 2020 cPanel, L.L.C.
#                                                                           All rights reserved.
# copyright@cpanel.net                                                         http://cpanel.net
# This code is subject to the cPanel license. Unauthorized copying is prohibited
*/

/* global define: false */

define(
    [
        "angular",
        "jquery",
        "lodash",
        "cjt/util/locale",
        "cjt/util/parse",
        "cjt/io/api",
        "cjt/io/whm-v1-request",
        "cjt/io/whm-v1" // IMPORTANT: Load the driver so it's ready
    ],
    function(angular, $, _, LOCALE, PARSE, API, APIREQUEST, APIDRIVER) {

        // Retrieve the current application
        var app = angular.module("App");

        var convertAddonData = app.factory("ConvertAddonData", ["$q", "defaultInfo", function($q, defaultInfo) {

            var addonData = {};

            addonData.domains = [];
            var default_options = {
                "email-accounts": true,
                "autoresponders": true,
                "email-forwarders": true,
                "docroot": true,
                "preserve-ownership": true,
                "custom-dns-records": true,
                "mysql_dbs": [],
                "mysql_users": [],
                "db_move_type": "move",
                "custom-vhost-includes": true,
                "copy-installed-ssl-cert": true,
                "ftp-accounts": true,
                "webdisk-accounts": true
            };

            function _getAddonData(domain) {
                var data = addonData.domains.filter(function(domain_data) {
                    return domain === domain_data.addon_domain;
                });
                return (data.length) ? data[0] : {};
            }

            /**
             * Fetch the addon domain
             *
             * @method getAddonDomain
             * @param {string} addonDomain - the addon domain you want to get
             * @returns A Promise that resolves to an object for the addon domain
             */
            addonData.getAddonDomain = function(addonDomain) {

                // If the domains data is empty, then we should fetch the data first
                if (addonData.domains.length === 0) {
                    return $q.when(addonData.loadList())
                        .then(function(result) {
                            return _getAddonData(addonDomain);
                        });
                } else {
                    return $q.when(_getAddonData(addonDomain));
                }
            };

            addonData.getAddonDomainDetails = function(addonDomain) {

                // if we already fetched the details previously, shortcircuit this api call
                var found = _getAddonData(addonDomain);
                if (Object.keys(found).length > 1 && Object.keys(found.details).length > 1) {
                    return $q.when(found);
                } else {
                    var apiCall = new APIREQUEST.Class();
                    apiCall.initialize("", "convert_addon_fetch_domain_details");
                    apiCall.addArgument("domain", addonDomain);

                    return $q.when(API.promise(apiCall.getRunArguments()))
                        .then(function(response) {
                            response = response.parsedResponse;

                            // update this addon domain in the data structure
                            // with the details
                            return addonData.getAddonDomain(addonDomain)
                                .then(function(result) {
                                    if (response.data !== null) {
                                        angular.extend(result.details, response.data);

                                        // if the addon domain has no options, initialize it with some
                                        if (Object.keys(result.move_options).length === 0) {
                                            angular.extend(result.move_options, default_options);
                                        }
                                    }

                                    return result;
                                });
                        })
                        .catch(function(response) {
                            response = response.parsedResponse;
                            return response.error;
                        });
                }
            };

            addonData.convertDomainObjectToList = function(domainObject) {
                addonData.domains = Object.keys(domainObject).map(function(domainName) {
                    var domainDetail = domainObject[domainName];
                    domainDetail.addon_domain = domainName;
                    domainDetail.details = {};
                    domainDetail.move_options = {};
                    domainDetail.account_settings = {};
                    return domainDetail;
                });
            };

            addonData.loadList = function() {
                var deferred = $q.defer();

                var apiCall = new APIREQUEST.Class();
                apiCall.initialize("", "convert_addon_list_addon_domains");

                API.promise(apiCall.getRunArguments())
                    .done(function(response) {

                        // create items from the response
                        response = response.parsedResponse;
                        if (response.status) {
                            addonData.convertDomainObjectToList(response.data);
                            deferred.resolve(addonData.domains);
                        } else {

                            // pass the error along
                            deferred.reject(response.error);
                        }
                    });

                // pass the promise back to the controller

                return deferred.promise;
            };

            addonData.beginConversion = function(addon) {
                var i, len;
                var apiCall = new APIREQUEST.Class();
                apiCall.initialize("", "convert_addon_initiate_conversion");

                for (var setting in addon.account_settings) {
                    if (addon.account_settings.hasOwnProperty(setting)) {
                        apiCall.addArgument(setting, addon.account_settings[setting]);
                    }
                }

                for (var service in addon.move_options) {
                    if (addon.move_options.hasOwnProperty(service)) {

                        // ignore this value
                        if (service === "db_move_type") {
                            continue;
                        }

                        if (service === "mysql_dbs") {
                            for (i = 0, len = addon.move_options[service].length; i < len; i++) {
                                if (addon.move_options.db_move_type === "copy") {
                                    apiCall.addArgument("copymysqldb-" + addon.move_options[service][i].name,
                                        addon.move_options[service][i].new_name);
                                } else {
                                    apiCall.addArgument("movemysqldb-" + i, addon.move_options[service][i].name);
                                }
                            }
                        } else if (service === "mysql_users" && addon.move_options.db_move_type === "move") {
                            for (i = 0, len = addon.move_options[service].length; i < len; i++) {
                                apiCall.addArgument("movemysqluser-" + i, addon.move_options[service][i].name);
                            }
                        } else {

                            // The backend expects boolean options to use 1 or 0
                            if (_.isBoolean(addon.move_options[service])) {
                                apiCall.addArgument(service, (addon.move_options[service]) ? 1 : 0);
                            } else {
                                apiCall.addArgument(service, addon.move_options[service]);
                            }
                        }
                    }
                }

                return $q.when(API.promise(apiCall.getRunArguments()))
                    .then(function(response) {
                        response = response.parsedResponse;
                        if (response.status) {
                            return response.data;
                        } else {
                            return $q.reject(response.meta);
                        }
                    });
            };

            addonData.init = function() {
                addonData.convertDomainObjectToList(defaultInfo.addon_domains);
            };

            addonData.init();

            return addonData;
        }]);

        return convertAddonData;
    }
);
Back to Directory File Manager