From 2eacd310b2c23045622d238597a2d2f8ba4b8778 Mon Sep 17 00:00:00 2001 From: Mike Gerwitz Date: Mon, 10 Jul 2017 10:02:57 -0400 Subject: [PATCH] Process metadata and provide to rate process Prefixes with "meta:". * src/server/Server.js (initQuote): Initialze metadata to empty. * src/server/daemon/controller.js (createQuote): Add metabucket. * src/server/db/MongoServerDao.js (saveQuote): Add additional documentation to docblock. Save all metadata if no bucket data provided (which indicates a full quote save). This happens on version change. * src/server/rater/ProcessManager.js (_genData): Add method to merge metadata into bucket data with "meta:" prefix. (byId): Use merged data. --- src/server/Server.js | 1 + src/server/daemon/controller.js | 7 +++++-- src/server/db/MongoServerDao.js | 8 ++++++++ src/server/rater/ProcessManager.js | 27 ++++++++++++++++++++++++++- 4 files changed, 40 insertions(+), 3 deletions(-) diff --git a/src/server/Server.js b/src/server/Server.js index 09b1d10..4771bd8 100644 --- a/src/server/Server.js +++ b/src/server/Server.js @@ -311,6 +311,7 @@ module.exports = Class( 'Server' ) .setData( server._getDefaultBucket( quote_program, quote_data ) ) + .setMetadata( quote_data.meta || {} ) .setQuickSaveData( quote_data.quicksave || {} ) .setAgentId( quote_data.agentId || agent_id ) .setAgentName( quote_data.agentName || agent_name ) diff --git a/src/server/daemon/controller.js b/src/server/daemon/controller.js index 0813e2c..b9b8e79 100644 --- a/src/server/daemon/controller.js +++ b/src/server/daemon/controller.js @@ -585,8 +585,11 @@ function createQuote( quote_id, program, request, callback, error_callback ) ); } - var bucket = QuoteDataBucket(), - quote = Quote( quote_id, bucket ); + var bucket = QuoteDataBucket(), + metabucket = QuoteDataBucket(), + quote = Quote( quote_id, bucket ); + + quote.setMetabucket( metabucket ); var controller = this; return server.initQuote( quote, program, request, diff --git a/src/server/db/MongoServerDao.js b/src/server/db/MongoServerDao.js index 8c3a9be..16b895e 100644 --- a/src/server/db/MongoServerDao.js +++ b/src/server/db/MongoServerDao.js @@ -271,6 +271,11 @@ module.exports = Class( 'MongoServerDao' ) /** * Saves a quote to the database * + * A full save will include all metadata. This should not cause any + * problems with race conditions for pending Data API calls on meta + * fields because those results write to individual indexes and do not + * rely on existing data. + * * @param Quote quote the quote to save * @param Function success_callback function to call on success * @param Function failure_callback function to call if save fails @@ -302,6 +307,9 @@ module.exports = Class( 'MongoServerDao' ) save_data = { data: quote.getBucket().getData(), }; + + // full save will include all metadata + save_data.meta = quote.getMetabucket().getData(); } else if ( save_data.data !== undefined ) { diff --git a/src/server/rater/ProcessManager.js b/src/server/rater/ProcessManager.js index dab4b4c..6d1ae59 100644 --- a/src/server/rater/ProcessManager.js +++ b/src/server/rater/ProcessManager.js @@ -211,7 +211,7 @@ module.exports = Class( 'ProcessManager', id: quote.getId(), agentId: quote.getAgentId(), agentName: quote.getAgentName(), - data: quote.getBucket().getData(), + data: this._genData( quote ), creditScoreRef: quote.getCreditScoreRef(), }, @@ -223,6 +223,31 @@ module.exports = Class( 'ProcessManager', }, + /** + * Generate data to provide to rater + * + * Bucket data is used as-is. Metadata are merged with a "meta:" prefix. + * + * @param {ServerSideQuote} quote source quote + * + * @return {Object} merged data + */ + 'private _genData'( quote ) + { + const dest = {}; + const metadata = quote.getMetabucket().getData(); + + Object.assign( dest, quote.getBucket().getData() ); + + for ( let key in metadata ) + { + dest[ 'meta:' + key ] = metadata[ key ]; + } + + return dest; + }, + + 'private _rateReply'( msg, errc ) { var rqid = msg.rqid,