shufflecom-calculations 1.12.18 → 1.12.21

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.
@@ -22,49 +22,57 @@ export enum SportsCashoutFailedReason {
22
22
  SPORTS_MARKET_CASHOUT_NOT_ENABLED = 'SPORTS_MARKET_CASHOUT_NOT_ENABLED',
23
23
  }
24
24
 
25
- function checkCashoutAvailable(
26
- sportsBet: SportsBetInterface,
27
- sportsBetSelections: SportsBetSelectionInterface[],
28
- markets: SportsMarketInterface[],
29
- marketSelections: SportsMarketSelectionInterface[],
30
- ):
31
- | {
32
- reason: SportsCashoutFailedReason;
25
+ class SportsCashoutError extends Error {
26
+ sportsBetSelection?: SportsBetSelectionInterface;
27
+ market?: SportsMarketInterface;
28
+ marketSelection?: SportsMarketSelectionInterface;
29
+
30
+ constructor(
31
+ reason: SportsCashoutFailedReason,
32
+ {
33
+ sportsBetSelection,
34
+ market,
35
+ marketSelection,
36
+ }: {
33
37
  sportsBetSelection?: SportsBetSelectionInterface;
34
38
  market?: SportsMarketInterface;
35
39
  marketSelection?: SportsMarketSelectionInterface;
36
- }
37
- | undefined {
40
+ } = {},
41
+ ) {
42
+ super(reason);
43
+
44
+ // https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-2.html#example
45
+ Object.setPrototypeOf(this, new.target.prototype); // restore prototype chain
46
+
47
+ this.sportsBetSelection = sportsBetSelection;
48
+ this.market = market;
49
+ this.marketSelection = marketSelection;
50
+ }
51
+ }
52
+
53
+ export function validateSportsBetCashoutAvailable(sportsBet: SportsBetInterface, sportsBetSelections: SportsBetSelectionInterface[]) {
38
54
  if (SportsBetStatus.PENDING !== sportsBet.status) {
39
- return {
40
- reason: SportsCashoutFailedReason.SPORTS_BET_IS_CLOSED,
41
- };
55
+ throw new SportsCashoutError(SportsCashoutFailedReason.SPORTS_BET_IS_CLOSED);
42
56
  }
43
57
 
44
58
  const containsLostBetSelection = sportsBetSelections.find(({ status }) => status === SportsBetSelectionStatus.LOST);
45
59
 
46
60
  if (containsLostBetSelection) {
47
- return {
48
- reason: SportsCashoutFailedReason.SPORTS_BET_IS_CLOSED,
49
- sportsBetSelection: containsLostBetSelection,
50
- };
61
+ throw new SportsCashoutError(SportsCashoutFailedReason.SPORTS_BET_IS_CLOSED, { sportsBetSelection: containsLostBetSelection });
51
62
  }
63
+ }
52
64
 
65
+ export function validateSportsMarketsCashoutAvailable(markets: SportsMarketInterface[], marketSelections: SportsMarketSelectionInterface[]) {
53
66
  const containsManualMarketSelection = marketSelections.find(({ provider }) => provider === SportsMarketProvider.SHUFFLE);
54
67
 
55
68
  if (containsManualMarketSelection) {
56
- return {
57
- reason: SportsCashoutFailedReason.MANUAL_MARKET_NOT_ALLOWED_CASHOUT,
58
- marketSelection: containsManualMarketSelection,
59
- };
69
+ throw new SportsCashoutError(SportsCashoutFailedReason.MANUAL_MARKET_NOT_ALLOWED_CASHOUT, { marketSelection: containsManualMarketSelection });
60
70
  }
61
71
 
62
72
  const atLeastOneTrading = marketSelections.some(({ status }) => status === SportsMarketSelectionStatus.TRADING);
63
73
 
64
74
  if (!atLeastOneTrading) {
65
- return {
66
- reason: SportsCashoutFailedReason.SPORTS_MARKET_CASHOUT_IS_NOT_OPEN,
67
- };
75
+ throw new SportsCashoutError(SportsCashoutFailedReason.SPORTS_MARKET_CASHOUT_IS_NOT_OPEN);
68
76
  }
69
77
 
70
78
  const containsUnavailableMarketSelection = marketSelections.find(marketSelection => {
@@ -78,10 +86,10 @@ function checkCashoutAvailable(
78
86
  });
79
87
 
80
88
  if (containsUnavailableMarketSelection) {
81
- return {
82
- reason: SportsCashoutFailedReason.SPORTS_MARKET_CASHOUT_IS_NOT_OPEN,
89
+ throw new SportsCashoutError(SportsCashoutFailedReason.SPORTS_MARKET_CASHOUT_IS_NOT_OPEN, {
83
90
  marketSelection: containsUnavailableMarketSelection,
84
- };
91
+ market: markets.find(market => market.id === containsUnavailableMarketSelection.marketId),
92
+ });
85
93
  }
86
94
 
87
95
  for (const marketSelection of marketSelections) {
@@ -90,32 +98,20 @@ function checkCashoutAvailable(
90
98
  const market = markets.find(market => market.id === marketSelection.marketId);
91
99
 
92
100
  if (!market) {
93
- return {
94
- reason: SportsCashoutFailedReason.SPORTS_MARKET_NOT_FOUND,
95
- market,
96
- };
101
+ throw new SportsCashoutError(SportsCashoutFailedReason.SPORTS_MARKET_NOT_FOUND, { market });
97
102
  }
98
103
 
99
104
  if (!market.inPlay && dayjs().isAfter(market.expiryTime)) {
100
- return {
101
- reason: SportsCashoutFailedReason.SPORTS_MARKET_CLOSED,
102
- market,
103
- };
105
+ throw new SportsCashoutError(SportsCashoutFailedReason.SPORTS_MARKET_CLOSED, { market });
104
106
  }
105
107
 
106
108
  if (market.inPlay) {
107
109
  if (!market.cashoutEnabled) {
108
- return {
109
- reason: SportsCashoutFailedReason.SPORTS_MARKET_CASHOUT_NOT_ENABLED,
110
- market,
111
- };
110
+ throw new SportsCashoutError(SportsCashoutFailedReason.SPORTS_MARKET_CASHOUT_NOT_ENABLED, { market });
112
111
  }
113
112
 
114
113
  if (market.cashoutStatus !== SportsMarketCashoutStatus.OPEN) {
115
- return {
116
- reason: SportsCashoutFailedReason.SPORTS_MARKET_CASHOUT_IS_NOT_OPEN,
117
- market,
118
- };
114
+ throw new SportsCashoutError(SportsCashoutFailedReason.SPORTS_MARKET_CASHOUT_IS_NOT_OPEN, { market });
119
115
  }
120
116
  }
121
117
  }
@@ -134,10 +130,18 @@ export function isCashoutAvailable({
134
130
  markets: SportsMarketInterface[];
135
131
  marketSelections: SportsMarketSelectionInterface[];
136
132
  }) {
137
- const cashoutAvailableState = checkCashoutAvailable(sportsBet, sportsBetSelections, markets, marketSelections);
133
+ try {
134
+ validateSportsBetCashoutAvailable(sportsBet, sportsBetSelections);
135
+ validateSportsMarketsCashoutAvailable(markets, marketSelections);
136
+ } catch (error: any) {
137
+ return {
138
+ canCashout: false,
139
+ reason: error.message,
140
+ ...error,
141
+ };
142
+ }
138
143
 
139
144
  return {
140
- canCashout: !cashoutAvailableState?.reason,
141
- ...cashoutAvailableState,
145
+ canCashout: true,
142
146
  };
143
147
  }
@@ -1,7 +1,8 @@
1
1
  export interface VipBonusIssuanceModel {
2
2
  currency?: string | null;
3
- bonusAmountUsd: string;
4
3
  occurrenceIndex: number;
4
+ amount?: string | null;
5
+ bonusAmountUsd?: string | null; // derived field
5
6
  createdAt?: string; // derived field
6
7
  expiryDate?: string; // derived field
7
8
  availableDate?: string; // derived field