@riocrypto/common-server 1.0.2932 → 1.0.2934

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/build/index.d.ts CHANGED
@@ -90,6 +90,7 @@ export * from "./models/STP-deposit-CLABE";
90
90
  export * from "./models/STP-settings";
91
91
  export * from "./models/fintoc-mxn-withdrawal";
92
92
  export * from "./models/fintoc-deposit-CLABE";
93
+ export * from "./models/fintoc-deposit-intake";
93
94
  export * from "./models/processor-readiness";
94
95
  export * from "./models/payment-address-verification";
95
96
  export * from "./models/alfin-virtual-cci";
package/build/index.js CHANGED
@@ -106,6 +106,7 @@ __exportStar(require("./models/STP-deposit-CLABE"), exports);
106
106
  __exportStar(require("./models/STP-settings"), exports);
107
107
  __exportStar(require("./models/fintoc-mxn-withdrawal"), exports);
108
108
  __exportStar(require("./models/fintoc-deposit-CLABE"), exports);
109
+ __exportStar(require("./models/fintoc-deposit-intake"), exports);
109
110
  __exportStar(require("./models/processor-readiness"), exports);
110
111
  __exportStar(require("./models/payment-address-verification"), exports);
111
112
  __exportStar(require("./models/alfin-virtual-cci"), exports);
@@ -1,9 +1,17 @@
1
1
  import { Fiat, Side, Crypto, ExternalTradeType, ExternalTradingProvider, ExternalTradeStatus, ExternalTradeAmountType, EmarketsSettlementType, LmaxOrderType, LmaxSide, LmaxTimeInForce } from "@riocrypto/common";
2
2
  import { Mongoose, Model, Document, HydratedDocument } from "mongoose";
3
+ interface ExternalTradeImportMeta {
4
+ fileName?: string;
5
+ importedBy?: string;
6
+ importedAt: Date;
7
+ providerOrderIdIsSynthetic?: boolean;
8
+ sourceRow?: Record<string, string>;
9
+ }
3
10
  interface ExternalTradeAttrs {
4
11
  createdAt: Date;
5
12
  providerOrderId?: string;
6
13
  tradeKey?: string;
14
+ valueDate?: string;
7
15
  type: ExternalTradeType;
8
16
  side: Side;
9
17
  provider: ExternalTradingProvider;
@@ -72,11 +80,13 @@ interface ExternalTradeAttrs {
72
80
  externalTradingAlgorithmId?: string;
73
81
  arbitrageSessionId?: string;
74
82
  isImported?: boolean;
83
+ importMeta?: ExternalTradeImportMeta;
75
84
  }
76
85
  interface ExternalTradeDoc extends Document {
77
86
  createdAt: Date;
78
87
  providerOrderId?: string;
79
88
  tradeKey?: string;
89
+ valueDate?: string;
80
90
  type: ExternalTradeType;
81
91
  side: Side;
82
92
  amountType: ExternalTradeAmountType;
@@ -146,9 +156,10 @@ interface ExternalTradeDoc extends Document {
146
156
  externalTradingAlgorithmId?: string;
147
157
  arbitrageSessionId?: string;
148
158
  isImported?: boolean;
159
+ importMeta?: ExternalTradeImportMeta;
149
160
  }
150
161
  interface ExternalTradeModel extends Model<ExternalTradeDoc> {
151
162
  build(attrs: ExternalTradeAttrs): HydratedDocument<ExternalTradeDoc>;
152
163
  }
153
164
  declare const buildExternalTrade: (mongoose: Mongoose) => ExternalTradeModel;
154
- export { buildExternalTrade, ExternalTradeDoc, ExternalTradeAttrs };
165
+ export { buildExternalTrade, ExternalTradeDoc, ExternalTradeAttrs, ExternalTradeImportMeta, };
@@ -17,6 +17,9 @@ const buildExternalTrade = (mongoose) => {
17
17
  tradeKey: {
18
18
  type: String,
19
19
  },
20
+ valueDate: {
21
+ type: String,
22
+ },
20
23
  requestedAmountType: {
21
24
  type: String,
22
25
  required: true,
@@ -90,6 +93,9 @@ const buildExternalTrade = (mongoose) => {
90
93
  type: Boolean,
91
94
  default: false,
92
95
  },
96
+ importMeta: {
97
+ type: Object,
98
+ },
93
99
  }, {
94
100
  toJSON: {
95
101
  transform(doc, ret) {
@@ -0,0 +1,39 @@
1
+ import { Mongoose, Model, Document, HydratedDocument } from "mongoose";
2
+ export declare enum FintocDepositIntakeStatus {
3
+ /** Recorded, waiting for the worker. */
4
+ Pending = "pending",
5
+ /** A worker has taken it. Reset to pending if left here too long. */
6
+ Processing = "processing",
7
+ /** Matching ran to completion, whatever it concluded. See `outcome`. */
8
+ Done = "done",
9
+ /** Matching threw and retries are exhausted. Needs a person. */
10
+ Failed = "failed"
11
+ }
12
+ export type FintocDepositIntakeSource = "webhook" | "poller";
13
+ interface FintocDepositIntakeAttrs {
14
+ fintocTransferId: string;
15
+ source: FintocDepositIntakeSource;
16
+ /** Fintoc's webhook event id, for tracing back to their dashboard. */
17
+ fintocEventId?: string;
18
+ receivedAt: Date;
19
+ }
20
+ interface FintocDepositIntakeDoc extends Document {
21
+ fintocTransferId: string;
22
+ source: FintocDepositIntakeSource;
23
+ fintocEventId?: string;
24
+ status: FintocDepositIntakeStatus;
25
+ attempts: number;
26
+ /** The `reason` processInboundFintocDeposit returned, once it has run. */
27
+ outcome?: string;
28
+ /** Whether that run published a payment, as opposed to skipping or rejecting. */
29
+ processed?: boolean;
30
+ lastError?: string;
31
+ receivedAt: Date;
32
+ startedAt?: Date;
33
+ finishedAt?: Date;
34
+ }
35
+ interface FintocDepositIntakeModel extends Model<FintocDepositIntakeDoc> {
36
+ build(attrs: FintocDepositIntakeAttrs): HydratedDocument<FintocDepositIntakeDoc>;
37
+ }
38
+ declare const buildFintocDepositIntake: (mongoose: Mongoose) => FintocDepositIntakeModel;
39
+ export { buildFintocDepositIntake, FintocDepositIntakeDoc, FintocDepositIntakeAttrs, };
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildFintocDepositIntake = exports.FintocDepositIntakeStatus = void 0;
4
+ // One row per inbound Fintoc transfer, written the moment we learn the transfer
5
+ // exists and before any work is done on it. This is what lets a deposit survive
6
+ // the pod being killed mid-processing: the webhook only records that the transfer
7
+ // arrived, and a worker does the matching from here, so a restart resumes rather
8
+ // than forgets. It is a processing ledger, not an accounting record; the money
9
+ // itself is recorded in InboundBankDeposit once matching has run.
10
+ var FintocDepositIntakeStatus;
11
+ (function (FintocDepositIntakeStatus) {
12
+ /** Recorded, waiting for the worker. */
13
+ FintocDepositIntakeStatus["Pending"] = "pending";
14
+ /** A worker has taken it. Reset to pending if left here too long. */
15
+ FintocDepositIntakeStatus["Processing"] = "processing";
16
+ /** Matching ran to completion, whatever it concluded. See `outcome`. */
17
+ FintocDepositIntakeStatus["Done"] = "done";
18
+ /** Matching threw and retries are exhausted. Needs a person. */
19
+ FintocDepositIntakeStatus["Failed"] = "failed";
20
+ })(FintocDepositIntakeStatus = exports.FintocDepositIntakeStatus || (exports.FintocDepositIntakeStatus = {}));
21
+ // Finished rows are kept a month for tracing a payment that went wrong, then
22
+ // dropped. Rows that never finish have no finishedAt and so never expire, which is
23
+ // the point: an unfinished deposit should stay visible until someone deals with it.
24
+ const FINISHED_ROW_TTL_SECONDS = 30 * 24 * 60 * 60;
25
+ const buildFintocDepositIntake = (mongoose) => {
26
+ if (mongoose.models.FintocDepositIntake) {
27
+ return mongoose.model("FintocDepositIntake");
28
+ }
29
+ const FintocDepositIntakeSchema = new mongoose.Schema({
30
+ fintocTransferId: {
31
+ type: String,
32
+ required: true,
33
+ },
34
+ source: {
35
+ type: String,
36
+ required: true,
37
+ enum: ["webhook", "poller"],
38
+ },
39
+ fintocEventId: {
40
+ type: String,
41
+ },
42
+ status: {
43
+ type: String,
44
+ required: true,
45
+ enum: Object.values(FintocDepositIntakeStatus),
46
+ default: FintocDepositIntakeStatus.Pending,
47
+ },
48
+ attempts: {
49
+ type: Number,
50
+ required: true,
51
+ default: 0,
52
+ },
53
+ outcome: {
54
+ type: String,
55
+ },
56
+ processed: {
57
+ type: Boolean,
58
+ },
59
+ lastError: {
60
+ type: String,
61
+ },
62
+ receivedAt: {
63
+ type: Date,
64
+ required: true,
65
+ },
66
+ startedAt: {
67
+ type: Date,
68
+ },
69
+ finishedAt: {
70
+ type: Date,
71
+ },
72
+ }, {
73
+ toJSON: {
74
+ transform(doc, ret) {
75
+ ret.id = ret._id.valueOf();
76
+ delete ret._id;
77
+ delete ret.__v;
78
+ },
79
+ },
80
+ });
81
+ // The dedup. A webhook delivered twice, or a transfer the poller sees after the
82
+ // webhook already recorded it, is an insert that fails rather than a second row.
83
+ FintocDepositIntakeSchema.index({ fintocTransferId: 1 }, { unique: true });
84
+ // What the worker polls on: the oldest pending row first, and the processing rows
85
+ // whose startedAt says their owner died.
86
+ FintocDepositIntakeSchema.index({ status: 1, receivedAt: 1 });
87
+ FintocDepositIntakeSchema.index({ status: 1, startedAt: 1 });
88
+ FintocDepositIntakeSchema.index({ finishedAt: 1 }, { expireAfterSeconds: FINISHED_ROW_TTL_SECONDS });
89
+ FintocDepositIntakeSchema.statics.build = (attrs) => {
90
+ return new FintocDepositIntake(attrs);
91
+ };
92
+ const FintocDepositIntake = mongoose.model("FintocDepositIntake", FintocDepositIntakeSchema);
93
+ return FintocDepositIntake;
94
+ };
95
+ exports.buildFintocDepositIntake = buildFintocDepositIntake;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@riocrypto/common-server",
3
- "version": "1.0.2932",
3
+ "version": "1.0.2934",
4
4
  "description": "",
5
5
  "main": "./build/index.js",
6
6
  "types": "./build/index.d.ts",