diff --git a/src/resources/orders.js b/src/resources/orders.js new file mode 100644 index 0000000..7c097ec --- /dev/null +++ b/src/resources/orders.js @@ -0,0 +1,107 @@ +"use strict" + +const debug = require("debug")("route4me") + +const utils = require("./../utils") +const errors = require("./../errors") + +class CustomInternalPostProcessing { + /** + * Handle `duplicate` output + * + * @private + * + * @example Expected input + * Sample = { + * "optimization_problem_id":"672998C4269918AFF461E5A691BAB8D0", + * "success":true + * } + * + * @param {Object} data - Internal + * @param {Object} ctx - Internal + * @param {Object} res - Internal + * @return {string} - The ID of duplicate + */ + static duplicate(data, ctx, res) { + if ( + !data + || "boolean" !== typeof data["success"] + || "string" !== typeof data["optimization_problem_id"] + ) { + return new errors.Route4MeValidationError("Invalid response", data) + } + + if (true === data["success"]) { + return data["optimization_problem_id"] + } + + // TODO: parse real error + return new errors.Route4MeApiError("Failed", res) + } +} + +// =================================== + +/** + * @namespace + */ +class Orders { + /** + * Orders facility + * + * @see {@link https://route4me.io/docs/#orders} + * @since 0.1.11 + * @private + * + * @param {Route4Me} route4me - Route4Me manager + * @return {Orders} - Orders facility + */ + constructor(route4me) { + this.r = route4me + } + + /** + * Create an Order + * + * @example Sample input + * + * { + * "address_1": "1358 E Luzerne St, Philadelphia, PA 19124, US", + * "cached_lat" : 48.335991, + * "cached_lng" : 31.18287, + * "address_alias" : "Auto test address", + * "address_city" : "Philadelphia", + * "EXT_FIELD_first_name" : "Igor", + * "EXT_FIELD_last_name" : "Progman", + * "EXT_FIELD_email" : "progman@gmail.com", + * "EXT_FIELD_phone" : "380380380380", + * "EXT_FIELD_custom_data" : [ + * { + * "order_id" : "10", + * "name" : "Bill Soul" + * } + * ] + * } + * + * @see {@link https://route4me.io/docs/#create-an-order} + * @category Orders + * @since 0.1.11 + * + * @todo TODO: use custom input format (well formatted) + * + * @param {jsonschema:Orders.OrderInput} data - New order + * @param {module:route4me-node~RequestCallback} [callback] + */ + create(data, callback) { + const body = data // convert data + + return this.r._makeRequest({ + method: "POST", + path: "/api.v4/order.php", + body, + validationContext: "Orders.Order", + }, callback) + } +} + +module.exports = Orders diff --git a/src/route4me.js b/src/route4me.js index 795c40e..6f511c7 100644 --- a/src/route4me.js +++ b/src/route4me.js @@ -12,6 +12,7 @@ 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 Territories = require("./resources/territories") const Tracking = require("./resources/tracking") @@ -122,6 +123,11 @@ class Route4Me { * @type {Optimizations} */ this.Optimizations = new Optimizations(this) + /** + * **Orders** related API calls + * @type {Orders} + */ + this.Orders = new Orders(this) /** * **Routes** related API calls * @type {Routes} diff --git a/test/resources/orders.spec.js b/test/resources/orders.spec.js new file mode 100644 index 0000000..eb0dc4d --- /dev/null +++ b/test/resources/orders.spec.js @@ -0,0 +1,79 @@ +"use strict" + +const request = require("superagent") +const saMock = require("superagent-mocker")(request) + +const helper = require("./../helper") + +const Route4Me = require("../../src/route4me") + +const testApiKey = "11111111111111111111111111111111" + + +describe(helper.toSuiteName(__filename), () => { + describe("SDK methods", () => { + const route4me = new Route4Me(testApiKey) + const resource = route4me.Orders + let req + + describe("create", () => { + beforeEach(() => { + saMock.post("*", (r) => { + req = r + req.method = "POST" + return { body: {} } + }) + }) + + afterEach(() => { + saMock.clearRoutes() + }) + + const data = { + "address_1": "1358 E Luzerne St, Philadelphia, PA 19124, US", + "cached_lat" : 48.335991, + "cached_lng" : 31.18287, + "address_alias" : "Auto test address", + "address_city" : "Philadelphia", + "EXT_FIELD_first_name" : "Igor", + "EXT_FIELD_last_name" : "Progman", + "EXT_FIELD_email" : "spam@route4me.com", + "EXT_FIELD_phone" : "380380380380", + "EXT_FIELD_custom_data" : [ { + "order_id" : "10", + "name" : "Bill Soul" + } ], + } + + it("should call route4me", (done) => { + resource.create(data, (err, res) => { + expect(err).not.exist + expect(res).exist + + helper.expectRequest(req, + "POST", "https://route4me.com/api.v4/order.php", + { }, + { + "address_1": "1358 E Luzerne St, Philadelphia, PA 19124, US", + "cached_lat" : 48.335991, + "cached_lng" : 31.18287, + "address_alias" : "Auto test address", + "address_city" : "Philadelphia", + "EXT_FIELD_first_name" : "Igor", + "EXT_FIELD_last_name" : "Progman", + "EXT_FIELD_email" : "spam@route4me.com", + "EXT_FIELD_phone" : "380380380380", + "EXT_FIELD_custom_data" : [ { + "order_id" : "10", + "name" : "Bill Soul" + } ], + } + ) + + done() + }) + }) + }) + + }) +})