Source: provider/mockTranslationProvider.js

Source: provider/mockTranslationProvider.js

/**
 * Copyright (c) 2019 Oracle and/or its affiliates. All rights reserved.
 * Licensed under the Universal Permissive License v 1.0 as shown at http://oss.oracle.com/licenses/upl.
 */
/* globals app, module, __dirname */
/* jshint esversion: 6 */

var request = require('request'),
	translationProviderApi = require('./translationProvider').api;

//
// NOTE: re-implement this object based on server and API requirements
//
var port = process.env.CECLSP_PORT || 8084,
	mockServerPrefix = 'http://localhost:' + port + '/lsp/rest/api/v1',
	urls = {
		COMMUNITY: mockServerPrefix + '/community',
		PROJECT: mockServerPrefix + '/project',
		DOCUMENT: mockServerPrefix + '/document',
		BINARY: mockServerPrefix + '/binary',
		WORKFLOW: mockServerPrefix + '/workflow'
	};


/**
 * Implementation of calls to the Translation Provider interface for the "MockServer".</br>
 * You will need to create the corresponding implementation for your Language Service Provider.
 * @constructor
 * @alias MockTranslationProvider
 * @augments TranslationProviderInterface
 */
var MockTranslationProvider = function () {};
MockTranslationProvider.prototype = Object.create(translationProviderApi.prototype);

/** @inheritdoc */
MockTranslationProvider.prototype.addDocument = function (projectId, authToken, name, content, sourceLocale, additionalData) {
	var self = this,
		error = '';

	if (!projectId || !authToken, !name || !content || !sourceLocale) {
		// invalid parameters
		error = 'MockTranslationProvider.addDocument(): required parameters: projectId, authToken, name, content';
	} else {
		// validate content is JSON & not empty
		try {
			JSON.parse(content);
			// With do_not_translate fields, it is possible to get empty content items.
		} catch (e) {
			error = 'MockTranslationProvider.addDocument(): content parameter must be JSON';
		}
	}

	// if there is an error, report it
	if (error) {
		return Promise.reject('MockTranslationProvider.addDocument(): ' + error);
	}

	// add the document
	return new Promise(function (resolve, reject) {
		request.post({
			url: urls.DOCUMENT,
			auth: {
				bearer: authToken
			},
			form: {
				'projectId': projectId,
				'sourceLocale': sourceLocale,
				'format': 'JSON',
				'charset': 'UTF-8',
				'name': name,
				'content': content
			}
		}, function (error, httpResponse, body) {
			if (!error && httpResponse.statusCode >= 200 && httpResponse.statusCode < 300) {
				try {
					var documentResponse = JSON.parse(body);
					return resolve(documentResponse);
				} catch (e) {
					return reject(e);
				}
			} else {
				return reject(error);
			}
		});
	});
};

/** @inheritdoc */
MockTranslationProvider.prototype.addBinaryFile = function (projectId, authToken, binaryFileSpec, file, sourceLocale, additionalData) {
	var error = '';

	if (!projectId || !authToken, !binaryFileSpec || !file || !sourceLocale) {
		// invalid parameters
		error = 'MockTranslationProvider.addDocument(): required parameters: projectId, authToken, binaryFileSpec, file';
	}

	// if there is an error, report it
	if (error) {
		return Promise.reject('MockTranslationProvider.addBinaryFile(): ' + error);
	}

	// add the binary file
	return new Promise(function (resolve, reject) {
		request.post({
			url: urls.BINARY,
			auth: {
				bearer: authToken
			},
			form: {
				'projectId': projectId,
				'sourceLocale': sourceLocale,
				'name': file.name,
				'binaryFileSpec': binaryFileSpec
			}
		}, function (error, httpResponse, body) {
			if (!error && httpResponse.statusCode >= 200 && httpResponse.statusCode < 300) {
				try {
					var documentResponse = JSON.parse(body);
					return resolve(documentResponse);
				} catch (e) {
					return reject(e);
				}
			} else {
				return reject(error);
			}
		});
	});
};

/** @inheritdoc */
MockTranslationProvider.prototype.getDocument = function (authToken, id) {
	return new Promise(function (resolve, reject) {
		request.get({
			url: urls.DOCUMENT + '/' + id,
			auth: {
				bearer: authToken
			}
		}, function (error, httpResponse, body) {
			if (!error && httpResponse.statusCode >= 200 && httpResponse.statusCode < 300) {
				try {
					var document = JSON.parse(body);
					return resolve(document);
				} catch (e) {
					return reject(e);
				}
			} else {
				return reject(error);
			}
		});
	});
};

/** @inheritdoc */
MockTranslationProvider.prototype.getDocumentImportProcess = function (authToken, id) {
	return new Promise(function (resolve, reject) {
		request.get({
			url: urls.DOCUMENT + '/' + id + '/import-process',
			auth: {
				bearer: authToken
			}
		}, function (error, httpResponse, body) {
			if (!error && httpResponse.statusCode >= 200 && httpResponse.statusCode < 300) {
				try {
					var document = JSON.parse(body);
					return resolve(document);
				} catch (e) {
					return reject(e);
				}
			} else {
				return reject(error);
			}
		});
	});
};

/** @inheritdoc */
MockTranslationProvider.prototype.getDocumentTranslationStatuses = function (authToken, id) {
	// confirm parameters
	if (!authToken || !id) {
		return Promise.reject('MockTranslationProvider.getDocumentTranslationStatuses(): required parameters: authToken, id');
	}

	return new Promise(function (resolve, reject) {
		request.get({
			url: urls.DOCUMENT + '/' + id + '/translation',
			auth: {
				bearer: authToken
			}
		}, function (error, httpResponse, body) {
			if (!error && httpResponse.statusCode >= 200 && httpResponse.statusCode < 300) {
				try {
					var translation = JSON.parse(body);
					return resolve(translation);
				} catch (e) {
					return reject(e);
				}
			} else {
				return reject(error);
			}
		});
	});
};

/** @inheritdoc */
MockTranslationProvider.prototype.getDocumentTranslationStatus = function (authToken, id, locale) {
	// confirm parameters
	if (!authToken || !id) {
		return Promise.reject('MockTranslationProvider.getTranslationStatus(): required parameters: authToken, id');
	}

	return this.getDocumentTranslationStatuses(id).then(function (translationStatuses) {
		var translations = translationStatuses.entities || [],
			translation;

		for (var i = 0; i < translations.length; i++) {
			if (translations[i].locale_code === locale) {
				translation = translations[i];
				break;
			}
		}

		return Promise.resolve(translation);
	});
};

/** @inheritdoc */
MockTranslationProvider.prototype.addTranslation = function (authToken, projectId, id, locale) {
	var self = this;

	// confirm parameters
	if (!authToken || !projectId || !id || !locale) {
		return Promise.reject('MockTranslationProvider.addTranslation(): required parameters: authToken, projectId, id, locale');
	}


	return new Promise(function (resolve, reject) {
		request.post({
			url: urls.DOCUMENT + '/' + id + '/translation',
			auth: {
				bearer: authToken
			},
			form: {
				'localeCode': locale,
				'projectId': projectId
			}
		}, function (error, httpResponse, body) {
			if (!error && httpResponse.statusCode >= 200 && httpResponse.statusCode < 300) {
				try {
					var translation = JSON.parse(body);
					return resolve(translation);
				} catch (e) {
					return reject(e);
				}
			} else {
				return reject(error);
			}
		});
	});
};

/** @inheritdoc */
MockTranslationProvider.prototype.getTranslation = function (authToken, id, locale) {
	// confirm parameters
	if (!authToken || !id || !locale) {
		return Promise.reject('MockTranslationProvider.getTranslation(): required parameters: authToken, id, locale');
	}

	return new Promise(function (resolve, reject) {
		request.get({
			url: urls.DOCUMENT + '/' + id + '/translation/' + locale,
			auth: {
				bearer: authToken
			}
		}, function (error, httpResponse, body) {
			if (!error && httpResponse.statusCode >= 200 && httpResponse.statusCode < 300) {
				try {
					var translation = JSON.parse(body);
					return resolve(translation);
				} catch (e) {
					return reject(e);
				}
			} else {
				return reject(error);
			}
		});
	});
};

/** @inheritdoc */
MockTranslationProvider.prototype.getBinaryTranslation = function (authToken, id, locale) {
	// confirm parameters
	if (!authToken || !id || !locale) {
		return Promise.reject('MockTranslationProvider.getBinaryTranslation(): required parameters: authToken, id, locale');
	}

	return new Promise(function (resolve, reject) {
		request.get({
			url: urls.DOCUMENT + '/' + id + '/binarytranslation/' + locale,
			auth: {
				bearer: authToken
			}
		}, function (error, httpResponse, body) {
			if (!error && httpResponse.statusCode >= 200 && httpResponse.statusCode < 300) {
				try {
					return resolve(body);
				} catch (e) {
					return reject(e);
				}
			} else {
				return reject(error);
			}
		});
	});
};

/** @inheritdoc */
MockTranslationProvider.prototype.addProject = function (authToken, communityId, workflowId, projectName) {
	var self = this;

	// confirm parameters
	if (!authToken || !communityId || !workflowId || !projectName) {
		return Promise.reject('MockTranslationProvider.addProject(): required parameters: authToken, communityId, workflowId, projectName)');
	}

	// create the project
	return new Promise(function (resolve, reject) {
		request.post({
				url: urls.PROJECT,
				auth: {
					bearer: authToken
				},
				form: {
					name: projectName,
					communityId: communityId,
					workflowId: workflowId
				}
			},
			function (error, httpResponse, body) {
				if (!error && httpResponse.statusCode >= 200 && httpResponse.statusCode < 300) {
					try {
						var project = JSON.parse(body);
						return resolve(project);
					} catch (e) {
						return reject(e);
					}
				} else {
					return reject(error);
				}
			});
	});
};

/** @inheritdoc */
MockTranslationProvider.prototype.getProjectStatus = function (authToken, id) {
	if (!authToken || !id) {
		return Promise.reject('MockTranslationProvider.getProjectStatus(): required parameters: authToken, id)');
	}
	return new Promise(function (resolve, reject) {
		request.get({
			url: urls.PROJECT + '/' + id + '/status',
			auth: {
				bearer: authToken
			}
		}, function (error, httpResponse, body) {
			if (!error && httpResponse.statusCode >= 200 && httpResponse.statusCode < 300) {
				var projectStatus = JSON.parse(body);
				return resolve(projectStatus);
			} else {
				return reject(error);
			}
		});
	});

};

/** @inheritdoc */
MockTranslationProvider.prototype.getCommunity = function (authToken) {
	if (!authToken) {
		return Promise.reject('MockTranslationProvider.getCommunity(): required parameters: authToken)');
	}

	return new Promise(function (resolve, reject) {
		request.get({
			url: urls.COMMUNITY,
			auth: {
				bearer: authToken
			}
		}, function (error, httpResponse, body) {
			if (!error && httpResponse.statusCode >= 200 && httpResponse.statusCode < 300) {
				try {
					var communityResponse = JSON.parse(body),
						community = communityResponse.entities[0],
						communityDetails = community.properties;

					return resolve(communityDetails.id);
				} catch (e) {
					return reject(e);
				}
			} else {
				return reject(error);
			}
		});
	});
};

module.exports = new MockTranslationProvider();