adaptic-backend 1.0.340 → 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 (110) hide show
  1. package/Account.cjs +2543 -2265
  2. package/Account.d.ts +19 -2
  3. package/Action.cjs +1116 -838
  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 +1073 -795
  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 +1107 -836
  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 +1064 -793
  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/prismaClient.d.ts +4 -5
  104. package/esm/prismaClient.d.ts.map +1 -1
  105. package/esm/prismaClient.js.map +1 -1
  106. package/esm/prismaClient.mjs +13 -11
  107. package/package.json +1 -1
  108. package/prismaClient.cjs +13 -11
  109. package/prismaClient.d.ts +4 -5
  110. package/server.cjs +37 -5
package/esm/Asset.mjs CHANGED
@@ -72,110 +72,618 @@ export const Asset = {
72
72
  * @param client - Apollo Client instance.
73
73
  * @returns The created Asset or null.
74
74
  */
75
+ /**
76
+ * Create a new Asset record.
77
+ * Enhanced with connection resilience against Prisma connection errors.
78
+ * @param props - Properties for the new record.
79
+ * @param globalClient - Apollo Client instance.
80
+ * @returns The created Asset or null.
81
+ */
75
82
  async create(props, globalClient) {
76
- const [modules, client] = await Promise.all([
77
- getApolloModules(),
78
- globalClient
79
- ? Promise.resolve(globalClient)
80
- : importedClient
81
- ]);
82
- const { gql, ApolloError } = modules;
83
- const CREATE_ONE_ASSET = gql `
84
- mutation createOneAsset($data: AssetCreateInput!) {
85
- createOneAsset(data: $data) {
86
- ${selectionSet}
87
- }
83
+ // Maximum number of retries for database connection issues
84
+ const MAX_RETRIES = 3;
85
+ let retryCount = 0;
86
+ let lastError = null;
87
+ // Retry loop to handle potential database connection issues
88
+ while (retryCount < MAX_RETRIES) {
89
+ try {
90
+ const [modules, client] = await Promise.all([
91
+ getApolloModules(),
92
+ globalClient
93
+ ? Promise.resolve(globalClient)
94
+ : importedClient
95
+ ]);
96
+ const { gql, ApolloError } = modules;
97
+ const CREATE_ONE_ASSET = gql `
98
+ mutation createOneAsset($data: AssetCreateInput!) {
99
+ createOneAsset(data: $data) {
100
+ ${selectionSet}
101
+ }
102
+ }
103
+ `;
104
+ const variables = {
105
+ data: {
106
+ symbol: props.symbol !== undefined ? props.symbol : undefined,
107
+ name: props.name !== undefined ? props.name : undefined,
108
+ type: props.type !== undefined ? props.type : undefined,
109
+ logoUrl: props.logoUrl !== undefined ? props.logoUrl : undefined,
110
+ description: props.description !== undefined ? props.description : undefined,
111
+ cik: props.cik !== undefined ? props.cik : undefined,
112
+ exchange: props.exchange !== undefined ? props.exchange : undefined,
113
+ currency: props.currency !== undefined ? props.currency : undefined,
114
+ country: props.country !== undefined ? props.country : undefined,
115
+ sector: props.sector !== undefined ? props.sector : undefined,
116
+ industry: props.industry !== undefined ? props.industry : undefined,
117
+ address: props.address !== undefined ? props.address : undefined,
118
+ officialSite: props.officialSite !== undefined ? props.officialSite : undefined,
119
+ fiscalYearEnd: props.fiscalYearEnd !== undefined ? props.fiscalYearEnd : undefined,
120
+ latestQuarter: props.latestQuarter !== undefined ? props.latestQuarter : undefined,
121
+ marketCapitalization: props.marketCapitalization !== undefined ? props.marketCapitalization : undefined,
122
+ ebitda: props.ebitda !== undefined ? props.ebitda : undefined,
123
+ peRatio: props.peRatio !== undefined ? props.peRatio : undefined,
124
+ pegRatio: props.pegRatio !== undefined ? props.pegRatio : undefined,
125
+ bookValue: props.bookValue !== undefined ? props.bookValue : undefined,
126
+ dividendPerShare: props.dividendPerShare !== undefined ? props.dividendPerShare : undefined,
127
+ dividendYield: props.dividendYield !== undefined ? props.dividendYield : undefined,
128
+ eps: props.eps !== undefined ? props.eps : undefined,
129
+ revenuePerShareTTM: props.revenuePerShareTTM !== undefined ? props.revenuePerShareTTM : undefined,
130
+ profitMargin: props.profitMargin !== undefined ? props.profitMargin : undefined,
131
+ operatingMarginTTM: props.operatingMarginTTM !== undefined ? props.operatingMarginTTM : undefined,
132
+ returnOnAssetsTTM: props.returnOnAssetsTTM !== undefined ? props.returnOnAssetsTTM : undefined,
133
+ returnOnEquityTTM: props.returnOnEquityTTM !== undefined ? props.returnOnEquityTTM : undefined,
134
+ revenueTTM: props.revenueTTM !== undefined ? props.revenueTTM : undefined,
135
+ grossProfitTTM: props.grossProfitTTM !== undefined ? props.grossProfitTTM : undefined,
136
+ dilutedEPSTTM: props.dilutedEPSTTM !== undefined ? props.dilutedEPSTTM : undefined,
137
+ quarterlyEarningsGrowthYOY: props.quarterlyEarningsGrowthYOY !== undefined ? props.quarterlyEarningsGrowthYOY : undefined,
138
+ quarterlyRevenueGrowthYOY: props.quarterlyRevenueGrowthYOY !== undefined ? props.quarterlyRevenueGrowthYOY : undefined,
139
+ analystTargetPrice: props.analystTargetPrice !== undefined ? props.analystTargetPrice : undefined,
140
+ analystRatingStrongBuy: props.analystRatingStrongBuy !== undefined ? props.analystRatingStrongBuy : undefined,
141
+ analystRatingBuy: props.analystRatingBuy !== undefined ? props.analystRatingBuy : undefined,
142
+ analystRatingHold: props.analystRatingHold !== undefined ? props.analystRatingHold : undefined,
143
+ analystRatingSell: props.analystRatingSell !== undefined ? props.analystRatingSell : undefined,
144
+ analystRatingStrongSell: props.analystRatingStrongSell !== undefined ? props.analystRatingStrongSell : undefined,
145
+ trailingPE: props.trailingPE !== undefined ? props.trailingPE : undefined,
146
+ forwardPE: props.forwardPE !== undefined ? props.forwardPE : undefined,
147
+ priceToSalesRatioTTM: props.priceToSalesRatioTTM !== undefined ? props.priceToSalesRatioTTM : undefined,
148
+ priceToBookRatio: props.priceToBookRatio !== undefined ? props.priceToBookRatio : undefined,
149
+ evToRevenue: props.evToRevenue !== undefined ? props.evToRevenue : undefined,
150
+ evToEbitda: props.evToEbitda !== undefined ? props.evToEbitda : undefined,
151
+ beta: props.beta !== undefined ? props.beta : undefined,
152
+ week52High: props.week52High !== undefined ? props.week52High : undefined,
153
+ week52Low: props.week52Low !== undefined ? props.week52Low : undefined,
154
+ day50MovingAverage: props.day50MovingAverage !== undefined ? props.day50MovingAverage : undefined,
155
+ day200MovingAverage: props.day200MovingAverage !== undefined ? props.day200MovingAverage : undefined,
156
+ sharesOutstanding: props.sharesOutstanding !== undefined ? props.sharesOutstanding : undefined,
157
+ dividendDate: props.dividendDate !== undefined ? props.dividendDate : undefined,
158
+ exDividendDate: props.exDividendDate !== undefined ? props.exDividendDate : undefined,
159
+ askPrice: props.askPrice !== undefined ? props.askPrice : undefined,
160
+ bidPrice: props.bidPrice !== undefined ? props.bidPrice : undefined,
161
+ newsMentions: props.newsMentions ?
162
+ Array.isArray(props.newsMentions) && props.newsMentions.length > 0 && props.newsMentions.every((item) => typeof item === 'object' && 'id' in item && Object.keys(item).length === 1) ? {
163
+ connect: props.newsMentions.map((item) => ({
164
+ id: item.id
165
+ }))
166
+ }
167
+ : { connectOrCreate: props.newsMentions.map((item) => ({
168
+ where: {
169
+ id: item.id !== undefined ? item.id : undefined,
170
+ url: item.url !== undefined ? item.url : undefined,
171
+ newsArticleId: item.newsArticleId !== undefined ? {
172
+ equals: item.newsArticleId
173
+ } : undefined,
174
+ },
175
+ create: {
176
+ url: item.url !== undefined ? item.url : undefined,
177
+ relevancyScore: item.relevancyScore !== undefined ? item.relevancyScore : undefined,
178
+ sentimentScore: item.sentimentScore !== undefined ? item.sentimentScore : undefined,
179
+ sentimentLabel: item.sentimentLabel !== undefined ? item.sentimentLabel : undefined,
180
+ news: item.news ?
181
+ typeof item.news === 'object' && Object.keys(item.news).length === 1 && Object.keys(item.news)[0] === 'id'
182
+ ? { connect: {
183
+ id: item.news.id
184
+ }
185
+ }
186
+ : { connectOrCreate: {
187
+ where: {
188
+ id: item.news.id !== undefined ? item.news.id : undefined,
189
+ url: item.news.url !== undefined ? item.news.url : undefined,
190
+ title: item.news.title !== undefined ? {
191
+ equals: item.news.title
192
+ } : undefined,
193
+ },
194
+ create: {
195
+ title: item.news.title !== undefined ? item.news.title : undefined,
196
+ content: item.news.content !== undefined ? item.news.content : undefined,
197
+ source: item.news.source !== undefined ? item.news.source : undefined,
198
+ sourceDomain: item.news.sourceDomain !== undefined ? item.news.sourceDomain : undefined,
199
+ url: item.news.url !== undefined ? item.news.url : undefined,
200
+ sentiment: item.news.sentiment !== undefined ? item.news.sentiment : undefined,
201
+ authors: item.news.authors !== undefined ? {
202
+ set: item.news.authors
203
+ } : undefined,
204
+ summary: item.news.summary !== undefined ? item.news.summary : undefined,
205
+ bannerImage: item.news.bannerImage !== undefined ? item.news.bannerImage : undefined,
206
+ timePublished: item.news.timePublished !== undefined ? item.news.timePublished : undefined,
207
+ category: item.news.category !== undefined ? item.news.category : undefined,
208
+ topics: item.news.topics !== undefined ? {
209
+ set: item.news.topics
210
+ } : undefined,
211
+ logo: item.news.logo !== undefined ? item.news.logo : undefined,
212
+ },
213
+ }
214
+ } : undefined,
215
+ },
216
+ }))
217
+ } : undefined,
218
+ },
219
+ };
220
+ const filteredVariables = removeUndefinedProps(variables);
221
+ const response = await client.mutate({
222
+ mutation: CREATE_ONE_ASSET,
223
+ variables: filteredVariables,
224
+ // Don't cache mutations, but ensure we're using the freshest context
225
+ fetchPolicy: 'no-cache'
226
+ });
227
+ if (response.errors && response.errors.length > 0)
228
+ throw new Error(response.errors[0].message);
229
+ if (response && response.data && response.data.createOneAsset) {
230
+ return response.data.createOneAsset;
231
+ }
232
+ else {
233
+ return null;
234
+ }
235
+ }
236
+ catch (error) {
237
+ lastError = error;
238
+ // Check if this is a database connection error that we should retry
239
+ const isConnectionError = error.message?.includes('Server has closed the connection') ||
240
+ error.message?.includes('Cannot reach database server') ||
241
+ error.message?.includes('Connection timed out') ||
242
+ error.message?.includes('Accelerate') || // Prisma Accelerate proxy errors
243
+ (error.networkError && error.networkError.message?.includes('Failed to fetch'));
244
+ if (isConnectionError && retryCount < MAX_RETRIES - 1) {
245
+ retryCount++;
246
+ const delay = Math.pow(2, retryCount) * 100; // Exponential backoff: 200ms, 400ms, 800ms
247
+ console.warn("Database connection error, retrying...");
248
+ await new Promise(resolve => setTimeout(resolve, delay));
249
+ continue;
250
+ }
251
+ // Log the error and rethrow
252
+ console.error("Database error occurred:", error);
253
+ throw error;
254
+ }
88
255
  }
89
- `;
90
- const variables = {
91
- data: {
92
- symbol: props.symbol !== undefined ? props.symbol : undefined,
93
- name: props.name !== undefined ? props.name : undefined,
94
- type: props.type !== undefined ? props.type : undefined,
95
- logoUrl: props.logoUrl !== undefined ? props.logoUrl : undefined,
96
- description: props.description !== undefined ? props.description : undefined,
97
- cik: props.cik !== undefined ? props.cik : undefined,
98
- exchange: props.exchange !== undefined ? props.exchange : undefined,
99
- currency: props.currency !== undefined ? props.currency : undefined,
100
- country: props.country !== undefined ? props.country : undefined,
101
- sector: props.sector !== undefined ? props.sector : undefined,
102
- industry: props.industry !== undefined ? props.industry : undefined,
103
- address: props.address !== undefined ? props.address : undefined,
104
- officialSite: props.officialSite !== undefined ? props.officialSite : undefined,
105
- fiscalYearEnd: props.fiscalYearEnd !== undefined ? props.fiscalYearEnd : undefined,
106
- latestQuarter: props.latestQuarter !== undefined ? props.latestQuarter : undefined,
107
- marketCapitalization: props.marketCapitalization !== undefined ? props.marketCapitalization : undefined,
108
- ebitda: props.ebitda !== undefined ? props.ebitda : undefined,
109
- peRatio: props.peRatio !== undefined ? props.peRatio : undefined,
110
- pegRatio: props.pegRatio !== undefined ? props.pegRatio : undefined,
111
- bookValue: props.bookValue !== undefined ? props.bookValue : undefined,
112
- dividendPerShare: props.dividendPerShare !== undefined ? props.dividendPerShare : undefined,
113
- dividendYield: props.dividendYield !== undefined ? props.dividendYield : undefined,
114
- eps: props.eps !== undefined ? props.eps : undefined,
115
- revenuePerShareTTM: props.revenuePerShareTTM !== undefined ? props.revenuePerShareTTM : undefined,
116
- profitMargin: props.profitMargin !== undefined ? props.profitMargin : undefined,
117
- operatingMarginTTM: props.operatingMarginTTM !== undefined ? props.operatingMarginTTM : undefined,
118
- returnOnAssetsTTM: props.returnOnAssetsTTM !== undefined ? props.returnOnAssetsTTM : undefined,
119
- returnOnEquityTTM: props.returnOnEquityTTM !== undefined ? props.returnOnEquityTTM : undefined,
120
- revenueTTM: props.revenueTTM !== undefined ? props.revenueTTM : undefined,
121
- grossProfitTTM: props.grossProfitTTM !== undefined ? props.grossProfitTTM : undefined,
122
- dilutedEPSTTM: props.dilutedEPSTTM !== undefined ? props.dilutedEPSTTM : undefined,
123
- quarterlyEarningsGrowthYOY: props.quarterlyEarningsGrowthYOY !== undefined ? props.quarterlyEarningsGrowthYOY : undefined,
124
- quarterlyRevenueGrowthYOY: props.quarterlyRevenueGrowthYOY !== undefined ? props.quarterlyRevenueGrowthYOY : undefined,
125
- analystTargetPrice: props.analystTargetPrice !== undefined ? props.analystTargetPrice : undefined,
126
- analystRatingStrongBuy: props.analystRatingStrongBuy !== undefined ? props.analystRatingStrongBuy : undefined,
127
- analystRatingBuy: props.analystRatingBuy !== undefined ? props.analystRatingBuy : undefined,
128
- analystRatingHold: props.analystRatingHold !== undefined ? props.analystRatingHold : undefined,
129
- analystRatingSell: props.analystRatingSell !== undefined ? props.analystRatingSell : undefined,
130
- analystRatingStrongSell: props.analystRatingStrongSell !== undefined ? props.analystRatingStrongSell : undefined,
131
- trailingPE: props.trailingPE !== undefined ? props.trailingPE : undefined,
132
- forwardPE: props.forwardPE !== undefined ? props.forwardPE : undefined,
133
- priceToSalesRatioTTM: props.priceToSalesRatioTTM !== undefined ? props.priceToSalesRatioTTM : undefined,
134
- priceToBookRatio: props.priceToBookRatio !== undefined ? props.priceToBookRatio : undefined,
135
- evToRevenue: props.evToRevenue !== undefined ? props.evToRevenue : undefined,
136
- evToEbitda: props.evToEbitda !== undefined ? props.evToEbitda : undefined,
137
- beta: props.beta !== undefined ? props.beta : undefined,
138
- week52High: props.week52High !== undefined ? props.week52High : undefined,
139
- week52Low: props.week52Low !== undefined ? props.week52Low : undefined,
140
- day50MovingAverage: props.day50MovingAverage !== undefined ? props.day50MovingAverage : undefined,
141
- day200MovingAverage: props.day200MovingAverage !== undefined ? props.day200MovingAverage : undefined,
142
- sharesOutstanding: props.sharesOutstanding !== undefined ? props.sharesOutstanding : undefined,
143
- dividendDate: props.dividendDate !== undefined ? props.dividendDate : undefined,
144
- exDividendDate: props.exDividendDate !== undefined ? props.exDividendDate : undefined,
145
- askPrice: props.askPrice !== undefined ? props.askPrice : undefined,
146
- bidPrice: props.bidPrice !== undefined ? props.bidPrice : undefined,
147
- newsMentions: props.newsMentions ?
148
- Array.isArray(props.newsMentions) && props.newsMentions.length > 0 && props.newsMentions.every((item) => typeof item === 'object' && 'id' in item && Object.keys(item).length === 1) ? {
149
- connect: props.newsMentions.map((item) => ({
150
- id: item.id
151
- }))
152
- }
153
- : { connectOrCreate: props.newsMentions.map((item) => ({
154
- where: {
155
- id: item.id !== undefined ? item.id : undefined,
156
- url: item.url !== undefined ? item.url : undefined,
157
- newsArticleId: item.newsArticleId !== undefined ? {
158
- equals: item.newsArticleId
159
- } : undefined,
160
- },
161
- create: {
162
- url: item.url !== undefined ? item.url : undefined,
163
- relevancyScore: item.relevancyScore !== undefined ? item.relevancyScore : undefined,
164
- sentimentScore: item.sentimentScore !== undefined ? item.sentimentScore : undefined,
165
- sentimentLabel: item.sentimentLabel !== undefined ? item.sentimentLabel : undefined,
166
- news: item.news ?
167
- typeof item.news === 'object' && Object.keys(item.news).length === 1 && Object.keys(item.news)[0] === 'id'
168
- ? { connect: {
169
- id: item.news.id
170
- }
171
- }
172
- : { connectOrCreate: {
256
+ // If we exhausted retries, throw the last error
257
+ throw lastError;
258
+ },
259
+ /**
260
+ * Create multiple Asset records.
261
+ * Enhanced with connection resilience against Prisma connection errors.
262
+ * @param props - Array of Asset objects for the new records.
263
+ * @param globalClient - Apollo Client instance.
264
+ * @returns The count of created records or null.
265
+ */
266
+ async createMany(props, globalClient) {
267
+ // Maximum number of retries for database connection issues
268
+ const MAX_RETRIES = 3;
269
+ let retryCount = 0;
270
+ let lastError = null;
271
+ // Retry loop to handle potential database connection issues
272
+ while (retryCount < MAX_RETRIES) {
273
+ try {
274
+ const [modules, client] = await Promise.all([
275
+ getApolloModules(),
276
+ globalClient
277
+ ? Promise.resolve(globalClient)
278
+ : importedClient
279
+ ]);
280
+ const { gql, ApolloError } = modules;
281
+ const CREATE_MANY_ASSET = gql `
282
+ mutation createManyAsset($data: [AssetCreateManyInput!]!) {
283
+ createManyAsset(data: $data) {
284
+ count
285
+ }
286
+ }`;
287
+ const variables = {
288
+ data: props.map(prop => ({
289
+ symbol: prop.symbol !== undefined ? prop.symbol : undefined,
290
+ name: prop.name !== undefined ? prop.name : undefined,
291
+ type: prop.type !== undefined ? prop.type : undefined,
292
+ logoUrl: prop.logoUrl !== undefined ? prop.logoUrl : undefined,
293
+ description: prop.description !== undefined ? prop.description : undefined,
294
+ cik: prop.cik !== undefined ? prop.cik : undefined,
295
+ exchange: prop.exchange !== undefined ? prop.exchange : undefined,
296
+ currency: prop.currency !== undefined ? prop.currency : undefined,
297
+ country: prop.country !== undefined ? prop.country : undefined,
298
+ sector: prop.sector !== undefined ? prop.sector : undefined,
299
+ industry: prop.industry !== undefined ? prop.industry : undefined,
300
+ address: prop.address !== undefined ? prop.address : undefined,
301
+ officialSite: prop.officialSite !== undefined ? prop.officialSite : undefined,
302
+ fiscalYearEnd: prop.fiscalYearEnd !== undefined ? prop.fiscalYearEnd : undefined,
303
+ latestQuarter: prop.latestQuarter !== undefined ? prop.latestQuarter : undefined,
304
+ marketCapitalization: prop.marketCapitalization !== undefined ? prop.marketCapitalization : undefined,
305
+ ebitda: prop.ebitda !== undefined ? prop.ebitda : undefined,
306
+ peRatio: prop.peRatio !== undefined ? prop.peRatio : undefined,
307
+ pegRatio: prop.pegRatio !== undefined ? prop.pegRatio : undefined,
308
+ bookValue: prop.bookValue !== undefined ? prop.bookValue : undefined,
309
+ dividendPerShare: prop.dividendPerShare !== undefined ? prop.dividendPerShare : undefined,
310
+ dividendYield: prop.dividendYield !== undefined ? prop.dividendYield : undefined,
311
+ eps: prop.eps !== undefined ? prop.eps : undefined,
312
+ revenuePerShareTTM: prop.revenuePerShareTTM !== undefined ? prop.revenuePerShareTTM : undefined,
313
+ profitMargin: prop.profitMargin !== undefined ? prop.profitMargin : undefined,
314
+ operatingMarginTTM: prop.operatingMarginTTM !== undefined ? prop.operatingMarginTTM : undefined,
315
+ returnOnAssetsTTM: prop.returnOnAssetsTTM !== undefined ? prop.returnOnAssetsTTM : undefined,
316
+ returnOnEquityTTM: prop.returnOnEquityTTM !== undefined ? prop.returnOnEquityTTM : undefined,
317
+ revenueTTM: prop.revenueTTM !== undefined ? prop.revenueTTM : undefined,
318
+ grossProfitTTM: prop.grossProfitTTM !== undefined ? prop.grossProfitTTM : undefined,
319
+ dilutedEPSTTM: prop.dilutedEPSTTM !== undefined ? prop.dilutedEPSTTM : undefined,
320
+ quarterlyEarningsGrowthYOY: prop.quarterlyEarningsGrowthYOY !== undefined ? prop.quarterlyEarningsGrowthYOY : undefined,
321
+ quarterlyRevenueGrowthYOY: prop.quarterlyRevenueGrowthYOY !== undefined ? prop.quarterlyRevenueGrowthYOY : undefined,
322
+ analystTargetPrice: prop.analystTargetPrice !== undefined ? prop.analystTargetPrice : undefined,
323
+ analystRatingStrongBuy: prop.analystRatingStrongBuy !== undefined ? prop.analystRatingStrongBuy : undefined,
324
+ analystRatingBuy: prop.analystRatingBuy !== undefined ? prop.analystRatingBuy : undefined,
325
+ analystRatingHold: prop.analystRatingHold !== undefined ? prop.analystRatingHold : undefined,
326
+ analystRatingSell: prop.analystRatingSell !== undefined ? prop.analystRatingSell : undefined,
327
+ analystRatingStrongSell: prop.analystRatingStrongSell !== undefined ? prop.analystRatingStrongSell : undefined,
328
+ trailingPE: prop.trailingPE !== undefined ? prop.trailingPE : undefined,
329
+ forwardPE: prop.forwardPE !== undefined ? prop.forwardPE : undefined,
330
+ priceToSalesRatioTTM: prop.priceToSalesRatioTTM !== undefined ? prop.priceToSalesRatioTTM : undefined,
331
+ priceToBookRatio: prop.priceToBookRatio !== undefined ? prop.priceToBookRatio : undefined,
332
+ evToRevenue: prop.evToRevenue !== undefined ? prop.evToRevenue : undefined,
333
+ evToEbitda: prop.evToEbitda !== undefined ? prop.evToEbitda : undefined,
334
+ beta: prop.beta !== undefined ? prop.beta : undefined,
335
+ week52High: prop.week52High !== undefined ? prop.week52High : undefined,
336
+ week52Low: prop.week52Low !== undefined ? prop.week52Low : undefined,
337
+ day50MovingAverage: prop.day50MovingAverage !== undefined ? prop.day50MovingAverage : undefined,
338
+ day200MovingAverage: prop.day200MovingAverage !== undefined ? prop.day200MovingAverage : undefined,
339
+ sharesOutstanding: prop.sharesOutstanding !== undefined ? prop.sharesOutstanding : undefined,
340
+ dividendDate: prop.dividendDate !== undefined ? prop.dividendDate : undefined,
341
+ exDividendDate: prop.exDividendDate !== undefined ? prop.exDividendDate : undefined,
342
+ askPrice: prop.askPrice !== undefined ? prop.askPrice : undefined,
343
+ bidPrice: prop.bidPrice !== undefined ? prop.bidPrice : undefined,
344
+ })),
345
+ };
346
+ const filteredVariables = removeUndefinedProps(variables);
347
+ const response = await client.mutate({
348
+ mutation: CREATE_MANY_ASSET,
349
+ variables: filteredVariables,
350
+ // Don't cache mutations, but ensure we're using the freshest context
351
+ fetchPolicy: 'no-cache'
352
+ });
353
+ if (response.errors && response.errors.length > 0)
354
+ throw new Error(response.errors[0].message);
355
+ if (response && response.data && response.data.createManyAsset) {
356
+ return response.data.createManyAsset;
357
+ }
358
+ else {
359
+ return null;
360
+ }
361
+ }
362
+ catch (error) {
363
+ lastError = error;
364
+ // Check if this is a database connection error that we should retry
365
+ const isConnectionError = error.message?.includes('Server has closed the connection') ||
366
+ error.message?.includes('Cannot reach database server') ||
367
+ error.message?.includes('Connection timed out') ||
368
+ error.message?.includes('Accelerate') || // Prisma Accelerate proxy errors
369
+ (error.networkError && error.networkError.message?.includes('Failed to fetch'));
370
+ if (isConnectionError && retryCount < MAX_RETRIES - 1) {
371
+ retryCount++;
372
+ const delay = Math.pow(2, retryCount) * 100; // Exponential backoff: 200ms, 400ms, 800ms
373
+ console.warn("Database connection error, retrying...");
374
+ await new Promise(resolve => setTimeout(resolve, delay));
375
+ continue;
376
+ }
377
+ // Log the error and rethrow
378
+ console.error("Database error occurred:", error);
379
+ throw error;
380
+ }
381
+ }
382
+ // If we exhausted retries, throw the last error
383
+ throw lastError;
384
+ },
385
+ /**
386
+ * Update a single Asset record.
387
+ * Enhanced with connection resilience against Prisma connection errors.
388
+ * @param props - Properties to update.
389
+ * @param globalClient - Apollo Client instance.
390
+ * @returns The updated Asset or null.
391
+ */
392
+ async update(props, globalClient) {
393
+ // Maximum number of retries for database connection issues
394
+ const MAX_RETRIES = 3;
395
+ let retryCount = 0;
396
+ let lastError = null;
397
+ // Retry loop to handle potential database connection issues
398
+ while (retryCount < MAX_RETRIES) {
399
+ try {
400
+ const [modules, client] = await Promise.all([
401
+ getApolloModules(),
402
+ globalClient
403
+ ? Promise.resolve(globalClient)
404
+ : importedClient
405
+ ]);
406
+ const { gql, ApolloError } = modules;
407
+ const UPDATE_ONE_ASSET = gql `
408
+ mutation updateOneAsset($data: AssetUpdateInput!, $where: AssetWhereUniqueInput!) {
409
+ updateOneAsset(data: $data, where: $where) {
410
+ ${selectionSet}
411
+ }
412
+ }`;
413
+ const variables = {
414
+ where: {
415
+ id: props.id !== undefined ? props.id : undefined,
416
+ symbol: props.symbol !== undefined ? props.symbol : undefined,
417
+ name: props.name !== undefined ? props.name : undefined,
418
+ },
419
+ data: {
420
+ id: props.id !== undefined ? {
421
+ set: props.id
422
+ } : undefined,
423
+ symbol: props.symbol !== undefined ? {
424
+ set: props.symbol
425
+ } : undefined,
426
+ name: props.name !== undefined ? {
427
+ set: props.name
428
+ } : undefined,
429
+ type: props.type !== undefined ? {
430
+ set: props.type
431
+ } : undefined,
432
+ logoUrl: props.logoUrl !== undefined ? {
433
+ set: props.logoUrl
434
+ } : undefined,
435
+ description: props.description !== undefined ? {
436
+ set: props.description
437
+ } : undefined,
438
+ cik: props.cik !== undefined ? {
439
+ set: props.cik
440
+ } : undefined,
441
+ exchange: props.exchange !== undefined ? {
442
+ set: props.exchange
443
+ } : undefined,
444
+ currency: props.currency !== undefined ? {
445
+ set: props.currency
446
+ } : undefined,
447
+ country: props.country !== undefined ? {
448
+ set: props.country
449
+ } : undefined,
450
+ sector: props.sector !== undefined ? {
451
+ set: props.sector
452
+ } : undefined,
453
+ industry: props.industry !== undefined ? {
454
+ set: props.industry
455
+ } : undefined,
456
+ address: props.address !== undefined ? {
457
+ set: props.address
458
+ } : undefined,
459
+ officialSite: props.officialSite !== undefined ? {
460
+ set: props.officialSite
461
+ } : undefined,
462
+ fiscalYearEnd: props.fiscalYearEnd !== undefined ? {
463
+ set: props.fiscalYearEnd
464
+ } : undefined,
465
+ latestQuarter: props.latestQuarter !== undefined ? {
466
+ set: props.latestQuarter
467
+ } : undefined,
468
+ marketCapitalization: props.marketCapitalization !== undefined ? {
469
+ set: props.marketCapitalization
470
+ } : undefined,
471
+ ebitda: props.ebitda !== undefined ? {
472
+ set: props.ebitda
473
+ } : undefined,
474
+ peRatio: props.peRatio !== undefined ? {
475
+ set: props.peRatio
476
+ } : undefined,
477
+ pegRatio: props.pegRatio !== undefined ? {
478
+ set: props.pegRatio
479
+ } : undefined,
480
+ bookValue: props.bookValue !== undefined ? {
481
+ set: props.bookValue
482
+ } : undefined,
483
+ dividendPerShare: props.dividendPerShare !== undefined ? {
484
+ set: props.dividendPerShare
485
+ } : undefined,
486
+ dividendYield: props.dividendYield !== undefined ? {
487
+ set: props.dividendYield
488
+ } : undefined,
489
+ eps: props.eps !== undefined ? {
490
+ set: props.eps
491
+ } : undefined,
492
+ revenuePerShareTTM: props.revenuePerShareTTM !== undefined ? {
493
+ set: props.revenuePerShareTTM
494
+ } : undefined,
495
+ profitMargin: props.profitMargin !== undefined ? {
496
+ set: props.profitMargin
497
+ } : undefined,
498
+ operatingMarginTTM: props.operatingMarginTTM !== undefined ? {
499
+ set: props.operatingMarginTTM
500
+ } : undefined,
501
+ returnOnAssetsTTM: props.returnOnAssetsTTM !== undefined ? {
502
+ set: props.returnOnAssetsTTM
503
+ } : undefined,
504
+ returnOnEquityTTM: props.returnOnEquityTTM !== undefined ? {
505
+ set: props.returnOnEquityTTM
506
+ } : undefined,
507
+ revenueTTM: props.revenueTTM !== undefined ? {
508
+ set: props.revenueTTM
509
+ } : undefined,
510
+ grossProfitTTM: props.grossProfitTTM !== undefined ? {
511
+ set: props.grossProfitTTM
512
+ } : undefined,
513
+ dilutedEPSTTM: props.dilutedEPSTTM !== undefined ? {
514
+ set: props.dilutedEPSTTM
515
+ } : undefined,
516
+ quarterlyEarningsGrowthYOY: props.quarterlyEarningsGrowthYOY !== undefined ? {
517
+ set: props.quarterlyEarningsGrowthYOY
518
+ } : undefined,
519
+ quarterlyRevenueGrowthYOY: props.quarterlyRevenueGrowthYOY !== undefined ? {
520
+ set: props.quarterlyRevenueGrowthYOY
521
+ } : undefined,
522
+ analystTargetPrice: props.analystTargetPrice !== undefined ? {
523
+ set: props.analystTargetPrice
524
+ } : undefined,
525
+ analystRatingStrongBuy: props.analystRatingStrongBuy !== undefined ? {
526
+ set: props.analystRatingStrongBuy
527
+ } : undefined,
528
+ analystRatingBuy: props.analystRatingBuy !== undefined ? {
529
+ set: props.analystRatingBuy
530
+ } : undefined,
531
+ analystRatingHold: props.analystRatingHold !== undefined ? {
532
+ set: props.analystRatingHold
533
+ } : undefined,
534
+ analystRatingSell: props.analystRatingSell !== undefined ? {
535
+ set: props.analystRatingSell
536
+ } : undefined,
537
+ analystRatingStrongSell: props.analystRatingStrongSell !== undefined ? {
538
+ set: props.analystRatingStrongSell
539
+ } : undefined,
540
+ trailingPE: props.trailingPE !== undefined ? {
541
+ set: props.trailingPE
542
+ } : undefined,
543
+ forwardPE: props.forwardPE !== undefined ? {
544
+ set: props.forwardPE
545
+ } : undefined,
546
+ priceToSalesRatioTTM: props.priceToSalesRatioTTM !== undefined ? {
547
+ set: props.priceToSalesRatioTTM
548
+ } : undefined,
549
+ priceToBookRatio: props.priceToBookRatio !== undefined ? {
550
+ set: props.priceToBookRatio
551
+ } : undefined,
552
+ evToRevenue: props.evToRevenue !== undefined ? {
553
+ set: props.evToRevenue
554
+ } : undefined,
555
+ evToEbitda: props.evToEbitda !== undefined ? {
556
+ set: props.evToEbitda
557
+ } : undefined,
558
+ beta: props.beta !== undefined ? {
559
+ set: props.beta
560
+ } : undefined,
561
+ week52High: props.week52High !== undefined ? {
562
+ set: props.week52High
563
+ } : undefined,
564
+ week52Low: props.week52Low !== undefined ? {
565
+ set: props.week52Low
566
+ } : undefined,
567
+ day50MovingAverage: props.day50MovingAverage !== undefined ? {
568
+ set: props.day50MovingAverage
569
+ } : undefined,
570
+ day200MovingAverage: props.day200MovingAverage !== undefined ? {
571
+ set: props.day200MovingAverage
572
+ } : undefined,
573
+ sharesOutstanding: props.sharesOutstanding !== undefined ? {
574
+ set: props.sharesOutstanding
575
+ } : undefined,
576
+ dividendDate: props.dividendDate !== undefined ? {
577
+ set: props.dividendDate
578
+ } : undefined,
579
+ exDividendDate: props.exDividendDate !== undefined ? {
580
+ set: props.exDividendDate
581
+ } : undefined,
582
+ askPrice: props.askPrice !== undefined ? {
583
+ set: props.askPrice
584
+ } : undefined,
585
+ bidPrice: props.bidPrice !== undefined ? {
586
+ set: props.bidPrice
587
+ } : undefined,
588
+ createdAt: props.createdAt !== undefined ? {
589
+ set: props.createdAt
590
+ } : undefined,
591
+ updatedAt: props.updatedAt !== undefined ? {
592
+ set: props.updatedAt
593
+ } : undefined,
594
+ newsMentions: props.newsMentions ?
595
+ Array.isArray(props.newsMentions) && props.newsMentions.length > 0 && props.newsMentions.every((item) => typeof item === 'object' && ('id' in item || 'symbol' in item) && Object.keys(item).length === 1) ? {
596
+ connect: props.newsMentions.map((item) => ({
597
+ id: item.id
598
+ }))
599
+ } : { upsert: props.newsMentions.map((item) => ({
600
+ where: {
601
+ id: item.id !== undefined ? item.id : undefined,
602
+ url: item.url !== undefined ? item.url : undefined,
603
+ assetId: item.assetId !== undefined ? {
604
+ equals: item.assetId
605
+ } : undefined,
606
+ newsArticleId: item.newsArticleId !== undefined ? {
607
+ equals: item.newsArticleId
608
+ } : undefined,
609
+ },
610
+ update: {
611
+ id: item.id !== undefined ? {
612
+ set: item.id
613
+ } : undefined,
614
+ url: item.url !== undefined ? {
615
+ set: item.url
616
+ } : undefined,
617
+ relevancyScore: item.relevancyScore !== undefined ? {
618
+ set: item.relevancyScore
619
+ } : undefined,
620
+ sentimentScore: item.sentimentScore !== undefined ? {
621
+ set: item.sentimentScore
622
+ } : undefined,
623
+ sentimentLabel: item.sentimentLabel !== undefined ? {
624
+ set: item.sentimentLabel
625
+ } : undefined,
626
+ news: item.news ?
627
+ typeof item.news === 'object' && Object.keys(item.news).length === 1 && (Object.keys(item.news)[0] === 'id' || Object.keys(item.news)[0] === 'symbol')
628
+ ? {
629
+ connect: {
630
+ id: item.news.id
631
+ }
632
+ } : { upsert: {
173
633
  where: {
174
- id: item.news.id !== undefined ? item.news.id : undefined,
175
- url: item.news.url !== undefined ? item.news.url : undefined,
634
+ id: item.news.id !== undefined ? {
635
+ equals: item.news.id
636
+ } : undefined,
176
637
  title: item.news.title !== undefined ? {
177
638
  equals: item.news.title
178
639
  } : undefined,
640
+ url: item.news.url !== undefined ? {
641
+ equals: item.news.url
642
+ } : undefined,
643
+ },
644
+ update: {
645
+ id: item.news.id !== undefined ? {
646
+ set: item.news.id
647
+ } : undefined,
648
+ title: item.news.title !== undefined ? {
649
+ set: item.news.title
650
+ } : undefined,
651
+ content: item.news.content !== undefined ? {
652
+ set: item.news.content
653
+ } : undefined,
654
+ source: item.news.source !== undefined ? {
655
+ set: item.news.source
656
+ } : undefined,
657
+ sourceDomain: item.news.sourceDomain !== undefined ? {
658
+ set: item.news.sourceDomain
659
+ } : undefined,
660
+ url: item.news.url !== undefined ? {
661
+ set: item.news.url
662
+ } : undefined,
663
+ sentiment: item.news.sentiment !== undefined ? {
664
+ set: item.news.sentiment
665
+ } : undefined,
666
+ authors: item.news.authors !== undefined ? {
667
+ set: item.news.authors
668
+ } : undefined,
669
+ summary: item.news.summary !== undefined ? {
670
+ set: item.news.summary
671
+ } : undefined,
672
+ bannerImage: item.news.bannerImage !== undefined ? {
673
+ set: item.news.bannerImage
674
+ } : undefined,
675
+ timePublished: item.news.timePublished !== undefined ? {
676
+ set: item.news.timePublished
677
+ } : undefined,
678
+ category: item.news.category !== undefined ? {
679
+ set: item.news.category
680
+ } : undefined,
681
+ topics: item.news.topics !== undefined ? {
682
+ set: item.news.topics
683
+ } : undefined,
684
+ logo: item.news.logo !== undefined ? {
685
+ set: item.news.logo
686
+ } : undefined,
179
687
  },
180
688
  create: {
181
689
  title: item.news.title !== undefined ? item.news.title : undefined,
@@ -198,617 +706,498 @@ export const Asset = {
198
706
  },
199
707
  }
200
708
  } : undefined,
201
- },
202
- }))
203
- } : undefined,
204
- },
205
- };
206
- const filteredVariables = removeUndefinedProps(variables);
207
- try {
208
- const response = await client.mutate({ mutation: CREATE_ONE_ASSET, variables: filteredVariables });
209
- if (response.errors && response.errors.length > 0)
210
- throw new Error(response.errors[0].message);
211
- if (response && response.data && response.data.createOneAsset) {
212
- return response.data.createOneAsset;
213
- }
214
- else {
215
- return null;
216
- }
217
- }
218
- catch (error) {
219
- console.error('Error in createOneAsset:', error);
220
- throw error;
221
- }
222
- },
223
- /**
224
- * Create multiple Asset records.
225
- * @param props - Array of Asset objects for the new records.
226
- * @param globalClient - Apollo Client instance.
227
- * @returns The count of created records or null.
228
- */
229
- async createMany(props, globalClient) {
230
- const [modules, client] = await Promise.all([
231
- getApolloModules(),
232
- globalClient
233
- ? Promise.resolve(globalClient)
234
- : importedClient
235
- ]);
236
- const { gql, ApolloError } = modules;
237
- const CREATE_MANY_ASSET = gql `
238
- mutation createManyAsset($data: [AssetCreateManyInput!]!) {
239
- createManyAsset(data: $data) {
240
- count
241
- }
242
- }`;
243
- const variables = {
244
- data: props.map(prop => ({
245
- symbol: prop.symbol !== undefined ? prop.symbol : undefined,
246
- name: prop.name !== undefined ? prop.name : undefined,
247
- type: prop.type !== undefined ? prop.type : undefined,
248
- logoUrl: prop.logoUrl !== undefined ? prop.logoUrl : undefined,
249
- description: prop.description !== undefined ? prop.description : undefined,
250
- cik: prop.cik !== undefined ? prop.cik : undefined,
251
- exchange: prop.exchange !== undefined ? prop.exchange : undefined,
252
- currency: prop.currency !== undefined ? prop.currency : undefined,
253
- country: prop.country !== undefined ? prop.country : undefined,
254
- sector: prop.sector !== undefined ? prop.sector : undefined,
255
- industry: prop.industry !== undefined ? prop.industry : undefined,
256
- address: prop.address !== undefined ? prop.address : undefined,
257
- officialSite: prop.officialSite !== undefined ? prop.officialSite : undefined,
258
- fiscalYearEnd: prop.fiscalYearEnd !== undefined ? prop.fiscalYearEnd : undefined,
259
- latestQuarter: prop.latestQuarter !== undefined ? prop.latestQuarter : undefined,
260
- marketCapitalization: prop.marketCapitalization !== undefined ? prop.marketCapitalization : undefined,
261
- ebitda: prop.ebitda !== undefined ? prop.ebitda : undefined,
262
- peRatio: prop.peRatio !== undefined ? prop.peRatio : undefined,
263
- pegRatio: prop.pegRatio !== undefined ? prop.pegRatio : undefined,
264
- bookValue: prop.bookValue !== undefined ? prop.bookValue : undefined,
265
- dividendPerShare: prop.dividendPerShare !== undefined ? prop.dividendPerShare : undefined,
266
- dividendYield: prop.dividendYield !== undefined ? prop.dividendYield : undefined,
267
- eps: prop.eps !== undefined ? prop.eps : undefined,
268
- revenuePerShareTTM: prop.revenuePerShareTTM !== undefined ? prop.revenuePerShareTTM : undefined,
269
- profitMargin: prop.profitMargin !== undefined ? prop.profitMargin : undefined,
270
- operatingMarginTTM: prop.operatingMarginTTM !== undefined ? prop.operatingMarginTTM : undefined,
271
- returnOnAssetsTTM: prop.returnOnAssetsTTM !== undefined ? prop.returnOnAssetsTTM : undefined,
272
- returnOnEquityTTM: prop.returnOnEquityTTM !== undefined ? prop.returnOnEquityTTM : undefined,
273
- revenueTTM: prop.revenueTTM !== undefined ? prop.revenueTTM : undefined,
274
- grossProfitTTM: prop.grossProfitTTM !== undefined ? prop.grossProfitTTM : undefined,
275
- dilutedEPSTTM: prop.dilutedEPSTTM !== undefined ? prop.dilutedEPSTTM : undefined,
276
- quarterlyEarningsGrowthYOY: prop.quarterlyEarningsGrowthYOY !== undefined ? prop.quarterlyEarningsGrowthYOY : undefined,
277
- quarterlyRevenueGrowthYOY: prop.quarterlyRevenueGrowthYOY !== undefined ? prop.quarterlyRevenueGrowthYOY : undefined,
278
- analystTargetPrice: prop.analystTargetPrice !== undefined ? prop.analystTargetPrice : undefined,
279
- analystRatingStrongBuy: prop.analystRatingStrongBuy !== undefined ? prop.analystRatingStrongBuy : undefined,
280
- analystRatingBuy: prop.analystRatingBuy !== undefined ? prop.analystRatingBuy : undefined,
281
- analystRatingHold: prop.analystRatingHold !== undefined ? prop.analystRatingHold : undefined,
282
- analystRatingSell: prop.analystRatingSell !== undefined ? prop.analystRatingSell : undefined,
283
- analystRatingStrongSell: prop.analystRatingStrongSell !== undefined ? prop.analystRatingStrongSell : undefined,
284
- trailingPE: prop.trailingPE !== undefined ? prop.trailingPE : undefined,
285
- forwardPE: prop.forwardPE !== undefined ? prop.forwardPE : undefined,
286
- priceToSalesRatioTTM: prop.priceToSalesRatioTTM !== undefined ? prop.priceToSalesRatioTTM : undefined,
287
- priceToBookRatio: prop.priceToBookRatio !== undefined ? prop.priceToBookRatio : undefined,
288
- evToRevenue: prop.evToRevenue !== undefined ? prop.evToRevenue : undefined,
289
- evToEbitda: prop.evToEbitda !== undefined ? prop.evToEbitda : undefined,
290
- beta: prop.beta !== undefined ? prop.beta : undefined,
291
- week52High: prop.week52High !== undefined ? prop.week52High : undefined,
292
- week52Low: prop.week52Low !== undefined ? prop.week52Low : undefined,
293
- day50MovingAverage: prop.day50MovingAverage !== undefined ? prop.day50MovingAverage : undefined,
294
- day200MovingAverage: prop.day200MovingAverage !== undefined ? prop.day200MovingAverage : undefined,
295
- sharesOutstanding: prop.sharesOutstanding !== undefined ? prop.sharesOutstanding : undefined,
296
- dividendDate: prop.dividendDate !== undefined ? prop.dividendDate : undefined,
297
- exDividendDate: prop.exDividendDate !== undefined ? prop.exDividendDate : undefined,
298
- askPrice: prop.askPrice !== undefined ? prop.askPrice : undefined,
299
- bidPrice: prop.bidPrice !== undefined ? prop.bidPrice : undefined,
300
- })),
301
- };
302
- const filteredVariables = removeUndefinedProps(variables);
303
- try {
304
- const response = await client.mutate({ mutation: CREATE_MANY_ASSET, variables: filteredVariables });
305
- if (response.errors && response.errors.length > 0)
306
- throw new Error(response.errors[0].message);
307
- if (response && response.data && response.data.createManyAsset) {
308
- return response.data.createManyAsset;
309
- }
310
- else {
311
- return null;
312
- }
313
- }
314
- catch (error) {
315
- console.error('Error in createManyAsset:', error);
316
- throw error;
317
- }
318
- },
319
- /**
320
- * Update a single Asset record.
321
- * @param props - Properties to update.
322
- * @param globalClient - Apollo Client instance.
323
- * @returns The updated Asset or null.
324
- */
325
- async update(props, globalClient) {
326
- const [modules, client] = await Promise.all([
327
- getApolloModules(),
328
- globalClient
329
- ? Promise.resolve(globalClient)
330
- : importedClient
331
- ]);
332
- const { gql, ApolloError } = modules;
333
- const UPDATE_ONE_ASSET = gql `
334
- mutation updateOneAsset($data: AssetUpdateInput!, $where: AssetWhereUniqueInput!) {
335
- updateOneAsset(data: $data, where: $where) {
336
- ${selectionSet}
337
- }
338
- }`;
339
- const variables = {
340
- where: {
341
- id: props.id !== undefined ? props.id : undefined,
342
- symbol: props.symbol !== undefined ? props.symbol : undefined,
343
- name: props.name !== undefined ? props.name : undefined,
344
- },
345
- data: {
346
- id: props.id !== undefined ? {
347
- set: props.id
348
- } : undefined,
349
- symbol: props.symbol !== undefined ? {
350
- set: props.symbol
351
- } : undefined,
352
- name: props.name !== undefined ? {
353
- set: props.name
354
- } : undefined,
355
- type: props.type !== undefined ? {
356
- set: props.type
357
- } : undefined,
358
- logoUrl: props.logoUrl !== undefined ? {
359
- set: props.logoUrl
360
- } : undefined,
361
- description: props.description !== undefined ? {
362
- set: props.description
363
- } : undefined,
364
- cik: props.cik !== undefined ? {
365
- set: props.cik
366
- } : undefined,
367
- exchange: props.exchange !== undefined ? {
368
- set: props.exchange
369
- } : undefined,
370
- currency: props.currency !== undefined ? {
371
- set: props.currency
372
- } : undefined,
373
- country: props.country !== undefined ? {
374
- set: props.country
375
- } : undefined,
376
- sector: props.sector !== undefined ? {
377
- set: props.sector
378
- } : undefined,
379
- industry: props.industry !== undefined ? {
380
- set: props.industry
381
- } : undefined,
382
- address: props.address !== undefined ? {
383
- set: props.address
384
- } : undefined,
385
- officialSite: props.officialSite !== undefined ? {
386
- set: props.officialSite
387
- } : undefined,
388
- fiscalYearEnd: props.fiscalYearEnd !== undefined ? {
389
- set: props.fiscalYearEnd
390
- } : undefined,
391
- latestQuarter: props.latestQuarter !== undefined ? {
392
- set: props.latestQuarter
393
- } : undefined,
394
- marketCapitalization: props.marketCapitalization !== undefined ? {
395
- set: props.marketCapitalization
396
- } : undefined,
397
- ebitda: props.ebitda !== undefined ? {
398
- set: props.ebitda
399
- } : undefined,
400
- peRatio: props.peRatio !== undefined ? {
401
- set: props.peRatio
402
- } : undefined,
403
- pegRatio: props.pegRatio !== undefined ? {
404
- set: props.pegRatio
405
- } : undefined,
406
- bookValue: props.bookValue !== undefined ? {
407
- set: props.bookValue
408
- } : undefined,
409
- dividendPerShare: props.dividendPerShare !== undefined ? {
410
- set: props.dividendPerShare
411
- } : undefined,
412
- dividendYield: props.dividendYield !== undefined ? {
413
- set: props.dividendYield
414
- } : undefined,
415
- eps: props.eps !== undefined ? {
416
- set: props.eps
417
- } : undefined,
418
- revenuePerShareTTM: props.revenuePerShareTTM !== undefined ? {
419
- set: props.revenuePerShareTTM
420
- } : undefined,
421
- profitMargin: props.profitMargin !== undefined ? {
422
- set: props.profitMargin
423
- } : undefined,
424
- operatingMarginTTM: props.operatingMarginTTM !== undefined ? {
425
- set: props.operatingMarginTTM
426
- } : undefined,
427
- returnOnAssetsTTM: props.returnOnAssetsTTM !== undefined ? {
428
- set: props.returnOnAssetsTTM
429
- } : undefined,
430
- returnOnEquityTTM: props.returnOnEquityTTM !== undefined ? {
431
- set: props.returnOnEquityTTM
432
- } : undefined,
433
- revenueTTM: props.revenueTTM !== undefined ? {
434
- set: props.revenueTTM
435
- } : undefined,
436
- grossProfitTTM: props.grossProfitTTM !== undefined ? {
437
- set: props.grossProfitTTM
438
- } : undefined,
439
- dilutedEPSTTM: props.dilutedEPSTTM !== undefined ? {
440
- set: props.dilutedEPSTTM
441
- } : undefined,
442
- quarterlyEarningsGrowthYOY: props.quarterlyEarningsGrowthYOY !== undefined ? {
443
- set: props.quarterlyEarningsGrowthYOY
444
- } : undefined,
445
- quarterlyRevenueGrowthYOY: props.quarterlyRevenueGrowthYOY !== undefined ? {
446
- set: props.quarterlyRevenueGrowthYOY
447
- } : undefined,
448
- analystTargetPrice: props.analystTargetPrice !== undefined ? {
449
- set: props.analystTargetPrice
450
- } : undefined,
451
- analystRatingStrongBuy: props.analystRatingStrongBuy !== undefined ? {
452
- set: props.analystRatingStrongBuy
453
- } : undefined,
454
- analystRatingBuy: props.analystRatingBuy !== undefined ? {
455
- set: props.analystRatingBuy
456
- } : undefined,
457
- analystRatingHold: props.analystRatingHold !== undefined ? {
458
- set: props.analystRatingHold
459
- } : undefined,
460
- analystRatingSell: props.analystRatingSell !== undefined ? {
461
- set: props.analystRatingSell
462
- } : undefined,
463
- analystRatingStrongSell: props.analystRatingStrongSell !== undefined ? {
464
- set: props.analystRatingStrongSell
465
- } : undefined,
466
- trailingPE: props.trailingPE !== undefined ? {
467
- set: props.trailingPE
468
- } : undefined,
469
- forwardPE: props.forwardPE !== undefined ? {
470
- set: props.forwardPE
471
- } : undefined,
472
- priceToSalesRatioTTM: props.priceToSalesRatioTTM !== undefined ? {
473
- set: props.priceToSalesRatioTTM
474
- } : undefined,
475
- priceToBookRatio: props.priceToBookRatio !== undefined ? {
476
- set: props.priceToBookRatio
477
- } : undefined,
478
- evToRevenue: props.evToRevenue !== undefined ? {
479
- set: props.evToRevenue
480
- } : undefined,
481
- evToEbitda: props.evToEbitda !== undefined ? {
482
- set: props.evToEbitda
483
- } : undefined,
484
- beta: props.beta !== undefined ? {
485
- set: props.beta
486
- } : undefined,
487
- week52High: props.week52High !== undefined ? {
488
- set: props.week52High
489
- } : undefined,
490
- week52Low: props.week52Low !== undefined ? {
491
- set: props.week52Low
492
- } : undefined,
493
- day50MovingAverage: props.day50MovingAverage !== undefined ? {
494
- set: props.day50MovingAverage
495
- } : undefined,
496
- day200MovingAverage: props.day200MovingAverage !== undefined ? {
497
- set: props.day200MovingAverage
498
- } : undefined,
499
- sharesOutstanding: props.sharesOutstanding !== undefined ? {
500
- set: props.sharesOutstanding
501
- } : undefined,
502
- dividendDate: props.dividendDate !== undefined ? {
503
- set: props.dividendDate
504
- } : undefined,
505
- exDividendDate: props.exDividendDate !== undefined ? {
506
- set: props.exDividendDate
507
- } : undefined,
508
- askPrice: props.askPrice !== undefined ? {
509
- set: props.askPrice
510
- } : undefined,
511
- bidPrice: props.bidPrice !== undefined ? {
512
- set: props.bidPrice
513
- } : undefined,
514
- createdAt: props.createdAt !== undefined ? {
515
- set: props.createdAt
516
- } : undefined,
517
- updatedAt: props.updatedAt !== undefined ? {
518
- set: props.updatedAt
519
- } : undefined,
520
- newsMentions: props.newsMentions ?
521
- Array.isArray(props.newsMentions) && props.newsMentions.length > 0 && props.newsMentions.every((item) => typeof item === 'object' && ('id' in item || 'symbol' in item) && Object.keys(item).length === 1) ? {
522
- connect: props.newsMentions.map((item) => ({
523
- id: item.id
524
- }))
525
- } : { upsert: props.newsMentions.map((item) => ({
526
- where: {
527
- id: item.id !== undefined ? item.id : undefined,
528
- url: item.url !== undefined ? item.url : undefined,
529
- assetId: item.assetId !== undefined ? {
530
- equals: item.assetId
531
- } : undefined,
532
- newsArticleId: item.newsArticleId !== undefined ? {
533
- equals: item.newsArticleId
534
- } : undefined,
535
- },
536
- update: {
537
- id: item.id !== undefined ? {
538
- set: item.id
539
- } : undefined,
540
- url: item.url !== undefined ? {
541
- set: item.url
542
- } : undefined,
543
- relevancyScore: item.relevancyScore !== undefined ? {
544
- set: item.relevancyScore
545
- } : undefined,
546
- sentimentScore: item.sentimentScore !== undefined ? {
547
- set: item.sentimentScore
548
- } : undefined,
549
- sentimentLabel: item.sentimentLabel !== undefined ? {
550
- set: item.sentimentLabel
551
- } : undefined,
552
- news: item.news ?
553
- typeof item.news === 'object' && Object.keys(item.news).length === 1 && (Object.keys(item.news)[0] === 'id' || Object.keys(item.news)[0] === 'symbol')
554
- ? {
555
- connect: {
556
- id: item.news.id
557
- }
558
- } : { upsert: {
559
- where: {
560
- id: item.news.id !== undefined ? {
561
- equals: item.news.id
562
- } : undefined,
563
- title: item.news.title !== undefined ? {
564
- equals: item.news.title
565
- } : undefined,
566
- url: item.news.url !== undefined ? {
567
- equals: item.news.url
568
- } : undefined,
569
- },
570
- update: {
571
- id: item.news.id !== undefined ? {
572
- set: item.news.id
573
- } : undefined,
574
- title: item.news.title !== undefined ? {
575
- set: item.news.title
576
- } : undefined,
577
- content: item.news.content !== undefined ? {
578
- set: item.news.content
579
- } : undefined,
580
- source: item.news.source !== undefined ? {
581
- set: item.news.source
582
- } : undefined,
583
- sourceDomain: item.news.sourceDomain !== undefined ? {
584
- set: item.news.sourceDomain
585
- } : undefined,
586
- url: item.news.url !== undefined ? {
587
- set: item.news.url
588
- } : undefined,
589
- sentiment: item.news.sentiment !== undefined ? {
590
- set: item.news.sentiment
591
- } : undefined,
592
- authors: item.news.authors !== undefined ? {
593
- set: item.news.authors
594
- } : undefined,
595
- summary: item.news.summary !== undefined ? {
596
- set: item.news.summary
597
- } : undefined,
598
- bannerImage: item.news.bannerImage !== undefined ? {
599
- set: item.news.bannerImage
600
- } : undefined,
601
- timePublished: item.news.timePublished !== undefined ? {
602
- set: item.news.timePublished
603
- } : undefined,
604
- category: item.news.category !== undefined ? {
605
- set: item.news.category
606
- } : undefined,
607
- topics: item.news.topics !== undefined ? {
608
- set: item.news.topics
609
- } : undefined,
610
- logo: item.news.logo !== undefined ? {
611
- set: item.news.logo
612
- } : undefined,
613
- },
614
- create: {
615
- title: item.news.title !== undefined ? item.news.title : undefined,
616
- content: item.news.content !== undefined ? item.news.content : undefined,
617
- source: item.news.source !== undefined ? item.news.source : undefined,
618
- sourceDomain: item.news.sourceDomain !== undefined ? item.news.sourceDomain : undefined,
619
- url: item.news.url !== undefined ? item.news.url : undefined,
620
- sentiment: item.news.sentiment !== undefined ? item.news.sentiment : undefined,
621
- authors: item.news.authors !== undefined ? {
622
- set: item.news.authors
623
- } : undefined,
624
- summary: item.news.summary !== undefined ? item.news.summary : undefined,
625
- bannerImage: item.news.bannerImage !== undefined ? item.news.bannerImage : undefined,
626
- timePublished: item.news.timePublished !== undefined ? item.news.timePublished : undefined,
627
- category: item.news.category !== undefined ? item.news.category : undefined,
628
- topics: item.news.topics !== undefined ? {
629
- set: item.news.topics
709
+ },
710
+ create: {
711
+ url: item.url !== undefined ? item.url : undefined,
712
+ relevancyScore: item.relevancyScore !== undefined ? item.relevancyScore : undefined,
713
+ sentimentScore: item.sentimentScore !== undefined ? item.sentimentScore : undefined,
714
+ sentimentLabel: item.sentimentLabel !== undefined ? item.sentimentLabel : undefined,
715
+ news: item.news ?
716
+ typeof item.news === 'object' && Object.keys(item.news).length === 1 && Object.keys(item.news)[0] === 'id'
717
+ ? { connect: {
718
+ id: item.news.id
719
+ }
720
+ }
721
+ : { connectOrCreate: {
722
+ where: {
723
+ id: item.news.id !== undefined ? item.news.id : undefined,
724
+ url: item.news.url !== undefined ? item.news.url : undefined,
725
+ title: item.news.title !== undefined ? {
726
+ equals: item.news.title
727
+ } : undefined,
728
+ },
729
+ create: {
730
+ title: item.news.title !== undefined ? item.news.title : undefined,
731
+ content: item.news.content !== undefined ? item.news.content : undefined,
732
+ source: item.news.source !== undefined ? item.news.source : undefined,
733
+ sourceDomain: item.news.sourceDomain !== undefined ? item.news.sourceDomain : undefined,
734
+ url: item.news.url !== undefined ? item.news.url : undefined,
735
+ sentiment: item.news.sentiment !== undefined ? item.news.sentiment : undefined,
736
+ authors: item.news.authors !== undefined ? {
737
+ set: item.news.authors
738
+ } : undefined,
739
+ summary: item.news.summary !== undefined ? item.news.summary : undefined,
740
+ bannerImage: item.news.bannerImage !== undefined ? item.news.bannerImage : undefined,
741
+ timePublished: item.news.timePublished !== undefined ? item.news.timePublished : undefined,
742
+ category: item.news.category !== undefined ? item.news.category : undefined,
743
+ topics: item.news.topics !== undefined ? {
744
+ set: item.news.topics
745
+ } : undefined,
746
+ logo: item.news.logo !== undefined ? item.news.logo : undefined,
747
+ },
748
+ }
630
749
  } : undefined,
631
- logo: item.news.logo !== undefined ? item.news.logo : undefined,
632
- },
633
- }
634
- } : undefined,
635
- },
636
- create: {
637
- url: item.url !== undefined ? item.url : undefined,
638
- relevancyScore: item.relevancyScore !== undefined ? item.relevancyScore : undefined,
639
- sentimentScore: item.sentimentScore !== undefined ? item.sentimentScore : undefined,
640
- sentimentLabel: item.sentimentLabel !== undefined ? item.sentimentLabel : undefined,
641
- news: item.news ?
642
- typeof item.news === 'object' && Object.keys(item.news).length === 1 && Object.keys(item.news)[0] === 'id'
643
- ? { connect: {
644
- id: item.news.id
645
- }
646
- }
647
- : { connectOrCreate: {
648
- where: {
649
- id: item.news.id !== undefined ? item.news.id : undefined,
650
- url: item.news.url !== undefined ? item.news.url : undefined,
651
- title: item.news.title !== undefined ? {
652
- equals: item.news.title
653
- } : undefined,
654
- },
655
- create: {
656
- title: item.news.title !== undefined ? item.news.title : undefined,
657
- content: item.news.content !== undefined ? item.news.content : undefined,
658
- source: item.news.source !== undefined ? item.news.source : undefined,
659
- sourceDomain: item.news.sourceDomain !== undefined ? item.news.sourceDomain : undefined,
660
- url: item.news.url !== undefined ? item.news.url : undefined,
661
- sentiment: item.news.sentiment !== undefined ? item.news.sentiment : undefined,
662
- authors: item.news.authors !== undefined ? {
663
- set: item.news.authors
664
- } : undefined,
665
- summary: item.news.summary !== undefined ? item.news.summary : undefined,
666
- bannerImage: item.news.bannerImage !== undefined ? item.news.bannerImage : undefined,
667
- timePublished: item.news.timePublished !== undefined ? item.news.timePublished : undefined,
668
- category: item.news.category !== undefined ? item.news.category : undefined,
669
- topics: item.news.topics !== undefined ? {
670
- set: item.news.topics
671
- } : undefined,
672
- logo: item.news.logo !== undefined ? item.news.logo : undefined,
673
- },
674
- }
675
- } : undefined,
676
- },
677
- }))
678
- } : undefined,
679
- },
680
- };
681
- const filteredVariables = removeUndefinedProps(variables);
682
- try {
683
- const response = await client.mutate({ mutation: UPDATE_ONE_ASSET, variables: filteredVariables });
684
- if (response.errors && response.errors.length > 0)
685
- throw new Error(response.errors[0].message);
686
- if (response && response.data && response.data.updateOneAsset) {
687
- return response.data.updateOneAsset;
750
+ },
751
+ }))
752
+ } : undefined,
753
+ },
754
+ };
755
+ const filteredVariables = removeUndefinedProps(variables);
756
+ const response = await client.mutate({
757
+ mutation: UPDATE_ONE_ASSET,
758
+ variables: filteredVariables,
759
+ // Don't cache mutations, but ensure we're using the freshest context
760
+ fetchPolicy: 'no-cache'
761
+ });
762
+ if (response.errors && response.errors.length > 0)
763
+ throw new Error(response.errors[0].message);
764
+ if (response && response.data && response.data.updateOneAsset) {
765
+ return response.data.updateOneAsset;
766
+ }
767
+ else {
768
+ return null;
769
+ }
688
770
  }
689
- else {
690
- return null;
771
+ catch (error) {
772
+ lastError = error;
773
+ // Check if this is a database connection error that we should retry
774
+ const isConnectionError = error.message?.includes('Server has closed the connection') ||
775
+ error.message?.includes('Cannot reach database server') ||
776
+ error.message?.includes('Connection timed out') ||
777
+ error.message?.includes('Accelerate') || // Prisma Accelerate proxy errors
778
+ (error.networkError && error.networkError.message?.includes('Failed to fetch'));
779
+ if (isConnectionError && retryCount < MAX_RETRIES - 1) {
780
+ retryCount++;
781
+ const delay = Math.pow(2, retryCount) * 100; // Exponential backoff: 200ms, 400ms, 800ms
782
+ console.warn("Database connection error, retrying...");
783
+ await new Promise(resolve => setTimeout(resolve, delay));
784
+ continue;
785
+ }
786
+ // Log the error and rethrow
787
+ console.error("Database error occurred:", error);
788
+ throw error;
691
789
  }
692
790
  }
693
- catch (error) {
694
- console.error('Error in updateOneAsset:', error);
695
- throw error;
696
- }
791
+ // If we exhausted retries, throw the last error
792
+ throw lastError;
697
793
  },
698
794
  /**
699
795
  * Upsert a single Asset record.
796
+ * Enhanced with connection resilience against Prisma connection errors.
700
797
  * @param props - Properties to update.
701
798
  * @param globalClient - Apollo Client instance.
702
799
  * @returns The updated Asset or null.
703
800
  */
704
801
  async upsert(props, globalClient) {
705
- const [modules, client] = await Promise.all([
706
- getApolloModules(),
707
- globalClient
708
- ? Promise.resolve(globalClient)
709
- : importedClient
710
- ]);
711
- const { gql, ApolloError } = modules;
712
- const UPSERT_ONE_ASSET = gql `
713
- mutation upsertOneAsset($where: AssetWhereUniqueInput!, $create: AssetCreateInput!, $update: AssetUpdateInput!) {
714
- upsertOneAsset(where: $where, create: $create, update: $update) {
715
- ${selectionSet}
716
- }
717
- }`;
718
- const variables = {
719
- where: {
720
- id: props.id !== undefined ? props.id : undefined,
721
- symbol: props.symbol !== undefined ? props.symbol : undefined,
722
- name: props.name !== undefined ? props.name : undefined,
723
- },
724
- create: {
725
- symbol: props.symbol !== undefined ? props.symbol : undefined,
726
- name: props.name !== undefined ? props.name : undefined,
727
- type: props.type !== undefined ? props.type : undefined,
728
- logoUrl: props.logoUrl !== undefined ? props.logoUrl : undefined,
729
- description: props.description !== undefined ? props.description : undefined,
730
- cik: props.cik !== undefined ? props.cik : undefined,
731
- exchange: props.exchange !== undefined ? props.exchange : undefined,
732
- currency: props.currency !== undefined ? props.currency : undefined,
733
- country: props.country !== undefined ? props.country : undefined,
734
- sector: props.sector !== undefined ? props.sector : undefined,
735
- industry: props.industry !== undefined ? props.industry : undefined,
736
- address: props.address !== undefined ? props.address : undefined,
737
- officialSite: props.officialSite !== undefined ? props.officialSite : undefined,
738
- fiscalYearEnd: props.fiscalYearEnd !== undefined ? props.fiscalYearEnd : undefined,
739
- latestQuarter: props.latestQuarter !== undefined ? props.latestQuarter : undefined,
740
- marketCapitalization: props.marketCapitalization !== undefined ? props.marketCapitalization : undefined,
741
- ebitda: props.ebitda !== undefined ? props.ebitda : undefined,
742
- peRatio: props.peRatio !== undefined ? props.peRatio : undefined,
743
- pegRatio: props.pegRatio !== undefined ? props.pegRatio : undefined,
744
- bookValue: props.bookValue !== undefined ? props.bookValue : undefined,
745
- dividendPerShare: props.dividendPerShare !== undefined ? props.dividendPerShare : undefined,
746
- dividendYield: props.dividendYield !== undefined ? props.dividendYield : undefined,
747
- eps: props.eps !== undefined ? props.eps : undefined,
748
- revenuePerShareTTM: props.revenuePerShareTTM !== undefined ? props.revenuePerShareTTM : undefined,
749
- profitMargin: props.profitMargin !== undefined ? props.profitMargin : undefined,
750
- operatingMarginTTM: props.operatingMarginTTM !== undefined ? props.operatingMarginTTM : undefined,
751
- returnOnAssetsTTM: props.returnOnAssetsTTM !== undefined ? props.returnOnAssetsTTM : undefined,
752
- returnOnEquityTTM: props.returnOnEquityTTM !== undefined ? props.returnOnEquityTTM : undefined,
753
- revenueTTM: props.revenueTTM !== undefined ? props.revenueTTM : undefined,
754
- grossProfitTTM: props.grossProfitTTM !== undefined ? props.grossProfitTTM : undefined,
755
- dilutedEPSTTM: props.dilutedEPSTTM !== undefined ? props.dilutedEPSTTM : undefined,
756
- quarterlyEarningsGrowthYOY: props.quarterlyEarningsGrowthYOY !== undefined ? props.quarterlyEarningsGrowthYOY : undefined,
757
- quarterlyRevenueGrowthYOY: props.quarterlyRevenueGrowthYOY !== undefined ? props.quarterlyRevenueGrowthYOY : undefined,
758
- analystTargetPrice: props.analystTargetPrice !== undefined ? props.analystTargetPrice : undefined,
759
- analystRatingStrongBuy: props.analystRatingStrongBuy !== undefined ? props.analystRatingStrongBuy : undefined,
760
- analystRatingBuy: props.analystRatingBuy !== undefined ? props.analystRatingBuy : undefined,
761
- analystRatingHold: props.analystRatingHold !== undefined ? props.analystRatingHold : undefined,
762
- analystRatingSell: props.analystRatingSell !== undefined ? props.analystRatingSell : undefined,
763
- analystRatingStrongSell: props.analystRatingStrongSell !== undefined ? props.analystRatingStrongSell : undefined,
764
- trailingPE: props.trailingPE !== undefined ? props.trailingPE : undefined,
765
- forwardPE: props.forwardPE !== undefined ? props.forwardPE : undefined,
766
- priceToSalesRatioTTM: props.priceToSalesRatioTTM !== undefined ? props.priceToSalesRatioTTM : undefined,
767
- priceToBookRatio: props.priceToBookRatio !== undefined ? props.priceToBookRatio : undefined,
768
- evToRevenue: props.evToRevenue !== undefined ? props.evToRevenue : undefined,
769
- evToEbitda: props.evToEbitda !== undefined ? props.evToEbitda : undefined,
770
- beta: props.beta !== undefined ? props.beta : undefined,
771
- week52High: props.week52High !== undefined ? props.week52High : undefined,
772
- week52Low: props.week52Low !== undefined ? props.week52Low : undefined,
773
- day50MovingAverage: props.day50MovingAverage !== undefined ? props.day50MovingAverage : undefined,
774
- day200MovingAverage: props.day200MovingAverage !== undefined ? props.day200MovingAverage : undefined,
775
- sharesOutstanding: props.sharesOutstanding !== undefined ? props.sharesOutstanding : undefined,
776
- dividendDate: props.dividendDate !== undefined ? props.dividendDate : undefined,
777
- exDividendDate: props.exDividendDate !== undefined ? props.exDividendDate : undefined,
778
- askPrice: props.askPrice !== undefined ? props.askPrice : undefined,
779
- bidPrice: props.bidPrice !== undefined ? props.bidPrice : undefined,
780
- newsMentions: props.newsMentions ?
781
- Array.isArray(props.newsMentions) && props.newsMentions.length > 0 && props.newsMentions.every((item) => typeof item === 'object' && 'id' in item && Object.keys(item).length === 1) ? {
782
- connect: props.newsMentions.map((item) => ({
783
- id: item.id
784
- }))
785
- }
786
- : { connectOrCreate: props.newsMentions.map((item) => ({
787
- where: {
788
- id: item.id !== undefined ? item.id : undefined,
789
- url: item.url !== undefined ? item.url : undefined,
790
- newsArticleId: item.newsArticleId !== undefined ? {
791
- equals: item.newsArticleId
792
- } : undefined,
793
- },
794
- create: {
795
- url: item.url !== undefined ? item.url : undefined,
796
- relevancyScore: item.relevancyScore !== undefined ? item.relevancyScore : undefined,
797
- sentimentScore: item.sentimentScore !== undefined ? item.sentimentScore : undefined,
798
- sentimentLabel: item.sentimentLabel !== undefined ? item.sentimentLabel : undefined,
799
- news: item.news ?
800
- typeof item.news === 'object' && Object.keys(item.news).length === 1 && Object.keys(item.news)[0] === 'id'
801
- ? { connect: {
802
- id: item.news.id
803
- }
804
- }
805
- : { connectOrCreate: {
802
+ // Maximum number of retries for database connection issues
803
+ const MAX_RETRIES = 3;
804
+ let retryCount = 0;
805
+ let lastError = null;
806
+ // Retry loop to handle potential database connection issues
807
+ while (retryCount < MAX_RETRIES) {
808
+ try {
809
+ const [modules, client] = await Promise.all([
810
+ getApolloModules(),
811
+ globalClient
812
+ ? Promise.resolve(globalClient)
813
+ : importedClient
814
+ ]);
815
+ const { gql, ApolloError } = modules;
816
+ const UPSERT_ONE_ASSET = gql `
817
+ mutation upsertOneAsset($where: AssetWhereUniqueInput!, $create: AssetCreateInput!, $update: AssetUpdateInput!) {
818
+ upsertOneAsset(where: $where, create: $create, update: $update) {
819
+ ${selectionSet}
820
+ }
821
+ }`;
822
+ const variables = {
823
+ where: {
824
+ id: props.id !== undefined ? props.id : undefined,
825
+ symbol: props.symbol !== undefined ? props.symbol : undefined,
826
+ name: props.name !== undefined ? props.name : undefined,
827
+ },
828
+ create: {
829
+ symbol: props.symbol !== undefined ? props.symbol : undefined,
830
+ name: props.name !== undefined ? props.name : undefined,
831
+ type: props.type !== undefined ? props.type : undefined,
832
+ logoUrl: props.logoUrl !== undefined ? props.logoUrl : undefined,
833
+ description: props.description !== undefined ? props.description : undefined,
834
+ cik: props.cik !== undefined ? props.cik : undefined,
835
+ exchange: props.exchange !== undefined ? props.exchange : undefined,
836
+ currency: props.currency !== undefined ? props.currency : undefined,
837
+ country: props.country !== undefined ? props.country : undefined,
838
+ sector: props.sector !== undefined ? props.sector : undefined,
839
+ industry: props.industry !== undefined ? props.industry : undefined,
840
+ address: props.address !== undefined ? props.address : undefined,
841
+ officialSite: props.officialSite !== undefined ? props.officialSite : undefined,
842
+ fiscalYearEnd: props.fiscalYearEnd !== undefined ? props.fiscalYearEnd : undefined,
843
+ latestQuarter: props.latestQuarter !== undefined ? props.latestQuarter : undefined,
844
+ marketCapitalization: props.marketCapitalization !== undefined ? props.marketCapitalization : undefined,
845
+ ebitda: props.ebitda !== undefined ? props.ebitda : undefined,
846
+ peRatio: props.peRatio !== undefined ? props.peRatio : undefined,
847
+ pegRatio: props.pegRatio !== undefined ? props.pegRatio : undefined,
848
+ bookValue: props.bookValue !== undefined ? props.bookValue : undefined,
849
+ dividendPerShare: props.dividendPerShare !== undefined ? props.dividendPerShare : undefined,
850
+ dividendYield: props.dividendYield !== undefined ? props.dividendYield : undefined,
851
+ eps: props.eps !== undefined ? props.eps : undefined,
852
+ revenuePerShareTTM: props.revenuePerShareTTM !== undefined ? props.revenuePerShareTTM : undefined,
853
+ profitMargin: props.profitMargin !== undefined ? props.profitMargin : undefined,
854
+ operatingMarginTTM: props.operatingMarginTTM !== undefined ? props.operatingMarginTTM : undefined,
855
+ returnOnAssetsTTM: props.returnOnAssetsTTM !== undefined ? props.returnOnAssetsTTM : undefined,
856
+ returnOnEquityTTM: props.returnOnEquityTTM !== undefined ? props.returnOnEquityTTM : undefined,
857
+ revenueTTM: props.revenueTTM !== undefined ? props.revenueTTM : undefined,
858
+ grossProfitTTM: props.grossProfitTTM !== undefined ? props.grossProfitTTM : undefined,
859
+ dilutedEPSTTM: props.dilutedEPSTTM !== undefined ? props.dilutedEPSTTM : undefined,
860
+ quarterlyEarningsGrowthYOY: props.quarterlyEarningsGrowthYOY !== undefined ? props.quarterlyEarningsGrowthYOY : undefined,
861
+ quarterlyRevenueGrowthYOY: props.quarterlyRevenueGrowthYOY !== undefined ? props.quarterlyRevenueGrowthYOY : undefined,
862
+ analystTargetPrice: props.analystTargetPrice !== undefined ? props.analystTargetPrice : undefined,
863
+ analystRatingStrongBuy: props.analystRatingStrongBuy !== undefined ? props.analystRatingStrongBuy : undefined,
864
+ analystRatingBuy: props.analystRatingBuy !== undefined ? props.analystRatingBuy : undefined,
865
+ analystRatingHold: props.analystRatingHold !== undefined ? props.analystRatingHold : undefined,
866
+ analystRatingSell: props.analystRatingSell !== undefined ? props.analystRatingSell : undefined,
867
+ analystRatingStrongSell: props.analystRatingStrongSell !== undefined ? props.analystRatingStrongSell : undefined,
868
+ trailingPE: props.trailingPE !== undefined ? props.trailingPE : undefined,
869
+ forwardPE: props.forwardPE !== undefined ? props.forwardPE : undefined,
870
+ priceToSalesRatioTTM: props.priceToSalesRatioTTM !== undefined ? props.priceToSalesRatioTTM : undefined,
871
+ priceToBookRatio: props.priceToBookRatio !== undefined ? props.priceToBookRatio : undefined,
872
+ evToRevenue: props.evToRevenue !== undefined ? props.evToRevenue : undefined,
873
+ evToEbitda: props.evToEbitda !== undefined ? props.evToEbitda : undefined,
874
+ beta: props.beta !== undefined ? props.beta : undefined,
875
+ week52High: props.week52High !== undefined ? props.week52High : undefined,
876
+ week52Low: props.week52Low !== undefined ? props.week52Low : undefined,
877
+ day50MovingAverage: props.day50MovingAverage !== undefined ? props.day50MovingAverage : undefined,
878
+ day200MovingAverage: props.day200MovingAverage !== undefined ? props.day200MovingAverage : undefined,
879
+ sharesOutstanding: props.sharesOutstanding !== undefined ? props.sharesOutstanding : undefined,
880
+ dividendDate: props.dividendDate !== undefined ? props.dividendDate : undefined,
881
+ exDividendDate: props.exDividendDate !== undefined ? props.exDividendDate : undefined,
882
+ askPrice: props.askPrice !== undefined ? props.askPrice : undefined,
883
+ bidPrice: props.bidPrice !== undefined ? props.bidPrice : undefined,
884
+ newsMentions: props.newsMentions ?
885
+ Array.isArray(props.newsMentions) && props.newsMentions.length > 0 && props.newsMentions.every((item) => typeof item === 'object' && 'id' in item && Object.keys(item).length === 1) ? {
886
+ connect: props.newsMentions.map((item) => ({
887
+ id: item.id
888
+ }))
889
+ }
890
+ : { connectOrCreate: props.newsMentions.map((item) => ({
891
+ where: {
892
+ id: item.id !== undefined ? item.id : undefined,
893
+ url: item.url !== undefined ? item.url : undefined,
894
+ newsArticleId: item.newsArticleId !== undefined ? {
895
+ equals: item.newsArticleId
896
+ } : undefined,
897
+ },
898
+ create: {
899
+ url: item.url !== undefined ? item.url : undefined,
900
+ relevancyScore: item.relevancyScore !== undefined ? item.relevancyScore : undefined,
901
+ sentimentScore: item.sentimentScore !== undefined ? item.sentimentScore : undefined,
902
+ sentimentLabel: item.sentimentLabel !== undefined ? item.sentimentLabel : undefined,
903
+ news: item.news ?
904
+ typeof item.news === 'object' && Object.keys(item.news).length === 1 && Object.keys(item.news)[0] === 'id'
905
+ ? { connect: {
906
+ id: item.news.id
907
+ }
908
+ }
909
+ : { connectOrCreate: {
910
+ where: {
911
+ id: item.news.id !== undefined ? item.news.id : undefined,
912
+ url: item.news.url !== undefined ? item.news.url : undefined,
913
+ title: item.news.title !== undefined ? {
914
+ equals: item.news.title
915
+ } : undefined,
916
+ },
917
+ create: {
918
+ title: item.news.title !== undefined ? item.news.title : undefined,
919
+ content: item.news.content !== undefined ? item.news.content : undefined,
920
+ source: item.news.source !== undefined ? item.news.source : undefined,
921
+ sourceDomain: item.news.sourceDomain !== undefined ? item.news.sourceDomain : undefined,
922
+ url: item.news.url !== undefined ? item.news.url : undefined,
923
+ sentiment: item.news.sentiment !== undefined ? item.news.sentiment : undefined,
924
+ authors: item.news.authors !== undefined ? {
925
+ set: item.news.authors
926
+ } : undefined,
927
+ summary: item.news.summary !== undefined ? item.news.summary : undefined,
928
+ bannerImage: item.news.bannerImage !== undefined ? item.news.bannerImage : undefined,
929
+ timePublished: item.news.timePublished !== undefined ? item.news.timePublished : undefined,
930
+ category: item.news.category !== undefined ? item.news.category : undefined,
931
+ topics: item.news.topics !== undefined ? {
932
+ set: item.news.topics
933
+ } : undefined,
934
+ logo: item.news.logo !== undefined ? item.news.logo : undefined,
935
+ },
936
+ }
937
+ } : undefined,
938
+ },
939
+ }))
940
+ } : undefined,
941
+ },
942
+ update: {
943
+ symbol: props.symbol !== undefined ? {
944
+ set: props.symbol
945
+ } : undefined,
946
+ name: props.name !== undefined ? {
947
+ set: props.name
948
+ } : undefined,
949
+ type: props.type !== undefined ? {
950
+ set: props.type
951
+ } : undefined,
952
+ logoUrl: props.logoUrl !== undefined ? {
953
+ set: props.logoUrl
954
+ } : undefined,
955
+ description: props.description !== undefined ? {
956
+ set: props.description
957
+ } : undefined,
958
+ cik: props.cik !== undefined ? {
959
+ set: props.cik
960
+ } : undefined,
961
+ exchange: props.exchange !== undefined ? {
962
+ set: props.exchange
963
+ } : undefined,
964
+ currency: props.currency !== undefined ? {
965
+ set: props.currency
966
+ } : undefined,
967
+ country: props.country !== undefined ? {
968
+ set: props.country
969
+ } : undefined,
970
+ sector: props.sector !== undefined ? {
971
+ set: props.sector
972
+ } : undefined,
973
+ industry: props.industry !== undefined ? {
974
+ set: props.industry
975
+ } : undefined,
976
+ address: props.address !== undefined ? {
977
+ set: props.address
978
+ } : undefined,
979
+ officialSite: props.officialSite !== undefined ? {
980
+ set: props.officialSite
981
+ } : undefined,
982
+ fiscalYearEnd: props.fiscalYearEnd !== undefined ? {
983
+ set: props.fiscalYearEnd
984
+ } : undefined,
985
+ latestQuarter: props.latestQuarter !== undefined ? {
986
+ set: props.latestQuarter
987
+ } : undefined,
988
+ marketCapitalization: props.marketCapitalization !== undefined ? {
989
+ set: props.marketCapitalization
990
+ } : undefined,
991
+ ebitda: props.ebitda !== undefined ? {
992
+ set: props.ebitda
993
+ } : undefined,
994
+ peRatio: props.peRatio !== undefined ? {
995
+ set: props.peRatio
996
+ } : undefined,
997
+ pegRatio: props.pegRatio !== undefined ? {
998
+ set: props.pegRatio
999
+ } : undefined,
1000
+ bookValue: props.bookValue !== undefined ? {
1001
+ set: props.bookValue
1002
+ } : undefined,
1003
+ dividendPerShare: props.dividendPerShare !== undefined ? {
1004
+ set: props.dividendPerShare
1005
+ } : undefined,
1006
+ dividendYield: props.dividendYield !== undefined ? {
1007
+ set: props.dividendYield
1008
+ } : undefined,
1009
+ eps: props.eps !== undefined ? {
1010
+ set: props.eps
1011
+ } : undefined,
1012
+ revenuePerShareTTM: props.revenuePerShareTTM !== undefined ? {
1013
+ set: props.revenuePerShareTTM
1014
+ } : undefined,
1015
+ profitMargin: props.profitMargin !== undefined ? {
1016
+ set: props.profitMargin
1017
+ } : undefined,
1018
+ operatingMarginTTM: props.operatingMarginTTM !== undefined ? {
1019
+ set: props.operatingMarginTTM
1020
+ } : undefined,
1021
+ returnOnAssetsTTM: props.returnOnAssetsTTM !== undefined ? {
1022
+ set: props.returnOnAssetsTTM
1023
+ } : undefined,
1024
+ returnOnEquityTTM: props.returnOnEquityTTM !== undefined ? {
1025
+ set: props.returnOnEquityTTM
1026
+ } : undefined,
1027
+ revenueTTM: props.revenueTTM !== undefined ? {
1028
+ set: props.revenueTTM
1029
+ } : undefined,
1030
+ grossProfitTTM: props.grossProfitTTM !== undefined ? {
1031
+ set: props.grossProfitTTM
1032
+ } : undefined,
1033
+ dilutedEPSTTM: props.dilutedEPSTTM !== undefined ? {
1034
+ set: props.dilutedEPSTTM
1035
+ } : undefined,
1036
+ quarterlyEarningsGrowthYOY: props.quarterlyEarningsGrowthYOY !== undefined ? {
1037
+ set: props.quarterlyEarningsGrowthYOY
1038
+ } : undefined,
1039
+ quarterlyRevenueGrowthYOY: props.quarterlyRevenueGrowthYOY !== undefined ? {
1040
+ set: props.quarterlyRevenueGrowthYOY
1041
+ } : undefined,
1042
+ analystTargetPrice: props.analystTargetPrice !== undefined ? {
1043
+ set: props.analystTargetPrice
1044
+ } : undefined,
1045
+ analystRatingStrongBuy: props.analystRatingStrongBuy !== undefined ? {
1046
+ set: props.analystRatingStrongBuy
1047
+ } : undefined,
1048
+ analystRatingBuy: props.analystRatingBuy !== undefined ? {
1049
+ set: props.analystRatingBuy
1050
+ } : undefined,
1051
+ analystRatingHold: props.analystRatingHold !== undefined ? {
1052
+ set: props.analystRatingHold
1053
+ } : undefined,
1054
+ analystRatingSell: props.analystRatingSell !== undefined ? {
1055
+ set: props.analystRatingSell
1056
+ } : undefined,
1057
+ analystRatingStrongSell: props.analystRatingStrongSell !== undefined ? {
1058
+ set: props.analystRatingStrongSell
1059
+ } : undefined,
1060
+ trailingPE: props.trailingPE !== undefined ? {
1061
+ set: props.trailingPE
1062
+ } : undefined,
1063
+ forwardPE: props.forwardPE !== undefined ? {
1064
+ set: props.forwardPE
1065
+ } : undefined,
1066
+ priceToSalesRatioTTM: props.priceToSalesRatioTTM !== undefined ? {
1067
+ set: props.priceToSalesRatioTTM
1068
+ } : undefined,
1069
+ priceToBookRatio: props.priceToBookRatio !== undefined ? {
1070
+ set: props.priceToBookRatio
1071
+ } : undefined,
1072
+ evToRevenue: props.evToRevenue !== undefined ? {
1073
+ set: props.evToRevenue
1074
+ } : undefined,
1075
+ evToEbitda: props.evToEbitda !== undefined ? {
1076
+ set: props.evToEbitda
1077
+ } : undefined,
1078
+ beta: props.beta !== undefined ? {
1079
+ set: props.beta
1080
+ } : undefined,
1081
+ week52High: props.week52High !== undefined ? {
1082
+ set: props.week52High
1083
+ } : undefined,
1084
+ week52Low: props.week52Low !== undefined ? {
1085
+ set: props.week52Low
1086
+ } : undefined,
1087
+ day50MovingAverage: props.day50MovingAverage !== undefined ? {
1088
+ set: props.day50MovingAverage
1089
+ } : undefined,
1090
+ day200MovingAverage: props.day200MovingAverage !== undefined ? {
1091
+ set: props.day200MovingAverage
1092
+ } : undefined,
1093
+ sharesOutstanding: props.sharesOutstanding !== undefined ? {
1094
+ set: props.sharesOutstanding
1095
+ } : undefined,
1096
+ dividendDate: props.dividendDate !== undefined ? {
1097
+ set: props.dividendDate
1098
+ } : undefined,
1099
+ exDividendDate: props.exDividendDate !== undefined ? {
1100
+ set: props.exDividendDate
1101
+ } : undefined,
1102
+ askPrice: props.askPrice !== undefined ? {
1103
+ set: props.askPrice
1104
+ } : undefined,
1105
+ bidPrice: props.bidPrice !== undefined ? {
1106
+ set: props.bidPrice
1107
+ } : undefined,
1108
+ newsMentions: props.newsMentions ?
1109
+ Array.isArray(props.newsMentions) && props.newsMentions.length > 0 && props.newsMentions.every((item) => typeof item === 'object' && ('id' in item || 'symbol' in item) && Object.keys(item).length === 1) ? {
1110
+ connect: props.newsMentions.map((item) => ({
1111
+ id: item.id
1112
+ }))
1113
+ } : { upsert: props.newsMentions.map((item) => ({
1114
+ where: {
1115
+ id: item.id !== undefined ? item.id : undefined,
1116
+ url: item.url !== undefined ? item.url : undefined,
1117
+ assetId: item.assetId !== undefined ? {
1118
+ equals: item.assetId
1119
+ } : undefined,
1120
+ newsArticleId: item.newsArticleId !== undefined ? {
1121
+ equals: item.newsArticleId
1122
+ } : undefined,
1123
+ },
1124
+ update: {
1125
+ id: item.id !== undefined ? {
1126
+ set: item.id
1127
+ } : undefined,
1128
+ url: item.url !== undefined ? {
1129
+ set: item.url
1130
+ } : undefined,
1131
+ relevancyScore: item.relevancyScore !== undefined ? {
1132
+ set: item.relevancyScore
1133
+ } : undefined,
1134
+ sentimentScore: item.sentimentScore !== undefined ? {
1135
+ set: item.sentimentScore
1136
+ } : undefined,
1137
+ sentimentLabel: item.sentimentLabel !== undefined ? {
1138
+ set: item.sentimentLabel
1139
+ } : undefined,
1140
+ news: item.news ?
1141
+ typeof item.news === 'object' && Object.keys(item.news).length === 1 && (Object.keys(item.news)[0] === 'id' || Object.keys(item.news)[0] === 'symbol')
1142
+ ? {
1143
+ connect: {
1144
+ id: item.news.id
1145
+ }
1146
+ } : { upsert: {
806
1147
  where: {
807
- id: item.news.id !== undefined ? item.news.id : undefined,
808
- url: item.news.url !== undefined ? item.news.url : undefined,
1148
+ id: item.news.id !== undefined ? {
1149
+ equals: item.news.id
1150
+ } : undefined,
809
1151
  title: item.news.title !== undefined ? {
810
1152
  equals: item.news.title
811
1153
  } : undefined,
1154
+ url: item.news.url !== undefined ? {
1155
+ equals: item.news.url
1156
+ } : undefined,
1157
+ },
1158
+ update: {
1159
+ id: item.news.id !== undefined ? {
1160
+ set: item.news.id
1161
+ } : undefined,
1162
+ title: item.news.title !== undefined ? {
1163
+ set: item.news.title
1164
+ } : undefined,
1165
+ content: item.news.content !== undefined ? {
1166
+ set: item.news.content
1167
+ } : undefined,
1168
+ source: item.news.source !== undefined ? {
1169
+ set: item.news.source
1170
+ } : undefined,
1171
+ sourceDomain: item.news.sourceDomain !== undefined ? {
1172
+ set: item.news.sourceDomain
1173
+ } : undefined,
1174
+ url: item.news.url !== undefined ? {
1175
+ set: item.news.url
1176
+ } : undefined,
1177
+ sentiment: item.news.sentiment !== undefined ? {
1178
+ set: item.news.sentiment
1179
+ } : undefined,
1180
+ authors: item.news.authors !== undefined ? {
1181
+ set: item.news.authors
1182
+ } : undefined,
1183
+ summary: item.news.summary !== undefined ? {
1184
+ set: item.news.summary
1185
+ } : undefined,
1186
+ bannerImage: item.news.bannerImage !== undefined ? {
1187
+ set: item.news.bannerImage
1188
+ } : undefined,
1189
+ timePublished: item.news.timePublished !== undefined ? {
1190
+ set: item.news.timePublished
1191
+ } : undefined,
1192
+ category: item.news.category !== undefined ? {
1193
+ set: item.news.category
1194
+ } : undefined,
1195
+ topics: item.news.topics !== undefined ? {
1196
+ set: item.news.topics
1197
+ } : undefined,
1198
+ logo: item.news.logo !== undefined ? {
1199
+ set: item.news.logo
1200
+ } : undefined,
812
1201
  },
813
1202
  create: {
814
1203
  title: item.news.title !== undefined ? item.news.title : undefined,
@@ -831,908 +1220,790 @@ export const Asset = {
831
1220
  },
832
1221
  }
833
1222
  } : undefined,
834
- },
835
- }))
836
- } : undefined,
837
- },
838
- update: {
839
- symbol: props.symbol !== undefined ? {
840
- set: props.symbol
841
- } : undefined,
842
- name: props.name !== undefined ? {
843
- set: props.name
844
- } : undefined,
845
- type: props.type !== undefined ? {
846
- set: props.type
847
- } : undefined,
848
- logoUrl: props.logoUrl !== undefined ? {
849
- set: props.logoUrl
850
- } : undefined,
851
- description: props.description !== undefined ? {
852
- set: props.description
853
- } : undefined,
854
- cik: props.cik !== undefined ? {
855
- set: props.cik
856
- } : undefined,
857
- exchange: props.exchange !== undefined ? {
858
- set: props.exchange
859
- } : undefined,
860
- currency: props.currency !== undefined ? {
861
- set: props.currency
862
- } : undefined,
863
- country: props.country !== undefined ? {
864
- set: props.country
865
- } : undefined,
866
- sector: props.sector !== undefined ? {
867
- set: props.sector
868
- } : undefined,
869
- industry: props.industry !== undefined ? {
870
- set: props.industry
871
- } : undefined,
872
- address: props.address !== undefined ? {
873
- set: props.address
874
- } : undefined,
875
- officialSite: props.officialSite !== undefined ? {
876
- set: props.officialSite
877
- } : undefined,
878
- fiscalYearEnd: props.fiscalYearEnd !== undefined ? {
879
- set: props.fiscalYearEnd
880
- } : undefined,
881
- latestQuarter: props.latestQuarter !== undefined ? {
882
- set: props.latestQuarter
883
- } : undefined,
884
- marketCapitalization: props.marketCapitalization !== undefined ? {
885
- set: props.marketCapitalization
886
- } : undefined,
887
- ebitda: props.ebitda !== undefined ? {
888
- set: props.ebitda
889
- } : undefined,
890
- peRatio: props.peRatio !== undefined ? {
891
- set: props.peRatio
892
- } : undefined,
893
- pegRatio: props.pegRatio !== undefined ? {
894
- set: props.pegRatio
895
- } : undefined,
896
- bookValue: props.bookValue !== undefined ? {
897
- set: props.bookValue
898
- } : undefined,
899
- dividendPerShare: props.dividendPerShare !== undefined ? {
900
- set: props.dividendPerShare
901
- } : undefined,
902
- dividendYield: props.dividendYield !== undefined ? {
903
- set: props.dividendYield
904
- } : undefined,
905
- eps: props.eps !== undefined ? {
906
- set: props.eps
907
- } : undefined,
908
- revenuePerShareTTM: props.revenuePerShareTTM !== undefined ? {
909
- set: props.revenuePerShareTTM
910
- } : undefined,
911
- profitMargin: props.profitMargin !== undefined ? {
912
- set: props.profitMargin
913
- } : undefined,
914
- operatingMarginTTM: props.operatingMarginTTM !== undefined ? {
915
- set: props.operatingMarginTTM
916
- } : undefined,
917
- returnOnAssetsTTM: props.returnOnAssetsTTM !== undefined ? {
918
- set: props.returnOnAssetsTTM
919
- } : undefined,
920
- returnOnEquityTTM: props.returnOnEquityTTM !== undefined ? {
921
- set: props.returnOnEquityTTM
922
- } : undefined,
923
- revenueTTM: props.revenueTTM !== undefined ? {
924
- set: props.revenueTTM
925
- } : undefined,
926
- grossProfitTTM: props.grossProfitTTM !== undefined ? {
927
- set: props.grossProfitTTM
928
- } : undefined,
929
- dilutedEPSTTM: props.dilutedEPSTTM !== undefined ? {
930
- set: props.dilutedEPSTTM
931
- } : undefined,
932
- quarterlyEarningsGrowthYOY: props.quarterlyEarningsGrowthYOY !== undefined ? {
933
- set: props.quarterlyEarningsGrowthYOY
934
- } : undefined,
935
- quarterlyRevenueGrowthYOY: props.quarterlyRevenueGrowthYOY !== undefined ? {
936
- set: props.quarterlyRevenueGrowthYOY
937
- } : undefined,
938
- analystTargetPrice: props.analystTargetPrice !== undefined ? {
939
- set: props.analystTargetPrice
940
- } : undefined,
941
- analystRatingStrongBuy: props.analystRatingStrongBuy !== undefined ? {
942
- set: props.analystRatingStrongBuy
943
- } : undefined,
944
- analystRatingBuy: props.analystRatingBuy !== undefined ? {
945
- set: props.analystRatingBuy
946
- } : undefined,
947
- analystRatingHold: props.analystRatingHold !== undefined ? {
948
- set: props.analystRatingHold
949
- } : undefined,
950
- analystRatingSell: props.analystRatingSell !== undefined ? {
951
- set: props.analystRatingSell
952
- } : undefined,
953
- analystRatingStrongSell: props.analystRatingStrongSell !== undefined ? {
954
- set: props.analystRatingStrongSell
955
- } : undefined,
956
- trailingPE: props.trailingPE !== undefined ? {
957
- set: props.trailingPE
958
- } : undefined,
959
- forwardPE: props.forwardPE !== undefined ? {
960
- set: props.forwardPE
961
- } : undefined,
962
- priceToSalesRatioTTM: props.priceToSalesRatioTTM !== undefined ? {
963
- set: props.priceToSalesRatioTTM
964
- } : undefined,
965
- priceToBookRatio: props.priceToBookRatio !== undefined ? {
966
- set: props.priceToBookRatio
967
- } : undefined,
968
- evToRevenue: props.evToRevenue !== undefined ? {
969
- set: props.evToRevenue
970
- } : undefined,
971
- evToEbitda: props.evToEbitda !== undefined ? {
972
- set: props.evToEbitda
973
- } : undefined,
974
- beta: props.beta !== undefined ? {
975
- set: props.beta
976
- } : undefined,
977
- week52High: props.week52High !== undefined ? {
978
- set: props.week52High
979
- } : undefined,
980
- week52Low: props.week52Low !== undefined ? {
981
- set: props.week52Low
982
- } : undefined,
983
- day50MovingAverage: props.day50MovingAverage !== undefined ? {
984
- set: props.day50MovingAverage
985
- } : undefined,
986
- day200MovingAverage: props.day200MovingAverage !== undefined ? {
987
- set: props.day200MovingAverage
988
- } : undefined,
989
- sharesOutstanding: props.sharesOutstanding !== undefined ? {
990
- set: props.sharesOutstanding
991
- } : undefined,
992
- dividendDate: props.dividendDate !== undefined ? {
993
- set: props.dividendDate
994
- } : undefined,
995
- exDividendDate: props.exDividendDate !== undefined ? {
996
- set: props.exDividendDate
997
- } : undefined,
998
- askPrice: props.askPrice !== undefined ? {
999
- set: props.askPrice
1000
- } : undefined,
1001
- bidPrice: props.bidPrice !== undefined ? {
1002
- set: props.bidPrice
1003
- } : undefined,
1004
- newsMentions: props.newsMentions ?
1005
- Array.isArray(props.newsMentions) && props.newsMentions.length > 0 && props.newsMentions.every((item) => typeof item === 'object' && ('id' in item || 'symbol' in item) && Object.keys(item).length === 1) ? {
1006
- connect: props.newsMentions.map((item) => ({
1007
- id: item.id
1008
- }))
1009
- } : { upsert: props.newsMentions.map((item) => ({
1010
- where: {
1011
- id: item.id !== undefined ? item.id : undefined,
1012
- url: item.url !== undefined ? item.url : undefined,
1013
- assetId: item.assetId !== undefined ? {
1014
- equals: item.assetId
1015
- } : undefined,
1016
- newsArticleId: item.newsArticleId !== undefined ? {
1017
- equals: item.newsArticleId
1018
- } : undefined,
1019
- },
1020
- update: {
1021
- id: item.id !== undefined ? {
1022
- set: item.id
1023
- } : undefined,
1024
- url: item.url !== undefined ? {
1025
- set: item.url
1026
- } : undefined,
1027
- relevancyScore: item.relevancyScore !== undefined ? {
1028
- set: item.relevancyScore
1029
- } : undefined,
1030
- sentimentScore: item.sentimentScore !== undefined ? {
1031
- set: item.sentimentScore
1032
- } : undefined,
1033
- sentimentLabel: item.sentimentLabel !== undefined ? {
1034
- set: item.sentimentLabel
1035
- } : undefined,
1036
- news: item.news ?
1037
- typeof item.news === 'object' && Object.keys(item.news).length === 1 && (Object.keys(item.news)[0] === 'id' || Object.keys(item.news)[0] === 'symbol')
1038
- ? {
1039
- connect: {
1040
- id: item.news.id
1041
- }
1042
- } : { upsert: {
1043
- where: {
1044
- id: item.news.id !== undefined ? {
1045
- equals: item.news.id
1046
- } : undefined,
1047
- title: item.news.title !== undefined ? {
1048
- equals: item.news.title
1049
- } : undefined,
1050
- url: item.news.url !== undefined ? {
1051
- equals: item.news.url
1052
- } : undefined,
1053
- },
1054
- update: {
1055
- id: item.news.id !== undefined ? {
1056
- set: item.news.id
1057
- } : undefined,
1058
- title: item.news.title !== undefined ? {
1059
- set: item.news.title
1060
- } : undefined,
1061
- content: item.news.content !== undefined ? {
1062
- set: item.news.content
1063
- } : undefined,
1064
- source: item.news.source !== undefined ? {
1065
- set: item.news.source
1066
- } : undefined,
1067
- sourceDomain: item.news.sourceDomain !== undefined ? {
1068
- set: item.news.sourceDomain
1069
- } : undefined,
1070
- url: item.news.url !== undefined ? {
1071
- set: item.news.url
1072
- } : undefined,
1073
- sentiment: item.news.sentiment !== undefined ? {
1074
- set: item.news.sentiment
1075
- } : undefined,
1076
- authors: item.news.authors !== undefined ? {
1077
- set: item.news.authors
1078
- } : undefined,
1079
- summary: item.news.summary !== undefined ? {
1080
- set: item.news.summary
1081
- } : undefined,
1082
- bannerImage: item.news.bannerImage !== undefined ? {
1083
- set: item.news.bannerImage
1084
- } : undefined,
1085
- timePublished: item.news.timePublished !== undefined ? {
1086
- set: item.news.timePublished
1087
- } : undefined,
1088
- category: item.news.category !== undefined ? {
1089
- set: item.news.category
1090
- } : undefined,
1091
- topics: item.news.topics !== undefined ? {
1092
- set: item.news.topics
1093
- } : undefined,
1094
- logo: item.news.logo !== undefined ? {
1095
- set: item.news.logo
1096
- } : undefined,
1097
- },
1098
- create: {
1099
- title: item.news.title !== undefined ? item.news.title : undefined,
1100
- content: item.news.content !== undefined ? item.news.content : undefined,
1101
- source: item.news.source !== undefined ? item.news.source : undefined,
1102
- sourceDomain: item.news.sourceDomain !== undefined ? item.news.sourceDomain : undefined,
1103
- url: item.news.url !== undefined ? item.news.url : undefined,
1104
- sentiment: item.news.sentiment !== undefined ? item.news.sentiment : undefined,
1105
- authors: item.news.authors !== undefined ? {
1106
- set: item.news.authors
1107
- } : undefined,
1108
- summary: item.news.summary !== undefined ? item.news.summary : undefined,
1109
- bannerImage: item.news.bannerImage !== undefined ? item.news.bannerImage : undefined,
1110
- timePublished: item.news.timePublished !== undefined ? item.news.timePublished : undefined,
1111
- category: item.news.category !== undefined ? item.news.category : undefined,
1112
- topics: item.news.topics !== undefined ? {
1113
- set: item.news.topics
1223
+ },
1224
+ create: {
1225
+ url: item.url !== undefined ? item.url : undefined,
1226
+ relevancyScore: item.relevancyScore !== undefined ? item.relevancyScore : undefined,
1227
+ sentimentScore: item.sentimentScore !== undefined ? item.sentimentScore : undefined,
1228
+ sentimentLabel: item.sentimentLabel !== undefined ? item.sentimentLabel : undefined,
1229
+ news: item.news ?
1230
+ typeof item.news === 'object' && Object.keys(item.news).length === 1 && Object.keys(item.news)[0] === 'id'
1231
+ ? { connect: {
1232
+ id: item.news.id
1233
+ }
1234
+ }
1235
+ : { connectOrCreate: {
1236
+ where: {
1237
+ id: item.news.id !== undefined ? item.news.id : undefined,
1238
+ url: item.news.url !== undefined ? item.news.url : undefined,
1239
+ title: item.news.title !== undefined ? {
1240
+ equals: item.news.title
1241
+ } : undefined,
1242
+ },
1243
+ create: {
1244
+ title: item.news.title !== undefined ? item.news.title : undefined,
1245
+ content: item.news.content !== undefined ? item.news.content : undefined,
1246
+ source: item.news.source !== undefined ? item.news.source : undefined,
1247
+ sourceDomain: item.news.sourceDomain !== undefined ? item.news.sourceDomain : undefined,
1248
+ url: item.news.url !== undefined ? item.news.url : undefined,
1249
+ sentiment: item.news.sentiment !== undefined ? item.news.sentiment : undefined,
1250
+ authors: item.news.authors !== undefined ? {
1251
+ set: item.news.authors
1252
+ } : undefined,
1253
+ summary: item.news.summary !== undefined ? item.news.summary : undefined,
1254
+ bannerImage: item.news.bannerImage !== undefined ? item.news.bannerImage : undefined,
1255
+ timePublished: item.news.timePublished !== undefined ? item.news.timePublished : undefined,
1256
+ category: item.news.category !== undefined ? item.news.category : undefined,
1257
+ topics: item.news.topics !== undefined ? {
1258
+ set: item.news.topics
1259
+ } : undefined,
1260
+ logo: item.news.logo !== undefined ? item.news.logo : undefined,
1261
+ },
1262
+ }
1114
1263
  } : undefined,
1115
- logo: item.news.logo !== undefined ? item.news.logo : undefined,
1116
- },
1117
- }
1118
- } : undefined,
1119
- },
1120
- create: {
1121
- url: item.url !== undefined ? item.url : undefined,
1122
- relevancyScore: item.relevancyScore !== undefined ? item.relevancyScore : undefined,
1123
- sentimentScore: item.sentimentScore !== undefined ? item.sentimentScore : undefined,
1124
- sentimentLabel: item.sentimentLabel !== undefined ? item.sentimentLabel : undefined,
1125
- news: item.news ?
1126
- typeof item.news === 'object' && Object.keys(item.news).length === 1 && Object.keys(item.news)[0] === 'id'
1127
- ? { connect: {
1128
- id: item.news.id
1129
- }
1130
- }
1131
- : { connectOrCreate: {
1132
- where: {
1133
- id: item.news.id !== undefined ? item.news.id : undefined,
1134
- url: item.news.url !== undefined ? item.news.url : undefined,
1135
- title: item.news.title !== undefined ? {
1136
- equals: item.news.title
1137
- } : undefined,
1138
- },
1139
- create: {
1140
- title: item.news.title !== undefined ? item.news.title : undefined,
1141
- content: item.news.content !== undefined ? item.news.content : undefined,
1142
- source: item.news.source !== undefined ? item.news.source : undefined,
1143
- sourceDomain: item.news.sourceDomain !== undefined ? item.news.sourceDomain : undefined,
1144
- url: item.news.url !== undefined ? item.news.url : undefined,
1145
- sentiment: item.news.sentiment !== undefined ? item.news.sentiment : undefined,
1146
- authors: item.news.authors !== undefined ? {
1147
- set: item.news.authors
1148
- } : undefined,
1149
- summary: item.news.summary !== undefined ? item.news.summary : undefined,
1150
- bannerImage: item.news.bannerImage !== undefined ? item.news.bannerImage : undefined,
1151
- timePublished: item.news.timePublished !== undefined ? item.news.timePublished : undefined,
1152
- category: item.news.category !== undefined ? item.news.category : undefined,
1153
- topics: item.news.topics !== undefined ? {
1154
- set: item.news.topics
1155
- } : undefined,
1156
- logo: item.news.logo !== undefined ? item.news.logo : undefined,
1157
- },
1158
- }
1159
- } : undefined,
1160
- },
1161
- }))
1162
- } : undefined,
1163
- },
1164
- };
1165
- const filteredVariables = removeUndefinedProps(variables);
1166
- try {
1167
- const response = await client.mutate({ mutation: UPSERT_ONE_ASSET, variables: filteredVariables });
1168
- if (response.errors && response.errors.length > 0)
1169
- throw new Error(response.errors[0].message);
1170
- if (response && response.data && response.data.upsertOneAsset) {
1171
- return response.data.upsertOneAsset;
1264
+ },
1265
+ }))
1266
+ } : undefined,
1267
+ },
1268
+ };
1269
+ const filteredVariables = removeUndefinedProps(variables);
1270
+ const response = await client.mutate({
1271
+ mutation: UPSERT_ONE_ASSET,
1272
+ variables: filteredVariables,
1273
+ // Don't cache mutations, but ensure we're using the freshest context
1274
+ fetchPolicy: 'no-cache'
1275
+ });
1276
+ if (response.errors && response.errors.length > 0)
1277
+ throw new Error(response.errors[0].message);
1278
+ if (response && response.data && response.data.upsertOneAsset) {
1279
+ return response.data.upsertOneAsset;
1280
+ }
1281
+ else {
1282
+ return null;
1283
+ }
1172
1284
  }
1173
- else {
1174
- return null;
1285
+ catch (error) {
1286
+ lastError = error;
1287
+ // Check if this is a database connection error that we should retry
1288
+ const isConnectionError = error.message?.includes('Server has closed the connection') ||
1289
+ error.message?.includes('Cannot reach database server') ||
1290
+ error.message?.includes('Connection timed out') ||
1291
+ error.message?.includes('Accelerate') || // Prisma Accelerate proxy errors
1292
+ (error.networkError && error.networkError.message?.includes('Failed to fetch'));
1293
+ if (isConnectionError && retryCount < MAX_RETRIES - 1) {
1294
+ retryCount++;
1295
+ const delay = Math.pow(2, retryCount) * 100; // Exponential backoff: 200ms, 400ms, 800ms
1296
+ console.warn("Database connection error, retrying...");
1297
+ await new Promise(resolve => setTimeout(resolve, delay));
1298
+ continue;
1299
+ }
1300
+ // Log the error and rethrow
1301
+ console.error("Database error occurred:", error);
1302
+ throw error;
1175
1303
  }
1176
1304
  }
1177
- catch (error) {
1178
- console.error('Error in upsertOneAsset:', error);
1179
- throw error;
1180
- }
1305
+ // If we exhausted retries, throw the last error
1306
+ throw lastError;
1181
1307
  },
1182
1308
  /**
1183
1309
  * Update multiple Asset records.
1310
+ * Enhanced with connection resilience against Prisma connection errors.
1184
1311
  * @param props - Array of Asset objects for the updated records.
1185
1312
  * @param globalClient - Apollo Client instance.
1186
1313
  * @returns The count of created records or null.
1187
1314
  */
1188
1315
  async updateMany(props, globalClient) {
1189
- const [modules, client] = await Promise.all([
1190
- getApolloModules(),
1191
- globalClient
1192
- ? Promise.resolve(globalClient)
1193
- : importedClient
1194
- ]);
1195
- const { gql, ApolloError } = modules;
1196
- const UPDATE_MANY_ASSET = gql `
1197
- mutation updateManyAsset($data: [AssetCreateManyInput!]!) {
1198
- updateManyAsset(data: $data) {
1199
- count
1200
- }
1201
- }`;
1202
- const variables = props.map(prop => ({
1203
- where: {
1204
- id: prop.id !== undefined ? prop.id : undefined,
1205
- symbol: prop.symbol !== undefined ? prop.symbol : undefined,
1206
- name: prop.name !== undefined ? prop.name : undefined,
1207
- },
1208
- data: {
1209
- id: prop.id !== undefined ? {
1210
- set: prop.id
1211
- } : undefined,
1212
- symbol: prop.symbol !== undefined ? {
1213
- set: prop.symbol
1214
- } : undefined,
1215
- name: prop.name !== undefined ? {
1216
- set: prop.name
1217
- } : undefined,
1218
- type: prop.type !== undefined ? {
1219
- set: prop.type
1220
- } : undefined,
1221
- logoUrl: prop.logoUrl !== undefined ? {
1222
- set: prop.logoUrl
1223
- } : undefined,
1224
- description: prop.description !== undefined ? {
1225
- set: prop.description
1226
- } : undefined,
1227
- cik: prop.cik !== undefined ? {
1228
- set: prop.cik
1229
- } : undefined,
1230
- exchange: prop.exchange !== undefined ? {
1231
- set: prop.exchange
1232
- } : undefined,
1233
- currency: prop.currency !== undefined ? {
1234
- set: prop.currency
1235
- } : undefined,
1236
- country: prop.country !== undefined ? {
1237
- set: prop.country
1238
- } : undefined,
1239
- sector: prop.sector !== undefined ? {
1240
- set: prop.sector
1241
- } : undefined,
1242
- industry: prop.industry !== undefined ? {
1243
- set: prop.industry
1244
- } : undefined,
1245
- address: prop.address !== undefined ? {
1246
- set: prop.address
1247
- } : undefined,
1248
- officialSite: prop.officialSite !== undefined ? {
1249
- set: prop.officialSite
1250
- } : undefined,
1251
- fiscalYearEnd: prop.fiscalYearEnd !== undefined ? {
1252
- set: prop.fiscalYearEnd
1253
- } : undefined,
1254
- latestQuarter: prop.latestQuarter !== undefined ? {
1255
- set: prop.latestQuarter
1256
- } : undefined,
1257
- marketCapitalization: prop.marketCapitalization !== undefined ? {
1258
- set: prop.marketCapitalization
1259
- } : undefined,
1260
- ebitda: prop.ebitda !== undefined ? {
1261
- set: prop.ebitda
1262
- } : undefined,
1263
- peRatio: prop.peRatio !== undefined ? {
1264
- set: prop.peRatio
1265
- } : undefined,
1266
- pegRatio: prop.pegRatio !== undefined ? {
1267
- set: prop.pegRatio
1268
- } : undefined,
1269
- bookValue: prop.bookValue !== undefined ? {
1270
- set: prop.bookValue
1271
- } : undefined,
1272
- dividendPerShare: prop.dividendPerShare !== undefined ? {
1273
- set: prop.dividendPerShare
1274
- } : undefined,
1275
- dividendYield: prop.dividendYield !== undefined ? {
1276
- set: prop.dividendYield
1277
- } : undefined,
1278
- eps: prop.eps !== undefined ? {
1279
- set: prop.eps
1280
- } : undefined,
1281
- revenuePerShareTTM: prop.revenuePerShareTTM !== undefined ? {
1282
- set: prop.revenuePerShareTTM
1283
- } : undefined,
1284
- profitMargin: prop.profitMargin !== undefined ? {
1285
- set: prop.profitMargin
1286
- } : undefined,
1287
- operatingMarginTTM: prop.operatingMarginTTM !== undefined ? {
1288
- set: prop.operatingMarginTTM
1289
- } : undefined,
1290
- returnOnAssetsTTM: prop.returnOnAssetsTTM !== undefined ? {
1291
- set: prop.returnOnAssetsTTM
1292
- } : undefined,
1293
- returnOnEquityTTM: prop.returnOnEquityTTM !== undefined ? {
1294
- set: prop.returnOnEquityTTM
1295
- } : undefined,
1296
- revenueTTM: prop.revenueTTM !== undefined ? {
1297
- set: prop.revenueTTM
1298
- } : undefined,
1299
- grossProfitTTM: prop.grossProfitTTM !== undefined ? {
1300
- set: prop.grossProfitTTM
1301
- } : undefined,
1302
- dilutedEPSTTM: prop.dilutedEPSTTM !== undefined ? {
1303
- set: prop.dilutedEPSTTM
1304
- } : undefined,
1305
- quarterlyEarningsGrowthYOY: prop.quarterlyEarningsGrowthYOY !== undefined ? {
1306
- set: prop.quarterlyEarningsGrowthYOY
1307
- } : undefined,
1308
- quarterlyRevenueGrowthYOY: prop.quarterlyRevenueGrowthYOY !== undefined ? {
1309
- set: prop.quarterlyRevenueGrowthYOY
1310
- } : undefined,
1311
- analystTargetPrice: prop.analystTargetPrice !== undefined ? {
1312
- set: prop.analystTargetPrice
1313
- } : undefined,
1314
- analystRatingStrongBuy: prop.analystRatingStrongBuy !== undefined ? {
1315
- set: prop.analystRatingStrongBuy
1316
- } : undefined,
1317
- analystRatingBuy: prop.analystRatingBuy !== undefined ? {
1318
- set: prop.analystRatingBuy
1319
- } : undefined,
1320
- analystRatingHold: prop.analystRatingHold !== undefined ? {
1321
- set: prop.analystRatingHold
1322
- } : undefined,
1323
- analystRatingSell: prop.analystRatingSell !== undefined ? {
1324
- set: prop.analystRatingSell
1325
- } : undefined,
1326
- analystRatingStrongSell: prop.analystRatingStrongSell !== undefined ? {
1327
- set: prop.analystRatingStrongSell
1328
- } : undefined,
1329
- trailingPE: prop.trailingPE !== undefined ? {
1330
- set: prop.trailingPE
1331
- } : undefined,
1332
- forwardPE: prop.forwardPE !== undefined ? {
1333
- set: prop.forwardPE
1334
- } : undefined,
1335
- priceToSalesRatioTTM: prop.priceToSalesRatioTTM !== undefined ? {
1336
- set: prop.priceToSalesRatioTTM
1337
- } : undefined,
1338
- priceToBookRatio: prop.priceToBookRatio !== undefined ? {
1339
- set: prop.priceToBookRatio
1340
- } : undefined,
1341
- evToRevenue: prop.evToRevenue !== undefined ? {
1342
- set: prop.evToRevenue
1343
- } : undefined,
1344
- evToEbitda: prop.evToEbitda !== undefined ? {
1345
- set: prop.evToEbitda
1346
- } : undefined,
1347
- beta: prop.beta !== undefined ? {
1348
- set: prop.beta
1349
- } : undefined,
1350
- week52High: prop.week52High !== undefined ? {
1351
- set: prop.week52High
1352
- } : undefined,
1353
- week52Low: prop.week52Low !== undefined ? {
1354
- set: prop.week52Low
1355
- } : undefined,
1356
- day50MovingAverage: prop.day50MovingAverage !== undefined ? {
1357
- set: prop.day50MovingAverage
1358
- } : undefined,
1359
- day200MovingAverage: prop.day200MovingAverage !== undefined ? {
1360
- set: prop.day200MovingAverage
1361
- } : undefined,
1362
- sharesOutstanding: prop.sharesOutstanding !== undefined ? {
1363
- set: prop.sharesOutstanding
1364
- } : undefined,
1365
- dividendDate: prop.dividendDate !== undefined ? {
1366
- set: prop.dividendDate
1367
- } : undefined,
1368
- exDividendDate: prop.exDividendDate !== undefined ? {
1369
- set: prop.exDividendDate
1370
- } : undefined,
1371
- askPrice: prop.askPrice !== undefined ? {
1372
- set: prop.askPrice
1373
- } : undefined,
1374
- bidPrice: prop.bidPrice !== undefined ? {
1375
- set: prop.bidPrice
1376
- } : undefined,
1377
- createdAt: prop.createdAt !== undefined ? {
1378
- set: prop.createdAt
1379
- } : undefined,
1380
- updatedAt: prop.updatedAt !== undefined ? {
1381
- set: prop.updatedAt
1382
- } : undefined,
1383
- newsMentions: prop.newsMentions ?
1384
- Array.isArray(prop.newsMentions) && prop.newsMentions.length > 0 && prop.newsMentions.every((item) => typeof item === 'object' && ('id' in item || 'symbol' in item) && Object.keys(item).length === 1) ? {
1385
- connect: prop.newsMentions.map((item) => ({
1386
- id: item.id
1387
- }))
1388
- } : { upsert: prop.newsMentions.map((item) => ({
1389
- where: {
1390
- id: item.id !== undefined ? item.id : undefined,
1391
- url: item.url !== undefined ? item.url : undefined,
1392
- assetId: item.assetId !== undefined ? {
1393
- equals: item.assetId
1394
- } : undefined,
1395
- newsArticleId: item.newsArticleId !== undefined ? {
1396
- equals: item.newsArticleId
1397
- } : undefined,
1398
- },
1399
- update: {
1400
- id: item.id !== undefined ? {
1401
- set: item.id
1402
- } : undefined,
1403
- url: item.url !== undefined ? {
1404
- set: item.url
1405
- } : undefined,
1406
- relevancyScore: item.relevancyScore !== undefined ? {
1407
- set: item.relevancyScore
1408
- } : undefined,
1409
- sentimentScore: item.sentimentScore !== undefined ? {
1410
- set: item.sentimentScore
1411
- } : undefined,
1412
- sentimentLabel: item.sentimentLabel !== undefined ? {
1413
- set: item.sentimentLabel
1414
- } : undefined,
1415
- news: item.news ?
1416
- typeof item.news === 'object' && Object.keys(item.news).length === 1 && (Object.keys(item.news)[0] === 'id' || Object.keys(item.news)[0] === 'symbol')
1417
- ? {
1418
- connect: {
1419
- id: item.news.id
1420
- }
1421
- } : { upsert: {
1422
- where: {
1423
- id: item.news.id !== undefined ? {
1424
- equals: item.news.id
1425
- } : undefined,
1426
- title: item.news.title !== undefined ? {
1427
- equals: item.news.title
1428
- } : undefined,
1429
- url: item.news.url !== undefined ? {
1430
- equals: item.news.url
1431
- } : undefined,
1432
- },
1433
- update: {
1434
- id: item.news.id !== undefined ? {
1435
- set: item.news.id
1436
- } : undefined,
1437
- title: item.news.title !== undefined ? {
1438
- set: item.news.title
1439
- } : undefined,
1440
- content: item.news.content !== undefined ? {
1441
- set: item.news.content
1442
- } : undefined,
1443
- source: item.news.source !== undefined ? {
1444
- set: item.news.source
1445
- } : undefined,
1446
- sourceDomain: item.news.sourceDomain !== undefined ? {
1447
- set: item.news.sourceDomain
1448
- } : undefined,
1449
- url: item.news.url !== undefined ? {
1450
- set: item.news.url
1451
- } : undefined,
1452
- sentiment: item.news.sentiment !== undefined ? {
1453
- set: item.news.sentiment
1454
- } : undefined,
1455
- authors: item.news.authors !== undefined ? {
1456
- set: item.news.authors
1457
- } : undefined,
1458
- summary: item.news.summary !== undefined ? {
1459
- set: item.news.summary
1460
- } : undefined,
1461
- bannerImage: item.news.bannerImage !== undefined ? {
1462
- set: item.news.bannerImage
1463
- } : undefined,
1464
- timePublished: item.news.timePublished !== undefined ? {
1465
- set: item.news.timePublished
1466
- } : undefined,
1467
- category: item.news.category !== undefined ? {
1468
- set: item.news.category
1469
- } : undefined,
1470
- topics: item.news.topics !== undefined ? {
1471
- set: item.news.topics
1472
- } : undefined,
1473
- logo: item.news.logo !== undefined ? {
1474
- set: item.news.logo
1475
- } : undefined,
1476
- },
1477
- create: {
1478
- title: item.news.title !== undefined ? item.news.title : undefined,
1479
- content: item.news.content !== undefined ? item.news.content : undefined,
1480
- source: item.news.source !== undefined ? item.news.source : undefined,
1481
- sourceDomain: item.news.sourceDomain !== undefined ? item.news.sourceDomain : undefined,
1482
- url: item.news.url !== undefined ? item.news.url : undefined,
1483
- sentiment: item.news.sentiment !== undefined ? item.news.sentiment : undefined,
1484
- authors: item.news.authors !== undefined ? {
1485
- set: item.news.authors
1486
- } : undefined,
1487
- summary: item.news.summary !== undefined ? item.news.summary : undefined,
1488
- bannerImage: item.news.bannerImage !== undefined ? item.news.bannerImage : undefined,
1489
- timePublished: item.news.timePublished !== undefined ? item.news.timePublished : undefined,
1490
- category: item.news.category !== undefined ? item.news.category : undefined,
1491
- topics: item.news.topics !== undefined ? {
1492
- set: item.news.topics
1493
- } : undefined,
1494
- logo: item.news.logo !== undefined ? item.news.logo : undefined,
1495
- },
1496
- }
1497
- } : undefined,
1498
- },
1499
- create: {
1500
- url: item.url !== undefined ? item.url : undefined,
1501
- relevancyScore: item.relevancyScore !== undefined ? item.relevancyScore : undefined,
1502
- sentimentScore: item.sentimentScore !== undefined ? item.sentimentScore : undefined,
1503
- sentimentLabel: item.sentimentLabel !== undefined ? item.sentimentLabel : undefined,
1504
- news: item.news ?
1505
- typeof item.news === 'object' && Object.keys(item.news).length === 1 && Object.keys(item.news)[0] === 'id'
1506
- ? { connect: {
1507
- id: item.news.id
1508
- }
1509
- }
1510
- : { connectOrCreate: {
1511
- where: {
1512
- id: item.news.id !== undefined ? item.news.id : undefined,
1513
- url: item.news.url !== undefined ? item.news.url : undefined,
1514
- title: item.news.title !== undefined ? {
1515
- equals: item.news.title
1516
- } : undefined,
1517
- },
1518
- create: {
1519
- title: item.news.title !== undefined ? item.news.title : undefined,
1520
- content: item.news.content !== undefined ? item.news.content : undefined,
1521
- source: item.news.source !== undefined ? item.news.source : undefined,
1522
- sourceDomain: item.news.sourceDomain !== undefined ? item.news.sourceDomain : undefined,
1523
- url: item.news.url !== undefined ? item.news.url : undefined,
1524
- sentiment: item.news.sentiment !== undefined ? item.news.sentiment : undefined,
1525
- authors: item.news.authors !== undefined ? {
1526
- set: item.news.authors
1527
- } : undefined,
1528
- summary: item.news.summary !== undefined ? item.news.summary : undefined,
1529
- bannerImage: item.news.bannerImage !== undefined ? item.news.bannerImage : undefined,
1530
- timePublished: item.news.timePublished !== undefined ? item.news.timePublished : undefined,
1531
- category: item.news.category !== undefined ? item.news.category : undefined,
1532
- topics: item.news.topics !== undefined ? {
1533
- set: item.news.topics
1534
- } : undefined,
1535
- logo: item.news.logo !== undefined ? item.news.logo : undefined,
1536
- },
1537
- }
1316
+ // Maximum number of retries for database connection issues
1317
+ const MAX_RETRIES = 3;
1318
+ let retryCount = 0;
1319
+ let lastError = null;
1320
+ // Retry loop to handle potential database connection issues
1321
+ while (retryCount < MAX_RETRIES) {
1322
+ try {
1323
+ const [modules, client] = await Promise.all([
1324
+ getApolloModules(),
1325
+ globalClient
1326
+ ? Promise.resolve(globalClient)
1327
+ : importedClient
1328
+ ]);
1329
+ const { gql, ApolloError } = modules;
1330
+ const UPDATE_MANY_ASSET = gql `
1331
+ mutation updateManyAsset($data: [AssetCreateManyInput!]!) {
1332
+ updateManyAsset(data: $data) {
1333
+ count
1334
+ }
1335
+ }`;
1336
+ const variables = props.map(prop => ({
1337
+ where: {
1338
+ id: prop.id !== undefined ? prop.id : undefined,
1339
+ symbol: prop.symbol !== undefined ? prop.symbol : undefined,
1340
+ name: prop.name !== undefined ? prop.name : undefined,
1341
+ },
1342
+ data: {
1343
+ id: prop.id !== undefined ? {
1344
+ set: prop.id
1345
+ } : undefined,
1346
+ symbol: prop.symbol !== undefined ? {
1347
+ set: prop.symbol
1348
+ } : undefined,
1349
+ name: prop.name !== undefined ? {
1350
+ set: prop.name
1351
+ } : undefined,
1352
+ type: prop.type !== undefined ? {
1353
+ set: prop.type
1354
+ } : undefined,
1355
+ logoUrl: prop.logoUrl !== undefined ? {
1356
+ set: prop.logoUrl
1357
+ } : undefined,
1358
+ description: prop.description !== undefined ? {
1359
+ set: prop.description
1360
+ } : undefined,
1361
+ cik: prop.cik !== undefined ? {
1362
+ set: prop.cik
1363
+ } : undefined,
1364
+ exchange: prop.exchange !== undefined ? {
1365
+ set: prop.exchange
1366
+ } : undefined,
1367
+ currency: prop.currency !== undefined ? {
1368
+ set: prop.currency
1369
+ } : undefined,
1370
+ country: prop.country !== undefined ? {
1371
+ set: prop.country
1372
+ } : undefined,
1373
+ sector: prop.sector !== undefined ? {
1374
+ set: prop.sector
1375
+ } : undefined,
1376
+ industry: prop.industry !== undefined ? {
1377
+ set: prop.industry
1378
+ } : undefined,
1379
+ address: prop.address !== undefined ? {
1380
+ set: prop.address
1381
+ } : undefined,
1382
+ officialSite: prop.officialSite !== undefined ? {
1383
+ set: prop.officialSite
1384
+ } : undefined,
1385
+ fiscalYearEnd: prop.fiscalYearEnd !== undefined ? {
1386
+ set: prop.fiscalYearEnd
1387
+ } : undefined,
1388
+ latestQuarter: prop.latestQuarter !== undefined ? {
1389
+ set: prop.latestQuarter
1390
+ } : undefined,
1391
+ marketCapitalization: prop.marketCapitalization !== undefined ? {
1392
+ set: prop.marketCapitalization
1393
+ } : undefined,
1394
+ ebitda: prop.ebitda !== undefined ? {
1395
+ set: prop.ebitda
1396
+ } : undefined,
1397
+ peRatio: prop.peRatio !== undefined ? {
1398
+ set: prop.peRatio
1399
+ } : undefined,
1400
+ pegRatio: prop.pegRatio !== undefined ? {
1401
+ set: prop.pegRatio
1402
+ } : undefined,
1403
+ bookValue: prop.bookValue !== undefined ? {
1404
+ set: prop.bookValue
1405
+ } : undefined,
1406
+ dividendPerShare: prop.dividendPerShare !== undefined ? {
1407
+ set: prop.dividendPerShare
1408
+ } : undefined,
1409
+ dividendYield: prop.dividendYield !== undefined ? {
1410
+ set: prop.dividendYield
1411
+ } : undefined,
1412
+ eps: prop.eps !== undefined ? {
1413
+ set: prop.eps
1414
+ } : undefined,
1415
+ revenuePerShareTTM: prop.revenuePerShareTTM !== undefined ? {
1416
+ set: prop.revenuePerShareTTM
1417
+ } : undefined,
1418
+ profitMargin: prop.profitMargin !== undefined ? {
1419
+ set: prop.profitMargin
1420
+ } : undefined,
1421
+ operatingMarginTTM: prop.operatingMarginTTM !== undefined ? {
1422
+ set: prop.operatingMarginTTM
1423
+ } : undefined,
1424
+ returnOnAssetsTTM: prop.returnOnAssetsTTM !== undefined ? {
1425
+ set: prop.returnOnAssetsTTM
1426
+ } : undefined,
1427
+ returnOnEquityTTM: prop.returnOnEquityTTM !== undefined ? {
1428
+ set: prop.returnOnEquityTTM
1429
+ } : undefined,
1430
+ revenueTTM: prop.revenueTTM !== undefined ? {
1431
+ set: prop.revenueTTM
1432
+ } : undefined,
1433
+ grossProfitTTM: prop.grossProfitTTM !== undefined ? {
1434
+ set: prop.grossProfitTTM
1435
+ } : undefined,
1436
+ dilutedEPSTTM: prop.dilutedEPSTTM !== undefined ? {
1437
+ set: prop.dilutedEPSTTM
1438
+ } : undefined,
1439
+ quarterlyEarningsGrowthYOY: prop.quarterlyEarningsGrowthYOY !== undefined ? {
1440
+ set: prop.quarterlyEarningsGrowthYOY
1441
+ } : undefined,
1442
+ quarterlyRevenueGrowthYOY: prop.quarterlyRevenueGrowthYOY !== undefined ? {
1443
+ set: prop.quarterlyRevenueGrowthYOY
1444
+ } : undefined,
1445
+ analystTargetPrice: prop.analystTargetPrice !== undefined ? {
1446
+ set: prop.analystTargetPrice
1447
+ } : undefined,
1448
+ analystRatingStrongBuy: prop.analystRatingStrongBuy !== undefined ? {
1449
+ set: prop.analystRatingStrongBuy
1450
+ } : undefined,
1451
+ analystRatingBuy: prop.analystRatingBuy !== undefined ? {
1452
+ set: prop.analystRatingBuy
1453
+ } : undefined,
1454
+ analystRatingHold: prop.analystRatingHold !== undefined ? {
1455
+ set: prop.analystRatingHold
1456
+ } : undefined,
1457
+ analystRatingSell: prop.analystRatingSell !== undefined ? {
1458
+ set: prop.analystRatingSell
1459
+ } : undefined,
1460
+ analystRatingStrongSell: prop.analystRatingStrongSell !== undefined ? {
1461
+ set: prop.analystRatingStrongSell
1462
+ } : undefined,
1463
+ trailingPE: prop.trailingPE !== undefined ? {
1464
+ set: prop.trailingPE
1465
+ } : undefined,
1466
+ forwardPE: prop.forwardPE !== undefined ? {
1467
+ set: prop.forwardPE
1468
+ } : undefined,
1469
+ priceToSalesRatioTTM: prop.priceToSalesRatioTTM !== undefined ? {
1470
+ set: prop.priceToSalesRatioTTM
1471
+ } : undefined,
1472
+ priceToBookRatio: prop.priceToBookRatio !== undefined ? {
1473
+ set: prop.priceToBookRatio
1474
+ } : undefined,
1475
+ evToRevenue: prop.evToRevenue !== undefined ? {
1476
+ set: prop.evToRevenue
1477
+ } : undefined,
1478
+ evToEbitda: prop.evToEbitda !== undefined ? {
1479
+ set: prop.evToEbitda
1480
+ } : undefined,
1481
+ beta: prop.beta !== undefined ? {
1482
+ set: prop.beta
1483
+ } : undefined,
1484
+ week52High: prop.week52High !== undefined ? {
1485
+ set: prop.week52High
1486
+ } : undefined,
1487
+ week52Low: prop.week52Low !== undefined ? {
1488
+ set: prop.week52Low
1489
+ } : undefined,
1490
+ day50MovingAverage: prop.day50MovingAverage !== undefined ? {
1491
+ set: prop.day50MovingAverage
1492
+ } : undefined,
1493
+ day200MovingAverage: prop.day200MovingAverage !== undefined ? {
1494
+ set: prop.day200MovingAverage
1495
+ } : undefined,
1496
+ sharesOutstanding: prop.sharesOutstanding !== undefined ? {
1497
+ set: prop.sharesOutstanding
1498
+ } : undefined,
1499
+ dividendDate: prop.dividendDate !== undefined ? {
1500
+ set: prop.dividendDate
1501
+ } : undefined,
1502
+ exDividendDate: prop.exDividendDate !== undefined ? {
1503
+ set: prop.exDividendDate
1504
+ } : undefined,
1505
+ askPrice: prop.askPrice !== undefined ? {
1506
+ set: prop.askPrice
1507
+ } : undefined,
1508
+ bidPrice: prop.bidPrice !== undefined ? {
1509
+ set: prop.bidPrice
1510
+ } : undefined,
1511
+ createdAt: prop.createdAt !== undefined ? {
1512
+ set: prop.createdAt
1513
+ } : undefined,
1514
+ updatedAt: prop.updatedAt !== undefined ? {
1515
+ set: prop.updatedAt
1516
+ } : undefined,
1517
+ newsMentions: prop.newsMentions ?
1518
+ Array.isArray(prop.newsMentions) && prop.newsMentions.length > 0 && prop.newsMentions.every((item) => typeof item === 'object' && ('id' in item || 'symbol' in item) && Object.keys(item).length === 1) ? {
1519
+ connect: prop.newsMentions.map((item) => ({
1520
+ id: item.id
1521
+ }))
1522
+ } : { upsert: prop.newsMentions.map((item) => ({
1523
+ where: {
1524
+ id: item.id !== undefined ? item.id : undefined,
1525
+ url: item.url !== undefined ? item.url : undefined,
1526
+ assetId: item.assetId !== undefined ? {
1527
+ equals: item.assetId
1528
+ } : undefined,
1529
+ newsArticleId: item.newsArticleId !== undefined ? {
1530
+ equals: item.newsArticleId
1531
+ } : undefined,
1532
+ },
1533
+ update: {
1534
+ id: item.id !== undefined ? {
1535
+ set: item.id
1536
+ } : undefined,
1537
+ url: item.url !== undefined ? {
1538
+ set: item.url
1539
+ } : undefined,
1540
+ relevancyScore: item.relevancyScore !== undefined ? {
1541
+ set: item.relevancyScore
1538
1542
  } : undefined,
1539
- },
1540
- }))
1541
- } : undefined,
1542
- },
1543
- }));
1544
- const filteredVariables = removeUndefinedProps(variables);
1545
- try {
1546
- const response = await client.mutate({ mutation: UPDATE_MANY_ASSET, variables: filteredVariables });
1547
- if (response.errors && response.errors.length > 0)
1548
- throw new Error(response.errors[0].message);
1549
- if (response && response.data && response.data.updateManyAsset) {
1550
- return response.data.updateManyAsset;
1543
+ sentimentScore: item.sentimentScore !== undefined ? {
1544
+ set: item.sentimentScore
1545
+ } : undefined,
1546
+ sentimentLabel: item.sentimentLabel !== undefined ? {
1547
+ set: item.sentimentLabel
1548
+ } : undefined,
1549
+ news: item.news ?
1550
+ typeof item.news === 'object' && Object.keys(item.news).length === 1 && (Object.keys(item.news)[0] === 'id' || Object.keys(item.news)[0] === 'symbol')
1551
+ ? {
1552
+ connect: {
1553
+ id: item.news.id
1554
+ }
1555
+ } : { upsert: {
1556
+ where: {
1557
+ id: item.news.id !== undefined ? {
1558
+ equals: item.news.id
1559
+ } : undefined,
1560
+ title: item.news.title !== undefined ? {
1561
+ equals: item.news.title
1562
+ } : undefined,
1563
+ url: item.news.url !== undefined ? {
1564
+ equals: item.news.url
1565
+ } : undefined,
1566
+ },
1567
+ update: {
1568
+ id: item.news.id !== undefined ? {
1569
+ set: item.news.id
1570
+ } : undefined,
1571
+ title: item.news.title !== undefined ? {
1572
+ set: item.news.title
1573
+ } : undefined,
1574
+ content: item.news.content !== undefined ? {
1575
+ set: item.news.content
1576
+ } : undefined,
1577
+ source: item.news.source !== undefined ? {
1578
+ set: item.news.source
1579
+ } : undefined,
1580
+ sourceDomain: item.news.sourceDomain !== undefined ? {
1581
+ set: item.news.sourceDomain
1582
+ } : undefined,
1583
+ url: item.news.url !== undefined ? {
1584
+ set: item.news.url
1585
+ } : undefined,
1586
+ sentiment: item.news.sentiment !== undefined ? {
1587
+ set: item.news.sentiment
1588
+ } : undefined,
1589
+ authors: item.news.authors !== undefined ? {
1590
+ set: item.news.authors
1591
+ } : undefined,
1592
+ summary: item.news.summary !== undefined ? {
1593
+ set: item.news.summary
1594
+ } : undefined,
1595
+ bannerImage: item.news.bannerImage !== undefined ? {
1596
+ set: item.news.bannerImage
1597
+ } : undefined,
1598
+ timePublished: item.news.timePublished !== undefined ? {
1599
+ set: item.news.timePublished
1600
+ } : undefined,
1601
+ category: item.news.category !== undefined ? {
1602
+ set: item.news.category
1603
+ } : undefined,
1604
+ topics: item.news.topics !== undefined ? {
1605
+ set: item.news.topics
1606
+ } : undefined,
1607
+ logo: item.news.logo !== undefined ? {
1608
+ set: item.news.logo
1609
+ } : undefined,
1610
+ },
1611
+ create: {
1612
+ title: item.news.title !== undefined ? item.news.title : undefined,
1613
+ content: item.news.content !== undefined ? item.news.content : undefined,
1614
+ source: item.news.source !== undefined ? item.news.source : undefined,
1615
+ sourceDomain: item.news.sourceDomain !== undefined ? item.news.sourceDomain : undefined,
1616
+ url: item.news.url !== undefined ? item.news.url : undefined,
1617
+ sentiment: item.news.sentiment !== undefined ? item.news.sentiment : undefined,
1618
+ authors: item.news.authors !== undefined ? {
1619
+ set: item.news.authors
1620
+ } : undefined,
1621
+ summary: item.news.summary !== undefined ? item.news.summary : undefined,
1622
+ bannerImage: item.news.bannerImage !== undefined ? item.news.bannerImage : undefined,
1623
+ timePublished: item.news.timePublished !== undefined ? item.news.timePublished : undefined,
1624
+ category: item.news.category !== undefined ? item.news.category : undefined,
1625
+ topics: item.news.topics !== undefined ? {
1626
+ set: item.news.topics
1627
+ } : undefined,
1628
+ logo: item.news.logo !== undefined ? item.news.logo : undefined,
1629
+ },
1630
+ }
1631
+ } : undefined,
1632
+ },
1633
+ create: {
1634
+ url: item.url !== undefined ? item.url : undefined,
1635
+ relevancyScore: item.relevancyScore !== undefined ? item.relevancyScore : undefined,
1636
+ sentimentScore: item.sentimentScore !== undefined ? item.sentimentScore : undefined,
1637
+ sentimentLabel: item.sentimentLabel !== undefined ? item.sentimentLabel : undefined,
1638
+ news: item.news ?
1639
+ typeof item.news === 'object' && Object.keys(item.news).length === 1 && Object.keys(item.news)[0] === 'id'
1640
+ ? { connect: {
1641
+ id: item.news.id
1642
+ }
1643
+ }
1644
+ : { connectOrCreate: {
1645
+ where: {
1646
+ id: item.news.id !== undefined ? item.news.id : undefined,
1647
+ url: item.news.url !== undefined ? item.news.url : undefined,
1648
+ title: item.news.title !== undefined ? {
1649
+ equals: item.news.title
1650
+ } : undefined,
1651
+ },
1652
+ create: {
1653
+ title: item.news.title !== undefined ? item.news.title : undefined,
1654
+ content: item.news.content !== undefined ? item.news.content : undefined,
1655
+ source: item.news.source !== undefined ? item.news.source : undefined,
1656
+ sourceDomain: item.news.sourceDomain !== undefined ? item.news.sourceDomain : undefined,
1657
+ url: item.news.url !== undefined ? item.news.url : undefined,
1658
+ sentiment: item.news.sentiment !== undefined ? item.news.sentiment : undefined,
1659
+ authors: item.news.authors !== undefined ? {
1660
+ set: item.news.authors
1661
+ } : undefined,
1662
+ summary: item.news.summary !== undefined ? item.news.summary : undefined,
1663
+ bannerImage: item.news.bannerImage !== undefined ? item.news.bannerImage : undefined,
1664
+ timePublished: item.news.timePublished !== undefined ? item.news.timePublished : undefined,
1665
+ category: item.news.category !== undefined ? item.news.category : undefined,
1666
+ topics: item.news.topics !== undefined ? {
1667
+ set: item.news.topics
1668
+ } : undefined,
1669
+ logo: item.news.logo !== undefined ? item.news.logo : undefined,
1670
+ },
1671
+ }
1672
+ } : undefined,
1673
+ },
1674
+ }))
1675
+ } : undefined,
1676
+ },
1677
+ }));
1678
+ const filteredVariables = removeUndefinedProps(variables);
1679
+ const response = await client.mutate({
1680
+ mutation: UPDATE_MANY_ASSET,
1681
+ variables: filteredVariables,
1682
+ // Don't cache mutations, but ensure we're using the freshest context
1683
+ fetchPolicy: 'no-cache'
1684
+ });
1685
+ if (response.errors && response.errors.length > 0)
1686
+ throw new Error(response.errors[0].message);
1687
+ if (response && response.data && response.data.updateManyAsset) {
1688
+ return response.data.updateManyAsset;
1689
+ }
1690
+ else {
1691
+ return null;
1692
+ }
1551
1693
  }
1552
- else {
1553
- return null;
1694
+ catch (error) {
1695
+ lastError = error;
1696
+ // Check if this is a database connection error that we should retry
1697
+ const isConnectionError = error.message?.includes('Server has closed the connection') ||
1698
+ error.message?.includes('Cannot reach database server') ||
1699
+ error.message?.includes('Connection timed out') ||
1700
+ error.message?.includes('Accelerate') || // Prisma Accelerate proxy errors
1701
+ (error.networkError && error.networkError.message?.includes('Failed to fetch'));
1702
+ if (isConnectionError && retryCount < MAX_RETRIES - 1) {
1703
+ retryCount++;
1704
+ const delay = Math.pow(2, retryCount) * 100; // Exponential backoff: 200ms, 400ms, 800ms
1705
+ console.warn("Database connection error, retrying...");
1706
+ await new Promise(resolve => setTimeout(resolve, delay));
1707
+ continue;
1708
+ }
1709
+ // Log the error and rethrow
1710
+ console.error("Database error occurred:", error);
1711
+ throw error;
1554
1712
  }
1555
1713
  }
1556
- catch (error) {
1557
- console.error('Error in updateManyAsset:', error);
1558
- throw error;
1559
- }
1714
+ // If we exhausted retries, throw the last error
1715
+ throw lastError;
1560
1716
  },
1561
1717
  /**
1562
1718
  * Delete a single Asset record.
1563
- * @param props - Properties to update.
1719
+ * Enhanced with connection resilience against Prisma connection errors.
1720
+ * @param props - Properties to identify the record to delete.
1564
1721
  * @param globalClient - Apollo Client instance.
1565
1722
  * @returns The deleted Asset or null.
1566
1723
  */
1567
1724
  async delete(props, globalClient) {
1568
- const [modules, client] = await Promise.all([
1569
- getApolloModules(),
1570
- globalClient
1571
- ? Promise.resolve(globalClient)
1572
- : importedClient
1573
- ]);
1574
- const { gql, ApolloError } = modules;
1575
- const DELETE_ONE_ASSET = gql `
1576
- mutation deleteOneAsset($where: AssetWhereUniqueInput!) {
1577
- deleteOneAsset(where: $where) {
1578
- id
1579
- }
1580
- }`;
1581
- const variables = {
1582
- where: {
1583
- id: props.id ? props.id : undefined,
1725
+ // Maximum number of retries for database connection issues
1726
+ const MAX_RETRIES = 3;
1727
+ let retryCount = 0;
1728
+ let lastError = null;
1729
+ // Retry loop to handle potential database connection issues
1730
+ while (retryCount < MAX_RETRIES) {
1731
+ try {
1732
+ const [modules, client] = await Promise.all([
1733
+ getApolloModules(),
1734
+ globalClient
1735
+ ? Promise.resolve(globalClient)
1736
+ : importedClient
1737
+ ]);
1738
+ const { gql, ApolloError } = modules;
1739
+ const DELETE_ONE_ASSET = gql `
1740
+ mutation deleteOneAsset($where: AssetWhereUniqueInput!) {
1741
+ deleteOneAsset(where: $where) {
1742
+ id
1584
1743
  }
1585
- };
1586
- const filteredVariables = removeUndefinedProps(variables);
1587
- try {
1588
- const response = await client.mutate({ mutation: DELETE_ONE_ASSET, variables: filteredVariables });
1589
- if (response.errors && response.errors.length > 0)
1590
- throw new Error(response.errors[0].message);
1591
- if (response && response.data && response.data.deleteOneAsset) {
1592
- return response.data.deleteOneAsset;
1744
+ }`;
1745
+ const variables = {
1746
+ where: {
1747
+ id: props.id ? props.id : undefined,
1748
+ }
1749
+ };
1750
+ const filteredVariables = removeUndefinedProps(variables);
1751
+ const response = await client.mutate({
1752
+ mutation: DELETE_ONE_ASSET,
1753
+ variables: filteredVariables,
1754
+ // Don't cache mutations, but ensure we're using the freshest context
1755
+ fetchPolicy: 'no-cache'
1756
+ });
1757
+ if (response.errors && response.errors.length > 0)
1758
+ throw new Error(response.errors[0].message);
1759
+ if (response && response.data && response.data.deleteOneAsset) {
1760
+ return response.data.deleteOneAsset;
1761
+ }
1762
+ else {
1763
+ return null;
1764
+ }
1593
1765
  }
1594
- else {
1595
- return null;
1766
+ catch (error) {
1767
+ lastError = error;
1768
+ // Check if this is a database connection error that we should retry
1769
+ const isConnectionError = error.message?.includes('Server has closed the connection') ||
1770
+ error.message?.includes('Cannot reach database server') ||
1771
+ error.message?.includes('Connection timed out') ||
1772
+ error.message?.includes('Accelerate') || // Prisma Accelerate proxy errors
1773
+ (error.networkError && error.networkError.message?.includes('Failed to fetch'));
1774
+ if (isConnectionError && retryCount < MAX_RETRIES - 1) {
1775
+ retryCount++;
1776
+ const delay = Math.pow(2, retryCount) * 100; // Exponential backoff: 200ms, 400ms, 800ms
1777
+ console.warn("Database connection error, retrying...");
1778
+ await new Promise(resolve => setTimeout(resolve, delay));
1779
+ continue;
1780
+ }
1781
+ // Log the error and rethrow
1782
+ console.error("Database error occurred:", error);
1783
+ throw error;
1596
1784
  }
1597
1785
  }
1598
- catch (error) {
1599
- console.error('Error in deleteOneAsset:', error);
1600
- throw error;
1601
- }
1786
+ // If we exhausted retries, throw the last error
1787
+ throw lastError;
1602
1788
  },
1603
1789
  /**
1604
1790
  * Retrieve a single Asset record by ID.
1605
- * @param props - Properties to update.
1791
+ * Enhanced with connection resilience against Prisma connection errors.
1792
+ * @param props - Properties to identify the record.
1606
1793
  * @param globalClient - Apollo Client instance.
1794
+ * @param whereInput - Optional custom where input.
1607
1795
  * @returns The retrieved Asset or null.
1608
1796
  */
1609
1797
  async get(props, globalClient, whereInput) {
1610
- const [modules, client] = await Promise.all([
1611
- getApolloModules(),
1612
- globalClient
1613
- ? Promise.resolve(globalClient)
1614
- : importedClient
1615
- ]);
1616
- const { gql, ApolloError } = modules;
1617
- const GET_ASSET = gql `
1618
- query getAsset($where: AssetWhereUniqueInput!) {
1619
- getAsset(where: $where) {
1620
- ${selectionSet}
1621
- }
1622
- }`;
1623
- const variables = {
1624
- where: whereInput ? whereInput : {
1625
- id: props.id !== undefined ? props.id : undefined,
1626
- symbol: props.symbol !== undefined ? props.symbol : undefined,
1627
- name: props.name !== undefined ? props.name : undefined,
1628
- },
1629
- };
1630
- const filteredVariables = removeUndefinedProps(variables);
1631
- try {
1632
- const response = await client.query({ query: GET_ASSET, variables: filteredVariables });
1633
- if (response.errors && response.errors.length > 0)
1634
- throw new Error(response.errors[0].message);
1635
- return response.data?.getAsset ?? null;
1636
- }
1637
- catch (error) {
1638
- if (error instanceof ApolloError && error.message === 'No Asset found') {
1639
- return null;
1798
+ // Maximum number of retries for database connection issues
1799
+ const MAX_RETRIES = 3;
1800
+ let retryCount = 0;
1801
+ let lastError = null;
1802
+ // Retry loop to handle potential database connection issues
1803
+ while (retryCount < MAX_RETRIES) {
1804
+ try {
1805
+ const [modules, client] = await Promise.all([
1806
+ getApolloModules(),
1807
+ globalClient
1808
+ ? Promise.resolve(globalClient)
1809
+ : importedClient
1810
+ ]);
1811
+ const { gql, ApolloError } = modules;
1812
+ const GET_ASSET = gql `
1813
+ query getAsset($where: AssetWhereUniqueInput!) {
1814
+ getAsset(where: $where) {
1815
+ ${selectionSet}
1640
1816
  }
1641
- else {
1642
- console.error('Error in getAsset:', error);
1817
+ }`;
1818
+ const variables = {
1819
+ where: whereInput ? whereInput : {
1820
+ id: props.id !== undefined ? props.id : undefined,
1821
+ symbol: props.symbol !== undefined ? props.symbol : undefined,
1822
+ name: props.name !== undefined ? props.name : undefined,
1823
+ },
1824
+ };
1825
+ const filteredVariables = removeUndefinedProps(variables);
1826
+ const response = await client.query({
1827
+ query: GET_ASSET,
1828
+ variables: filteredVariables,
1829
+ fetchPolicy: 'network-only', // Force network request to avoid stale cache
1830
+ });
1831
+ if (response.errors && response.errors.length > 0)
1832
+ throw new Error(response.errors[0].message);
1833
+ return response.data?.getAsset ?? null;
1834
+ }
1835
+ catch (error) {
1836
+ lastError = error;
1837
+ // Check if this is a "No record found" error - this is an expected condition, not a failure
1838
+ if (error.message === 'No Asset found') {
1839
+ return null;
1840
+ }
1841
+ // Check if this is a database connection error that we should retry
1842
+ const isConnectionError = error.message?.includes('Server has closed the connection') ||
1843
+ error.message?.includes('Cannot reach database server') ||
1844
+ error.message?.includes('Connection timed out') ||
1845
+ error.message?.includes('Accelerate') || // Prisma Accelerate proxy errors
1846
+ (error.networkError && error.networkError.message?.includes('Failed to fetch'));
1847
+ if (isConnectionError && retryCount < MAX_RETRIES - 1) {
1848
+ retryCount++;
1849
+ const delay = Math.pow(2, retryCount) * 100; // Exponential backoff: 200ms, 400ms, 800ms
1850
+ console.warn("Database connection error, retrying...");
1851
+ await new Promise(resolve => setTimeout(resolve, delay));
1852
+ continue;
1853
+ }
1854
+ // Log the error and rethrow
1855
+ console.error("Database error occurred:", error);
1643
1856
  throw error;
1644
1857
  }
1645
1858
  }
1859
+ // If we exhausted retries, throw the last error
1860
+ throw lastError;
1646
1861
  },
1647
1862
  /**
1648
1863
  * Retrieve all Assets records.
1864
+ * Enhanced with connection resilience against Prisma connection errors.
1649
1865
  * @param globalClient - Apollo Client instance.
1650
1866
  * @returns An array of Asset records or null.
1651
1867
  */
1652
1868
  async getAll(globalClient) {
1653
- const [modules, client] = await Promise.all([
1654
- getApolloModules(),
1655
- globalClient
1656
- ? Promise.resolve(globalClient)
1657
- : importedClient
1658
- ]);
1659
- const { gql, ApolloError } = modules;
1660
- const GET_ALL_ASSET = gql `
1661
- query getAllAsset {
1662
- assets {
1663
- ${selectionSet}
1664
- }
1665
- }`;
1666
- try {
1667
- const response = await client.query({ query: GET_ALL_ASSET });
1668
- if (response.errors && response.errors.length > 0)
1669
- throw new Error(response.errors[0].message);
1670
- return response.data?.assets ?? null;
1671
- }
1672
- catch (error) {
1673
- if (error instanceof ApolloError && error.message === 'No Asset found') {
1674
- return null;
1869
+ // Maximum number of retries for database connection issues
1870
+ const MAX_RETRIES = 3;
1871
+ let retryCount = 0;
1872
+ let lastError = null;
1873
+ // Retry loop to handle potential database connection issues
1874
+ while (retryCount < MAX_RETRIES) {
1875
+ try {
1876
+ const [modules, client] = await Promise.all([
1877
+ getApolloModules(),
1878
+ globalClient
1879
+ ? Promise.resolve(globalClient)
1880
+ : importedClient
1881
+ ]);
1882
+ const { gql, ApolloError } = modules;
1883
+ const GET_ALL_ASSET = gql `
1884
+ query getAllAsset {
1885
+ assets {
1886
+ ${selectionSet}
1675
1887
  }
1676
- else {
1677
- console.error('Error in getAsset:', error);
1888
+ }`;
1889
+ const response = await client.query({
1890
+ query: GET_ALL_ASSET,
1891
+ fetchPolicy: 'network-only', // Force network request to avoid stale cache
1892
+ });
1893
+ if (response.errors && response.errors.length > 0)
1894
+ throw new Error(response.errors[0].message);
1895
+ return response.data?.assets ?? null;
1896
+ }
1897
+ catch (error) {
1898
+ lastError = error;
1899
+ // Check if this is a "No record found" error - this is an expected condition, not a failure
1900
+ if (error.message === 'No Asset found') {
1901
+ return null;
1902
+ }
1903
+ // Check if this is a database connection error that we should retry
1904
+ const isConnectionError = error.message?.includes('Server has closed the connection') ||
1905
+ error.message?.includes('Cannot reach database server') ||
1906
+ error.message?.includes('Connection timed out') ||
1907
+ error.message?.includes('Accelerate') || // Prisma Accelerate proxy errors
1908
+ (error.networkError && error.networkError.message?.includes('Failed to fetch'));
1909
+ if (isConnectionError && retryCount < MAX_RETRIES - 1) {
1910
+ retryCount++;
1911
+ const delay = Math.pow(2, retryCount) * 100; // Exponential backoff: 200ms, 400ms, 800ms
1912
+ console.warn("Database connection error, retrying...");
1913
+ await new Promise(resolve => setTimeout(resolve, delay));
1914
+ continue;
1915
+ }
1916
+ // Log the error and rethrow
1917
+ console.error("Database error occurred:", error);
1678
1918
  throw error;
1679
1919
  }
1680
1920
  }
1921
+ // If we exhausted retries, throw the last error
1922
+ throw lastError;
1681
1923
  },
1682
1924
  /**
1683
1925
  * Find multiple Asset records based on conditions.
1926
+ * Enhanced with connection resilience against Prisma connection errors.
1684
1927
  * @param props - Conditions to find records.
1685
1928
  * @param globalClient - Apollo Client instance.
1929
+ * @param whereInput - Optional custom where input.
1686
1930
  * @returns An array of found Asset records or null.
1687
1931
  */
1688
1932
  async findMany(props, globalClient, whereInput) {
1689
- const [modules, client] = await Promise.all([
1690
- getApolloModules(),
1691
- globalClient
1692
- ? Promise.resolve(globalClient)
1693
- : importedClient
1694
- ]);
1695
- const { gql, ApolloError } = modules;
1696
- const FIND_MANY_ASSET = gql `
1697
- query findManyAsset($where: AssetWhereInput!) {
1698
- assets(where: $where) {
1699
- ${selectionSet}
1700
- }
1701
- }`;
1702
- const variables = {
1703
- where: whereInput ? whereInput : {
1704
- id: props.id !== undefined ? {
1705
- equals: props.id
1706
- } : undefined,
1707
- symbol: props.symbol !== undefined ? {
1708
- equals: props.symbol
1709
- } : undefined,
1710
- name: props.name !== undefined ? {
1711
- equals: props.name
1712
- } : undefined,
1713
- },
1714
- };
1715
- const filteredVariables = removeUndefinedProps(variables);
1716
- try {
1717
- const response = await client.query({ query: FIND_MANY_ASSET, variables: filteredVariables });
1718
- if (response.errors && response.errors.length > 0)
1719
- throw new Error(response.errors[0].message);
1720
- if (response && response.data && response.data.assets) {
1721
- return response.data.assets;
1933
+ // Maximum number of retries for database connection issues
1934
+ const MAX_RETRIES = 3;
1935
+ let retryCount = 0;
1936
+ let lastError = null;
1937
+ // Retry loop to handle potential database connection issues
1938
+ while (retryCount < MAX_RETRIES) {
1939
+ try {
1940
+ const [modules, client] = await Promise.all([
1941
+ getApolloModules(),
1942
+ globalClient
1943
+ ? Promise.resolve(globalClient)
1944
+ : importedClient
1945
+ ]);
1946
+ const { gql, ApolloError } = modules;
1947
+ const FIND_MANY_ASSET = gql `
1948
+ query findManyAsset($where: AssetWhereInput!) {
1949
+ assets(where: $where) {
1950
+ ${selectionSet}
1722
1951
  }
1723
- else {
1724
- return [];
1725
- }
1726
- }
1727
- catch (error) {
1728
- if (error instanceof ApolloError && error.message === 'No Asset found') {
1729
- return null;
1952
+ }`;
1953
+ const variables = {
1954
+ where: whereInput ? whereInput : {
1955
+ id: props.id !== undefined ? {
1956
+ equals: props.id
1957
+ } : undefined,
1958
+ symbol: props.symbol !== undefined ? {
1959
+ equals: props.symbol
1960
+ } : undefined,
1961
+ name: props.name !== undefined ? {
1962
+ equals: props.name
1963
+ } : undefined,
1964
+ },
1965
+ };
1966
+ const filteredVariables = removeUndefinedProps(variables);
1967
+ const response = await client.query({
1968
+ query: FIND_MANY_ASSET,
1969
+ variables: filteredVariables,
1970
+ fetchPolicy: 'network-only', // Force network request to avoid stale cache
1971
+ });
1972
+ if (response.errors && response.errors.length > 0)
1973
+ throw new Error(response.errors[0].message);
1974
+ if (response && response.data && response.data.assets) {
1975
+ return response.data.assets;
1976
+ }
1977
+ else {
1978
+ return [];
1979
+ }
1730
1980
  }
1731
- else {
1732
- console.error('Error in getAsset:', error);
1981
+ catch (error) {
1982
+ lastError = error;
1983
+ // Check if this is a "No record found" error - this is an expected condition, not a failure
1984
+ if (error.message === 'No Asset found') {
1985
+ return null;
1986
+ }
1987
+ // Check if this is a database connection error that we should retry
1988
+ const isConnectionError = error.message?.includes('Server has closed the connection') ||
1989
+ error.message?.includes('Cannot reach database server') ||
1990
+ error.message?.includes('Connection timed out') ||
1991
+ error.message?.includes('Accelerate') || // Prisma Accelerate proxy errors
1992
+ (error.networkError && error.networkError.message?.includes('Failed to fetch'));
1993
+ if (isConnectionError && retryCount < MAX_RETRIES - 1) {
1994
+ retryCount++;
1995
+ const delay = Math.pow(2, retryCount) * 100; // Exponential backoff: 200ms, 400ms, 800ms
1996
+ console.warn("Database connection error, retrying...");
1997
+ await new Promise(resolve => setTimeout(resolve, delay));
1998
+ continue;
1999
+ }
2000
+ // Log the error and rethrow
2001
+ console.error("Database error occurred:", error);
1733
2002
  throw error;
1734
2003
  }
1735
2004
  }
2005
+ // If we exhausted retries, throw the last error
2006
+ throw lastError;
1736
2007
  }
1737
2008
  };
1738
2009
  //# sourceMappingURL=Asset.js.map