Viewing File: /usr/local/cpanel/base/cjt/datasource.js

(function(window) {

    "use strict";

    var CPANEL = window.CPANEL;
    var YAHOO = window.YAHOO;

    YAHOO.util.DataSourceBase.prototype.get_field_parser = function(field) {
        var fields, parser = "string";
        try {
            fields = this.responseSchema.fields;
        } catch (e) {}
        if (fields) {
            for (var f = 0; f < fields.length; f++) {
                if (fields[f].key === field) {
                    parser = fields[f].parser || parser;
                    break;
                }
            }
        }

        return parser;
    };


    var _std_CXD_opts = {
        responseType: YAHOO.util.DataSource.TYPE_JSON,
        connXhrMode: "cancelStaleRequests",
        connMethodPost: true
    };

    var CXD_OPTS = {};
    if (CPANEL.is_whm()) {
        CXD_OPTS[1] = YAHOO.lang.augmentObject({}, _std_CXD_opts);
        CXD_OPTS[1].responseSchema = {
            resultsList: "data",
            metaFields: {
                total_records: "metadata.chunk.records",
                before_filter: "metadata.filter.filtered",
                metadata: "metadata"
            }
        };
    } else {
        CXD_OPTS[2] = YAHOO.lang.augmentObject({}, _std_CXD_opts);
        CXD_OPTS[3] = YAHOO.lang.augmentObject({}, _std_CXD_opts);

        CXD_OPTS[2].responseSchema = {
            resultsList: "cpanelresult.data",
            metaFields: {
                total_records: "cpanelresult.paginate.total_results",
                before_filter: "cpanelresult.before_filter",
                metadata: "cpanelresult.metadata"
            }
        };

        CXD_OPTS[3].responseSchema = {
            resultsList: "data",
            metaFields: {
                total_records: "metadata.paginate.total_results",
                before_filter: "metadata.records_before_filter",
                metadata: "metadata"
            }
        };
    }


    // class CPANEL_XHR_DataSource
    //
    // Subclass wrapper around YUI XHRDataSource for cPanel and WHM APIs
    // Additional opts:
    //  fields:       for the responseSchema
    //  func:         the function name
    //  module:       the module name (n/a in WHM)
    //  api_version:  API version passed to CPANEL.api.construct_query
    //  request_data: default data object to be added to request objects

    var CPANEL_XHRDataSource = function(opts) {
        var my_opts = {};

        if (opts) {
            YAHOO.lang.augmentObject(my_opts, opts);
        }

        if (typeof my_opts.api_version === "undefined") {
            my_opts.api_version = CPANEL.api.find_api_version(); // default API version
        } else {
            my_opts.api_version = +my_opts.api_version;
        }

        var api_opts = CXD_OPTS[my_opts.api_version];
        if (!api_opts) {
            throw "Invalid API version: " + my_opts.api_version;
        }

        // Don't override things that are passed in.
        YAHOO.lang.augmentObject(my_opts, api_opts);

        if (my_opts.fields) {
            my_opts.responseSchema.fields = my_opts.fields;
            delete my_opts.fields;
        }

        // A dummy URL since makeConnection will feed in the real URL.
        CPANEL_XHRDataSource.superclass.constructor.call(this, "/", my_opts);
    };
    YAHOO.lang.extend(CPANEL_XHRDataSource, YAHOO.util.XHRDataSource, {

        // Extract tabular data from WHM v1, and check for API-level errors.
        parseJSONData: function(req, parsed) {
            var use_whm1 = (CPANEL.is_whm() && (this.api_version === 1));
            if (use_whm1) {
                var metadata = parsed.metadata;
                var to_reduce = !metadata || !metadata.payload_is_literal || (metadata.payload_is_literal === "0");

                if (to_reduce) {
                    parsed.data = CPANEL.api.reduce_whm1_list_data(parsed.data);
                }
            }

            var ret = CPANEL_XHRDataSource.superclass.parseJSONData.call(this, req, parsed);

            var messages;
            if (use_whm1) {
                if (!CPANEL.api.find_whm1_status(parsed)) {
                    messages = CPANEL.api.find_whm1_messages(parsed);
                }
            } else {
                if (this.api_version === 3) {
                    if (!CPANEL.api.find_uapi_status(parsed)) {
                        messages = CPANEL.api.find_uapi_messages(parsed);
                    }
                } else if (!CPANEL.api.find_cpanel2_status(parsed)) {
                    messages = CPANEL.api.find_cpanel2_messages(parsed);
                }
            }

            if (messages) {
                ret.error = true;
                var errs = messages.filter(function(m) {
                    return m.level === "error";
                });
                if (errs.length) {
                    ret.cpanel_error = errs[0].content;
                }
            }

            return ret;
        },

        // This expects a CPANEL.api request object but will add in func/module/version
        // We fall back to default XHRDataSource if the request is not an object.
        makeConnection: function(req, cb, clr) {
            if (typeof req === "object") {

                // copy, then add module/func as needed
                req = YAHOO.lang.JSON.parse(YAHOO.lang.JSON.stringify(req));

                var that = this;
                ["module", "func"].forEach(function(key) {
                    if (!(key in req) && (key in that)) {
                        req[key] = that[key];
                    }
                });

                if (!req.api_data) {
                    req.api_data = {};
                }
                req.api_data.version = this.api_version;

                if (this.request_data) {
                    if (!req.data) {
                        req.data = {};
                    }
                    YAHOO.lang.augmentObject(req.data, this.request_data);
                }

                this.liveData = CPANEL.api.construct_url_path(req);

                req = CPANEL.api.construct_query(req);
            }

            return CPANEL_XHRDataSource.superclass.makeConnection.call(this, req, cb, clr);
        }
    });


    var export_obj = {
        CPANEL_XHRDataSource: CPANEL_XHRDataSource
    };
    CPANEL.datasource = export_obj;

    return export_obj;
}(window));
Back to Directory File Manager