Source: model/uaa/UsersUAA.js

/*jslint node: true*/

var HttpUtils = require('../../utils/HttpUtils');

/**
 * Manage Users on Cloud Foundry UAA
 * @param {String} endPoint [UAA endpoint]
 * @constructor
 */
function UsersUAA(endPoint) {
    "use strict";
    this.UAA_API_URL = endPoint;
    this.REST = new HttpUtils();
}

/**
 * Set endpoint
 * @param {String} endPoint [UAA endpoint]
 */
UsersUAA.prototype.setEndPoint = function (endPoint) {
    "use strict";
    this.UAA_API_URL = endPoint;
};

/**
 * Add an User on UAA
 * {@link https://github.com/cloudfoundry/uaa/blob/master/docs/UAA-APIs.rst#create-a-user-post-users}
 * {@link http://www.simplecloud.info/specs/draft-scim-api-01.html#create-resource}
 *
 * @param  {String} token_type   [Authentication type]
 * @param  {String} access_token [Authentication token]
 * @param  {JSON} uaa_options     [user options]
 * @return {JSON}              [return a JSON response]
 */
UsersUAA.prototype.add = function (token_type, access_token, uaa_options) {
    "use strict";
    var url = this.UAA_API_URL + "/Users";
    var options = {
        method: 'POST',
        url: url,
        headers: {
            Accept: 'application/json',
            Authorization: token_type + ' ' + access_token
        },
        json: uaa_options
    };

    return this.REST.request(options, "201", false);
};

/**
 * Update Password [PENDING]
 * {@link https://github.com/cloudfoundry/uaa/blob/master/docs/UAA-APIs.rst#create-a-user-post-users}
 * {@link http://www.simplecloud.info/specs/draft-scim-api-01.html#create-resource}
 *
 * @param  {String} token_type   [Authentication type]
 * @param  {String} access_token [Authentication token]
 * @param  {JSON} uaa_options     [user options]
 * @return {JSON}              [return a JSON response]
 */
UsersUAA.prototype.updatePassword = function (token_type, access_token, uaa_guid, uaa_options) {
    "use strict";
    var url = this.UAA_API_URL + "/Users/" + uaa_guid + "/password";
    var options = {
        method: 'PUT',
        url: url,
        headers: {
            Accept: 'application/json',
            Authorization: token_type + ' ' + access_token
        },
        json: uaa_options
    };

    return this.REST.request(options, "200", false);
};

/**
 * Remove an User
 * {@link http://www.simplecloud.info/specs/draft-scim-api-01.html#delete-resource}
 *
 * @param  {String} token_type   [Authentication type]
 * @param  {String} access_token [Authentication token]
 * @param  {String} uaa_guid     [uaa guid]
 * @return {JSON}              [return a JSON response]
 */
UsersUAA.prototype.remove = function (token_type, access_token, uaa_guid) {
    "use strict";

    var url = this.UAA_API_URL + "/Users/" + uaa_guid;
    var options = {
        method: 'DELETE',
        url: url,
        headers: {
            Accept: 'application/json',
            Authorization: token_type + ' ' + access_token
        }
    };

    return this.REST.request(options, "200", false);
};

/**
 * Get users
 * {@link http://www.simplecloud.info/specs/draft-scim-api-01.html#get-resources-ops}
 *
 * @example
 * ?filter=userName eq 'demo4'"
 *
 * @param  {String} token_type   [Authentication type]
 * @param  {String} access_token [Authentication token]
 * @param  {JSON} searchOptions     [searchOptions]
 * @return {JSON}              [return a JSON response]
 */
UsersUAA.prototype.getUsers = function (token_type, access_token, searchOptions) {
    "use strict";
    var url = this.UAA_API_URL + "/Users";
    if (searchOptions) {
        url += searchOptions;
    }
    var options = {
        method: 'GET',
        url: url,
        headers: {
            Accept: 'application/json',
            Authorization: token_type + ' ' + access_token
        }
    };

    return this.REST.request(options, "200", true);
};

/**
 * Method to authenticate with Cloud Foundry UAA
 * @param  {String} endPoint [token_enpoint/authorization_endpoint]
 * @param  {String} username     [username]
 * @param  {String} password [password]
 * @return {JSon}          [UAA Response]
 */
UsersUAA.prototype.login = function (username, password) {
    "use strict";
    var url = this.UAA_API_URL + "/oauth/token";
    var options = {
        method: 'POST',
        url: url,
        headers: {
            Authorization: 'Basic Y2Y6',
            'Content-Type': 'application/x-www-form-urlencoded'
        },
        form: {
            grant_type: "password",
            client_id: "cf",
            username: username,
            password: password
        }
    };

    return this.REST.request(options, "200", true);
};

/**
 * Method to refresh a Token
 * https://github.com/cloudfoundry/uaa/blob/master/docs/UAA-Tokens.md
 * @param  {String} refresh_token [Oauth refresh token]
 * @return {JSON}               [Response]
 */
UsersUAA.prototype.refreshToken = function (refresh_token) {
    "use strict";
    var url = this.UAA_API_URL + "/oauth/token";
    var options = {
        method: 'POST',
        url: url,
        headers: {
            Accept: 'application/json',
            Authorization: 'Basic Y2Y6',
            'Content-Type': 'application/x-www-form-urlencoded'
        },
        form: {
            grant_type: "refresh_token",
            refresh_token: refresh_token
        }
    };

    return this.REST.request(options, "200", true);
};

module.exports = UsersUAA;