Santhosh has uploaded a new change for review.
https://gerrit.wikimedia.org/r/188764
Change subject: Provide version number in REST apis
......................................................................
Provide version number in REST apis
Bug: T87712
Change-Id: I69c1655ab79451898cc901a6bb32e2f7bd9f6263
---
M ContentTranslationService.js
M public/translation/js/main.js
A routes/v1.js
3 files changed, 178 insertions(+), 170 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/services/cxserver
refs/changes/64/188764/1
diff --git a/ContentTranslationService.js b/ContentTranslationService.js
index 54aa42e..e61a4e7 100644
--- a/ContentTranslationService.js
+++ b/ContentTranslationService.js
@@ -23,8 +23,8 @@
logger = require( __dirname + '/utils/Logger.js' ),
privateKey,
certificate,
- credentials,
- pkg = require( __dirname + '/package.json' );
+ credentials;
+
app = express();
// Starts https server only if all needed args provided, else starts http
server.
@@ -43,182 +43,19 @@
}
instanceName = 'worker(' + process.pid + ')';
+
app.use( function ( req, res, next ) {
res.header( 'Access-Control-Allow-Origin', conf( 'allowCORS' ) );
res.header( 'Access-Control-Allow-Headers', 'X-Requested-With' );
next();
} );
-app.get( '/page/:language/:title', function ( req, res ) {
- var sourceLanguage = req.params.language,
- title = req.params.title,
- CXSegmenter = require( __dirname +
'/segmentation/CXSegmenter.js' ).CXSegmenter,
- PageLoader = require( __dirname + '/pageloader/PageLoader.js'
).PageLoader,
- pageloader = new PageLoader( title, sourceLanguage );
+app.use( '/v1', require('./routes/v1' ) );
+app.use( '/', require('./routes/v1' ) );
- logger.profile( 'Fetch page' );
- pageloader.load().then(
- function ( response ) {
- var segmenter, segmentedContent;
- try {
- logger.profile( 'Fetch page', { title: title,
sourceLanguage: sourceLanguage } );
- logger.profile( 'Segment page' );
- segmenter = new CXSegmenter( response.body,
sourceLanguage );
- segmenter.segment();
- segmentedContent =
segmenter.getSegmentedContent();
- logger.profile( 'Segment page', { title: title,
sourceLanguage: sourceLanguage } );
- } catch ( error ) {
- res.send( 500, {
- error: '' + error
- } );
- logger.log( 'error', 'Page %s:%s could not be
fetched or segmented: (%s)',
- sourceLanguage, title, error.toString()
);
- }
- res.send( {
- sourceLanguage: sourceLanguage,
- title: title,
- revision: response.revision,
- segmentedContent: segmentedContent
- } );
- logger.debug( 'Page sent' );
- },
- function ( error ) {
- res.send( 404, {
- error: '' + error
- } );
- logger.info( 'Page not found: %s:%s', sourceLanguage,
title );
- }
- );
-} );
-
-app.get( '/mt/:from/:to/:provider?', function ( req, res ) {
- res.send( 405, { error: 'Request must be posted' } );
-} );
-
-app.post( '/mt/:from/:to/:provider?', function ( req, res ) {
- var mtClients, mtClient,
- sourceHtmlChunks, sourceHtml, reqLength,
- registry = require( __dirname + '/registry' ),
- from = req.params.from,
- to = req.params.to,
- provider = registry.getValidProvider( from, to, 'mt',
req.params.provider );
-
- if ( !provider ) {
- res.send( 404, { error: 'Provider not supported' } );
- logger.info( 'MT provider invalid or missing' );
-
- return;
- }
-
- mtClients = require( __dirname + '/mt/' );
- if ( mtClients[ provider ] === undefined ) {
- res.send( 500, { error: 'Provider not found' } );
- logger.error( 'Configured provider ' + provider + ' was not
found' );
- return;
- }
-
- mtClient = new mtClients[ provider ]();
-
- sourceHtmlChunks = [ '<div>' ];
- reqLength = 0;
-
- req.on( 'data', function ( data ) {
- reqLength += data.length;
- if ( reqLength > 50000 ) {
- // Too long
- res.send( 413, { error: 'Content too long' } );
- logger.error( 'MT content too long' );
- return;
- }
- sourceHtmlChunks.push( data );
- } );
- req.on( 'end', function () {
- sourceHtmlChunks.push( '</div>' );
- sourceHtml = sourceHtmlChunks.join( '' );
-
- logger.profile( 'MT' );
- mtClient.translate( from, to, sourceHtml ).then(
- function ( data ) {
- // Prevent XSS by sending json with
- // dangerous characters converted to
- // unicode sequences
- var json = JSON.stringify( { contents: data } );
- json = json
- .replace( /&/g, '\\u0026' )
- .replace( /</g, '\\u003C' )
- .replace( />/g, '\\u003E' );
- res.type( 'application/json' );
- res.send( json );
- logger.profile( 'MT', { from: from, to: to } );
- },
- function ( error ) {
- res.send( 500, { error: error } );
- logger.log( 'error', 'MT processing error:
(%s)', error.toString() );
- }
- );
- } );
-} );
-
-app.get( '/dictionary/:word/:from/:to/:provider?', function ( req, res ) {
- var dictClients, dictClient,
- registry = require( __dirname + '/registry' ),
- word = req.params.word,
- from = req.params.from,
- to = req.params.to,
- provider = registry.getValidProvider( from, to, 'dictionary',
req.params.provider );
-
- if ( !provider ) {
- res.send( 404 );
- logger.info( 'Dictionary provider invalid or missing' );
-
- return;
- }
-
- dictClients = require( __dirname + '/dictionary/' );
- dictClient = dictClients[ provider ];
-
- logger.profile( 'Dictionary lookup' );
- dictClient.getTranslations( word, from, to ).then(
- function ( data ) {
- res.send( data );
- logger.profile( 'Dictionary lookup', { word: word,
from: from, to: to } );
- },
- function ( error ) {
- res.send( 500, {
- error: error
- } );
- logger.log( 'error', 'Dictionary lookup error: (%s)',
error.toString() );
- }
- );
-} );
-
-app.get( '/list/:tool/:from/:to', function ( req, res ) {
- var tool = req.params.tool,
- from = req.params.from,
- to = req.params.to,
- registry = require( __dirname + '/registry' ),
- toolset = registry.getToolSet( from, to );
-
- res.json( toolset[ tool ] || {} );
- logger.debug( 'Tool data sent' );
-} );
-
-app.get( '/languagepairs', function ( req, res ) {
- var registry = require( __dirname + '/registry' );
-
- res.json( registry.getLanguagePairs() );
-} );
-
-app.get( '/version', function ( req, res ) {
- var version = {
- name: pkg.name,
- version: pkg.version
- };
- res.json( version );
- logger.debug( 'Version info sent' );
-} );
// Everything else goes through this.
app.use( express.static( __dirname + '/public' ) );
+
console.log( instanceName + ' ready. Listening on port: ' + conf( 'port' ) );
server.listen( conf( 'port' ) );
diff --git a/public/translation/js/main.js b/public/translation/js/main.js
index ae296cb..e7d4914 100644
--- a/public/translation/js/main.js
+++ b/public/translation/js/main.js
@@ -3,7 +3,7 @@
'use strict';
function translate( sourceLanguage, targetLanguage, content ) {
- var url = '/mt/' + sourceLanguage + '/' + targetLanguage;
+ var url = '/v1/mt/' + sourceLanguage + '/' + targetLanguage;
return $.post( url, content );
}
diff --git a/routes/v1.js b/routes/v1.js
new file mode 100644
index 0000000..f11a4d1
--- /dev/null
+++ b/routes/v1.js
@@ -0,0 +1,171 @@
+var express = require('express'),
+ logger = require( __dirname + '/../utils/Logger.js' ),
+ registry = require( __dirname + '/../registry' ),
+ pkg = require( __dirname + '/../package.json' ),
+ app = express();
+
+app.get( '/page/:language/:title', function ( req, res ) {
+ var sourceLanguage = req.params.language,
+ title = req.params.title,
+ CXSegmenter = require( __dirname +
'/../segmentation/CXSegmenter.js' ).CXSegmenter,
+ PageLoader = require( __dirname +
'/../pageloader/PageLoader.js' ).PageLoader,
+ pageloader = new PageLoader( title, sourceLanguage );
+
+ logger.profile( 'Fetch page' );
+ pageloader.load().then(
+ function ( response ) {
+ var segmenter, segmentedContent;
+ try {
+ logger.profile( 'Fetch page', { title: title,
sourceLanguage: sourceLanguage } );
+ logger.profile( 'Segment page' );
+ segmenter = new CXSegmenter( response.body,
sourceLanguage );
+ segmenter.segment();
+ segmentedContent =
segmenter.getSegmentedContent();
+ logger.profile( 'Segment page', { title: title,
sourceLanguage: sourceLanguage } );
+ } catch ( error ) {
+ res.send( 500, {
+ error: '' + error
+ } );
+ logger.log( 'error', 'Page %s:%s could not be
fetched or segmented: (%s)',
+ sourceLanguage, title, error.toString()
);
+ }
+ res.send( {
+ sourceLanguage: sourceLanguage,
+ title: title,
+ revision: response.revision,
+ segmentedContent: segmentedContent
+ } );
+ logger.debug( 'Page sent' );
+ },
+ function ( error ) {
+ res.send( 404, {
+ error: '' + error
+ } );
+ logger.info( 'Page not found: %s:%s', sourceLanguage,
title );
+ }
+ );
+} );
+
+app.get( '/mt/:from/:to/:provider?', function ( req, res ) {
+ res.send( 405, { error: 'Request must be posted' } );
+} );
+
+app.post( '/mt/:from/:to/:provider?', function ( req, res ) {
+ var mtClients, mtClient,
+ sourceHtmlChunks, sourceHtml, reqLength,
+ from = req.params.from,
+ to = req.params.to,
+ provider = registry.getValidProvider( from, to, 'mt',
req.params.provider );
+
+ if ( !provider ) {
+ res.send( 404, { error: 'Provider not supported' } );
+ logger.info( 'MT provider invalid or missing' );
+
+ return;
+ }
+
+ mtClients = require( __dirname + '/../mt/' );
+ if ( mtClients[ provider ] === undefined ) {
+ res.send( 500, { error: 'Provider not found' } );
+ logger.error( 'Configured provider ' + provider + ' was not
found' );
+ return;
+ }
+
+ mtClient = new mtClients[ provider ]();
+
+ sourceHtmlChunks = [ '<div>' ];
+ reqLength = 0;
+
+ req.on( 'data', function ( data ) {
+ reqLength += data.length;
+ if ( reqLength > 50000 ) {
+ // Too long
+ res.send( 413, { error: 'Content too long' } );
+ logger.error( 'MT content too long' );
+ return;
+ }
+ sourceHtmlChunks.push( data );
+ } );
+ req.on( 'end', function () {
+ sourceHtmlChunks.push( '</div>' );
+ sourceHtml = sourceHtmlChunks.join( '' );
+
+ logger.profile( 'MT' );
+ mtClient.translate( from, to, sourceHtml ).then(
+ function ( data ) {
+ // Prevent XSS by sending json with
+ // dangerous characters converted to
+ // unicode sequences
+ var json = JSON.stringify( { contents: data } );
+ json = json
+ .replace( /&/g, '\\u0026' )
+ .replace( /</g, '\\u003C' )
+ .replace( />/g, '\\u003E' );
+ res.type( 'application/json' );
+ res.send( json );
+ logger.profile( 'MT', { from: from, to: to } );
+ },
+ function ( error ) {
+ res.send( 500, { error: error } );
+ logger.log( 'error', 'MT processing error:
(%s)', error.toString() );
+ }
+ );
+ } );
+} );
+
+app.get( '/dictionary/:word/:from/:to/:provider?', function ( req, res ) {
+ var dictClients, dictClient,
+ word = req.params.word,
+ from = req.params.from,
+ to = req.params.to,
+ provider = registry.getValidProvider( from, to, 'dictionary',
req.params.provider );
+
+ if ( !provider ) {
+ res.send( 404 );
+ logger.info( 'Dictionary provider invalid or missing' );
+
+ return;
+ }
+
+ dictClients = require( __dirname + '/dictionary/' );
+ dictClient = dictClients[ provider ];
+
+ logger.profile( 'Dictionary lookup' );
+ dictClient.getTranslations( word, from, to ).then(
+ function ( data ) {
+ res.send( data );
+ logger.profile( 'Dictionary lookup', { word: word,
from: from, to: to } );
+ },
+ function ( error ) {
+ res.send( 500, {
+ error: error
+ } );
+ logger.log( 'error', 'Dictionary lookup error: (%s)',
error.toString() );
+ }
+ );
+} );
+
+app.get( '/list/:tool/:from/:to', function ( req, res ) {
+ var tool = req.params.tool,
+ from = req.params.from,
+ to = req.params.to,
+ toolset = registry.getToolSet( from, to );
+
+ res.json( toolset[ tool ] || {} );
+ logger.debug( 'Tool data sent' );
+} );
+
+app.get( '/languagepairs', function ( req, res ) {
+ res.json( registry.getLanguagePairs() );
+} );
+
+app.get( '/version', function ( req, res ) {
+ var version = {
+ name: pkg.name,
+ version: pkg.version
+ };
+ res.json( version );
+ logger.debug( 'Version info sent' );
+} );
+
+module.exports = app;
\ No newline at end of file
--
To view, visit https://gerrit.wikimedia.org/r/188764
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I69c1655ab79451898cc901a6bb32e2f7bd9f6263
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/services/cxserver
Gerrit-Branch: master
Gerrit-Owner: Santhosh <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits