-
Notifications
You must be signed in to change notification settings - Fork 18
/
requestForQuoteState.ts
70 lines (59 loc) · 2.47 KB
/
requestForQuoteState.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import {
Logger
} from 'esp-js-ui';
import {InputEvents, RfqEvents} from '../../events';
import * as uuid from 'uuid';
import {CashTileModel} from '../cashTileModel';
import {Quote, RfqStatus} from '../../services/rfqService';
import {observeEvent} from 'esp-js';
const _log = Logger.create('CashTile-RequestForQuoteState');
export interface RequestForQuoteState {
rfqId: string;
currentQuoteId?: string;
status: RfqStatus;
quote?: Quote;
}
export const defaultRequestForQuoteStateFactory = (): RequestForQuoteState => {
return {
rfqId: null,
currentQuoteId: null,
status: RfqStatus.Idle
};
};
export class RequestForQuoteStateHandlers {
constructor(/* can use DI if required for readonly access to other services */) {
}
@observeEvent(RfqEvents.requestQuote)
onRequestQuote(draft: RequestForQuoteState, event: RfqEvents.RequestQuoteEvent, model: CashTileModel /* , context: EventContext */) {
_log.info(`Requesting Quote for ${model.inputs.ccyPair} ${model.inputs.notional}`);
draft.rfqId = uuid.v4();
draft.status = RfqStatus.Requesting;
}
@observeEvent(RfqEvents.rfqUpdate)
onRfqUpdated(draft: RequestForQuoteState, event: RfqEvents.RfqUpdateEvent, model: CashTileModel /* , context: EventContext */) {
_log.info(`Quote received. RfqId ${event.rfqId} price: ${event.quote.price}`, event);
draft.status = event.status;
draft.quote = event.quote;
}
@observeEvent(RfqEvents.cancelRfq)
onCancelQuote(draft: RequestForQuoteState, event: RfqEvents.CancelRfqEvent, model: CashTileModel) {
_log.info(`Passing on quote ${draft.rfqId}`, event);
draft.status = RfqStatus.Canceling;
draft.quote = null;
}
@observeEvent(RfqEvents.executeOnQuote)
onExecuting(draft: RequestForQuoteState, event: RfqEvents.ExecuteOnQuoteEvent, model: CashTileModel) {
_log.info(`Passing on quote ${draft.rfqId}`, event);
if (draft.status === RfqStatus.Quoting) {
draft.status = RfqStatus.Executing;
}
}
@observeEvent(InputEvents.changeCurrencyPair)
@observeEvent(InputEvents.notionalChanged)
onInputsChanged(draft: RequestForQuoteState, event: RfqEvents.RequestQuoteEvent, model: CashTileModel /* , context: EventContext */) {
_log.info(`Requesting Quote for ${model.inputs.ccyPair} ${model.inputs.notional}`);
draft.rfqId = null;
draft.status = RfqStatus.Idle;
draft.quote = null;
}
}