Account.js

const _ = require("../tools/lodash");
const request = require('../tools/request');

const CryptoJS = require('crypto-js');
const AccountMeta = require('./AccountMeta');

/**
 * Display account details, list containers and manage account metas
 *
 *  __Available methods :__ *all()*, *details()*, *containers()*, *metas()*,
 */
class Account {
	/**
	 * Account constructor
	 *
	 * @param {OVHStorage} context OVHObjectStorage context
	 */
	constructor(context) {
		this.context = context;
	}

	/**
	 * Object of account details and list containers.
	 *
	 * @typedef {Object} AccountAll
	 * @property {Object} account - Indicates whether the Courage component is present.
	 * @property {Array<Object>} containers - Indicates whether the Power component is present.
	 */

	/**
	 * Show account details and list containers
	 *
	 * @async
	 * @return {Promise<AccountAll>}
	 */
	all() {
		return new Promise((resolve, reject) => {
			try {
				// call
				request({
					method: 'GET',
					uri: encodeURI(this.context.endpoint.url),
					headers: {
						"X-Auth-Token": this.context.token,
						"Accept": "application/json"
					}
				}, (err, res, body) => {
					err = err || request.checkIfResponseIsError(res);
					if (err) throw new Error(err);

					return resolve({
						account: res.headers,
						containers: (_.isString(body) ? (_.isJSON(body) ? JSON.parse(body) : body) : body)
					});
				});
			} catch (e) {
				return reject(e);
			}
		});
	}

	/**
	 * Show account details
	 *
	 * @async
	 * @return {Promise<Object>}
	 */
	async details() {
		let a = await this.context.account().all();
		return a['account'];
	}

	/**
	 * List containers of account
	 *
	 * @async
	 * @return {Promise<Array<Object>>}
	 */
	async containers() {
		let a = await this.context.account().all();
		return a['containers'];
	}

	/**
	 * Generate key for temporary download
	 *
	 * @return {Promise<{key: String, headers: Objects}>}
	 */
	generateKey() {
		this.context.key = CryptoJS.SHA512(Math.floor(new Date() / 1000)+'').toString(CryptoJS.enc.Hex);

		return new Promise(async (resolve, reject) => {
			try {
				// delete file
				request({
					method: 'POST',
					uri: encodeURI(this.context.endpoint.url),
					headers: {
						"X-Account-Meta-Temp-URL-Key": this.context.key,
						"X-Auth-Token": this.context.token,
						"Accept": "application/json"
					}
				}, (err, res) => {
					err = err || request.checkIfResponseIsError(res);
					if (err) // noinspection ExceptionCaughtLocallyJS
						throw new Error(err);

					return resolve({ key: this.context.key, headers: res.headers });
				});
			} catch (e) {
				return reject(e);
			}
		});
	}

	/**
	 * Manage meta data of account
	 * Available methods : create(), update(), delete(), all(), has(), get()
	 *
	 * @return {AccountMeta}
	 */
	metas() {
		return new AccountMeta(this.context);
	}
}

module.exports = Account;