Skip to content
This repository has been archived by the owner on Jun 11, 2024. It is now read-only.

Commit

Permalink
Merge pull request #1168 from LiskHQ/1166-swagger-definitions
Browse files Browse the repository at this point in the history
Migrate z-schema files to swagger definitions - Closes #1166
  • Loading branch information
karmacoma authored Jan 2, 2018
2 parents 9806e16 + 51d6b49 commit d63077a
Show file tree
Hide file tree
Showing 25 changed files with 438 additions and 440 deletions.
8 changes: 5 additions & 3 deletions api/ws/workers/peersUpdateRules.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,15 @@
var connectionsTable = require('./connectionsTable');
var SlaveToMasterSender = require('./slaveToMasterSender');
var Rules = require('./rules');
var schema = require('../../../schema/transport');
var failureCodes = require('../../../api/ws/rpc/failureCodes');
var PeerUpdateError = require('../../../api/ws/rpc/failureCodes').PeerUpdateError;
var swaggerHelper = require('../../../helpers/swagger');
var definitions = swaggerHelper.getSwaggerSpec().definitions;
var z_schema = swaggerHelper.getValidator();
var Peer = require('../../../logic/peer');
var Z_schema = require('../../../helpers/z_schema');

var self, z_schema = new Z_schema();
var self;

/**
* Secures peers updates. Used only by workers.
Expand Down Expand Up @@ -107,7 +109,7 @@ PeersUpdateRules.prototype.external = {
* @param {function} cb
*/
update: function (request, cb) {
z_schema.validate(request, schema.update, function (err) {
z_schema.validate(request, definitions.WSPeerUpdateRequest, function (err) {
if (err) {
return setImmediate(cb, err[0].message);
}
Expand Down
7 changes: 5 additions & 2 deletions app.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ var httpApi = require('./helpers/httpApi.js');
var Sequence = require('./helpers/sequence.js');
var z_schema = require('./helpers/z_schema.js');
var swagger = require('./config/swagger');
var swaggerHelper = require('./helpers/swagger');

process.stdin.resume();

Expand Down Expand Up @@ -172,7 +173,7 @@ d.run(function () {
},

schema: function (cb) {
cb(null, new z_schema());
cb(null, swaggerHelper.getValidator());
},

/**
Expand Down Expand Up @@ -528,7 +529,9 @@ d.run(function () {
cb();
}],

ready: ['modules', 'bus', 'logic', function (scope, cb) {
ready: ['swagger', 'modules', 'bus', 'logic', function (scope, cb) {
scope.modules.swagger = scope.swagger;

// Fire onBind event in every module
scope.bus.message('bind', scope.modules);

Expand Down
48 changes: 31 additions & 17 deletions config/swagger.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ var SwaggerRunner = require('swagger-node-runner');
var path = require('path');
var fs = require('fs');
var YAML = require('js-yaml');
var _ = require('lodash');
var swaggerHelper = require('../helpers/swagger');

// Its necessary to require this file to extend swagger validator with our custom formats
var validator = require('../helpers/swagger').getValidator();
Expand Down Expand Up @@ -33,38 +35,46 @@ function bootstrapSwagger (app, config, logger, scope, cb) {
require(config.root + controllerFolder + file)(scope);
});

var swagger = YAML.safeLoad(fs.readFileSync(path.join(config.root + '/schema/swagger.yml')).toString());

var swaggerConfig = {
appRoot: config.root,
configDir: config.root + '/config/swagger',
swagger: swagger,
swaggerFile: path.join(config.root + '/schema/swagger.yml'),
enforceUniqueOperationId: true,
startWithErrors: false,
startWithWarnings: false
startWithWarnings: true
};

SwaggerRunner.create(swaggerConfig, function (err, runner) {
if (err) {
// Swagger express middleware
SwaggerRunner.create(swaggerConfig, function (errors, runner) {
if (errors) {
// Ignore unused definition warning
errors.validationWarnings = _.filter(errors.validationWarnings, function (error) {
return error.code !== 'UNUSED_DEFINITION';
});

// Some error occurred in configuring the swagger
if (err.validationErrors) {
if (!_.isEmpty(errors.validationErrors)) {
logger.error('Swagger Validation Errors:');
logger.error(err.validationErrors);
logger.error(errors.validationErrors);
}
if (err.validationWarnings) {

if (!_.isEmpty(errors.validationWarnings)) {
logger.error('Swagger Validation Warnings:');
logger.error(err.validationWarnings);
logger.error(errors.validationWarnings);
}

if (!_.isEmpty(errors.validationErrors) || !_.isEmpty(errors.validationWarnings) ) {
cb(errors);
return;
}
cb(err);
return;
}

// Swagger Express Middleware
// Swagger express middleware
var swaggerExpress = runner.expressMiddleware();

// Check the response and do appropriate on error
// Check the response and act appropriately on error
runner.on('responseValidationError', function (validationResponse, request, response) {
// TODO: Troubleshoot why default validation hook consider json response as string response
// TODO: Troubleshoot why default validation hook considers json response as string response
if (validationResponse.errors[0].code !== 'INVALID_RESPONSE_BODY') {
logger.error('Swagger Response Validation Errors:');
logger.error(validationResponse.errors[0].errors);
Expand All @@ -77,8 +87,12 @@ function bootstrapSwagger (app, config, logger, scope, cb) {
// To be used in test cases or getting configuration runtime
app.swaggerRunner = runner;

// Successfully mounted the swagger runner
cb(null, {swaggerRunner: runner});
swaggerHelper.getResolvedSwaggerSpec().then(function (resolvedSchema) {
// Successfully mounted the swagger runner
cb(null, {swaggerRunner: runner, definitions: resolvedSchema.definitions});
}).catch(function (reason) {
cb(reason);
});
});
}

Expand Down
8 changes: 4 additions & 4 deletions helpers/wsApi.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,18 @@
var _ = require('lodash');
var url = require('url');
var failureCodes = require('../api/ws/rpc/failureCodes.js');
var Z_schema = require('../helpers/z_schema.js');
var schema = require('../schema/transport.js');
var swaggerHelper = require('../helpers/swagger');
var definitions = swaggerHelper.getSwaggerSpec().definitions;
var Peer = require('../logic/peer.js');
var constants = require('./constants');

var z_schema = new Z_schema();
var z_schema = swaggerHelper.getValidator();

var middleware = {

Handshake: function (system) {
return function (headers, cb) {
z_schema.validate(headers, schema.headers, function (error) {
z_schema.validate(headers, definitions.WSPeerHeaders, function (error) {
if (error) {
return setImmediate(cb, {
code: failureCodes.INVALID_HEADERS,
Expand Down
4 changes: 4 additions & 0 deletions helpers/z_schema.js
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,10 @@ var liskFormats = {
},

version: function (str) {
if (str === null || str === undefined) {
return false;
}

if (str.length === 0) {
return true;
}
Expand Down
9 changes: 5 additions & 4 deletions modules/blocks/process.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,10 @@ var _ = require('lodash');
var async = require('async');
var constants = require('../../helpers/constants.js');
var Peer = require('../../logic/peer.js');
var schema = require('../../schema/blocks.js');
var slots = require('../../helpers/slots.js');
var sql = require('../../sql/blocks.js');

var modules, library, self, __private = {};
var modules, definitions, library, self, __private = {};

/**
* Initializes library.
Expand Down Expand Up @@ -231,7 +230,7 @@ Process.prototype.getCommonBlock = function (peer, height, cb) {
},
function (common, waterCb) {
// Validate remote peer response via schema
library.schema.validate(common, schema.getCommonBlock, function (err) {
library.schema.validate(common, definitions.CommonBlock, function (err) {
if (err) {
return setImmediate(waterCb, err[0].message);
} else {
Expand Down Expand Up @@ -397,7 +396,7 @@ Process.prototype.loadBlocksFromPeer = function (peer, cb) {
}

function validateBlocks (blocks, seriesCb) {
var report = library.schema.validate(blocks, schema.loadBlocksFromPeer);
var report = library.schema.validate(blocks, definitions.BlocksList);

if (!report) {
return setImmediate(seriesCb, 'Received invalid blocks data');
Expand Down Expand Up @@ -583,6 +582,8 @@ Process.prototype.onBind = function (scope) {
transport: scope.transport,
};

definitions = scope.swagger.definitions;

// Set module as loaded
__private.loaded = true;
};
Expand Down
9 changes: 5 additions & 4 deletions modules/loader.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,13 @@ var exceptions = require('../helpers/exceptions');
var ip = require('ip');
var jobsQueue = require('../helpers/jobsQueue.js');
var Peer = require('../logic/peer.js');
var schema = require('../schema/loader.js');
var slots = require('../helpers/slots.js');
var sql = require('../sql/loader.js');

require('colors');

// Private fields
var modules, library, self, __private = {}, shared = {};
var modules, definitions, library, self, __private = {}, shared = {};

__private.loaded = false;
__private.isActive = false;
Expand Down Expand Up @@ -172,7 +171,7 @@ __private.loadSignatures = function (cb) {
peer.applyHeaders({state: Peer.STATE.DISCONNECTED});
return setImmediate(waterCb, err);
} else {
library.schema.validate(res, schema.loadSignatures, function (err) {
library.schema.validate(res, definitions.WSSignaturesResponse, function (err) {
return setImmediate(waterCb, err, res.signatures);
});
}
Expand Down Expand Up @@ -232,7 +231,7 @@ __private.loadTransactions = function (cb) {
peer.applyHeaders({state: Peer.STATE.DISCONNECTED});
return setImmediate(waterCb, err);
}
library.schema.validate(res, schema.loadTransactions, function (err) {
library.schema.validate(res, definitions.WSTransactionsResponse, function (err) {
if (err) {
return setImmediate(waterCb, err[0].message);
} else {
Expand Down Expand Up @@ -846,6 +845,8 @@ Loader.prototype.onBind = function (scope) {
system: scope.system,
};

definitions = scope.swagger.definitions;

__private.loadBlockChain();
};

Expand Down
15 changes: 8 additions & 7 deletions modules/peers.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,11 @@ var ApiError = require('../helpers/apiError.js');
var constants = require('../helpers/constants.js');
var failureCodes = require('../api/ws/rpc/failureCodes.js');
var jobsQueue = require('../helpers/jobsQueue.js');
var schema = require('../schema/peers.js');
var Peer = require('../logic/peer.js');
var sql = require('../sql/peers.js');

// Private fields
var modules, library, self, __private = {};
var modules, library, self, __private = {}, definitions;

/**
* Initializes library with scope content.
Expand Down Expand Up @@ -379,7 +378,7 @@ Peers.prototype.discover = function (cb) {
}

function validatePeersList (result, waterCb) {
library.schema.validate(result, schema.discover.peers, function (err) {
library.schema.validate(result, definitions.PeersList, function (err) {
return setImmediate(waterCb, err, result.peers);
});
}
Expand All @@ -393,7 +392,7 @@ Peers.prototype.discover = function (cb) {
function updatePeers (peers, waterCb) {
async.each(peers, function (peer, eachCb) {
peer = library.logic.peers.create(peer);
library.schema.validate(peer, schema.discover.peer, function (err) {
library.schema.validate(peer, definitions.Peer, function (err) {
if (err) {
library.logger.warn(['Rejecting invalid peer:', peer.string].join(' '), {err: err});
return setImmediate(eachCb);
Expand Down Expand Up @@ -519,6 +518,8 @@ Peers.prototype.onBind = function (scope) {
modules = {
system: scope.system
};

definitions = scope.swagger.definitions;
};

/**
Expand Down Expand Up @@ -550,7 +551,7 @@ Peers.prototype.onBlockchainReady = function () {
};

/**
* Discovers peers and updates them in 10sec intervals loop.
* Periodically discovers and updates peers.
*/
Peers.prototype.onPeersReady = function () {
library.logger.trace('Peers ready');
Expand Down Expand Up @@ -596,8 +597,8 @@ Peers.prototype.onPeersReady = function () {
return setImmediate(cb);
});
}
// Loop in 10sec intervals (5sec + 5sec connect timeout from pingPeer)
jobsQueue.register('peersDiscoveryAndUpdate', peersDiscoveryAndUpdate, 60000);
// Loop in 10 sec intervals (5 sec + 5 sec connection timeout from pingPeer)
jobsQueue.register('peersDiscoveryAndUpdate', peersDiscoveryAndUpdate, 5000);
};

/**
Expand Down
37 changes: 0 additions & 37 deletions modules/transactions.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ var extend = require('extend');
var apiCodes = require('../helpers/apiCodes.js');
var ApiError = require('../helpers/apiError.js');
var sortBy = require('../helpers/sort_by.js').sortBy;
var schema = require('../schema/transactions.js');
var sql = require('../sql/transactions.js');
var TransactionPool = require('../logic/transactionPool.js');
var transactionTypes = require('../helpers/transactionTypes.js');
Expand Down Expand Up @@ -251,30 +250,6 @@ __private.getAssetForIdsBasedOnType = function (ids, type) {
return library.db.query(sql[queryName], {id: ids});
};

/**
* Gets transaction by calling parameter method.
* @private
* @param {Object} method
* @param {Object} req
* @param {function} cb - Callback function.
* @returns {setImmediateCallback} error | data: {transaction}
*/
__private.getPooledTransaction = function (method, req, cb) {
library.schema.validate(req.body, schema.getPooledTransaction, function (err) {
if (err) {
return setImmediate(cb, err[0].message);
}

var transaction = self[method](req.body.id);

if (!transaction) {
return setImmediate(cb, 'Transaction not found');
}

return setImmediate(cb, null, {transaction: transaction});
});
};

/**
* Gets transactions by calling parameter method.
* Filters by senderPublicKey or address if they are present.
Expand Down Expand Up @@ -622,26 +597,14 @@ Transactions.prototype.shared = {
});
},

getQueuedTransaction: function (req, cb) {
return __private.getPooledTransaction('getQueuedTransaction', req, cb);
},

getUnProcessedTransactions: function (filters, cb) {
return __private.getPooledTransactions('getQueuedTransactionList', filters, cb);
},

getMultisignatureTransaction: function (req, cb) {
return __private.getPooledTransaction('getMultisignatureTransaction', req, cb);
},

getMultisignatureTransactions: function (req, cb) {
return __private.getPooledTransactions('getMultisignatureTransactionList', req, cb);
},

getUnconfirmedTransaction: function (req, cb) {
return __private.getPooledTransaction('getUnconfirmedTransaction', req, cb);
},

getUnconfirmedTransactions: function (req, cb) {
return __private.getPooledTransactions('getUnconfirmedTransactionList', req, cb);
},
Expand Down
Loading

0 comments on commit d63077a

Please sign in to comment.