UNPKG

route4me-nodejs-sdk

Version:

Access Route4Me's logistics-as-a-service API using our Node.js SDK

289 lines (270 loc) 8.7 kB
"use strict" const debug = require("debug")("route4me") const platform = require("platform") const ActivityFeed = require("./resources/activity-feed") const Addresses = require("./resources/addresses") const AddressBook = require("./resources/address-book") const AddressBookV5 = require("./resources/address-book-v5") const AddressBarcodes = require("./resources/address-barcodes") const AutomaticTerritories = require("./resources/automatic-territories") const AvoidanceZones = require("./resources/avoidance-zones") const Geocoding = require("./resources/geocoding") const Members = require("./resources/members") const Notes = require("./resources/notes") const Optimizations = require("./resources/optimizations") const Orders = require("./resources/orders") const Routes = require("./resources/routes") const Schedules = require("./resources/schedules") const TeamManagement = require("./resources/team-management") const Territories = require("./resources/territories") const Tracking = require("./resources/tracking") const Vehicles = require("./resources/vehicles") const VehiclesV5 = require("./resources/vehicles-v5") const packageJson = require("./../package.json") // eslint-disable-line import/no-dynamic-require const utils = require("./utils") const errors = require("./errors") const RequestManager = require("./request-manager") /** * Route4Me main SDK class * * The main purpose of this class: to provide an access to API-methods and to keep * chore and routine in the shadow as long as possible. * * With `route4me` instance you should get responses from API easy-peasy. * * Main members of the instanse of `Route4Me` class: * * * [ActivityFeed ]{@link ActivityFeed} * * [Addresses ]{@link Addresses} * * [AddressBook ]{@link AddressBook} * * [AddressBookV5 ]{@link AddressBookV5} * * [AddressBarcodes ]{@link AddressBarcodes} * * [AutomaticTerritories]{@link AutomaticTerritories} * * [AvoidanceZones ]{@link AvoidanceZones} * * [Geocoding ]{@link Geocoding} * * [Members ]{@link Members} * * [Notes ]{@link Notes} * * [Optimizations ]{@link Optimizations} * * [Orders ]{@link Orders} * * [OrderCustomFields ]{@link OrderCustomFields} * * [Routes ]{@link Routes} * * [Schedules ]{@link Schedules} * * [TeamManagement ]{@link TeamManagement} * * [Territories ]{@link Territories} * * [Tracking ]{@link Tracking} * * [Vehicles ]{@link Vehicles} * * [VehiclesV5 ]{@link VehiclesV5} * * Each member corresponds to an bunch of methods, described in API-documentation, * but the most methods in this SDK have unified names: * * * `create` - to create new entity * * `get` - to get **one** entity (usually, by ID) * * `list` - returns a list of **all** entities (sometimes with `limit` and `offset`) * * `update` - allows to edit entity * * `remove` - removes/deletes the entity * * `search` - obviously: allows to search items by a set of criteria * * For most use cases it is necessary: * * 1. Create `route4me` instance (with your API-key) * 2. Call the appropriate method * 3. Get the result (as JSON object) * 4. **PROFIT** * * @summary Route4Me main SDK class * * @category Route4Me */ class Route4Me { /** * Create new API client * * @param {string} apiKey API KEY * @param {object} [options] Additional options for new instance * @param {string} [options.baseUrl=https://api.route4me.com] Base URL for sending requests * @param {string} [options.baseUrl5=https://wh.route4me.com/modules] Base URL for sending * requests to backend API v.5 * @param {ILogger} [options.logger=null] Logger facility * @param {boolean|function} [options.promise=false] Use promises instead of * callbacks. Usage: * * `false` means _no promises, use callbacks_; * * `true` means _use global `Promise`_ as promises' constructor; * * `constructor (function)` forces to use explicit Promise library. * See also Examples section of this documentation. * * @param {module:route4me-node~ValidationCallback} [options.validate=false] * Validator for input and output parameters of the API methods. Set **falsey** * value to skip autovalidation (in favor of manual check). * * @return {Route4Me} New API client */ constructor(apiKey, options) { const opt = {} // check options opt["baseUrl"] = utils.get(options, "baseUrl", "https://api.route4me.com") opt["baseUrl5"] = utils.get(options, "baseUrl5", "https://wh.route4me.com/modules") opt["logger"] = utils.get(options, "logger", new utils.ILogger()) opt["promise"] = utils.get(options, "promise", false) opt["validate"] = utils.get(options, "validate", false) // TODO: decide, whether this param could be configured opt["userAgent"] = `superagent/3.3.2 (${platform.name} ${platform.version}; Route4Me-${platform.name}/${Route4Me.version}) ${platform.description}` debug("init", opt) debug("version", Route4Me.version) if (!apiKey) { throw new errors.Route4MeError("'apiKey' is not set") } const req = new RequestManager(apiKey, opt) this._logger = opt["logger"] /** * **ActivityFeed** related API calls * @type {ActivityFeed} * @since 0.1.12 */ this.ActivityFeed = new ActivityFeed(req) /** * **AddressBook** related API calls * @type {AddressBook} * @since 0.1.8 */ this.AddressBook = new AddressBook(req) /** * **AddressBookV5** related API calls * @type {AddressBookV5} * @since 0.1.8 */ this.AddressBookV5 = new AddressBookV5(req) /** * **AddressBarcodes** related API calls * @type {AddressBarcodes} * @since 1.0.5 */ this.AddressBarcodes = new AddressBarcodes(req) /** * **Addresses** related API calls * @type {Addresses} * @since 0.1.8 */ this.Addresses = new Addresses(req) /** * **AutomaticTerritories** related API calls * @type {AutomaticTerritories} * @since 0.1.16 */ this.AutomaticTerritories = new AutomaticTerritories(req) /** * **AvoidanceZones** related API calls * @type {AvoidanceZones} * @since 0.1.8 */ this.AvoidanceZones = new AvoidanceZones(req) /** * **Geocoding** related API calls * @type {Geocoding} * @since 0.1.9 */ this.Geocoding = new Geocoding(req) /* * **Members** related API calls * @type {Members} * @since 0.1.8 */ this.Members = new Members(req) /** * **Notes** related API calls * @type {Notes} * @since 0.1.9 */ this.Notes = new Notes(req) /** * **Optimizations** related API calls * @type {Optimizations} */ this.Optimizations = new Optimizations(req) /** * **Orders** related API calls * @type {Orders} */ this.Orders = new Orders(req) /** * **Routes** related API calls * @type {Routes} * @since 0.1.8 */ this.Routes = new Routes(req) /** * **Schedules** related API calls * @type {Schedules} * @since 1.0.18 */ this.Schedules = new Schedules(req) /** * **TeamManagement** related API calls * @type {TeamManagement} */ this.TeamManagement = new TeamManagement(req) /** * **Territories** related API calls * @type {Territories} */ this.Territories = new Territories(req) /** * **Tracking** related API calls * @type {Tracking} */ this.Tracking = new Tracking(req) /** * **Vehicles** related API calls * @type {Vehicles} */ this.Vehicles = new Vehicles(req) /** * **VehiclesV5** related API calls * @type {VehiclesV5} */ this.VehiclesV5 = new VehiclesV5(req) this._logger.debug({ msg: "initialized", version: Route4Me.version }) /** * Base URL for sending requests * * @since 1.0.9 * * @return {string} URL * @readonly */ this.baseUrl = () => opt["baseUrl"] /** * Base URL for sending requests to backend API v.5 * * @since 1.0.9 * * @return {string} URL * @readonly */ this.baseUrl5 = () => opt["baseUrl5"] } /** * Version of this API client * * @since 0.1.3 * * @return {string} Version * @static * @readonly */ static get version() { return packageJson.version } /** * Version of this API client * * @since 0.2.0 * * @return {string} Version * @readonly */ get version() { // eslint-disable-line class-methods-use-this return packageJson.version } } module.exports = Route4Me