[DEV-6353] Generate and save reverse deltas for ratingdata and step save
parent
a4d151ef79
commit
cda048dd8c
|
@ -161,9 +161,8 @@ function _deepEqual( a: any, b: any ): boolean
|
|||
return false;
|
||||
}
|
||||
|
||||
return a.map( ( item, i ) => _deepEqual( item, b[ i ] ) )
|
||||
.every( res => res === true );
|
||||
return a.every( ( item, i ) => _deepEqual( item, b[ i ] ) );
|
||||
}
|
||||
|
||||
return ''+a === ''+b;
|
||||
return a === b;
|
||||
}
|
||||
|
|
|
@ -1144,14 +1144,28 @@ module.exports = Class( 'Server' )
|
|||
{
|
||||
try
|
||||
{
|
||||
var rdelta_data;
|
||||
var parsed_data = JSON.parse( post_data.data );
|
||||
var bucket = quote.getBucket();
|
||||
|
||||
const { filtered, dapis, meta_clear } =
|
||||
const { filtered, dapis, meta_clear, rdiff } =
|
||||
server._dataProcessor.processDiff(
|
||||
parsed_data, request, program, bucket, quote
|
||||
);
|
||||
|
||||
// Leave rdelta_data undefined if rdiff is an empty object
|
||||
if ( Object.keys( rdiff ).length > 0 )
|
||||
{
|
||||
rdelta_data = {
|
||||
"rdelta.data": {
|
||||
data: rdiff,
|
||||
timestamp: Math.round(
|
||||
new Date().getTime() / 1000
|
||||
),
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
server._monitorMetadataPromise( quote, dapis, meta_clear );
|
||||
}
|
||||
catch ( err )
|
||||
|
@ -1173,7 +1187,7 @@ module.exports = Class( 'Server' )
|
|||
}
|
||||
|
||||
// save the quote
|
||||
server._doQuoteSave( step_id, request, quote, program );
|
||||
server._doQuoteSave( step_id, request, quote, program, rdelta_data);
|
||||
});
|
||||
|
||||
return this;
|
||||
|
@ -1205,7 +1219,14 @@ module.exports = Class( 'Server' )
|
|||
},
|
||||
|
||||
|
||||
'private _doQuoteSave': function( step_id, request, quote, program, c )
|
||||
'private _doQuoteSave': function(
|
||||
step_id,
|
||||
request,
|
||||
quote,
|
||||
program,
|
||||
rdelta_data,
|
||||
c
|
||||
)
|
||||
{
|
||||
var server = this;
|
||||
|
||||
|
@ -1258,7 +1279,9 @@ module.exports = Class( 'Server' )
|
|||
);
|
||||
|
||||
c && c( false );
|
||||
}
|
||||
},
|
||||
undefined,
|
||||
rdelta_data
|
||||
);
|
||||
} );
|
||||
},
|
||||
|
|
|
@ -43,6 +43,7 @@ var rating_service = null;
|
|||
const {
|
||||
bucket: {
|
||||
QuoteDataBucket,
|
||||
delta
|
||||
},
|
||||
|
||||
dapi: {
|
||||
|
@ -141,7 +142,7 @@ exports.init = function( logger, enc_service, conf )
|
|||
rating_service = easejs( RatingService ).use(
|
||||
RatingServicePublish( amqplib, exports.post_rate_publish, logger )
|
||||
)(
|
||||
logger, dao, server, exports.rater
|
||||
logger, dao, server, exports.rater, delta.createDelta
|
||||
);
|
||||
|
||||
// TODO: exports.init needs to support callbacks; this will work, but
|
||||
|
|
|
@ -31,6 +31,7 @@ import { ServerDao } from "../db/ServerDao";
|
|||
import { ServerSideQuote } from "../quote/ServerSideQuote";
|
||||
import { UserRequest } from "../request/UserRequest";
|
||||
import { UserResponse } from "../request/UserResponse";
|
||||
import { DeltaConstructor } from "../../bucket/delta";
|
||||
|
||||
type RequestCallback = () => void;
|
||||
|
||||
|
@ -59,12 +60,14 @@ export class RatingService
|
|||
* @param _dao - database connection
|
||||
* @param _server - server actions
|
||||
* @param _rater_manager - rating manager
|
||||
* @param _createDelta - delta constructor
|
||||
*/
|
||||
constructor(
|
||||
private readonly _logger: PriorityLog,
|
||||
private readonly _dao: ServerDao,
|
||||
private readonly _server: Server,
|
||||
private readonly _rater_manager: ProcessManager,
|
||||
private readonly _createDelta: DeltaConstructor<number>,
|
||||
) {}
|
||||
|
||||
|
||||
|
@ -271,12 +274,19 @@ export class RatingService
|
|||
quote.setLastPremiumDate( cur_date );
|
||||
quote.setRatedDate( cur_date );
|
||||
|
||||
const quote_data = quote.getRatingData();
|
||||
const save_data = { ratedata: data };
|
||||
const rdelta_data = {
|
||||
"rdelta.ratedata": {
|
||||
data: this._createDelta( data, quote_data ),
|
||||
timestamp: cur_date
|
||||
},
|
||||
};
|
||||
|
||||
// save the last prem status (we pass an empty object as the save
|
||||
// data argument to ensure that we do not save the actual bucket
|
||||
// data, which may cause a race condition with the below merge call)
|
||||
this._dao.saveQuote( quote, c, c, {
|
||||
ratedata: data,
|
||||
}, {} );
|
||||
this._dao.saveQuote( quote, c, c, save_data, rdelta_data );
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -36,6 +36,7 @@ import { UserRequest } from "../../../src/server/request/UserRequest";
|
|||
import { UserResponse } from "../../../src/server/request/UserResponse";
|
||||
import { UserSession } from "../../../src/server/request/UserSession";
|
||||
import { QuoteDataBucket } from "../../../src/bucket/QuoteDataBucket";
|
||||
import { Kv } from "../../../src/bucket/delta";
|
||||
|
||||
import {
|
||||
ServerDao,
|
||||
|
@ -59,9 +60,10 @@ describe( 'RatingService', () =>
|
|||
response,
|
||||
quote,
|
||||
stub_rate_data,
|
||||
createDelta,
|
||||
} = getStubs();
|
||||
|
||||
const sut = new Sut( logger, dao, server, raters );
|
||||
const sut = new Sut( logger, dao, server, raters, createDelta);
|
||||
|
||||
const expected = {
|
||||
data: stub_rate_data,
|
||||
|
@ -85,9 +87,10 @@ describe( 'RatingService', () =>
|
|||
response,
|
||||
quote,
|
||||
stub_rate_data,
|
||||
createDelta,
|
||||
} = getStubs();
|
||||
|
||||
const sut = new Sut( logger, dao, server, raters );
|
||||
const sut = new Sut( logger, dao, server, raters, createDelta );
|
||||
|
||||
let last_prem_called = false;
|
||||
let rated_date_called = false;
|
||||
|
@ -152,6 +155,7 @@ describe( 'RatingService', () =>
|
|||
response,
|
||||
quote,
|
||||
stub_rate_data,
|
||||
createDelta,
|
||||
} = getStubs();
|
||||
|
||||
let saved_rates = false;
|
||||
|
@ -172,7 +176,7 @@ describe( 'RatingService', () =>
|
|||
return dao;
|
||||
};
|
||||
|
||||
const sut = new Sut( logger, dao, server, raters );
|
||||
const sut = new Sut( logger, dao, server, raters, createDelta );
|
||||
|
||||
return sut.request( request, response, quote, "" )
|
||||
.then( () =>
|
||||
|
@ -182,6 +186,55 @@ describe( 'RatingService', () =>
|
|||
} );
|
||||
|
||||
|
||||
it( "saves delta to it's own field", () =>
|
||||
{
|
||||
const {
|
||||
logger,
|
||||
server,
|
||||
raters,
|
||||
dao,
|
||||
request,
|
||||
response,
|
||||
quote,
|
||||
stub_rate_delta,
|
||||
createDelta,
|
||||
} = getStubs();
|
||||
|
||||
let saved_quote = false;
|
||||
|
||||
let timestamp = 0;
|
||||
|
||||
quote.setLastPremiumDate = ( ts: UnixTimestamp ) =>
|
||||
{
|
||||
timestamp = ts;
|
||||
return quote;
|
||||
};
|
||||
|
||||
dao.saveQuote = (
|
||||
quote: ServerSideQuote,
|
||||
success: ServerDaoCallback,
|
||||
_failure: ServerDaoCallback,
|
||||
_save_data: Record<string, any>,
|
||||
push_data: Record<string, any>,
|
||||
) =>
|
||||
{
|
||||
stub_rate_delta[ "rdelta.ratedata" ].timestamp = timestamp;
|
||||
saved_quote = true;
|
||||
|
||||
expect( push_data ).to.deep.equal( stub_rate_delta );
|
||||
success( quote );
|
||||
|
||||
return dao;
|
||||
};
|
||||
|
||||
const sut = new Sut( logger, dao, server, raters, createDelta );
|
||||
|
||||
return sut.request( request, response, quote, "" )
|
||||
.then( () => { expect( saved_quote ).to.be.true; } );
|
||||
} );
|
||||
|
||||
|
||||
|
||||
it( "rejects and responds with error", () =>
|
||||
{
|
||||
const {
|
||||
|
@ -194,13 +247,14 @@ describe( 'RatingService', () =>
|
|||
request,
|
||||
response,
|
||||
server,
|
||||
createDelta,
|
||||
} = getStubs();
|
||||
|
||||
const expected_error = new Error( "expected error" );
|
||||
|
||||
rater.rate = () => { throw expected_error; };
|
||||
|
||||
const sut = new Sut( logger, dao, server, raters );
|
||||
const sut = new Sut( logger, dao, server, raters, createDelta );
|
||||
|
||||
let logged = false;
|
||||
|
||||
|
@ -242,11 +296,12 @@ describe( 'RatingService', () =>
|
|||
request,
|
||||
response,
|
||||
server,
|
||||
createDelta,
|
||||
} = getStubs();
|
||||
|
||||
const expected_message = 'expected foo';
|
||||
|
||||
const sut = new Sut( logger, dao, server, raters );
|
||||
const sut = new Sut( logger, dao, server, raters, createDelta );
|
||||
|
||||
rater.rate = (
|
||||
_quote: ServerSideQuote,
|
||||
|
@ -279,6 +334,7 @@ describe( 'RatingService', () =>
|
|||
response,
|
||||
server,
|
||||
stub_rate_data,
|
||||
createDelta,
|
||||
} = getStubs();
|
||||
|
||||
let sent = false;
|
||||
|
@ -304,7 +360,7 @@ describe( 'RatingService', () =>
|
|||
return server;
|
||||
};
|
||||
|
||||
const sut = new Sut( logger, dao, server, raters );
|
||||
const sut = new Sut( logger, dao, server, raters, createDelta );
|
||||
|
||||
return sut.request( request, response, quote, "" )
|
||||
.then( () => expect( sent ).to.be.true );
|
||||
|
@ -325,6 +381,7 @@ describe( 'RatingService', () =>
|
|||
request,
|
||||
response,
|
||||
quote,
|
||||
createDelta,
|
||||
} = getStubs();
|
||||
|
||||
dao.mergeBucket = () =>
|
||||
|
@ -341,7 +398,7 @@ describe( 'RatingService', () =>
|
|||
{
|
||||
processed = true;
|
||||
}
|
||||
}( logger, dao, server, raters );
|
||||
}( logger, dao, server, raters, createDelta );
|
||||
|
||||
sut.request( request, response, quote, 'something' );
|
||||
} );
|
||||
|
@ -361,6 +418,7 @@ describe( 'RatingService', () =>
|
|||
request,
|
||||
response,
|
||||
quote,
|
||||
createDelta,
|
||||
} = getStubs();
|
||||
|
||||
quote.getLastPremiumDate = () =>
|
||||
|
@ -371,7 +429,7 @@ describe( 'RatingService', () =>
|
|||
|
||||
quote.getRatedDate = () => initial_date;
|
||||
|
||||
const sut = new Sut( logger, dao, server, raters );
|
||||
const sut = new Sut( logger, dao, server, raters, createDelta );
|
||||
|
||||
server.sendResponse = ( _request: any, _quote: any, resp: any, _actions: any ) =>
|
||||
{
|
||||
|
@ -404,6 +462,19 @@ function getStubs()
|
|||
_unavailable_all: '0',
|
||||
};
|
||||
|
||||
const stub_rate_delta: any = {
|
||||
"rdelta.ratedata": {
|
||||
data: {
|
||||
_unavailable_all: [ undefined ]
|
||||
},
|
||||
timestamp: 123
|
||||
}
|
||||
};
|
||||
|
||||
const createDelta = ( _src: Kv, _dest: Kv ) => {
|
||||
return stub_rate_delta[ "rdelta.ratedata" ][ "data" ];
|
||||
};
|
||||
|
||||
const rater = new class implements Rater
|
||||
{
|
||||
rate(
|
||||
|
@ -518,16 +589,18 @@ function getStubs()
|
|||
};
|
||||
|
||||
return {
|
||||
program: program,
|
||||
stub_rate_data: stub_rate_data,
|
||||
rater: rater,
|
||||
raters: raters,
|
||||
logger: logger,
|
||||
server: server,
|
||||
dao: dao,
|
||||
session: session,
|
||||
request: request,
|
||||
response: response,
|
||||
quote: quote,
|
||||
program: program,
|
||||
stub_rate_data: stub_rate_data,
|
||||
stub_rate_delta: stub_rate_delta,
|
||||
createDelta: createDelta,
|
||||
rater: rater,
|
||||
raters: raters,
|
||||
logger: logger,
|
||||
server: server,
|
||||
dao: dao,
|
||||
session: session,
|
||||
request: request,
|
||||
response: response,
|
||||
quote: quote,
|
||||
};
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue