'use strict';
/**
* ### RTM API Client
*
* This Class is used to represent an RTM API Client. The Client contains
* the API Key, API Secret and access permissions used to access the
* RTM API endpoints.
*
* It also includes API wrapper functions for making a general RTM API request
* as well as the auth-related functions.
*
* #### Usage
*
* The `RTMClient` Class is what is exported when the entire `rtm-api` module
* is loaded via `require`.
*
* ```
* const RTM = require('rtm-api');
* let client = new RTM(API_KEY, API_SECRET, RTM.PERM_DELETE);
* ```
*
* #### Auth Example
*
* This example gets an Auth URL to be opened by the RTM User
*
* ```
* client.auth.getAuthUrl(function(err, authUrl, frob) {
* // Have user authenticate and authorize the program with the authUrl
* // Once authorized by the user, use the frob to get an authToken
* )};
* ```
*
* #### RTM API Example
*
* This example makes an RTM API request using the method `rtm.method` and the
* parameter foo=bar.
*
* ```
* client.get('rtm.method', {foo: "bar"}, function(err, resp) {
* if ( err ) {
* // handle error
* }
* // use the response
* });
* ```
*
* See {@link RTMUser#get|RTMUser.get} for making User-authenticated API requests.
*
* @class
*/
class RTMClient {
/**
* Create a new RTM Client with the specified API access information
* @param {string} key RTM API Client Key
* @param {string} secret RTM API Client Secret
* @param {string} [perms=RTMClient.PERM_READ] RTM API Client Access Permissions. This
* should be one of {@link RTMClient.PERM_READ}, {@link RTMClient.PERM_WRITE} or
* {@link RTMClient.PERM_DELETE}.
* @constructor
*/
constructor(key, secret, perms=RTMClient.PERM_READ) {
this._apiKey = key;
this._apiSecret = secret;
this._perms = perms;
}
/**
* RTM API Client Key
* @type {string}
*/
get key() {
return this._apiKey;
}
/**
* RTM API Client Secret
* @type {string}
*/
get secret() {
return this._apiSecret;
}
/**
* RTM API Client Access Permissions
* @type {string}
*/
get perms() {
return this._perms;
}
// ===== USER FUNCTIONS ===== //
/**
* User export/import-related functions:
* - {@link RTMClient~user/create|create}
* - {@link RTMClient~user/export|export}
* - {@link RTMClient~user/exportToString|exportToString}
* - {@link RTMClient~user/import|import}
* - {@link RTMClient~user/importFromString|importFromString}
* @returns {{create: function, export: function, exportToString: function, import: function, importFromString: function}}
*/
get user() {
return require('./user.js')(this);
}
// ===== API HELPER FUNCTIONS ===== //
/**
* Make the specified RTM API call.
*
* The `method` should be the name of the RTM API method. Any necessary
* parameters should be provided with `params` as an object with the properties
* of the object as the parameters' key/value pairs.
*
* RTM API methods that require an AuthToken should set the `params` `auth_token`
* property or provide a valid `RTMUser` with an AuthToken.
* @param {string} method RTM API Method
* @param {object} [params] RTM Method Parameters (as an object with key/value pairs)
* @param {RTMUser} [user=undefined] The RTM User making the request
* @param {function} callback Callback function(err, resp)
* @param {RTMError} callback.err RTM Error Response, if encountered
* @param {RTMSuccess} callback.resp The parsed RTM API Response, if successful
*/
get(method, params, user, callback) {
require('../utils/get.js')(method, params, user, this, callback);
}
/**
* Auth-related functions:
* - {@link RTMClient~auth/getAuthUrl|getAuthUrl}
* - {@link RTMClient~auth/getAuthToken|getAuthToken}
* - {@link RTMClient~auth/verifyAuthToken|verifyAuthToken}
* @returns {{getAuthUrl: function, getAuthToken: function, verifyAuthToken: function}}
*/
get auth() {
return require('./auth.js')(this);
}
}
// ==== RTM API PERMISSION LEVELS ==== //
/**
* RTM API Access: `read` -
* gives the ability to read task, contact, group and list details and contents.
* @type {string}
* @default
*/
RTMClient.PERM_READ = 'read';
/**
* RTM API Access: `write` -
* gives the ability to add and modify task, contact, group and list details and
* contents (also allows you to `read`).
* @type {string}
* @default
*/
RTMClient.PERM_WRITE = 'write';
/**
* RTM API Access: `delete` -
* gives the ability to delete task, contacts, groups and list (also allows
* you to `read` and `write`).
* @type {string}
* @default
*/
RTMClient.PERM_DELETE = 'delete';
module.exports = RTMClient;