adaptic-backend 1.0.339 → 1.0.341

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.
Files changed (352) hide show
  1. package/Account.cjs +2543 -2265
  2. package/Account.d.ts +19 -2
  3. package/Action.cjs +1115 -683
  4. package/Action.d.ts +19 -2
  5. package/Alert.cjs +2626 -2348
  6. package/Alert.d.ts +19 -2
  7. package/Allocation.cjs +2578 -2300
  8. package/Allocation.d.ts +19 -2
  9. package/AlpacaAccount.cjs +2383 -2105
  10. package/AlpacaAccount.d.ts +19 -2
  11. package/Asset.cjs +1813 -1535
  12. package/Asset.d.ts +19 -2
  13. package/Authenticator.cjs +2568 -2290
  14. package/Authenticator.d.ts +19 -2
  15. package/Customer.cjs +2495 -2217
  16. package/Customer.d.ts +19 -2
  17. package/EconomicEvent.cjs +645 -367
  18. package/EconomicEvent.d.ts +19 -2
  19. package/MarketSentiment.cjs +618 -340
  20. package/MarketSentiment.d.ts +19 -2
  21. package/NewsArticle.cjs +1933 -1655
  22. package/NewsArticle.d.ts +19 -2
  23. package/NewsArticleAssetSentiment.cjs +1842 -1564
  24. package/NewsArticleAssetSentiment.d.ts +19 -2
  25. package/ScheduledOptionOrder.cjs +594 -316
  26. package/ScheduledOptionOrder.d.ts +19 -2
  27. package/Session.cjs +2570 -2292
  28. package/Session.d.ts +19 -2
  29. package/Trade.cjs +1087 -666
  30. package/Trade.d.ts +19 -2
  31. package/User.cjs +2288 -2010
  32. package/User.d.ts +19 -2
  33. package/VerificationToken.cjs +606 -328
  34. package/VerificationToken.d.ts +19 -2
  35. package/esm/Account.d.ts +19 -2
  36. package/esm/Account.d.ts.map +1 -1
  37. package/esm/Account.js.map +1 -1
  38. package/esm/Account.mjs +2534 -2263
  39. package/esm/Action.d.ts +19 -2
  40. package/esm/Action.d.ts.map +1 -1
  41. package/esm/Action.js.map +1 -1
  42. package/esm/Action.mjs +1106 -681
  43. package/esm/Alert.d.ts +19 -2
  44. package/esm/Alert.d.ts.map +1 -1
  45. package/esm/Alert.js.map +1 -1
  46. package/esm/Alert.mjs +2617 -2346
  47. package/esm/Allocation.d.ts +19 -2
  48. package/esm/Allocation.d.ts.map +1 -1
  49. package/esm/Allocation.js.map +1 -1
  50. package/esm/Allocation.mjs +2569 -2298
  51. package/esm/AlpacaAccount.d.ts +19 -2
  52. package/esm/AlpacaAccount.d.ts.map +1 -1
  53. package/esm/AlpacaAccount.js.map +1 -1
  54. package/esm/AlpacaAccount.mjs +2374 -2103
  55. package/esm/Asset.d.ts +19 -2
  56. package/esm/Asset.d.ts.map +1 -1
  57. package/esm/Asset.js.map +1 -1
  58. package/esm/Asset.mjs +1804 -1533
  59. package/esm/Authenticator.d.ts +19 -2
  60. package/esm/Authenticator.d.ts.map +1 -1
  61. package/esm/Authenticator.js.map +1 -1
  62. package/esm/Authenticator.mjs +2559 -2288
  63. package/esm/Customer.d.ts +19 -2
  64. package/esm/Customer.d.ts.map +1 -1
  65. package/esm/Customer.js.map +1 -1
  66. package/esm/Customer.mjs +2486 -2215
  67. package/esm/EconomicEvent.d.ts +19 -2
  68. package/esm/EconomicEvent.d.ts.map +1 -1
  69. package/esm/EconomicEvent.js.map +1 -1
  70. package/esm/EconomicEvent.mjs +636 -365
  71. package/esm/MarketSentiment.d.ts +19 -2
  72. package/esm/MarketSentiment.d.ts.map +1 -1
  73. package/esm/MarketSentiment.js.map +1 -1
  74. package/esm/MarketSentiment.mjs +609 -338
  75. package/esm/NewsArticle.d.ts +19 -2
  76. package/esm/NewsArticle.d.ts.map +1 -1
  77. package/esm/NewsArticle.js.map +1 -1
  78. package/esm/NewsArticle.mjs +1924 -1653
  79. package/esm/NewsArticleAssetSentiment.d.ts +19 -2
  80. package/esm/NewsArticleAssetSentiment.d.ts.map +1 -1
  81. package/esm/NewsArticleAssetSentiment.js.map +1 -1
  82. package/esm/NewsArticleAssetSentiment.mjs +1833 -1562
  83. package/esm/ScheduledOptionOrder.d.ts +19 -2
  84. package/esm/ScheduledOptionOrder.d.ts.map +1 -1
  85. package/esm/ScheduledOptionOrder.js.map +1 -1
  86. package/esm/ScheduledOptionOrder.mjs +585 -314
  87. package/esm/Session.d.ts +19 -2
  88. package/esm/Session.d.ts.map +1 -1
  89. package/esm/Session.js.map +1 -1
  90. package/esm/Session.mjs +2561 -2290
  91. package/esm/Trade.d.ts +19 -2
  92. package/esm/Trade.d.ts.map +1 -1
  93. package/esm/Trade.js.map +1 -1
  94. package/esm/Trade.mjs +1078 -664
  95. package/esm/User.d.ts +19 -2
  96. package/esm/User.d.ts.map +1 -1
  97. package/esm/User.js.map +1 -1
  98. package/esm/User.mjs +2279 -2008
  99. package/esm/VerificationToken.d.ts +19 -2
  100. package/esm/VerificationToken.d.ts.map +1 -1
  101. package/esm/VerificationToken.js.map +1 -1
  102. package/esm/VerificationToken.mjs +597 -326
  103. package/esm/generated/selectionSets/Trade.d.ts +1 -1
  104. package/esm/generated/selectionSets/Trade.d.ts.map +1 -1
  105. package/esm/generated/selectionSets/Trade.js.map +1 -1
  106. package/esm/generated/selectionSets/Trade.mjs +14 -3
  107. package/esm/generated/typeStrings/Trade.d.ts +1 -1
  108. package/esm/generated/typeStrings/Trade.d.ts.map +1 -1
  109. package/esm/generated/typeStrings/Trade.js.map +1 -1
  110. package/esm/generated/typeStrings/Trade.mjs +0 -6
  111. package/esm/generated/typeStrings/index.d.ts +1 -1
  112. package/esm/generated/typegraphql-prisma/enhance.js.map +1 -1
  113. package/esm/generated/typegraphql-prisma/enhance.mjs +24 -24
  114. package/esm/generated/typegraphql-prisma/enums/TradeScalarFieldEnum.d.ts +15 -4
  115. package/esm/generated/typegraphql-prisma/enums/TradeScalarFieldEnum.d.ts.map +1 -1
  116. package/esm/generated/typegraphql-prisma/enums/TradeScalarFieldEnum.js.map +1 -1
  117. package/esm/generated/typegraphql-prisma/enums/TradeScalarFieldEnum.mjs +14 -3
  118. package/esm/generated/typegraphql-prisma/models/Trade.d.ts +56 -12
  119. package/esm/generated/typegraphql-prisma/models/Trade.d.ts.map +1 -1
  120. package/esm/generated/typegraphql-prisma/models/Trade.js.map +1 -1
  121. package/esm/generated/typegraphql-prisma/models/Trade.mjs +154 -33
  122. package/esm/generated/typegraphql-prisma/resolvers/crud/Trade/args/FindFirstTradeArgs.d.ts +1 -1
  123. package/esm/generated/typegraphql-prisma/resolvers/crud/Trade/args/FindFirstTradeArgs.d.ts.map +1 -1
  124. package/esm/generated/typegraphql-prisma/resolvers/crud/Trade/args/FindFirstTradeArgs.js.map +1 -1
  125. package/esm/generated/typegraphql-prisma/resolvers/crud/Trade/args/FindFirstTradeOrThrowArgs.d.ts +1 -1
  126. package/esm/generated/typegraphql-prisma/resolvers/crud/Trade/args/FindFirstTradeOrThrowArgs.d.ts.map +1 -1
  127. package/esm/generated/typegraphql-prisma/resolvers/crud/Trade/args/FindFirstTradeOrThrowArgs.js.map +1 -1
  128. package/esm/generated/typegraphql-prisma/resolvers/crud/Trade/args/FindManyTradeArgs.d.ts +1 -1
  129. package/esm/generated/typegraphql-prisma/resolvers/crud/Trade/args/FindManyTradeArgs.d.ts.map +1 -1
  130. package/esm/generated/typegraphql-prisma/resolvers/crud/Trade/args/FindManyTradeArgs.js.map +1 -1
  131. package/esm/generated/typegraphql-prisma/resolvers/crud/Trade/args/GroupByTradeArgs.d.ts +1 -1
  132. package/esm/generated/typegraphql-prisma/resolvers/crud/Trade/args/GroupByTradeArgs.d.ts.map +1 -1
  133. package/esm/generated/typegraphql-prisma/resolvers/crud/Trade/args/GroupByTradeArgs.js.map +1 -1
  134. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeAvgOrderByAggregateInput.d.ts +9 -3
  135. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeAvgOrderByAggregateInput.d.ts.map +1 -1
  136. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeAvgOrderByAggregateInput.js.map +1 -1
  137. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeAvgOrderByAggregateInput.mjs +49 -7
  138. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeCountOrderByAggregateInput.d.ts +14 -3
  139. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeCountOrderByAggregateInput.d.ts.map +1 -1
  140. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeCountOrderByAggregateInput.js.map +1 -1
  141. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeCountOrderByAggregateInput.mjs +93 -16
  142. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeCreateInput.d.ts +14 -3
  143. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeCreateInput.d.ts.map +1 -1
  144. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeCreateInput.js.map +1 -1
  145. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeCreateInput.mjs +98 -21
  146. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeCreateManyInput.d.ts +14 -3
  147. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeCreateManyInput.d.ts.map +1 -1
  148. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeCreateManyInput.js.map +1 -1
  149. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeCreateManyInput.mjs +98 -21
  150. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeCreateWithoutActionsInput.d.ts +14 -3
  151. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeCreateWithoutActionsInput.d.ts.map +1 -1
  152. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeCreateWithoutActionsInput.js.map +1 -1
  153. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeCreateWithoutActionsInput.mjs +98 -21
  154. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeMaxOrderByAggregateInput.d.ts +14 -3
  155. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeMaxOrderByAggregateInput.d.ts.map +1 -1
  156. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeMaxOrderByAggregateInput.js.map +1 -1
  157. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeMaxOrderByAggregateInput.mjs +93 -16
  158. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeMinOrderByAggregateInput.d.ts +14 -3
  159. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeMinOrderByAggregateInput.d.ts.map +1 -1
  160. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeMinOrderByAggregateInput.js.map +1 -1
  161. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeMinOrderByAggregateInput.mjs +93 -16
  162. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeOrderByWithAggregationInput.d.ts +14 -3
  163. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeOrderByWithAggregationInput.d.ts.map +1 -1
  164. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeOrderByWithAggregationInput.js.map +1 -1
  165. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeOrderByWithAggregationInput.mjs +97 -20
  166. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeOrderByWithRelationInput.d.ts +14 -3
  167. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeOrderByWithRelationInput.d.ts.map +1 -1
  168. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeOrderByWithRelationInput.js.map +1 -1
  169. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeOrderByWithRelationInput.mjs +97 -20
  170. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeScalarWhereWithAggregatesInput.d.ts +16 -3
  171. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeScalarWhereWithAggregatesInput.d.ts.map +1 -1
  172. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeScalarWhereWithAggregatesInput.js.map +1 -1
  173. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeScalarWhereWithAggregatesInput.mjs +100 -21
  174. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeSumOrderByAggregateInput.d.ts +9 -3
  175. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeSumOrderByAggregateInput.d.ts.map +1 -1
  176. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeSumOrderByAggregateInput.js.map +1 -1
  177. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeSumOrderByAggregateInput.mjs +49 -7
  178. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeUpdateInput.d.ts +16 -3
  179. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeUpdateInput.d.ts.map +1 -1
  180. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeUpdateInput.js.map +1 -1
  181. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeUpdateInput.mjs +100 -21
  182. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeUpdateManyMutationInput.d.ts +16 -3
  183. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeUpdateManyMutationInput.d.ts.map +1 -1
  184. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeUpdateManyMutationInput.js.map +1 -1
  185. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeUpdateManyMutationInput.mjs +100 -21
  186. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeUpdateWithoutActionsInput.d.ts +16 -3
  187. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeUpdateWithoutActionsInput.d.ts.map +1 -1
  188. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeUpdateWithoutActionsInput.js.map +1 -1
  189. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeUpdateWithoutActionsInput.mjs +100 -21
  190. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeWhereInput.d.ts +16 -3
  191. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeWhereInput.d.ts.map +1 -1
  192. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeWhereInput.js.map +1 -1
  193. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeWhereInput.mjs +100 -21
  194. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeWhereUniqueInput.d.ts +16 -3
  195. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeWhereUniqueInput.d.ts.map +1 -1
  196. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeWhereUniqueInput.js.map +1 -1
  197. package/esm/generated/typegraphql-prisma/resolvers/inputs/TradeWhereUniqueInput.mjs +100 -21
  198. package/esm/generated/typegraphql-prisma/resolvers/outputs/CreateManyAndReturnTrade.d.ts +14 -3
  199. package/esm/generated/typegraphql-prisma/resolvers/outputs/CreateManyAndReturnTrade.d.ts.map +1 -1
  200. package/esm/generated/typegraphql-prisma/resolvers/outputs/CreateManyAndReturnTrade.js.map +1 -1
  201. package/esm/generated/typegraphql-prisma/resolvers/outputs/CreateManyAndReturnTrade.mjs +98 -21
  202. package/esm/generated/typegraphql-prisma/resolvers/outputs/TradeAvgAggregate.d.ts +9 -3
  203. package/esm/generated/typegraphql-prisma/resolvers/outputs/TradeAvgAggregate.d.ts.map +1 -1
  204. package/esm/generated/typegraphql-prisma/resolvers/outputs/TradeAvgAggregate.js.map +1 -1
  205. package/esm/generated/typegraphql-prisma/resolvers/outputs/TradeAvgAggregate.mjs +49 -7
  206. package/esm/generated/typegraphql-prisma/resolvers/outputs/TradeCountAggregate.d.ts +14 -3
  207. package/esm/generated/typegraphql-prisma/resolvers/outputs/TradeCountAggregate.d.ts.map +1 -1
  208. package/esm/generated/typegraphql-prisma/resolvers/outputs/TradeCountAggregate.js.map +1 -1
  209. package/esm/generated/typegraphql-prisma/resolvers/outputs/TradeCountAggregate.mjs +93 -16
  210. package/esm/generated/typegraphql-prisma/resolvers/outputs/TradeGroupBy.d.ts +14 -3
  211. package/esm/generated/typegraphql-prisma/resolvers/outputs/TradeGroupBy.d.ts.map +1 -1
  212. package/esm/generated/typegraphql-prisma/resolvers/outputs/TradeGroupBy.js.map +1 -1
  213. package/esm/generated/typegraphql-prisma/resolvers/outputs/TradeGroupBy.mjs +98 -21
  214. package/esm/generated/typegraphql-prisma/resolvers/outputs/TradeMaxAggregate.d.ts +14 -3
  215. package/esm/generated/typegraphql-prisma/resolvers/outputs/TradeMaxAggregate.d.ts.map +1 -1
  216. package/esm/generated/typegraphql-prisma/resolvers/outputs/TradeMaxAggregate.js.map +1 -1
  217. package/esm/generated/typegraphql-prisma/resolvers/outputs/TradeMaxAggregate.mjs +98 -21
  218. package/esm/generated/typegraphql-prisma/resolvers/outputs/TradeMinAggregate.d.ts +14 -3
  219. package/esm/generated/typegraphql-prisma/resolvers/outputs/TradeMinAggregate.d.ts.map +1 -1
  220. package/esm/generated/typegraphql-prisma/resolvers/outputs/TradeMinAggregate.js.map +1 -1
  221. package/esm/generated/typegraphql-prisma/resolvers/outputs/TradeMinAggregate.mjs +98 -21
  222. package/esm/generated/typegraphql-prisma/resolvers/outputs/TradeSumAggregate.d.ts +9 -3
  223. package/esm/generated/typegraphql-prisma/resolvers/outputs/TradeSumAggregate.d.ts.map +1 -1
  224. package/esm/generated/typegraphql-prisma/resolvers/outputs/TradeSumAggregate.js.map +1 -1
  225. package/esm/generated/typegraphql-prisma/resolvers/outputs/TradeSumAggregate.mjs +49 -7
  226. package/esm/prismaClient.d.ts +4 -5
  227. package/esm/prismaClient.d.ts.map +1 -1
  228. package/esm/prismaClient.js.map +1 -1
  229. package/esm/prismaClient.mjs +13 -11
  230. package/generated/typeStrings/Trade.cjs +0 -6
  231. package/generated/typeStrings/Trade.d.ts +1 -1
  232. package/generated/typeStrings/Trade.d.ts.map +1 -1
  233. package/generated/typeStrings/Trade.js.map +1 -1
  234. package/generated/typeStrings/index.d.ts +1 -1
  235. package/generated/typegraphql-prisma/enhance.cjs +24 -24
  236. package/generated/typegraphql-prisma/enhance.js.map +1 -1
  237. package/generated/typegraphql-prisma/enums/TradeScalarFieldEnum.cjs +14 -3
  238. package/generated/typegraphql-prisma/enums/TradeScalarFieldEnum.d.ts +15 -4
  239. package/generated/typegraphql-prisma/enums/TradeScalarFieldEnum.d.ts.map +1 -1
  240. package/generated/typegraphql-prisma/enums/TradeScalarFieldEnum.js.map +1 -1
  241. package/generated/typegraphql-prisma/models/Trade.cjs +98 -21
  242. package/generated/typegraphql-prisma/models/Trade.d.ts +56 -12
  243. package/generated/typegraphql-prisma/models/Trade.d.ts.map +1 -1
  244. package/generated/typegraphql-prisma/models/Trade.js.map +1 -1
  245. package/generated/typegraphql-prisma/resolvers/crud/Trade/args/FindFirstTradeArgs.d.ts +1 -1
  246. package/generated/typegraphql-prisma/resolvers/crud/Trade/args/FindFirstTradeArgs.d.ts.map +1 -1
  247. package/generated/typegraphql-prisma/resolvers/crud/Trade/args/FindFirstTradeArgs.js.map +1 -1
  248. package/generated/typegraphql-prisma/resolvers/crud/Trade/args/FindFirstTradeOrThrowArgs.d.ts +1 -1
  249. package/generated/typegraphql-prisma/resolvers/crud/Trade/args/FindFirstTradeOrThrowArgs.d.ts.map +1 -1
  250. package/generated/typegraphql-prisma/resolvers/crud/Trade/args/FindFirstTradeOrThrowArgs.js.map +1 -1
  251. package/generated/typegraphql-prisma/resolvers/crud/Trade/args/FindManyTradeArgs.d.ts +1 -1
  252. package/generated/typegraphql-prisma/resolvers/crud/Trade/args/FindManyTradeArgs.d.ts.map +1 -1
  253. package/generated/typegraphql-prisma/resolvers/crud/Trade/args/FindManyTradeArgs.js.map +1 -1
  254. package/generated/typegraphql-prisma/resolvers/crud/Trade/args/GroupByTradeArgs.d.ts +1 -1
  255. package/generated/typegraphql-prisma/resolvers/crud/Trade/args/GroupByTradeArgs.d.ts.map +1 -1
  256. package/generated/typegraphql-prisma/resolvers/crud/Trade/args/GroupByTradeArgs.js.map +1 -1
  257. package/generated/typegraphql-prisma/resolvers/inputs/TradeAvgOrderByAggregateInput.cjs +40 -4
  258. package/generated/typegraphql-prisma/resolvers/inputs/TradeAvgOrderByAggregateInput.d.ts +9 -3
  259. package/generated/typegraphql-prisma/resolvers/inputs/TradeAvgOrderByAggregateInput.d.ts.map +1 -1
  260. package/generated/typegraphql-prisma/resolvers/inputs/TradeAvgOrderByAggregateInput.js.map +1 -1
  261. package/generated/typegraphql-prisma/resolvers/inputs/TradeCountOrderByAggregateInput.cjs +79 -13
  262. package/generated/typegraphql-prisma/resolvers/inputs/TradeCountOrderByAggregateInput.d.ts +14 -3
  263. package/generated/typegraphql-prisma/resolvers/inputs/TradeCountOrderByAggregateInput.d.ts.map +1 -1
  264. package/generated/typegraphql-prisma/resolvers/inputs/TradeCountOrderByAggregateInput.js.map +1 -1
  265. package/generated/typegraphql-prisma/resolvers/inputs/TradeCreateInput.cjs +84 -18
  266. package/generated/typegraphql-prisma/resolvers/inputs/TradeCreateInput.d.ts +14 -3
  267. package/generated/typegraphql-prisma/resolvers/inputs/TradeCreateInput.d.ts.map +1 -1
  268. package/generated/typegraphql-prisma/resolvers/inputs/TradeCreateInput.js.map +1 -1
  269. package/generated/typegraphql-prisma/resolvers/inputs/TradeCreateManyInput.cjs +84 -18
  270. package/generated/typegraphql-prisma/resolvers/inputs/TradeCreateManyInput.d.ts +14 -3
  271. package/generated/typegraphql-prisma/resolvers/inputs/TradeCreateManyInput.d.ts.map +1 -1
  272. package/generated/typegraphql-prisma/resolvers/inputs/TradeCreateManyInput.js.map +1 -1
  273. package/generated/typegraphql-prisma/resolvers/inputs/TradeCreateWithoutActionsInput.cjs +84 -18
  274. package/generated/typegraphql-prisma/resolvers/inputs/TradeCreateWithoutActionsInput.d.ts +14 -3
  275. package/generated/typegraphql-prisma/resolvers/inputs/TradeCreateWithoutActionsInput.d.ts.map +1 -1
  276. package/generated/typegraphql-prisma/resolvers/inputs/TradeCreateWithoutActionsInput.js.map +1 -1
  277. package/generated/typegraphql-prisma/resolvers/inputs/TradeMaxOrderByAggregateInput.cjs +79 -13
  278. package/generated/typegraphql-prisma/resolvers/inputs/TradeMaxOrderByAggregateInput.d.ts +14 -3
  279. package/generated/typegraphql-prisma/resolvers/inputs/TradeMaxOrderByAggregateInput.d.ts.map +1 -1
  280. package/generated/typegraphql-prisma/resolvers/inputs/TradeMaxOrderByAggregateInput.js.map +1 -1
  281. package/generated/typegraphql-prisma/resolvers/inputs/TradeMinOrderByAggregateInput.cjs +79 -13
  282. package/generated/typegraphql-prisma/resolvers/inputs/TradeMinOrderByAggregateInput.d.ts +14 -3
  283. package/generated/typegraphql-prisma/resolvers/inputs/TradeMinOrderByAggregateInput.d.ts.map +1 -1
  284. package/generated/typegraphql-prisma/resolvers/inputs/TradeMinOrderByAggregateInput.js.map +1 -1
  285. package/generated/typegraphql-prisma/resolvers/inputs/TradeOrderByWithAggregationInput.cjs +83 -17
  286. package/generated/typegraphql-prisma/resolvers/inputs/TradeOrderByWithAggregationInput.d.ts +14 -3
  287. package/generated/typegraphql-prisma/resolvers/inputs/TradeOrderByWithAggregationInput.d.ts.map +1 -1
  288. package/generated/typegraphql-prisma/resolvers/inputs/TradeOrderByWithAggregationInput.js.map +1 -1
  289. package/generated/typegraphql-prisma/resolvers/inputs/TradeOrderByWithRelationInput.cjs +83 -17
  290. package/generated/typegraphql-prisma/resolvers/inputs/TradeOrderByWithRelationInput.d.ts +14 -3
  291. package/generated/typegraphql-prisma/resolvers/inputs/TradeOrderByWithRelationInput.d.ts.map +1 -1
  292. package/generated/typegraphql-prisma/resolvers/inputs/TradeOrderByWithRelationInput.js.map +1 -1
  293. package/generated/typegraphql-prisma/resolvers/inputs/TradeScalarWhereWithAggregatesInput.cjs +86 -18
  294. package/generated/typegraphql-prisma/resolvers/inputs/TradeScalarWhereWithAggregatesInput.d.ts +16 -3
  295. package/generated/typegraphql-prisma/resolvers/inputs/TradeScalarWhereWithAggregatesInput.d.ts.map +1 -1
  296. package/generated/typegraphql-prisma/resolvers/inputs/TradeScalarWhereWithAggregatesInput.js.map +1 -1
  297. package/generated/typegraphql-prisma/resolvers/inputs/TradeSumOrderByAggregateInput.cjs +40 -4
  298. package/generated/typegraphql-prisma/resolvers/inputs/TradeSumOrderByAggregateInput.d.ts +9 -3
  299. package/generated/typegraphql-prisma/resolvers/inputs/TradeSumOrderByAggregateInput.d.ts.map +1 -1
  300. package/generated/typegraphql-prisma/resolvers/inputs/TradeSumOrderByAggregateInput.js.map +1 -1
  301. package/generated/typegraphql-prisma/resolvers/inputs/TradeUpdateInput.cjs +86 -18
  302. package/generated/typegraphql-prisma/resolvers/inputs/TradeUpdateInput.d.ts +16 -3
  303. package/generated/typegraphql-prisma/resolvers/inputs/TradeUpdateInput.d.ts.map +1 -1
  304. package/generated/typegraphql-prisma/resolvers/inputs/TradeUpdateInput.js.map +1 -1
  305. package/generated/typegraphql-prisma/resolvers/inputs/TradeUpdateManyMutationInput.cjs +86 -18
  306. package/generated/typegraphql-prisma/resolvers/inputs/TradeUpdateManyMutationInput.d.ts +16 -3
  307. package/generated/typegraphql-prisma/resolvers/inputs/TradeUpdateManyMutationInput.d.ts.map +1 -1
  308. package/generated/typegraphql-prisma/resolvers/inputs/TradeUpdateManyMutationInput.js.map +1 -1
  309. package/generated/typegraphql-prisma/resolvers/inputs/TradeUpdateWithoutActionsInput.cjs +86 -18
  310. package/generated/typegraphql-prisma/resolvers/inputs/TradeUpdateWithoutActionsInput.d.ts +16 -3
  311. package/generated/typegraphql-prisma/resolvers/inputs/TradeUpdateWithoutActionsInput.d.ts.map +1 -1
  312. package/generated/typegraphql-prisma/resolvers/inputs/TradeUpdateWithoutActionsInput.js.map +1 -1
  313. package/generated/typegraphql-prisma/resolvers/inputs/TradeWhereInput.cjs +86 -18
  314. package/generated/typegraphql-prisma/resolvers/inputs/TradeWhereInput.d.ts +16 -3
  315. package/generated/typegraphql-prisma/resolvers/inputs/TradeWhereInput.d.ts.map +1 -1
  316. package/generated/typegraphql-prisma/resolvers/inputs/TradeWhereInput.js.map +1 -1
  317. package/generated/typegraphql-prisma/resolvers/inputs/TradeWhereUniqueInput.cjs +86 -18
  318. package/generated/typegraphql-prisma/resolvers/inputs/TradeWhereUniqueInput.d.ts +16 -3
  319. package/generated/typegraphql-prisma/resolvers/inputs/TradeWhereUniqueInput.d.ts.map +1 -1
  320. package/generated/typegraphql-prisma/resolvers/inputs/TradeWhereUniqueInput.js.map +1 -1
  321. package/generated/typegraphql-prisma/resolvers/outputs/CreateManyAndReturnTrade.cjs +84 -18
  322. package/generated/typegraphql-prisma/resolvers/outputs/CreateManyAndReturnTrade.d.ts +14 -3
  323. package/generated/typegraphql-prisma/resolvers/outputs/CreateManyAndReturnTrade.d.ts.map +1 -1
  324. package/generated/typegraphql-prisma/resolvers/outputs/CreateManyAndReturnTrade.js.map +1 -1
  325. package/generated/typegraphql-prisma/resolvers/outputs/TradeAvgAggregate.cjs +40 -4
  326. package/generated/typegraphql-prisma/resolvers/outputs/TradeAvgAggregate.d.ts +9 -3
  327. package/generated/typegraphql-prisma/resolvers/outputs/TradeAvgAggregate.d.ts.map +1 -1
  328. package/generated/typegraphql-prisma/resolvers/outputs/TradeAvgAggregate.js.map +1 -1
  329. package/generated/typegraphql-prisma/resolvers/outputs/TradeCountAggregate.cjs +79 -13
  330. package/generated/typegraphql-prisma/resolvers/outputs/TradeCountAggregate.d.ts +14 -3
  331. package/generated/typegraphql-prisma/resolvers/outputs/TradeCountAggregate.d.ts.map +1 -1
  332. package/generated/typegraphql-prisma/resolvers/outputs/TradeCountAggregate.js.map +1 -1
  333. package/generated/typegraphql-prisma/resolvers/outputs/TradeGroupBy.cjs +84 -18
  334. package/generated/typegraphql-prisma/resolvers/outputs/TradeGroupBy.d.ts +14 -3
  335. package/generated/typegraphql-prisma/resolvers/outputs/TradeGroupBy.d.ts.map +1 -1
  336. package/generated/typegraphql-prisma/resolvers/outputs/TradeGroupBy.js.map +1 -1
  337. package/generated/typegraphql-prisma/resolvers/outputs/TradeMaxAggregate.cjs +84 -18
  338. package/generated/typegraphql-prisma/resolvers/outputs/TradeMaxAggregate.d.ts +14 -3
  339. package/generated/typegraphql-prisma/resolvers/outputs/TradeMaxAggregate.d.ts.map +1 -1
  340. package/generated/typegraphql-prisma/resolvers/outputs/TradeMaxAggregate.js.map +1 -1
  341. package/generated/typegraphql-prisma/resolvers/outputs/TradeMinAggregate.cjs +84 -18
  342. package/generated/typegraphql-prisma/resolvers/outputs/TradeMinAggregate.d.ts +14 -3
  343. package/generated/typegraphql-prisma/resolvers/outputs/TradeMinAggregate.d.ts.map +1 -1
  344. package/generated/typegraphql-prisma/resolvers/outputs/TradeMinAggregate.js.map +1 -1
  345. package/generated/typegraphql-prisma/resolvers/outputs/TradeSumAggregate.cjs +40 -4
  346. package/generated/typegraphql-prisma/resolvers/outputs/TradeSumAggregate.d.ts +9 -3
  347. package/generated/typegraphql-prisma/resolvers/outputs/TradeSumAggregate.d.ts.map +1 -1
  348. package/generated/typegraphql-prisma/resolvers/outputs/TradeSumAggregate.js.map +1 -1
  349. package/package.json +1 -1
  350. package/prismaClient.cjs +13 -11
  351. package/prismaClient.d.ts +4 -5
  352. package/server.cjs +37 -5
package/esm/Trade.mjs CHANGED
@@ -7,9 +7,6 @@ const selectionSet = `
7
7
 
8
8
  id
9
9
  alpacaAccountId
10
- qty
11
- price
12
- total
13
10
  signal
14
11
  strategy
15
12
  analysis
@@ -32,6 +29,20 @@ const selectionSet = `
32
29
  updatedAt
33
30
  alpacaOrderId
34
31
  }
32
+ entryPrice
33
+ exitPrice
34
+ entryQty
35
+ exitQty
36
+ entryValue
37
+ exitValue
38
+ entryTime
39
+ exitTime
40
+ pnlAmount
41
+ pnlPercent
42
+ durationMinutes
43
+ marketPhase
44
+ marketVolatility
45
+ thresholdsJson
35
46
 
36
47
  `;
37
48
  export const Trade = {
@@ -41,762 +52,1165 @@ export const Trade = {
41
52
  * @param client - Apollo Client instance.
42
53
  * @returns The created Trade or null.
43
54
  */
55
+ /**
56
+ * Create a new Trade record.
57
+ * Enhanced with connection resilience against Prisma connection errors.
58
+ * @param props - Properties for the new record.
59
+ * @param globalClient - Apollo Client instance.
60
+ * @returns The created Trade or null.
61
+ */
44
62
  async create(props, globalClient) {
45
- const [modules, client] = await Promise.all([
46
- getApolloModules(),
47
- globalClient
48
- ? Promise.resolve(globalClient)
49
- : importedClient
50
- ]);
51
- const { gql, ApolloError } = modules;
52
- const CREATE_ONE_TRADE = gql `
53
- mutation createOneTrade($data: TradeCreateInput!) {
54
- createOneTrade(data: $data) {
55
- ${selectionSet}
56
- }
57
- }
58
- `;
59
- const variables = {
60
- data: {
61
- alpacaAccountId: props.alpacaAccountId !== undefined ? props.alpacaAccountId : undefined,
62
- qty: props.qty !== undefined ? props.qty : undefined,
63
- price: props.price !== undefined ? props.price : undefined,
64
- total: props.total !== undefined ? props.total : undefined,
65
- signal: props.signal !== undefined ? props.signal : undefined,
66
- strategy: props.strategy !== undefined ? props.strategy : undefined,
67
- analysis: props.analysis !== undefined ? props.analysis : undefined,
68
- summary: props.summary !== undefined ? props.summary : undefined,
69
- confidence: props.confidence !== undefined ? props.confidence : undefined,
70
- timestamp: props.timestamp !== undefined ? props.timestamp : undefined,
71
- status: props.status !== undefined ? props.status : undefined,
72
- symbol: props.symbol !== undefined ? props.symbol : undefined,
73
- actions: props.actions ?
74
- Array.isArray(props.actions) && props.actions.length > 0 && props.actions.every((item) => typeof item === 'object' && 'id' in item && Object.keys(item).length === 1) ? {
75
- connect: props.actions.map((item) => ({
76
- id: item.id
77
- }))
78
- }
79
- : { connectOrCreate: props.actions.map((item) => ({
80
- where: {
81
- id: item.id !== undefined ? item.id : undefined,
82
- alpacaOrderId: item.alpacaOrderId !== undefined ? item.alpacaOrderId : undefined,
83
- tradeId: item.tradeId !== undefined ? {
84
- equals: item.tradeId
85
- } : undefined,
86
- },
87
- create: {
88
- sequence: item.sequence !== undefined ? item.sequence : undefined,
89
- type: item.type !== undefined ? item.type : undefined,
90
- primary: item.primary !== undefined ? item.primary : undefined,
91
- note: item.note !== undefined ? item.note : undefined,
92
- status: item.status !== undefined ? item.status : undefined,
93
- alpacaOrderId: item.alpacaOrderId !== undefined ? item.alpacaOrderId : undefined,
94
- },
95
- }))
96
- } : undefined,
97
- },
98
- };
99
- const filteredVariables = removeUndefinedProps(variables);
100
- try {
101
- const response = await client.mutate({ mutation: CREATE_ONE_TRADE, variables: filteredVariables });
102
- if (response.errors && response.errors.length > 0)
103
- throw new Error(response.errors[0].message);
104
- if (response && response.data && response.data.createOneTrade) {
105
- return response.data.createOneTrade;
63
+ // Maximum number of retries for database connection issues
64
+ const MAX_RETRIES = 3;
65
+ let retryCount = 0;
66
+ let lastError = null;
67
+ // Retry loop to handle potential database connection issues
68
+ while (retryCount < MAX_RETRIES) {
69
+ try {
70
+ const [modules, client] = await Promise.all([
71
+ getApolloModules(),
72
+ globalClient
73
+ ? Promise.resolve(globalClient)
74
+ : importedClient
75
+ ]);
76
+ const { gql, ApolloError } = modules;
77
+ const CREATE_ONE_TRADE = gql `
78
+ mutation createOneTrade($data: TradeCreateInput!) {
79
+ createOneTrade(data: $data) {
80
+ ${selectionSet}
81
+ }
82
+ }
83
+ `;
84
+ const variables = {
85
+ data: {
86
+ alpacaAccountId: props.alpacaAccountId !== undefined ? props.alpacaAccountId : undefined,
87
+ signal: props.signal !== undefined ? props.signal : undefined,
88
+ strategy: props.strategy !== undefined ? props.strategy : undefined,
89
+ analysis: props.analysis !== undefined ? props.analysis : undefined,
90
+ summary: props.summary !== undefined ? props.summary : undefined,
91
+ confidence: props.confidence !== undefined ? props.confidence : undefined,
92
+ timestamp: props.timestamp !== undefined ? props.timestamp : undefined,
93
+ status: props.status !== undefined ? props.status : undefined,
94
+ symbol: props.symbol !== undefined ? props.symbol : undefined,
95
+ entryPrice: props.entryPrice !== undefined ? props.entryPrice : undefined,
96
+ exitPrice: props.exitPrice !== undefined ? props.exitPrice : undefined,
97
+ entryQty: props.entryQty !== undefined ? props.entryQty : undefined,
98
+ exitQty: props.exitQty !== undefined ? props.exitQty : undefined,
99
+ entryValue: props.entryValue !== undefined ? props.entryValue : undefined,
100
+ exitValue: props.exitValue !== undefined ? props.exitValue : undefined,
101
+ entryTime: props.entryTime !== undefined ? props.entryTime : undefined,
102
+ exitTime: props.exitTime !== undefined ? props.exitTime : undefined,
103
+ pnlAmount: props.pnlAmount !== undefined ? props.pnlAmount : undefined,
104
+ pnlPercent: props.pnlPercent !== undefined ? props.pnlPercent : undefined,
105
+ durationMinutes: props.durationMinutes !== undefined ? props.durationMinutes : undefined,
106
+ marketPhase: props.marketPhase !== undefined ? props.marketPhase : undefined,
107
+ marketVolatility: props.marketVolatility !== undefined ? props.marketVolatility : undefined,
108
+ thresholdsJson: props.thresholdsJson !== undefined ? props.thresholdsJson : undefined,
109
+ actions: props.actions ?
110
+ Array.isArray(props.actions) && props.actions.length > 0 && props.actions.every((item) => typeof item === 'object' && 'id' in item && Object.keys(item).length === 1) ? {
111
+ connect: props.actions.map((item) => ({
112
+ id: item.id
113
+ }))
114
+ }
115
+ : { connectOrCreate: props.actions.map((item) => ({
116
+ where: {
117
+ id: item.id !== undefined ? item.id : undefined,
118
+ alpacaOrderId: item.alpacaOrderId !== undefined ? item.alpacaOrderId : undefined,
119
+ tradeId: item.tradeId !== undefined ? {
120
+ equals: item.tradeId
121
+ } : undefined,
122
+ },
123
+ create: {
124
+ sequence: item.sequence !== undefined ? item.sequence : undefined,
125
+ type: item.type !== undefined ? item.type : undefined,
126
+ primary: item.primary !== undefined ? item.primary : undefined,
127
+ note: item.note !== undefined ? item.note : undefined,
128
+ status: item.status !== undefined ? item.status : undefined,
129
+ alpacaOrderId: item.alpacaOrderId !== undefined ? item.alpacaOrderId : undefined,
130
+ },
131
+ }))
132
+ } : undefined,
133
+ },
134
+ };
135
+ const filteredVariables = removeUndefinedProps(variables);
136
+ const response = await client.mutate({
137
+ mutation: CREATE_ONE_TRADE,
138
+ variables: filteredVariables,
139
+ // Don't cache mutations, but ensure we're using the freshest context
140
+ fetchPolicy: 'no-cache'
141
+ });
142
+ if (response.errors && response.errors.length > 0)
143
+ throw new Error(response.errors[0].message);
144
+ if (response && response.data && response.data.createOneTrade) {
145
+ return response.data.createOneTrade;
146
+ }
147
+ else {
148
+ return null;
149
+ }
106
150
  }
107
- else {
108
- return null;
151
+ catch (error) {
152
+ lastError = error;
153
+ // Check if this is a database connection error that we should retry
154
+ const isConnectionError = error.message?.includes('Server has closed the connection') ||
155
+ error.message?.includes('Cannot reach database server') ||
156
+ error.message?.includes('Connection timed out') ||
157
+ error.message?.includes('Accelerate') || // Prisma Accelerate proxy errors
158
+ (error.networkError && error.networkError.message?.includes('Failed to fetch'));
159
+ if (isConnectionError && retryCount < MAX_RETRIES - 1) {
160
+ retryCount++;
161
+ const delay = Math.pow(2, retryCount) * 100; // Exponential backoff: 200ms, 400ms, 800ms
162
+ console.warn("Database connection error, retrying...");
163
+ await new Promise(resolve => setTimeout(resolve, delay));
164
+ continue;
165
+ }
166
+ // Log the error and rethrow
167
+ console.error("Database error occurred:", error);
168
+ throw error;
109
169
  }
110
170
  }
111
- catch (error) {
112
- console.error('Error in createOneTrade:', error);
113
- throw error;
114
- }
171
+ // If we exhausted retries, throw the last error
172
+ throw lastError;
115
173
  },
116
174
  /**
117
175
  * Create multiple Trade records.
176
+ * Enhanced with connection resilience against Prisma connection errors.
118
177
  * @param props - Array of Trade objects for the new records.
119
178
  * @param globalClient - Apollo Client instance.
120
179
  * @returns The count of created records or null.
121
180
  */
122
181
  async createMany(props, globalClient) {
123
- const [modules, client] = await Promise.all([
124
- getApolloModules(),
125
- globalClient
126
- ? Promise.resolve(globalClient)
127
- : importedClient
128
- ]);
129
- const { gql, ApolloError } = modules;
130
- const CREATE_MANY_TRADE = gql `
131
- mutation createManyTrade($data: [TradeCreateManyInput!]!) {
132
- createManyTrade(data: $data) {
133
- count
134
- }
135
- }`;
136
- const variables = {
137
- data: props.map(prop => ({
138
- alpacaAccountId: prop.alpacaAccountId !== undefined ? prop.alpacaAccountId : undefined,
139
- qty: prop.qty !== undefined ? prop.qty : undefined,
140
- price: prop.price !== undefined ? prop.price : undefined,
141
- total: prop.total !== undefined ? prop.total : undefined,
142
- signal: prop.signal !== undefined ? prop.signal : undefined,
143
- strategy: prop.strategy !== undefined ? prop.strategy : undefined,
144
- analysis: prop.analysis !== undefined ? prop.analysis : undefined,
145
- summary: prop.summary !== undefined ? prop.summary : undefined,
146
- confidence: prop.confidence !== undefined ? prop.confidence : undefined,
147
- timestamp: prop.timestamp !== undefined ? prop.timestamp : undefined,
148
- status: prop.status !== undefined ? prop.status : undefined,
149
- symbol: prop.symbol !== undefined ? prop.symbol : undefined,
150
- })),
151
- };
152
- const filteredVariables = removeUndefinedProps(variables);
153
- try {
154
- const response = await client.mutate({ mutation: CREATE_MANY_TRADE, variables: filteredVariables });
155
- if (response.errors && response.errors.length > 0)
156
- throw new Error(response.errors[0].message);
157
- if (response && response.data && response.data.createManyTrade) {
158
- return response.data.createManyTrade;
182
+ // Maximum number of retries for database connection issues
183
+ const MAX_RETRIES = 3;
184
+ let retryCount = 0;
185
+ let lastError = null;
186
+ // Retry loop to handle potential database connection issues
187
+ while (retryCount < MAX_RETRIES) {
188
+ try {
189
+ const [modules, client] = await Promise.all([
190
+ getApolloModules(),
191
+ globalClient
192
+ ? Promise.resolve(globalClient)
193
+ : importedClient
194
+ ]);
195
+ const { gql, ApolloError } = modules;
196
+ const CREATE_MANY_TRADE = gql `
197
+ mutation createManyTrade($data: [TradeCreateManyInput!]!) {
198
+ createManyTrade(data: $data) {
199
+ count
159
200
  }
160
- else {
161
- return null;
201
+ }`;
202
+ const variables = {
203
+ data: props.map(prop => ({
204
+ alpacaAccountId: prop.alpacaAccountId !== undefined ? prop.alpacaAccountId : undefined,
205
+ signal: prop.signal !== undefined ? prop.signal : undefined,
206
+ strategy: prop.strategy !== undefined ? prop.strategy : undefined,
207
+ analysis: prop.analysis !== undefined ? prop.analysis : undefined,
208
+ summary: prop.summary !== undefined ? prop.summary : undefined,
209
+ confidence: prop.confidence !== undefined ? prop.confidence : undefined,
210
+ timestamp: prop.timestamp !== undefined ? prop.timestamp : undefined,
211
+ status: prop.status !== undefined ? prop.status : undefined,
212
+ symbol: prop.symbol !== undefined ? prop.symbol : undefined,
213
+ entryPrice: prop.entryPrice !== undefined ? prop.entryPrice : undefined,
214
+ exitPrice: prop.exitPrice !== undefined ? prop.exitPrice : undefined,
215
+ entryQty: prop.entryQty !== undefined ? prop.entryQty : undefined,
216
+ exitQty: prop.exitQty !== undefined ? prop.exitQty : undefined,
217
+ entryValue: prop.entryValue !== undefined ? prop.entryValue : undefined,
218
+ exitValue: prop.exitValue !== undefined ? prop.exitValue : undefined,
219
+ entryTime: prop.entryTime !== undefined ? prop.entryTime : undefined,
220
+ exitTime: prop.exitTime !== undefined ? prop.exitTime : undefined,
221
+ pnlAmount: prop.pnlAmount !== undefined ? prop.pnlAmount : undefined,
222
+ pnlPercent: prop.pnlPercent !== undefined ? prop.pnlPercent : undefined,
223
+ durationMinutes: prop.durationMinutes !== undefined ? prop.durationMinutes : undefined,
224
+ marketPhase: prop.marketPhase !== undefined ? prop.marketPhase : undefined,
225
+ marketVolatility: prop.marketVolatility !== undefined ? prop.marketVolatility : undefined,
226
+ thresholdsJson: prop.thresholdsJson !== undefined ? prop.thresholdsJson : undefined,
227
+ })),
228
+ };
229
+ const filteredVariables = removeUndefinedProps(variables);
230
+ const response = await client.mutate({
231
+ mutation: CREATE_MANY_TRADE,
232
+ variables: filteredVariables,
233
+ // Don't cache mutations, but ensure we're using the freshest context
234
+ fetchPolicy: 'no-cache'
235
+ });
236
+ if (response.errors && response.errors.length > 0)
237
+ throw new Error(response.errors[0].message);
238
+ if (response && response.data && response.data.createManyTrade) {
239
+ return response.data.createManyTrade;
240
+ }
241
+ else {
242
+ return null;
243
+ }
244
+ }
245
+ catch (error) {
246
+ lastError = error;
247
+ // Check if this is a database connection error that we should retry
248
+ const isConnectionError = error.message?.includes('Server has closed the connection') ||
249
+ error.message?.includes('Cannot reach database server') ||
250
+ error.message?.includes('Connection timed out') ||
251
+ error.message?.includes('Accelerate') || // Prisma Accelerate proxy errors
252
+ (error.networkError && error.networkError.message?.includes('Failed to fetch'));
253
+ if (isConnectionError && retryCount < MAX_RETRIES - 1) {
254
+ retryCount++;
255
+ const delay = Math.pow(2, retryCount) * 100; // Exponential backoff: 200ms, 400ms, 800ms
256
+ console.warn("Database connection error, retrying...");
257
+ await new Promise(resolve => setTimeout(resolve, delay));
258
+ continue;
259
+ }
260
+ // Log the error and rethrow
261
+ console.error("Database error occurred:", error);
262
+ throw error;
162
263
  }
163
264
  }
164
- catch (error) {
165
- console.error('Error in createManyTrade:', error);
166
- throw error;
167
- }
265
+ // If we exhausted retries, throw the last error
266
+ throw lastError;
168
267
  },
169
268
  /**
170
269
  * Update a single Trade record.
270
+ * Enhanced with connection resilience against Prisma connection errors.
171
271
  * @param props - Properties to update.
172
272
  * @param globalClient - Apollo Client instance.
173
273
  * @returns The updated Trade or null.
174
274
  */
175
275
  async update(props, globalClient) {
176
- const [modules, client] = await Promise.all([
177
- getApolloModules(),
178
- globalClient
179
- ? Promise.resolve(globalClient)
180
- : importedClient
181
- ]);
182
- const { gql, ApolloError } = modules;
183
- const UPDATE_ONE_TRADE = gql `
184
- mutation updateOneTrade($data: TradeUpdateInput!, $where: TradeWhereUniqueInput!) {
185
- updateOneTrade(data: $data, where: $where) {
186
- ${selectionSet}
187
- }
188
- }`;
189
- const variables = {
190
- where: {
191
- id: props.id !== undefined ? props.id : undefined,
192
- alpacaAccountId: props.alpacaAccountId !== undefined ? {
193
- equals: props.alpacaAccountId
194
- } : undefined,
195
- symbol: props.symbol !== undefined ? {
196
- equals: props.symbol
197
- } : undefined,
198
- },
199
- data: {
200
- id: props.id !== undefined ? {
201
- set: props.id
202
- } : undefined,
203
- alpacaAccountId: props.alpacaAccountId !== undefined ? {
204
- set: props.alpacaAccountId
205
- } : undefined,
206
- qty: props.qty !== undefined ? {
207
- set: props.qty
208
- } : undefined,
209
- price: props.price !== undefined ? {
210
- set: props.price
211
- } : undefined,
212
- total: props.total !== undefined ? {
213
- set: props.total
214
- } : undefined,
215
- signal: props.signal !== undefined ? {
216
- set: props.signal
217
- } : undefined,
218
- strategy: props.strategy !== undefined ? {
219
- set: props.strategy
220
- } : undefined,
221
- analysis: props.analysis !== undefined ? {
222
- set: props.analysis
223
- } : undefined,
224
- summary: props.summary !== undefined ? {
225
- set: props.summary
226
- } : undefined,
227
- confidence: props.confidence !== undefined ? {
228
- set: props.confidence
229
- } : undefined,
230
- timestamp: props.timestamp !== undefined ? {
231
- set: props.timestamp
232
- } : undefined,
233
- createdAt: props.createdAt !== undefined ? {
234
- set: props.createdAt
235
- } : undefined,
236
- updatedAt: props.updatedAt !== undefined ? {
237
- set: props.updatedAt
238
- } : undefined,
239
- status: props.status !== undefined ? {
240
- set: props.status
241
- } : undefined,
242
- symbol: props.symbol !== undefined ? {
243
- set: props.symbol
244
- } : undefined,
245
- actions: props.actions ?
246
- Array.isArray(props.actions) && props.actions.length > 0 && props.actions.every((item) => typeof item === 'object' && ('id' in item || 'symbol' in item) && Object.keys(item).length === 1) ? {
247
- connect: props.actions.map((item) => ({
248
- id: item.id
249
- }))
250
- } : { upsert: props.actions.map((item) => ({
251
- where: {
252
- id: item.id !== undefined ? item.id : undefined,
253
- alpacaOrderId: item.alpacaOrderId !== undefined ? item.alpacaOrderId : undefined,
254
- tradeId: item.tradeId !== undefined ? {
255
- equals: item.tradeId
256
- } : undefined,
257
- },
258
- update: {
259
- id: item.id !== undefined ? {
260
- set: item.id
261
- } : undefined,
262
- sequence: item.sequence !== undefined ? {
263
- set: item.sequence
264
- } : undefined,
265
- type: item.type !== undefined ? {
266
- set: item.type
267
- } : undefined,
268
- primary: item.primary !== undefined ? {
269
- set: item.primary
270
- } : undefined,
271
- note: item.note !== undefined ? {
272
- set: item.note
273
- } : undefined,
274
- status: item.status !== undefined ? {
275
- set: item.status
276
- } : undefined,
277
- alpacaOrderId: item.alpacaOrderId !== undefined ? {
278
- set: item.alpacaOrderId
279
- } : undefined,
280
- },
281
- create: {
282
- sequence: item.sequence !== undefined ? item.sequence : undefined,
283
- type: item.type !== undefined ? item.type : undefined,
284
- primary: item.primary !== undefined ? item.primary : undefined,
285
- note: item.note !== undefined ? item.note : undefined,
286
- status: item.status !== undefined ? item.status : undefined,
287
- alpacaOrderId: item.alpacaOrderId !== undefined ? item.alpacaOrderId : undefined,
288
- },
289
- }))
290
- } : undefined,
291
- },
292
- };
293
- const filteredVariables = removeUndefinedProps(variables);
294
- try {
295
- const response = await client.mutate({ mutation: UPDATE_ONE_TRADE, variables: filteredVariables });
296
- if (response.errors && response.errors.length > 0)
297
- throw new Error(response.errors[0].message);
298
- if (response && response.data && response.data.updateOneTrade) {
299
- return response.data.updateOneTrade;
276
+ // Maximum number of retries for database connection issues
277
+ const MAX_RETRIES = 3;
278
+ let retryCount = 0;
279
+ let lastError = null;
280
+ // Retry loop to handle potential database connection issues
281
+ while (retryCount < MAX_RETRIES) {
282
+ try {
283
+ const [modules, client] = await Promise.all([
284
+ getApolloModules(),
285
+ globalClient
286
+ ? Promise.resolve(globalClient)
287
+ : importedClient
288
+ ]);
289
+ const { gql, ApolloError } = modules;
290
+ const UPDATE_ONE_TRADE = gql `
291
+ mutation updateOneTrade($data: TradeUpdateInput!, $where: TradeWhereUniqueInput!) {
292
+ updateOneTrade(data: $data, where: $where) {
293
+ ${selectionSet}
294
+ }
295
+ }`;
296
+ const variables = {
297
+ where: {
298
+ id: props.id !== undefined ? props.id : undefined,
299
+ alpacaAccountId: props.alpacaAccountId !== undefined ? {
300
+ equals: props.alpacaAccountId
301
+ } : undefined,
302
+ symbol: props.symbol !== undefined ? {
303
+ equals: props.symbol
304
+ } : undefined,
305
+ },
306
+ data: {
307
+ id: props.id !== undefined ? {
308
+ set: props.id
309
+ } : undefined,
310
+ alpacaAccountId: props.alpacaAccountId !== undefined ? {
311
+ set: props.alpacaAccountId
312
+ } : undefined,
313
+ signal: props.signal !== undefined ? {
314
+ set: props.signal
315
+ } : undefined,
316
+ strategy: props.strategy !== undefined ? {
317
+ set: props.strategy
318
+ } : undefined,
319
+ analysis: props.analysis !== undefined ? {
320
+ set: props.analysis
321
+ } : undefined,
322
+ summary: props.summary !== undefined ? {
323
+ set: props.summary
324
+ } : undefined,
325
+ confidence: props.confidence !== undefined ? {
326
+ set: props.confidence
327
+ } : undefined,
328
+ timestamp: props.timestamp !== undefined ? {
329
+ set: props.timestamp
330
+ } : undefined,
331
+ createdAt: props.createdAt !== undefined ? {
332
+ set: props.createdAt
333
+ } : undefined,
334
+ updatedAt: props.updatedAt !== undefined ? {
335
+ set: props.updatedAt
336
+ } : undefined,
337
+ status: props.status !== undefined ? {
338
+ set: props.status
339
+ } : undefined,
340
+ symbol: props.symbol !== undefined ? {
341
+ set: props.symbol
342
+ } : undefined,
343
+ entryPrice: props.entryPrice !== undefined ? {
344
+ set: props.entryPrice
345
+ } : undefined,
346
+ exitPrice: props.exitPrice !== undefined ? {
347
+ set: props.exitPrice
348
+ } : undefined,
349
+ entryQty: props.entryQty !== undefined ? {
350
+ set: props.entryQty
351
+ } : undefined,
352
+ exitQty: props.exitQty !== undefined ? {
353
+ set: props.exitQty
354
+ } : undefined,
355
+ entryValue: props.entryValue !== undefined ? {
356
+ set: props.entryValue
357
+ } : undefined,
358
+ exitValue: props.exitValue !== undefined ? {
359
+ set: props.exitValue
360
+ } : undefined,
361
+ entryTime: props.entryTime !== undefined ? {
362
+ set: props.entryTime
363
+ } : undefined,
364
+ exitTime: props.exitTime !== undefined ? {
365
+ set: props.exitTime
366
+ } : undefined,
367
+ pnlAmount: props.pnlAmount !== undefined ? {
368
+ set: props.pnlAmount
369
+ } : undefined,
370
+ pnlPercent: props.pnlPercent !== undefined ? {
371
+ set: props.pnlPercent
372
+ } : undefined,
373
+ durationMinutes: props.durationMinutes !== undefined ? {
374
+ set: props.durationMinutes
375
+ } : undefined,
376
+ marketPhase: props.marketPhase !== undefined ? {
377
+ set: props.marketPhase
378
+ } : undefined,
379
+ marketVolatility: props.marketVolatility !== undefined ? {
380
+ set: props.marketVolatility
381
+ } : undefined,
382
+ thresholdsJson: props.thresholdsJson !== undefined ? {
383
+ set: props.thresholdsJson
384
+ } : undefined,
385
+ actions: props.actions ?
386
+ Array.isArray(props.actions) && props.actions.length > 0 && props.actions.every((item) => typeof item === 'object' && ('id' in item || 'symbol' in item) && Object.keys(item).length === 1) ? {
387
+ connect: props.actions.map((item) => ({
388
+ id: item.id
389
+ }))
390
+ } : { upsert: props.actions.map((item) => ({
391
+ where: {
392
+ id: item.id !== undefined ? item.id : undefined,
393
+ alpacaOrderId: item.alpacaOrderId !== undefined ? item.alpacaOrderId : undefined,
394
+ tradeId: item.tradeId !== undefined ? {
395
+ equals: item.tradeId
396
+ } : undefined,
397
+ },
398
+ update: {
399
+ id: item.id !== undefined ? {
400
+ set: item.id
401
+ } : undefined,
402
+ sequence: item.sequence !== undefined ? {
403
+ set: item.sequence
404
+ } : undefined,
405
+ type: item.type !== undefined ? {
406
+ set: item.type
407
+ } : undefined,
408
+ primary: item.primary !== undefined ? {
409
+ set: item.primary
410
+ } : undefined,
411
+ note: item.note !== undefined ? {
412
+ set: item.note
413
+ } : undefined,
414
+ status: item.status !== undefined ? {
415
+ set: item.status
416
+ } : undefined,
417
+ alpacaOrderId: item.alpacaOrderId !== undefined ? {
418
+ set: item.alpacaOrderId
419
+ } : undefined,
420
+ },
421
+ create: {
422
+ sequence: item.sequence !== undefined ? item.sequence : undefined,
423
+ type: item.type !== undefined ? item.type : undefined,
424
+ primary: item.primary !== undefined ? item.primary : undefined,
425
+ note: item.note !== undefined ? item.note : undefined,
426
+ status: item.status !== undefined ? item.status : undefined,
427
+ alpacaOrderId: item.alpacaOrderId !== undefined ? item.alpacaOrderId : undefined,
428
+ },
429
+ }))
430
+ } : undefined,
431
+ },
432
+ };
433
+ const filteredVariables = removeUndefinedProps(variables);
434
+ const response = await client.mutate({
435
+ mutation: UPDATE_ONE_TRADE,
436
+ variables: filteredVariables,
437
+ // Don't cache mutations, but ensure we're using the freshest context
438
+ fetchPolicy: 'no-cache'
439
+ });
440
+ if (response.errors && response.errors.length > 0)
441
+ throw new Error(response.errors[0].message);
442
+ if (response && response.data && response.data.updateOneTrade) {
443
+ return response.data.updateOneTrade;
444
+ }
445
+ else {
446
+ return null;
447
+ }
300
448
  }
301
- else {
302
- return null;
449
+ catch (error) {
450
+ lastError = error;
451
+ // Check if this is a database connection error that we should retry
452
+ const isConnectionError = error.message?.includes('Server has closed the connection') ||
453
+ error.message?.includes('Cannot reach database server') ||
454
+ error.message?.includes('Connection timed out') ||
455
+ error.message?.includes('Accelerate') || // Prisma Accelerate proxy errors
456
+ (error.networkError && error.networkError.message?.includes('Failed to fetch'));
457
+ if (isConnectionError && retryCount < MAX_RETRIES - 1) {
458
+ retryCount++;
459
+ const delay = Math.pow(2, retryCount) * 100; // Exponential backoff: 200ms, 400ms, 800ms
460
+ console.warn("Database connection error, retrying...");
461
+ await new Promise(resolve => setTimeout(resolve, delay));
462
+ continue;
463
+ }
464
+ // Log the error and rethrow
465
+ console.error("Database error occurred:", error);
466
+ throw error;
303
467
  }
304
468
  }
305
- catch (error) {
306
- console.error('Error in updateOneTrade:', error);
307
- throw error;
308
- }
469
+ // If we exhausted retries, throw the last error
470
+ throw lastError;
309
471
  },
310
472
  /**
311
473
  * Upsert a single Trade record.
474
+ * Enhanced with connection resilience against Prisma connection errors.
312
475
  * @param props - Properties to update.
313
476
  * @param globalClient - Apollo Client instance.
314
477
  * @returns The updated Trade or null.
315
478
  */
316
479
  async upsert(props, globalClient) {
317
- const [modules, client] = await Promise.all([
318
- getApolloModules(),
319
- globalClient
320
- ? Promise.resolve(globalClient)
321
- : importedClient
322
- ]);
323
- const { gql, ApolloError } = modules;
324
- const UPSERT_ONE_TRADE = gql `
325
- mutation upsertOneTrade($where: TradeWhereUniqueInput!, $create: TradeCreateInput!, $update: TradeUpdateInput!) {
326
- upsertOneTrade(where: $where, create: $create, update: $update) {
327
- ${selectionSet}
328
- }
329
- }`;
330
- const variables = {
331
- where: {
332
- id: props.id !== undefined ? props.id : undefined,
333
- alpacaAccountId: props.alpacaAccountId !== undefined ? {
334
- equals: props.alpacaAccountId
335
- } : undefined,
336
- symbol: props.symbol !== undefined ? {
337
- equals: props.symbol
338
- } : undefined,
339
- },
340
- create: {
341
- alpacaAccountId: props.alpacaAccountId !== undefined ? props.alpacaAccountId : undefined,
342
- qty: props.qty !== undefined ? props.qty : undefined,
343
- price: props.price !== undefined ? props.price : undefined,
344
- total: props.total !== undefined ? props.total : undefined,
345
- signal: props.signal !== undefined ? props.signal : undefined,
346
- strategy: props.strategy !== undefined ? props.strategy : undefined,
347
- analysis: props.analysis !== undefined ? props.analysis : undefined,
348
- summary: props.summary !== undefined ? props.summary : undefined,
349
- confidence: props.confidence !== undefined ? props.confidence : undefined,
350
- timestamp: props.timestamp !== undefined ? props.timestamp : undefined,
351
- status: props.status !== undefined ? props.status : undefined,
352
- symbol: props.symbol !== undefined ? props.symbol : undefined,
353
- actions: props.actions ?
354
- Array.isArray(props.actions) && props.actions.length > 0 && props.actions.every((item) => typeof item === 'object' && 'id' in item && Object.keys(item).length === 1) ? {
355
- connect: props.actions.map((item) => ({
356
- id: item.id
357
- }))
358
- }
359
- : { connectOrCreate: props.actions.map((item) => ({
360
- where: {
361
- id: item.id !== undefined ? item.id : undefined,
362
- alpacaOrderId: item.alpacaOrderId !== undefined ? item.alpacaOrderId : undefined,
363
- tradeId: item.tradeId !== undefined ? {
364
- equals: item.tradeId
365
- } : undefined,
366
- },
367
- create: {
368
- sequence: item.sequence !== undefined ? item.sequence : undefined,
369
- type: item.type !== undefined ? item.type : undefined,
370
- primary: item.primary !== undefined ? item.primary : undefined,
371
- note: item.note !== undefined ? item.note : undefined,
372
- status: item.status !== undefined ? item.status : undefined,
373
- alpacaOrderId: item.alpacaOrderId !== undefined ? item.alpacaOrderId : undefined,
374
- },
375
- }))
376
- } : undefined,
377
- },
378
- update: {
379
- alpacaAccountId: props.alpacaAccountId !== undefined ? {
380
- set: props.alpacaAccountId
381
- } : undefined,
382
- qty: props.qty !== undefined ? {
383
- set: props.qty
384
- } : undefined,
385
- price: props.price !== undefined ? {
386
- set: props.price
387
- } : undefined,
388
- total: props.total !== undefined ? {
389
- set: props.total
390
- } : undefined,
391
- signal: props.signal !== undefined ? {
392
- set: props.signal
393
- } : undefined,
394
- strategy: props.strategy !== undefined ? {
395
- set: props.strategy
396
- } : undefined,
397
- analysis: props.analysis !== undefined ? {
398
- set: props.analysis
399
- } : undefined,
400
- summary: props.summary !== undefined ? {
401
- set: props.summary
402
- } : undefined,
403
- confidence: props.confidence !== undefined ? {
404
- set: props.confidence
405
- } : undefined,
406
- timestamp: props.timestamp !== undefined ? {
407
- set: props.timestamp
408
- } : undefined,
409
- status: props.status !== undefined ? {
410
- set: props.status
411
- } : undefined,
412
- symbol: props.symbol !== undefined ? {
413
- set: props.symbol
414
- } : undefined,
415
- actions: props.actions ?
416
- Array.isArray(props.actions) && props.actions.length > 0 && props.actions.every((item) => typeof item === 'object' && ('id' in item || 'symbol' in item) && Object.keys(item).length === 1) ? {
417
- connect: props.actions.map((item) => ({
418
- id: item.id
419
- }))
420
- } : { upsert: props.actions.map((item) => ({
421
- where: {
422
- id: item.id !== undefined ? item.id : undefined,
423
- alpacaOrderId: item.alpacaOrderId !== undefined ? item.alpacaOrderId : undefined,
424
- tradeId: item.tradeId !== undefined ? {
425
- equals: item.tradeId
426
- } : undefined,
427
- },
428
- update: {
429
- id: item.id !== undefined ? {
430
- set: item.id
431
- } : undefined,
432
- sequence: item.sequence !== undefined ? {
433
- set: item.sequence
434
- } : undefined,
435
- type: item.type !== undefined ? {
436
- set: item.type
437
- } : undefined,
438
- primary: item.primary !== undefined ? {
439
- set: item.primary
440
- } : undefined,
441
- note: item.note !== undefined ? {
442
- set: item.note
443
- } : undefined,
444
- status: item.status !== undefined ? {
445
- set: item.status
446
- } : undefined,
447
- alpacaOrderId: item.alpacaOrderId !== undefined ? {
448
- set: item.alpacaOrderId
480
+ // Maximum number of retries for database connection issues
481
+ const MAX_RETRIES = 3;
482
+ let retryCount = 0;
483
+ let lastError = null;
484
+ // Retry loop to handle potential database connection issues
485
+ while (retryCount < MAX_RETRIES) {
486
+ try {
487
+ const [modules, client] = await Promise.all([
488
+ getApolloModules(),
489
+ globalClient
490
+ ? Promise.resolve(globalClient)
491
+ : importedClient
492
+ ]);
493
+ const { gql, ApolloError } = modules;
494
+ const UPSERT_ONE_TRADE = gql `
495
+ mutation upsertOneTrade($where: TradeWhereUniqueInput!, $create: TradeCreateInput!, $update: TradeUpdateInput!) {
496
+ upsertOneTrade(where: $where, create: $create, update: $update) {
497
+ ${selectionSet}
498
+ }
499
+ }`;
500
+ const variables = {
501
+ where: {
502
+ id: props.id !== undefined ? props.id : undefined,
503
+ alpacaAccountId: props.alpacaAccountId !== undefined ? {
504
+ equals: props.alpacaAccountId
505
+ } : undefined,
506
+ symbol: props.symbol !== undefined ? {
507
+ equals: props.symbol
508
+ } : undefined,
509
+ },
510
+ create: {
511
+ alpacaAccountId: props.alpacaAccountId !== undefined ? props.alpacaAccountId : undefined,
512
+ signal: props.signal !== undefined ? props.signal : undefined,
513
+ strategy: props.strategy !== undefined ? props.strategy : undefined,
514
+ analysis: props.analysis !== undefined ? props.analysis : undefined,
515
+ summary: props.summary !== undefined ? props.summary : undefined,
516
+ confidence: props.confidence !== undefined ? props.confidence : undefined,
517
+ timestamp: props.timestamp !== undefined ? props.timestamp : undefined,
518
+ status: props.status !== undefined ? props.status : undefined,
519
+ symbol: props.symbol !== undefined ? props.symbol : undefined,
520
+ entryPrice: props.entryPrice !== undefined ? props.entryPrice : undefined,
521
+ exitPrice: props.exitPrice !== undefined ? props.exitPrice : undefined,
522
+ entryQty: props.entryQty !== undefined ? props.entryQty : undefined,
523
+ exitQty: props.exitQty !== undefined ? props.exitQty : undefined,
524
+ entryValue: props.entryValue !== undefined ? props.entryValue : undefined,
525
+ exitValue: props.exitValue !== undefined ? props.exitValue : undefined,
526
+ entryTime: props.entryTime !== undefined ? props.entryTime : undefined,
527
+ exitTime: props.exitTime !== undefined ? props.exitTime : undefined,
528
+ pnlAmount: props.pnlAmount !== undefined ? props.pnlAmount : undefined,
529
+ pnlPercent: props.pnlPercent !== undefined ? props.pnlPercent : undefined,
530
+ durationMinutes: props.durationMinutes !== undefined ? props.durationMinutes : undefined,
531
+ marketPhase: props.marketPhase !== undefined ? props.marketPhase : undefined,
532
+ marketVolatility: props.marketVolatility !== undefined ? props.marketVolatility : undefined,
533
+ thresholdsJson: props.thresholdsJson !== undefined ? props.thresholdsJson : undefined,
534
+ actions: props.actions ?
535
+ Array.isArray(props.actions) && props.actions.length > 0 && props.actions.every((item) => typeof item === 'object' && 'id' in item && Object.keys(item).length === 1) ? {
536
+ connect: props.actions.map((item) => ({
537
+ id: item.id
538
+ }))
539
+ }
540
+ : { connectOrCreate: props.actions.map((item) => ({
541
+ where: {
542
+ id: item.id !== undefined ? item.id : undefined,
543
+ alpacaOrderId: item.alpacaOrderId !== undefined ? item.alpacaOrderId : undefined,
544
+ tradeId: item.tradeId !== undefined ? {
545
+ equals: item.tradeId
546
+ } : undefined,
547
+ },
548
+ create: {
549
+ sequence: item.sequence !== undefined ? item.sequence : undefined,
550
+ type: item.type !== undefined ? item.type : undefined,
551
+ primary: item.primary !== undefined ? item.primary : undefined,
552
+ note: item.note !== undefined ? item.note : undefined,
553
+ status: item.status !== undefined ? item.status : undefined,
554
+ alpacaOrderId: item.alpacaOrderId !== undefined ? item.alpacaOrderId : undefined,
555
+ },
556
+ }))
449
557
  } : undefined,
450
- },
451
- create: {
452
- sequence: item.sequence !== undefined ? item.sequence : undefined,
453
- type: item.type !== undefined ? item.type : undefined,
454
- primary: item.primary !== undefined ? item.primary : undefined,
455
- note: item.note !== undefined ? item.note : undefined,
456
- status: item.status !== undefined ? item.status : undefined,
457
- alpacaOrderId: item.alpacaOrderId !== undefined ? item.alpacaOrderId : undefined,
458
- },
459
- }))
460
- } : undefined,
461
- },
462
- };
463
- const filteredVariables = removeUndefinedProps(variables);
464
- try {
465
- const response = await client.mutate({ mutation: UPSERT_ONE_TRADE, variables: filteredVariables });
466
- if (response.errors && response.errors.length > 0)
467
- throw new Error(response.errors[0].message);
468
- if (response && response.data && response.data.upsertOneTrade) {
469
- return response.data.upsertOneTrade;
558
+ },
559
+ update: {
560
+ alpacaAccountId: props.alpacaAccountId !== undefined ? {
561
+ set: props.alpacaAccountId
562
+ } : undefined,
563
+ signal: props.signal !== undefined ? {
564
+ set: props.signal
565
+ } : undefined,
566
+ strategy: props.strategy !== undefined ? {
567
+ set: props.strategy
568
+ } : undefined,
569
+ analysis: props.analysis !== undefined ? {
570
+ set: props.analysis
571
+ } : undefined,
572
+ summary: props.summary !== undefined ? {
573
+ set: props.summary
574
+ } : undefined,
575
+ confidence: props.confidence !== undefined ? {
576
+ set: props.confidence
577
+ } : undefined,
578
+ timestamp: props.timestamp !== undefined ? {
579
+ set: props.timestamp
580
+ } : undefined,
581
+ status: props.status !== undefined ? {
582
+ set: props.status
583
+ } : undefined,
584
+ symbol: props.symbol !== undefined ? {
585
+ set: props.symbol
586
+ } : undefined,
587
+ entryPrice: props.entryPrice !== undefined ? {
588
+ set: props.entryPrice
589
+ } : undefined,
590
+ exitPrice: props.exitPrice !== undefined ? {
591
+ set: props.exitPrice
592
+ } : undefined,
593
+ entryQty: props.entryQty !== undefined ? {
594
+ set: props.entryQty
595
+ } : undefined,
596
+ exitQty: props.exitQty !== undefined ? {
597
+ set: props.exitQty
598
+ } : undefined,
599
+ entryValue: props.entryValue !== undefined ? {
600
+ set: props.entryValue
601
+ } : undefined,
602
+ exitValue: props.exitValue !== undefined ? {
603
+ set: props.exitValue
604
+ } : undefined,
605
+ entryTime: props.entryTime !== undefined ? {
606
+ set: props.entryTime
607
+ } : undefined,
608
+ exitTime: props.exitTime !== undefined ? {
609
+ set: props.exitTime
610
+ } : undefined,
611
+ pnlAmount: props.pnlAmount !== undefined ? {
612
+ set: props.pnlAmount
613
+ } : undefined,
614
+ pnlPercent: props.pnlPercent !== undefined ? {
615
+ set: props.pnlPercent
616
+ } : undefined,
617
+ durationMinutes: props.durationMinutes !== undefined ? {
618
+ set: props.durationMinutes
619
+ } : undefined,
620
+ marketPhase: props.marketPhase !== undefined ? {
621
+ set: props.marketPhase
622
+ } : undefined,
623
+ marketVolatility: props.marketVolatility !== undefined ? {
624
+ set: props.marketVolatility
625
+ } : undefined,
626
+ thresholdsJson: props.thresholdsJson !== undefined ? {
627
+ set: props.thresholdsJson
628
+ } : undefined,
629
+ actions: props.actions ?
630
+ Array.isArray(props.actions) && props.actions.length > 0 && props.actions.every((item) => typeof item === 'object' && ('id' in item || 'symbol' in item) && Object.keys(item).length === 1) ? {
631
+ connect: props.actions.map((item) => ({
632
+ id: item.id
633
+ }))
634
+ } : { upsert: props.actions.map((item) => ({
635
+ where: {
636
+ id: item.id !== undefined ? item.id : undefined,
637
+ alpacaOrderId: item.alpacaOrderId !== undefined ? item.alpacaOrderId : undefined,
638
+ tradeId: item.tradeId !== undefined ? {
639
+ equals: item.tradeId
640
+ } : undefined,
641
+ },
642
+ update: {
643
+ id: item.id !== undefined ? {
644
+ set: item.id
645
+ } : undefined,
646
+ sequence: item.sequence !== undefined ? {
647
+ set: item.sequence
648
+ } : undefined,
649
+ type: item.type !== undefined ? {
650
+ set: item.type
651
+ } : undefined,
652
+ primary: item.primary !== undefined ? {
653
+ set: item.primary
654
+ } : undefined,
655
+ note: item.note !== undefined ? {
656
+ set: item.note
657
+ } : undefined,
658
+ status: item.status !== undefined ? {
659
+ set: item.status
660
+ } : undefined,
661
+ alpacaOrderId: item.alpacaOrderId !== undefined ? {
662
+ set: item.alpacaOrderId
663
+ } : undefined,
664
+ },
665
+ create: {
666
+ sequence: item.sequence !== undefined ? item.sequence : undefined,
667
+ type: item.type !== undefined ? item.type : undefined,
668
+ primary: item.primary !== undefined ? item.primary : undefined,
669
+ note: item.note !== undefined ? item.note : undefined,
670
+ status: item.status !== undefined ? item.status : undefined,
671
+ alpacaOrderId: item.alpacaOrderId !== undefined ? item.alpacaOrderId : undefined,
672
+ },
673
+ }))
674
+ } : undefined,
675
+ },
676
+ };
677
+ const filteredVariables = removeUndefinedProps(variables);
678
+ const response = await client.mutate({
679
+ mutation: UPSERT_ONE_TRADE,
680
+ variables: filteredVariables,
681
+ // Don't cache mutations, but ensure we're using the freshest context
682
+ fetchPolicy: 'no-cache'
683
+ });
684
+ if (response.errors && response.errors.length > 0)
685
+ throw new Error(response.errors[0].message);
686
+ if (response && response.data && response.data.upsertOneTrade) {
687
+ return response.data.upsertOneTrade;
688
+ }
689
+ else {
690
+ return null;
691
+ }
470
692
  }
471
- else {
472
- return null;
693
+ catch (error) {
694
+ lastError = error;
695
+ // Check if this is a database connection error that we should retry
696
+ const isConnectionError = error.message?.includes('Server has closed the connection') ||
697
+ error.message?.includes('Cannot reach database server') ||
698
+ error.message?.includes('Connection timed out') ||
699
+ error.message?.includes('Accelerate') || // Prisma Accelerate proxy errors
700
+ (error.networkError && error.networkError.message?.includes('Failed to fetch'));
701
+ if (isConnectionError && retryCount < MAX_RETRIES - 1) {
702
+ retryCount++;
703
+ const delay = Math.pow(2, retryCount) * 100; // Exponential backoff: 200ms, 400ms, 800ms
704
+ console.warn("Database connection error, retrying...");
705
+ await new Promise(resolve => setTimeout(resolve, delay));
706
+ continue;
707
+ }
708
+ // Log the error and rethrow
709
+ console.error("Database error occurred:", error);
710
+ throw error;
473
711
  }
474
712
  }
475
- catch (error) {
476
- console.error('Error in upsertOneTrade:', error);
477
- throw error;
478
- }
713
+ // If we exhausted retries, throw the last error
714
+ throw lastError;
479
715
  },
480
716
  /**
481
717
  * Update multiple Trade records.
718
+ * Enhanced with connection resilience against Prisma connection errors.
482
719
  * @param props - Array of Trade objects for the updated records.
483
720
  * @param globalClient - Apollo Client instance.
484
721
  * @returns The count of created records or null.
485
722
  */
486
723
  async updateMany(props, globalClient) {
487
- const [modules, client] = await Promise.all([
488
- getApolloModules(),
489
- globalClient
490
- ? Promise.resolve(globalClient)
491
- : importedClient
492
- ]);
493
- const { gql, ApolloError } = modules;
494
- const UPDATE_MANY_TRADE = gql `
495
- mutation updateManyTrade($data: [TradeCreateManyInput!]!) {
496
- updateManyTrade(data: $data) {
497
- count
498
- }
499
- }`;
500
- const variables = props.map(prop => ({
501
- where: {
502
- id: prop.id !== undefined ? prop.id : undefined,
503
- alpacaAccountId: prop.alpacaAccountId !== undefined ? {
504
- equals: prop.alpacaAccountId
505
- } : undefined,
506
- symbol: prop.symbol !== undefined ? {
507
- equals: prop.symbol
508
- } : undefined,
509
- },
510
- data: {
511
- id: prop.id !== undefined ? {
512
- set: prop.id
513
- } : undefined,
514
- alpacaAccountId: prop.alpacaAccountId !== undefined ? {
515
- set: prop.alpacaAccountId
516
- } : undefined,
517
- qty: prop.qty !== undefined ? {
518
- set: prop.qty
519
- } : undefined,
520
- price: prop.price !== undefined ? {
521
- set: prop.price
522
- } : undefined,
523
- total: prop.total !== undefined ? {
524
- set: prop.total
525
- } : undefined,
526
- signal: prop.signal !== undefined ? {
527
- set: prop.signal
528
- } : undefined,
529
- strategy: prop.strategy !== undefined ? {
530
- set: prop.strategy
531
- } : undefined,
532
- analysis: prop.analysis !== undefined ? {
533
- set: prop.analysis
534
- } : undefined,
535
- summary: prop.summary !== undefined ? {
536
- set: prop.summary
537
- } : undefined,
538
- confidence: prop.confidence !== undefined ? {
539
- set: prop.confidence
540
- } : undefined,
541
- timestamp: prop.timestamp !== undefined ? {
542
- set: prop.timestamp
543
- } : undefined,
544
- createdAt: prop.createdAt !== undefined ? {
545
- set: prop.createdAt
546
- } : undefined,
547
- updatedAt: prop.updatedAt !== undefined ? {
548
- set: prop.updatedAt
549
- } : undefined,
550
- status: prop.status !== undefined ? {
551
- set: prop.status
552
- } : undefined,
553
- symbol: prop.symbol !== undefined ? {
554
- set: prop.symbol
555
- } : undefined,
556
- actions: prop.actions ?
557
- Array.isArray(prop.actions) && prop.actions.length > 0 && prop.actions.every((item) => typeof item === 'object' && ('id' in item || 'symbol' in item) && Object.keys(item).length === 1) ? {
558
- connect: prop.actions.map((item) => ({
559
- id: item.id
560
- }))
561
- } : { upsert: prop.actions.map((item) => ({
562
- where: {
563
- id: item.id !== undefined ? item.id : undefined,
564
- alpacaOrderId: item.alpacaOrderId !== undefined ? item.alpacaOrderId : undefined,
565
- tradeId: item.tradeId !== undefined ? {
566
- equals: item.tradeId
567
- } : undefined,
568
- },
569
- update: {
570
- id: item.id !== undefined ? {
571
- set: item.id
572
- } : undefined,
573
- sequence: item.sequence !== undefined ? {
574
- set: item.sequence
575
- } : undefined,
576
- type: item.type !== undefined ? {
577
- set: item.type
578
- } : undefined,
579
- primary: item.primary !== undefined ? {
580
- set: item.primary
581
- } : undefined,
582
- note: item.note !== undefined ? {
583
- set: item.note
584
- } : undefined,
585
- status: item.status !== undefined ? {
586
- set: item.status
587
- } : undefined,
588
- alpacaOrderId: item.alpacaOrderId !== undefined ? {
589
- set: item.alpacaOrderId
590
- } : undefined,
591
- },
592
- create: {
593
- sequence: item.sequence !== undefined ? item.sequence : undefined,
594
- type: item.type !== undefined ? item.type : undefined,
595
- primary: item.primary !== undefined ? item.primary : undefined,
596
- note: item.note !== undefined ? item.note : undefined,
597
- status: item.status !== undefined ? item.status : undefined,
598
- alpacaOrderId: item.alpacaOrderId !== undefined ? item.alpacaOrderId : undefined,
599
- },
600
- }))
601
- } : undefined,
602
- },
603
- }));
604
- const filteredVariables = removeUndefinedProps(variables);
605
- try {
606
- const response = await client.mutate({ mutation: UPDATE_MANY_TRADE, variables: filteredVariables });
607
- if (response.errors && response.errors.length > 0)
608
- throw new Error(response.errors[0].message);
609
- if (response && response.data && response.data.updateManyTrade) {
610
- return response.data.updateManyTrade;
724
+ // Maximum number of retries for database connection issues
725
+ const MAX_RETRIES = 3;
726
+ let retryCount = 0;
727
+ let lastError = null;
728
+ // Retry loop to handle potential database connection issues
729
+ while (retryCount < MAX_RETRIES) {
730
+ try {
731
+ const [modules, client] = await Promise.all([
732
+ getApolloModules(),
733
+ globalClient
734
+ ? Promise.resolve(globalClient)
735
+ : importedClient
736
+ ]);
737
+ const { gql, ApolloError } = modules;
738
+ const UPDATE_MANY_TRADE = gql `
739
+ mutation updateManyTrade($data: [TradeCreateManyInput!]!) {
740
+ updateManyTrade(data: $data) {
741
+ count
742
+ }
743
+ }`;
744
+ const variables = props.map(prop => ({
745
+ where: {
746
+ id: prop.id !== undefined ? prop.id : undefined,
747
+ alpacaAccountId: prop.alpacaAccountId !== undefined ? {
748
+ equals: prop.alpacaAccountId
749
+ } : undefined,
750
+ symbol: prop.symbol !== undefined ? {
751
+ equals: prop.symbol
752
+ } : undefined,
753
+ },
754
+ data: {
755
+ id: prop.id !== undefined ? {
756
+ set: prop.id
757
+ } : undefined,
758
+ alpacaAccountId: prop.alpacaAccountId !== undefined ? {
759
+ set: prop.alpacaAccountId
760
+ } : undefined,
761
+ signal: prop.signal !== undefined ? {
762
+ set: prop.signal
763
+ } : undefined,
764
+ strategy: prop.strategy !== undefined ? {
765
+ set: prop.strategy
766
+ } : undefined,
767
+ analysis: prop.analysis !== undefined ? {
768
+ set: prop.analysis
769
+ } : undefined,
770
+ summary: prop.summary !== undefined ? {
771
+ set: prop.summary
772
+ } : undefined,
773
+ confidence: prop.confidence !== undefined ? {
774
+ set: prop.confidence
775
+ } : undefined,
776
+ timestamp: prop.timestamp !== undefined ? {
777
+ set: prop.timestamp
778
+ } : undefined,
779
+ createdAt: prop.createdAt !== undefined ? {
780
+ set: prop.createdAt
781
+ } : undefined,
782
+ updatedAt: prop.updatedAt !== undefined ? {
783
+ set: prop.updatedAt
784
+ } : undefined,
785
+ status: prop.status !== undefined ? {
786
+ set: prop.status
787
+ } : undefined,
788
+ symbol: prop.symbol !== undefined ? {
789
+ set: prop.symbol
790
+ } : undefined,
791
+ entryPrice: prop.entryPrice !== undefined ? {
792
+ set: prop.entryPrice
793
+ } : undefined,
794
+ exitPrice: prop.exitPrice !== undefined ? {
795
+ set: prop.exitPrice
796
+ } : undefined,
797
+ entryQty: prop.entryQty !== undefined ? {
798
+ set: prop.entryQty
799
+ } : undefined,
800
+ exitQty: prop.exitQty !== undefined ? {
801
+ set: prop.exitQty
802
+ } : undefined,
803
+ entryValue: prop.entryValue !== undefined ? {
804
+ set: prop.entryValue
805
+ } : undefined,
806
+ exitValue: prop.exitValue !== undefined ? {
807
+ set: prop.exitValue
808
+ } : undefined,
809
+ entryTime: prop.entryTime !== undefined ? {
810
+ set: prop.entryTime
811
+ } : undefined,
812
+ exitTime: prop.exitTime !== undefined ? {
813
+ set: prop.exitTime
814
+ } : undefined,
815
+ pnlAmount: prop.pnlAmount !== undefined ? {
816
+ set: prop.pnlAmount
817
+ } : undefined,
818
+ pnlPercent: prop.pnlPercent !== undefined ? {
819
+ set: prop.pnlPercent
820
+ } : undefined,
821
+ durationMinutes: prop.durationMinutes !== undefined ? {
822
+ set: prop.durationMinutes
823
+ } : undefined,
824
+ marketPhase: prop.marketPhase !== undefined ? {
825
+ set: prop.marketPhase
826
+ } : undefined,
827
+ marketVolatility: prop.marketVolatility !== undefined ? {
828
+ set: prop.marketVolatility
829
+ } : undefined,
830
+ thresholdsJson: prop.thresholdsJson !== undefined ? {
831
+ set: prop.thresholdsJson
832
+ } : undefined,
833
+ actions: prop.actions ?
834
+ Array.isArray(prop.actions) && prop.actions.length > 0 && prop.actions.every((item) => typeof item === 'object' && ('id' in item || 'symbol' in item) && Object.keys(item).length === 1) ? {
835
+ connect: prop.actions.map((item) => ({
836
+ id: item.id
837
+ }))
838
+ } : { upsert: prop.actions.map((item) => ({
839
+ where: {
840
+ id: item.id !== undefined ? item.id : undefined,
841
+ alpacaOrderId: item.alpacaOrderId !== undefined ? item.alpacaOrderId : undefined,
842
+ tradeId: item.tradeId !== undefined ? {
843
+ equals: item.tradeId
844
+ } : undefined,
845
+ },
846
+ update: {
847
+ id: item.id !== undefined ? {
848
+ set: item.id
849
+ } : undefined,
850
+ sequence: item.sequence !== undefined ? {
851
+ set: item.sequence
852
+ } : undefined,
853
+ type: item.type !== undefined ? {
854
+ set: item.type
855
+ } : undefined,
856
+ primary: item.primary !== undefined ? {
857
+ set: item.primary
858
+ } : undefined,
859
+ note: item.note !== undefined ? {
860
+ set: item.note
861
+ } : undefined,
862
+ status: item.status !== undefined ? {
863
+ set: item.status
864
+ } : undefined,
865
+ alpacaOrderId: item.alpacaOrderId !== undefined ? {
866
+ set: item.alpacaOrderId
867
+ } : undefined,
868
+ },
869
+ create: {
870
+ sequence: item.sequence !== undefined ? item.sequence : undefined,
871
+ type: item.type !== undefined ? item.type : undefined,
872
+ primary: item.primary !== undefined ? item.primary : undefined,
873
+ note: item.note !== undefined ? item.note : undefined,
874
+ status: item.status !== undefined ? item.status : undefined,
875
+ alpacaOrderId: item.alpacaOrderId !== undefined ? item.alpacaOrderId : undefined,
876
+ },
877
+ }))
878
+ } : undefined,
879
+ },
880
+ }));
881
+ const filteredVariables = removeUndefinedProps(variables);
882
+ const response = await client.mutate({
883
+ mutation: UPDATE_MANY_TRADE,
884
+ variables: filteredVariables,
885
+ // Don't cache mutations, but ensure we're using the freshest context
886
+ fetchPolicy: 'no-cache'
887
+ });
888
+ if (response.errors && response.errors.length > 0)
889
+ throw new Error(response.errors[0].message);
890
+ if (response && response.data && response.data.updateManyTrade) {
891
+ return response.data.updateManyTrade;
892
+ }
893
+ else {
894
+ return null;
895
+ }
611
896
  }
612
- else {
613
- return null;
897
+ catch (error) {
898
+ lastError = error;
899
+ // Check if this is a database connection error that we should retry
900
+ const isConnectionError = error.message?.includes('Server has closed the connection') ||
901
+ error.message?.includes('Cannot reach database server') ||
902
+ error.message?.includes('Connection timed out') ||
903
+ error.message?.includes('Accelerate') || // Prisma Accelerate proxy errors
904
+ (error.networkError && error.networkError.message?.includes('Failed to fetch'));
905
+ if (isConnectionError && retryCount < MAX_RETRIES - 1) {
906
+ retryCount++;
907
+ const delay = Math.pow(2, retryCount) * 100; // Exponential backoff: 200ms, 400ms, 800ms
908
+ console.warn("Database connection error, retrying...");
909
+ await new Promise(resolve => setTimeout(resolve, delay));
910
+ continue;
911
+ }
912
+ // Log the error and rethrow
913
+ console.error("Database error occurred:", error);
914
+ throw error;
614
915
  }
615
916
  }
616
- catch (error) {
617
- console.error('Error in updateManyTrade:', error);
618
- throw error;
619
- }
917
+ // If we exhausted retries, throw the last error
918
+ throw lastError;
620
919
  },
621
920
  /**
622
921
  * Delete a single Trade record.
623
- * @param props - Properties to update.
922
+ * Enhanced with connection resilience against Prisma connection errors.
923
+ * @param props - Properties to identify the record to delete.
624
924
  * @param globalClient - Apollo Client instance.
625
925
  * @returns The deleted Trade or null.
626
926
  */
627
927
  async delete(props, globalClient) {
628
- const [modules, client] = await Promise.all([
629
- getApolloModules(),
630
- globalClient
631
- ? Promise.resolve(globalClient)
632
- : importedClient
633
- ]);
634
- const { gql, ApolloError } = modules;
635
- const DELETE_ONE_TRADE = gql `
636
- mutation deleteOneTrade($where: TradeWhereUniqueInput!) {
637
- deleteOneTrade(where: $where) {
638
- id
639
- }
640
- }`;
641
- const variables = {
642
- where: {
643
- id: props.id ? props.id : undefined,
928
+ // Maximum number of retries for database connection issues
929
+ const MAX_RETRIES = 3;
930
+ let retryCount = 0;
931
+ let lastError = null;
932
+ // Retry loop to handle potential database connection issues
933
+ while (retryCount < MAX_RETRIES) {
934
+ try {
935
+ const [modules, client] = await Promise.all([
936
+ getApolloModules(),
937
+ globalClient
938
+ ? Promise.resolve(globalClient)
939
+ : importedClient
940
+ ]);
941
+ const { gql, ApolloError } = modules;
942
+ const DELETE_ONE_TRADE = gql `
943
+ mutation deleteOneTrade($where: TradeWhereUniqueInput!) {
944
+ deleteOneTrade(where: $where) {
945
+ id
644
946
  }
645
- };
646
- const filteredVariables = removeUndefinedProps(variables);
647
- try {
648
- const response = await client.mutate({ mutation: DELETE_ONE_TRADE, variables: filteredVariables });
649
- if (response.errors && response.errors.length > 0)
650
- throw new Error(response.errors[0].message);
651
- if (response && response.data && response.data.deleteOneTrade) {
652
- return response.data.deleteOneTrade;
947
+ }`;
948
+ const variables = {
949
+ where: {
950
+ id: props.id ? props.id : undefined,
951
+ }
952
+ };
953
+ const filteredVariables = removeUndefinedProps(variables);
954
+ const response = await client.mutate({
955
+ mutation: DELETE_ONE_TRADE,
956
+ variables: filteredVariables,
957
+ // Don't cache mutations, but ensure we're using the freshest context
958
+ fetchPolicy: 'no-cache'
959
+ });
960
+ if (response.errors && response.errors.length > 0)
961
+ throw new Error(response.errors[0].message);
962
+ if (response && response.data && response.data.deleteOneTrade) {
963
+ return response.data.deleteOneTrade;
964
+ }
965
+ else {
966
+ return null;
967
+ }
653
968
  }
654
- else {
655
- return null;
969
+ catch (error) {
970
+ lastError = error;
971
+ // Check if this is a database connection error that we should retry
972
+ const isConnectionError = error.message?.includes('Server has closed the connection') ||
973
+ error.message?.includes('Cannot reach database server') ||
974
+ error.message?.includes('Connection timed out') ||
975
+ error.message?.includes('Accelerate') || // Prisma Accelerate proxy errors
976
+ (error.networkError && error.networkError.message?.includes('Failed to fetch'));
977
+ if (isConnectionError && retryCount < MAX_RETRIES - 1) {
978
+ retryCount++;
979
+ const delay = Math.pow(2, retryCount) * 100; // Exponential backoff: 200ms, 400ms, 800ms
980
+ console.warn("Database connection error, retrying...");
981
+ await new Promise(resolve => setTimeout(resolve, delay));
982
+ continue;
983
+ }
984
+ // Log the error and rethrow
985
+ console.error("Database error occurred:", error);
986
+ throw error;
656
987
  }
657
988
  }
658
- catch (error) {
659
- console.error('Error in deleteOneTrade:', error);
660
- throw error;
661
- }
989
+ // If we exhausted retries, throw the last error
990
+ throw lastError;
662
991
  },
663
992
  /**
664
993
  * Retrieve a single Trade record by ID.
665
- * @param props - Properties to update.
994
+ * Enhanced with connection resilience against Prisma connection errors.
995
+ * @param props - Properties to identify the record.
666
996
  * @param globalClient - Apollo Client instance.
997
+ * @param whereInput - Optional custom where input.
667
998
  * @returns The retrieved Trade or null.
668
999
  */
669
1000
  async get(props, globalClient, whereInput) {
670
- const [modules, client] = await Promise.all([
671
- getApolloModules(),
672
- globalClient
673
- ? Promise.resolve(globalClient)
674
- : importedClient
675
- ]);
676
- const { gql, ApolloError } = modules;
677
- const GET_TRADE = gql `
678
- query getTrade($where: TradeWhereUniqueInput!) {
679
- getTrade(where: $where) {
680
- ${selectionSet}
681
- }
682
- }`;
683
- const variables = {
684
- where: whereInput ? whereInput : {
685
- id: props.id !== undefined ? props.id : undefined,
686
- alpacaAccountId: props.alpacaAccountId !== undefined ? {
687
- equals: props.alpacaAccountId
688
- } : undefined,
689
- symbol: props.symbol !== undefined ? {
690
- equals: props.symbol
691
- } : undefined,
692
- },
693
- };
694
- const filteredVariables = removeUndefinedProps(variables);
695
- try {
696
- const response = await client.query({ query: GET_TRADE, variables: filteredVariables });
697
- if (response.errors && response.errors.length > 0)
698
- throw new Error(response.errors[0].message);
699
- return response.data?.getTrade ?? null;
700
- }
701
- catch (error) {
702
- if (error instanceof ApolloError && error.message === 'No Trade found') {
703
- return null;
1001
+ // Maximum number of retries for database connection issues
1002
+ const MAX_RETRIES = 3;
1003
+ let retryCount = 0;
1004
+ let lastError = null;
1005
+ // Retry loop to handle potential database connection issues
1006
+ while (retryCount < MAX_RETRIES) {
1007
+ try {
1008
+ const [modules, client] = await Promise.all([
1009
+ getApolloModules(),
1010
+ globalClient
1011
+ ? Promise.resolve(globalClient)
1012
+ : importedClient
1013
+ ]);
1014
+ const { gql, ApolloError } = modules;
1015
+ const GET_TRADE = gql `
1016
+ query getTrade($where: TradeWhereUniqueInput!) {
1017
+ getTrade(where: $where) {
1018
+ ${selectionSet}
1019
+ }
1020
+ }`;
1021
+ const variables = {
1022
+ where: whereInput ? whereInput : {
1023
+ id: props.id !== undefined ? props.id : undefined,
1024
+ alpacaAccountId: props.alpacaAccountId !== undefined ? {
1025
+ equals: props.alpacaAccountId
1026
+ } : undefined,
1027
+ symbol: props.symbol !== undefined ? {
1028
+ equals: props.symbol
1029
+ } : undefined,
1030
+ },
1031
+ };
1032
+ const filteredVariables = removeUndefinedProps(variables);
1033
+ const response = await client.query({
1034
+ query: GET_TRADE,
1035
+ variables: filteredVariables,
1036
+ fetchPolicy: 'network-only', // Force network request to avoid stale cache
1037
+ });
1038
+ if (response.errors && response.errors.length > 0)
1039
+ throw new Error(response.errors[0].message);
1040
+ return response.data?.getTrade ?? null;
704
1041
  }
705
- else {
706
- console.error('Error in getTrade:', error);
1042
+ catch (error) {
1043
+ lastError = error;
1044
+ // Check if this is a "No record found" error - this is an expected condition, not a failure
1045
+ if (error.message === 'No Trade found') {
1046
+ return null;
1047
+ }
1048
+ // Check if this is a database connection error that we should retry
1049
+ const isConnectionError = error.message?.includes('Server has closed the connection') ||
1050
+ error.message?.includes('Cannot reach database server') ||
1051
+ error.message?.includes('Connection timed out') ||
1052
+ error.message?.includes('Accelerate') || // Prisma Accelerate proxy errors
1053
+ (error.networkError && error.networkError.message?.includes('Failed to fetch'));
1054
+ if (isConnectionError && retryCount < MAX_RETRIES - 1) {
1055
+ retryCount++;
1056
+ const delay = Math.pow(2, retryCount) * 100; // Exponential backoff: 200ms, 400ms, 800ms
1057
+ console.warn("Database connection error, retrying...");
1058
+ await new Promise(resolve => setTimeout(resolve, delay));
1059
+ continue;
1060
+ }
1061
+ // Log the error and rethrow
1062
+ console.error("Database error occurred:", error);
707
1063
  throw error;
708
1064
  }
709
1065
  }
1066
+ // If we exhausted retries, throw the last error
1067
+ throw lastError;
710
1068
  },
711
1069
  /**
712
1070
  * Retrieve all Trades records.
1071
+ * Enhanced with connection resilience against Prisma connection errors.
713
1072
  * @param globalClient - Apollo Client instance.
714
1073
  * @returns An array of Trade records or null.
715
1074
  */
716
1075
  async getAll(globalClient) {
717
- const [modules, client] = await Promise.all([
718
- getApolloModules(),
719
- globalClient
720
- ? Promise.resolve(globalClient)
721
- : importedClient
722
- ]);
723
- const { gql, ApolloError } = modules;
724
- const GET_ALL_TRADE = gql `
725
- query getAllTrade {
726
- trades {
727
- ${selectionSet}
728
- }
729
- }`;
730
- try {
731
- const response = await client.query({ query: GET_ALL_TRADE });
732
- if (response.errors && response.errors.length > 0)
733
- throw new Error(response.errors[0].message);
734
- return response.data?.trades ?? null;
735
- }
736
- catch (error) {
737
- if (error instanceof ApolloError && error.message === 'No Trade found') {
738
- return null;
1076
+ // Maximum number of retries for database connection issues
1077
+ const MAX_RETRIES = 3;
1078
+ let retryCount = 0;
1079
+ let lastError = null;
1080
+ // Retry loop to handle potential database connection issues
1081
+ while (retryCount < MAX_RETRIES) {
1082
+ try {
1083
+ const [modules, client] = await Promise.all([
1084
+ getApolloModules(),
1085
+ globalClient
1086
+ ? Promise.resolve(globalClient)
1087
+ : importedClient
1088
+ ]);
1089
+ const { gql, ApolloError } = modules;
1090
+ const GET_ALL_TRADE = gql `
1091
+ query getAllTrade {
1092
+ trades {
1093
+ ${selectionSet}
1094
+ }
1095
+ }`;
1096
+ const response = await client.query({
1097
+ query: GET_ALL_TRADE,
1098
+ fetchPolicy: 'network-only', // Force network request to avoid stale cache
1099
+ });
1100
+ if (response.errors && response.errors.length > 0)
1101
+ throw new Error(response.errors[0].message);
1102
+ return response.data?.trades ?? null;
739
1103
  }
740
- else {
741
- console.error('Error in getTrade:', error);
1104
+ catch (error) {
1105
+ lastError = error;
1106
+ // Check if this is a "No record found" error - this is an expected condition, not a failure
1107
+ if (error.message === 'No Trade found') {
1108
+ return null;
1109
+ }
1110
+ // Check if this is a database connection error that we should retry
1111
+ const isConnectionError = error.message?.includes('Server has closed the connection') ||
1112
+ error.message?.includes('Cannot reach database server') ||
1113
+ error.message?.includes('Connection timed out') ||
1114
+ error.message?.includes('Accelerate') || // Prisma Accelerate proxy errors
1115
+ (error.networkError && error.networkError.message?.includes('Failed to fetch'));
1116
+ if (isConnectionError && retryCount < MAX_RETRIES - 1) {
1117
+ retryCount++;
1118
+ const delay = Math.pow(2, retryCount) * 100; // Exponential backoff: 200ms, 400ms, 800ms
1119
+ console.warn("Database connection error, retrying...");
1120
+ await new Promise(resolve => setTimeout(resolve, delay));
1121
+ continue;
1122
+ }
1123
+ // Log the error and rethrow
1124
+ console.error("Database error occurred:", error);
742
1125
  throw error;
743
1126
  }
744
1127
  }
1128
+ // If we exhausted retries, throw the last error
1129
+ throw lastError;
745
1130
  },
746
1131
  /**
747
1132
  * Find multiple Trade records based on conditions.
1133
+ * Enhanced with connection resilience against Prisma connection errors.
748
1134
  * @param props - Conditions to find records.
749
1135
  * @param globalClient - Apollo Client instance.
1136
+ * @param whereInput - Optional custom where input.
750
1137
  * @returns An array of found Trade records or null.
751
1138
  */
752
1139
  async findMany(props, globalClient, whereInput) {
753
- const [modules, client] = await Promise.all([
754
- getApolloModules(),
755
- globalClient
756
- ? Promise.resolve(globalClient)
757
- : importedClient
758
- ]);
759
- const { gql, ApolloError } = modules;
760
- const FIND_MANY_TRADE = gql `
761
- query findManyTrade($where: TradeWhereInput!) {
762
- trades(where: $where) {
763
- ${selectionSet}
764
- }
765
- }`;
766
- const variables = {
767
- where: whereInput ? whereInput : {
768
- id: props.id !== undefined ? {
769
- equals: props.id
770
- } : undefined,
771
- alpacaAccountId: props.alpacaAccountId !== undefined ? {
772
- equals: props.alpacaAccountId
773
- } : undefined,
774
- symbol: props.symbol !== undefined ? {
775
- equals: props.symbol
776
- } : undefined,
777
- },
778
- };
779
- const filteredVariables = removeUndefinedProps(variables);
780
- try {
781
- const response = await client.query({ query: FIND_MANY_TRADE, variables: filteredVariables });
782
- if (response.errors && response.errors.length > 0)
783
- throw new Error(response.errors[0].message);
784
- if (response && response.data && response.data.trades) {
785
- return response.data.trades;
786
- }
787
- else {
788
- return [];
1140
+ // Maximum number of retries for database connection issues
1141
+ const MAX_RETRIES = 3;
1142
+ let retryCount = 0;
1143
+ let lastError = null;
1144
+ // Retry loop to handle potential database connection issues
1145
+ while (retryCount < MAX_RETRIES) {
1146
+ try {
1147
+ const [modules, client] = await Promise.all([
1148
+ getApolloModules(),
1149
+ globalClient
1150
+ ? Promise.resolve(globalClient)
1151
+ : importedClient
1152
+ ]);
1153
+ const { gql, ApolloError } = modules;
1154
+ const FIND_MANY_TRADE = gql `
1155
+ query findManyTrade($where: TradeWhereInput!) {
1156
+ trades(where: $where) {
1157
+ ${selectionSet}
789
1158
  }
790
- }
791
- catch (error) {
792
- if (error instanceof ApolloError && error.message === 'No Trade found') {
793
- return null;
1159
+ }`;
1160
+ const variables = {
1161
+ where: whereInput ? whereInput : {
1162
+ id: props.id !== undefined ? {
1163
+ equals: props.id
1164
+ } : undefined,
1165
+ alpacaAccountId: props.alpacaAccountId !== undefined ? {
1166
+ equals: props.alpacaAccountId
1167
+ } : undefined,
1168
+ symbol: props.symbol !== undefined ? {
1169
+ equals: props.symbol
1170
+ } : undefined,
1171
+ },
1172
+ };
1173
+ const filteredVariables = removeUndefinedProps(variables);
1174
+ const response = await client.query({
1175
+ query: FIND_MANY_TRADE,
1176
+ variables: filteredVariables,
1177
+ fetchPolicy: 'network-only', // Force network request to avoid stale cache
1178
+ });
1179
+ if (response.errors && response.errors.length > 0)
1180
+ throw new Error(response.errors[0].message);
1181
+ if (response && response.data && response.data.trades) {
1182
+ return response.data.trades;
1183
+ }
1184
+ else {
1185
+ return [];
1186
+ }
794
1187
  }
795
- else {
796
- console.error('Error in getTrade:', error);
1188
+ catch (error) {
1189
+ lastError = error;
1190
+ // Check if this is a "No record found" error - this is an expected condition, not a failure
1191
+ if (error.message === 'No Trade found') {
1192
+ return null;
1193
+ }
1194
+ // Check if this is a database connection error that we should retry
1195
+ const isConnectionError = error.message?.includes('Server has closed the connection') ||
1196
+ error.message?.includes('Cannot reach database server') ||
1197
+ error.message?.includes('Connection timed out') ||
1198
+ error.message?.includes('Accelerate') || // Prisma Accelerate proxy errors
1199
+ (error.networkError && error.networkError.message?.includes('Failed to fetch'));
1200
+ if (isConnectionError && retryCount < MAX_RETRIES - 1) {
1201
+ retryCount++;
1202
+ const delay = Math.pow(2, retryCount) * 100; // Exponential backoff: 200ms, 400ms, 800ms
1203
+ console.warn("Database connection error, retrying...");
1204
+ await new Promise(resolve => setTimeout(resolve, delay));
1205
+ continue;
1206
+ }
1207
+ // Log the error and rethrow
1208
+ console.error("Database error occurred:", error);
797
1209
  throw error;
798
1210
  }
799
1211
  }
1212
+ // If we exhausted retries, throw the last error
1213
+ throw lastError;
800
1214
  }
801
1215
  };
802
1216
  //# sourceMappingURL=Trade.js.map