Source: bemap-services-v2/acl/bemap-acl-details-response.js

/**
 * BeNomad BeMap JavaScript API - AclDetailsResponse
 *
 * Response from `GET service/acl/1.0/user/details` — the current user's
 * identity, granted roles, accessible geoservers, and accessible charging-
 * station providers. The geoserver list is **already filtered by the user's
 * ACL** server-side, so it is safe to render directly in a dropdown.
 *
 * Wire shape (cross-checked against a real beta response):
 *
 *   {
 *     "username": "your-login",
 *     "rights":   ["ROLE_GEOCODING", "ROLE_ROUTING", ...],
 *     "geoservers": [
 *       { "key": "osm",  "value": "OpenStreetMap" },
 *       { "key": "here", "value": "HERE", "byDefault": true }
 *     ],
 *     "chargingStationProviders": [
 *       { "key": "ecoMovement", "value": "Eco-Movement" }
 *     ]
 *   }
 *
 * @since 1.5.0
 * @public
 * @constructor
 * @param {Object} [options]
 * @param {String} [options.username]
 * @param {Array.<String>} [options.rights]
 * @param {Array.<bemap.AclLabel>} [options.geoservers]
 * @param {Array.<bemap.AclLabel>} [options.chargingStationProviders]
 */
bemap.AclDetailsResponse = function(options) {
    var opts = options || {};
    this.username = opts.username || null;
    this.rights = Array.isArray(opts.rights) ? opts.rights.slice() : [];
    this.geoservers = Array.isArray(opts.geoservers) ? opts.geoservers : [];
    this.chargingStationProviders = Array.isArray(opts.chargingStationProviders) ? opts.chargingStationProviders : [];
};

bemap.AclDetailsResponse.prototype.getUsername = function() { return this.username; };
bemap.AclDetailsResponse.prototype.getRights = function() { return this.rights; };
bemap.AclDetailsResponse.prototype.getGeoservers = function() { return this.geoservers; };
bemap.AclDetailsResponse.prototype.getChargingStationProviders = function() { return this.chargingStationProviders; };

/**
 * `true` when the current user has the supplied role (e.g. `'ROLE_ROUTING'`).
 * @public
 * @param {String} role
 * @return {Boolean}
 */
bemap.AclDetailsResponse.prototype.hasRight = function(role) {
    return this.rights.indexOf(role) >= 0;
};

/**
 * Find the geoserver in the user's allowed list flagged as the default,
 * or `null` when none is flagged.
 * @public
 * @return {bemap.AclLabel|null}
 */
bemap.AclDetailsResponse.prototype.getDefaultGeoserver = function() {
    for (var i = 0; i < this.geoservers.length; i++) {
        if (this.geoservers[i].isDefault()) return this.geoservers[i];
    }
    return null;
};

bemap.AclDetailsResponse.fromJson = function(json) {
    if (!json) return new bemap.AclDetailsResponse();

    var geoservers = Array.isArray(json.geoservers)
        ? json.geoservers.map(function(g) { return bemap.AclLabel.fromJson(g); })
        : [];
    var providers = Array.isArray(json.chargingStationProviders)
        ? json.chargingStationProviders.map(function(p) { return bemap.AclLabel.fromJson(p); })
        : [];

    return new bemap.AclDetailsResponse({
        username: json.username,
        rights: Array.isArray(json.rights) ? json.rights.slice() : [],
        geoservers: geoservers,
        chargingStationProviders: providers
    });
};