cimpress-translations
Version:
Lightweight client for the Translations Service
395 lines (335 loc) • 12.2 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var rp = require("request-promise-native");
var _require = require("pope"),
pope = _require.pope;
var httpStatus = require("http-status-codes");
var jsonPatch = require("fast-json-patch");
var _require2 = require("./errors"),
buildError = _require2.buildError;
var _require3 = require("./language"),
findLanguage = _require3.findLanguage,
findLanguageCode = _require3.findLanguageCode;
var API = {
url: "https://api.translations.cimpress.io",
v1Services: "/v1/services",
v1ServicesId: "/v1/services/{{id}}",
v1ServicesIdStructure: "/v1/services/{{id}}/structure",
v1ServicesIdLanguage: "/v1/services/{{id}}/blobs/{{language}}"
};
var requestCatch = function requestCatch(err) {
if (err && err.statusCode === httpStatus.NOT_FOUND) {
throw buildError("ENOTFOUND", err.message);
}
if (err && [httpStatus.UNAUTHORIZED, httpStatus.FORBIDDEN].includes(err.statusCode)) {
throw buildError("ENOACCESS", err.message);
}
throw buildError("EGENERIC", err.message);
};
var CimpressTranslationsClient =
/*#__PURE__*/
function () {
function CimpressTranslationsClient(url, auth) {
(0, _classCallCheck2["default"])(this, CimpressTranslationsClient);
this.url = url || API.url;
this.auth = auth;
}
(0, _createClass2["default"])(CimpressTranslationsClient, [{
key: "buildUrl",
value: function buildUrl(path, dict) {
return pope(this.url + path, dict);
}
}, {
key: "addAuth",
value: function () {
var _addAuth = (0, _asyncToGenerator2["default"])(
/*#__PURE__*/
_regenerator["default"].mark(function _callee(options) {
var auth;
return _regenerator["default"].wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
_context.next = 2;
return this.getAuth();
case 2:
auth = _context.sent;
if (auth) {
auth = auth.startsWith('Bearer ') ? auth : 'Bearer ' + auth;
options.headers = Object.assign(options.headers || {}, {
Authorization: auth
});
}
case 4:
case "end":
return _context.stop();
}
}
}, _callee, this);
}));
function addAuth(_x) {
return _addAuth.apply(this, arguments);
}
return addAuth;
}()
}, {
key: "getAuth",
value: function getAuth() {
if (typeof this.auth === "function") {
return this.auth();
}
return this.auth;
}
}, {
key: "listServices",
value: function () {
var _listServices = (0, _asyncToGenerator2["default"])(
/*#__PURE__*/
_regenerator["default"].mark(function _callee2() {
var options;
return _regenerator["default"].wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
options = {
url: this.buildUrl(API.v1Services),
json: true
};
_context2.next = 3;
return this.addAuth(options);
case 3:
return _context2.abrupt("return", rp(options)["catch"](requestCatch));
case 4:
case "end":
return _context2.stop();
}
}
}, _callee2, this);
}));
function listServices() {
return _listServices.apply(this, arguments);
}
return listServices;
}()
}, {
key: "describeService",
value: function () {
var _describeService = (0, _asyncToGenerator2["default"])(
/*#__PURE__*/
_regenerator["default"].mark(function _callee3(serviceId) {
var options;
return _regenerator["default"].wrap(function _callee3$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
options = {
url: this.buildUrl(API.v1ServicesId, {
id: serviceId
}),
json: true
};
_context3.next = 3;
return this.addAuth(options);
case 3:
return _context3.abrupt("return", rp(options)["catch"](requestCatch));
case 4:
case "end":
return _context3.stop();
}
}
}, _callee3, this);
}));
function describeService(_x2) {
return _describeService.apply(this, arguments);
}
return describeService;
}()
}, {
key: "getLanguageBlob",
value: function () {
var _getLanguageBlob = (0, _asyncToGenerator2["default"])(
/*#__PURE__*/
_regenerator["default"].mark(function _callee4(serviceId, language) {
var languageCode, options;
return _regenerator["default"].wrap(function _callee4$(_context4) {
while (1) {
switch (_context4.prev = _context4.next) {
case 0:
languageCode = findLanguageCode(language);
if (languageCode) {
_context4.next = 3;
break;
}
throw buildError("ENOLANG");
case 3:
options = {
url: this.buildUrl(API.v1ServicesIdLanguage, {
id: serviceId,
language: languageCode
}),
json: true
};
_context4.next = 6;
return this.addAuth(options);
case 6:
return _context4.abrupt("return", rp(options)["catch"](requestCatch));
case 7:
case "end":
return _context4.stop();
}
}
}, _callee4, this);
}));
function getLanguageBlob(_x3, _x4) {
return _getLanguageBlob.apply(this, arguments);
}
return getLanguageBlob;
}()
}, {
key: "putLanguageBlob",
value: function () {
var _putLanguageBlob = (0, _asyncToGenerator2["default"])(
/*#__PURE__*/
_regenerator["default"].mark(function _callee5(serviceId, language, blob) {
var languageObject, languageCode, shortLanguageCode, requestBody, options;
return _regenerator["default"].wrap(function _callee5$(_context5) {
while (1) {
switch (_context5.prev = _context5.next) {
case 0:
languageObject = findLanguage(language); // validate that language was found and fields required to form the REST request are present
if (languageObject && languageObject["639-2"] && languageObject.en && Array.isArray(languageObject.en) && languageObject.en.length > 0) {
_context5.next = 3;
break;
}
throw buildError("ENOLANG");
case 3:
languageCode = languageObject["639-2"];
shortLanguageCode = languageObject["639-1"];
requestBody = {
blob: blob,
metadata: {
name: languageObject.en[0],
shortName: languageCode,
nativeName: shortLanguageCode && languageObject[shortLanguageCode] && languageObject[shortLanguageCode][0] || languageObject.en[0]
}
};
options = {
method: "PUT",
url: this.buildUrl(API.v1ServicesIdLanguage, {
id: serviceId,
language: languageCode
}),
body: requestBody,
json: true
};
_context5.next = 9;
return this.addAuth(options);
case 9:
return _context5.abrupt("return", rp(options)["catch"](requestCatch));
case 10:
case "end":
return _context5.stop();
}
}
}, _callee5, this);
}));
function putLanguageBlob(_x5, _x6, _x7) {
return _putLanguageBlob.apply(this, arguments);
}
return putLanguageBlob;
}()
}, {
key: "patchStructure",
value: function () {
var _patchStructure = (0, _asyncToGenerator2["default"])(
/*#__PURE__*/
_regenerator["default"].mark(function _callee6(serviceId, structurePatches) {
var error, options;
return _regenerator["default"].wrap(function _callee6$(_context6) {
while (1) {
switch (_context6.prev = _context6.next) {
case 0:
error = jsonPatch.validate(structurePatches);
if (!error) {
_context6.next = 3;
break;
}
throw buildError("EBADREQUEST", JSON.stringify(error));
case 3:
options = {
method: "PATCH",
url: this.buildUrl(API.v1ServicesIdStructure, {
id: serviceId
}),
body: structurePatches,
json: true
};
_context6.next = 6;
return this.addAuth(options);
case 6:
return _context6.abrupt("return", rp(options)["catch"](requestCatch));
case 7:
case "end":
return _context6.stop();
}
}
}, _callee6, this);
}));
function patchStructure(_x8, _x9) {
return _patchStructure.apply(this, arguments);
}
return patchStructure;
}()
}, {
key: "removeKeysFromStructure",
value: function () {
var _removeKeysFromStructure = (0, _asyncToGenerator2["default"])(
/*#__PURE__*/
_regenerator["default"].mark(function _callee7(serviceId) {
var blob,
remoteBlob,
blobPatches,
removeFromStructurePatches,
_args7 = arguments;
return _regenerator["default"].wrap(function _callee7$(_context7) {
while (1) {
switch (_context7.prev = _context7.next) {
case 0:
blob = _args7.length > 1 && _args7[1] !== undefined ? _args7[1] : {};
_context7.next = 3;
return this.getLanguageBlob(serviceId, blob.blobId);
case 3:
remoteBlob = _context7.sent;
blobPatches = jsonPatch.compare(remoteBlob.data, blob.data);
removeFromStructurePatches = blobPatches.filter(function (patch) {
return patch.op === "remove";
});
if (!(removeFromStructurePatches.length > 0)) {
_context7.next = 10;
break;
}
_context7.next = 9;
return this.patchStructure(serviceId, removeFromStructurePatches);
case 9:
return _context7.abrupt("return", _context7.sent);
case 10:
case "end":
return _context7.stop();
}
}
}, _callee7, this);
}));
function removeKeysFromStructure(_x10) {
return _removeKeysFromStructure.apply(this, arguments);
}
return removeKeysFromStructure;
}()
}]);
return CimpressTranslationsClient;
}();
CimpressTranslationsClient.API = API;
module.exports = CimpressTranslationsClient;