adaptic-backend 1.0.340 → 1.0.342

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 (122) hide show
  1. package/Account.cjs +2670 -2264
  2. package/Account.d.ts +19 -2
  3. package/Action.cjs +1195 -839
  4. package/Action.d.ts +19 -2
  5. package/Alert.cjs +2651 -2347
  6. package/Alert.d.ts +19 -2
  7. package/Allocation.cjs +2631 -2304
  8. package/Allocation.d.ts +19 -2
  9. package/AlpacaAccount.cjs +2654 -2104
  10. package/AlpacaAccount.d.ts +19 -2
  11. package/Asset.cjs +2611 -1544
  12. package/Asset.d.ts +19 -2
  13. package/Authenticator.cjs +2603 -2290
  14. package/Authenticator.d.ts +19 -2
  15. package/Customer.cjs +2506 -2220
  16. package/Customer.d.ts +19 -2
  17. package/EconomicEvent.cjs +708 -367
  18. package/EconomicEvent.d.ts +19 -2
  19. package/MarketSentiment.cjs +691 -340
  20. package/MarketSentiment.d.ts +19 -2
  21. package/NewsArticle.cjs +2114 -1655
  22. package/NewsArticle.d.ts +19 -2
  23. package/NewsArticleAssetSentiment.cjs +1873 -1564
  24. package/NewsArticleAssetSentiment.d.ts +19 -2
  25. package/ScheduledOptionOrder.cjs +607 -316
  26. package/ScheduledOptionOrder.d.ts +19 -2
  27. package/Session.cjs +2592 -2294
  28. package/Session.d.ts +19 -2
  29. package/Trade.cjs +1261 -795
  30. package/Trade.d.ts +19 -2
  31. package/User.cjs +2432 -2013
  32. package/User.d.ts +19 -2
  33. package/VerificationToken.cjs +637 -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 +2661 -2262
  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 +1186 -837
  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 +2642 -2345
  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 +2622 -2302
  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 +2645 -2102
  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 +2602 -1542
  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 +2594 -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 +2497 -2218
  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 +699 -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 +682 -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 +2105 -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 +1864 -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 +598 -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 +2583 -2292
  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 +1252 -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 +2423 -2011
  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 +628 -326
  103. package/esm/generated/typegraphql-prisma/enhance.js.map +1 -1
  104. package/esm/generated/typegraphql-prisma/enhance.mjs +1 -1
  105. package/esm/generated/typegraphql-prisma/resolvers/inputs/AccountWhereUniqueInput.d.ts +1 -1
  106. package/esm/generated/typegraphql-prisma/resolvers/inputs/AccountWhereUniqueInput.d.ts.map +1 -1
  107. package/esm/generated/typegraphql-prisma/resolvers/inputs/AccountWhereUniqueInput.js.map +1 -1
  108. package/esm/generated/typegraphql-prisma/resolvers/inputs/AccountWhereUniqueInput.mjs +7 -7
  109. package/esm/prismaClient.d.ts +4 -5
  110. package/esm/prismaClient.d.ts.map +1 -1
  111. package/esm/prismaClient.js.map +1 -1
  112. package/esm/prismaClient.mjs +13 -11
  113. package/generated/typegraphql-prisma/enhance.cjs +1 -1
  114. package/generated/typegraphql-prisma/enhance.js.map +1 -1
  115. package/generated/typegraphql-prisma/resolvers/inputs/AccountWhereUniqueInput.cjs +6 -6
  116. package/generated/typegraphql-prisma/resolvers/inputs/AccountWhereUniqueInput.d.ts +1 -1
  117. package/generated/typegraphql-prisma/resolvers/inputs/AccountWhereUniqueInput.d.ts.map +1 -1
  118. package/generated/typegraphql-prisma/resolvers/inputs/AccountWhereUniqueInput.js.map +1 -1
  119. package/package.json +1 -1
  120. package/prismaClient.cjs +13 -11
  121. package/prismaClient.d.ts +4 -5
  122. package/server.cjs +37 -5
package/esm/Asset.mjs CHANGED
@@ -72,110 +72,777 @@ 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
+ type: props.type !== undefined ? {
419
+ equals: props.type
420
+ } : undefined,
421
+ logoUrl: props.logoUrl !== undefined ? {
422
+ equals: props.logoUrl
423
+ } : undefined,
424
+ description: props.description !== undefined ? {
425
+ equals: props.description
426
+ } : undefined,
427
+ cik: props.cik !== undefined ? {
428
+ equals: props.cik
429
+ } : undefined,
430
+ exchange: props.exchange !== undefined ? {
431
+ equals: props.exchange
432
+ } : undefined,
433
+ currency: props.currency !== undefined ? {
434
+ equals: props.currency
435
+ } : undefined,
436
+ country: props.country !== undefined ? {
437
+ equals: props.country
438
+ } : undefined,
439
+ sector: props.sector !== undefined ? {
440
+ equals: props.sector
441
+ } : undefined,
442
+ industry: props.industry !== undefined ? {
443
+ equals: props.industry
444
+ } : undefined,
445
+ address: props.address !== undefined ? {
446
+ equals: props.address
447
+ } : undefined,
448
+ officialSite: props.officialSite !== undefined ? {
449
+ equals: props.officialSite
450
+ } : undefined,
451
+ fiscalYearEnd: props.fiscalYearEnd !== undefined ? {
452
+ equals: props.fiscalYearEnd
453
+ } : undefined,
454
+ latestQuarter: props.latestQuarter !== undefined ? {
455
+ equals: props.latestQuarter
456
+ } : undefined,
457
+ marketCapitalization: props.marketCapitalization !== undefined ? {
458
+ equals: props.marketCapitalization
459
+ } : undefined,
460
+ ebitda: props.ebitda !== undefined ? {
461
+ equals: props.ebitda
462
+ } : undefined,
463
+ peRatio: props.peRatio !== undefined ? {
464
+ equals: props.peRatio
465
+ } : undefined,
466
+ pegRatio: props.pegRatio !== undefined ? {
467
+ equals: props.pegRatio
468
+ } : undefined,
469
+ bookValue: props.bookValue !== undefined ? {
470
+ equals: props.bookValue
471
+ } : undefined,
472
+ dividendPerShare: props.dividendPerShare !== undefined ? {
473
+ equals: props.dividendPerShare
474
+ } : undefined,
475
+ dividendYield: props.dividendYield !== undefined ? {
476
+ equals: props.dividendYield
477
+ } : undefined,
478
+ eps: props.eps !== undefined ? {
479
+ equals: props.eps
480
+ } : undefined,
481
+ revenuePerShareTTM: props.revenuePerShareTTM !== undefined ? {
482
+ equals: props.revenuePerShareTTM
483
+ } : undefined,
484
+ profitMargin: props.profitMargin !== undefined ? {
485
+ equals: props.profitMargin
486
+ } : undefined,
487
+ operatingMarginTTM: props.operatingMarginTTM !== undefined ? {
488
+ equals: props.operatingMarginTTM
489
+ } : undefined,
490
+ returnOnAssetsTTM: props.returnOnAssetsTTM !== undefined ? {
491
+ equals: props.returnOnAssetsTTM
492
+ } : undefined,
493
+ returnOnEquityTTM: props.returnOnEquityTTM !== undefined ? {
494
+ equals: props.returnOnEquityTTM
495
+ } : undefined,
496
+ revenueTTM: props.revenueTTM !== undefined ? {
497
+ equals: props.revenueTTM
498
+ } : undefined,
499
+ grossProfitTTM: props.grossProfitTTM !== undefined ? {
500
+ equals: props.grossProfitTTM
501
+ } : undefined,
502
+ dilutedEPSTTM: props.dilutedEPSTTM !== undefined ? {
503
+ equals: props.dilutedEPSTTM
504
+ } : undefined,
505
+ quarterlyEarningsGrowthYOY: props.quarterlyEarningsGrowthYOY !== undefined ? {
506
+ equals: props.quarterlyEarningsGrowthYOY
507
+ } : undefined,
508
+ quarterlyRevenueGrowthYOY: props.quarterlyRevenueGrowthYOY !== undefined ? {
509
+ equals: props.quarterlyRevenueGrowthYOY
510
+ } : undefined,
511
+ analystTargetPrice: props.analystTargetPrice !== undefined ? {
512
+ equals: props.analystTargetPrice
513
+ } : undefined,
514
+ analystRatingStrongBuy: props.analystRatingStrongBuy !== undefined ? {
515
+ equals: props.analystRatingStrongBuy
516
+ } : undefined,
517
+ analystRatingBuy: props.analystRatingBuy !== undefined ? {
518
+ equals: props.analystRatingBuy
519
+ } : undefined,
520
+ analystRatingHold: props.analystRatingHold !== undefined ? {
521
+ equals: props.analystRatingHold
522
+ } : undefined,
523
+ analystRatingSell: props.analystRatingSell !== undefined ? {
524
+ equals: props.analystRatingSell
525
+ } : undefined,
526
+ analystRatingStrongSell: props.analystRatingStrongSell !== undefined ? {
527
+ equals: props.analystRatingStrongSell
528
+ } : undefined,
529
+ trailingPE: props.trailingPE !== undefined ? {
530
+ equals: props.trailingPE
531
+ } : undefined,
532
+ forwardPE: props.forwardPE !== undefined ? {
533
+ equals: props.forwardPE
534
+ } : undefined,
535
+ priceToSalesRatioTTM: props.priceToSalesRatioTTM !== undefined ? {
536
+ equals: props.priceToSalesRatioTTM
537
+ } : undefined,
538
+ priceToBookRatio: props.priceToBookRatio !== undefined ? {
539
+ equals: props.priceToBookRatio
540
+ } : undefined,
541
+ evToRevenue: props.evToRevenue !== undefined ? {
542
+ equals: props.evToRevenue
543
+ } : undefined,
544
+ evToEbitda: props.evToEbitda !== undefined ? {
545
+ equals: props.evToEbitda
546
+ } : undefined,
547
+ beta: props.beta !== undefined ? {
548
+ equals: props.beta
549
+ } : undefined,
550
+ week52High: props.week52High !== undefined ? {
551
+ equals: props.week52High
552
+ } : undefined,
553
+ week52Low: props.week52Low !== undefined ? {
554
+ equals: props.week52Low
555
+ } : undefined,
556
+ day50MovingAverage: props.day50MovingAverage !== undefined ? {
557
+ equals: props.day50MovingAverage
558
+ } : undefined,
559
+ day200MovingAverage: props.day200MovingAverage !== undefined ? {
560
+ equals: props.day200MovingAverage
561
+ } : undefined,
562
+ sharesOutstanding: props.sharesOutstanding !== undefined ? {
563
+ equals: props.sharesOutstanding
564
+ } : undefined,
565
+ dividendDate: props.dividendDate !== undefined ? {
566
+ equals: props.dividendDate
567
+ } : undefined,
568
+ exDividendDate: props.exDividendDate !== undefined ? {
569
+ equals: props.exDividendDate
570
+ } : undefined,
571
+ createdAt: props.createdAt !== undefined ? {
572
+ equals: props.createdAt
573
+ } : undefined,
574
+ updatedAt: props.updatedAt !== undefined ? {
575
+ equals: props.updatedAt
576
+ } : undefined,
577
+ },
578
+ data: {
579
+ id: props.id !== undefined ? {
580
+ set: props.id
581
+ } : undefined,
582
+ symbol: props.symbol !== undefined ? {
583
+ set: props.symbol
584
+ } : undefined,
585
+ name: props.name !== undefined ? {
586
+ set: props.name
587
+ } : undefined,
588
+ type: props.type !== undefined ? {
589
+ set: props.type
590
+ } : undefined,
591
+ logoUrl: props.logoUrl !== undefined ? {
592
+ set: props.logoUrl
593
+ } : undefined,
594
+ description: props.description !== undefined ? {
595
+ set: props.description
596
+ } : undefined,
597
+ cik: props.cik !== undefined ? {
598
+ set: props.cik
599
+ } : undefined,
600
+ exchange: props.exchange !== undefined ? {
601
+ set: props.exchange
602
+ } : undefined,
603
+ currency: props.currency !== undefined ? {
604
+ set: props.currency
605
+ } : undefined,
606
+ country: props.country !== undefined ? {
607
+ set: props.country
608
+ } : undefined,
609
+ sector: props.sector !== undefined ? {
610
+ set: props.sector
611
+ } : undefined,
612
+ industry: props.industry !== undefined ? {
613
+ set: props.industry
614
+ } : undefined,
615
+ address: props.address !== undefined ? {
616
+ set: props.address
617
+ } : undefined,
618
+ officialSite: props.officialSite !== undefined ? {
619
+ set: props.officialSite
620
+ } : undefined,
621
+ fiscalYearEnd: props.fiscalYearEnd !== undefined ? {
622
+ set: props.fiscalYearEnd
623
+ } : undefined,
624
+ latestQuarter: props.latestQuarter !== undefined ? {
625
+ set: props.latestQuarter
626
+ } : undefined,
627
+ marketCapitalization: props.marketCapitalization !== undefined ? {
628
+ set: props.marketCapitalization
629
+ } : undefined,
630
+ ebitda: props.ebitda !== undefined ? {
631
+ set: props.ebitda
632
+ } : undefined,
633
+ peRatio: props.peRatio !== undefined ? {
634
+ set: props.peRatio
635
+ } : undefined,
636
+ pegRatio: props.pegRatio !== undefined ? {
637
+ set: props.pegRatio
638
+ } : undefined,
639
+ bookValue: props.bookValue !== undefined ? {
640
+ set: props.bookValue
641
+ } : undefined,
642
+ dividendPerShare: props.dividendPerShare !== undefined ? {
643
+ set: props.dividendPerShare
644
+ } : undefined,
645
+ dividendYield: props.dividendYield !== undefined ? {
646
+ set: props.dividendYield
647
+ } : undefined,
648
+ eps: props.eps !== undefined ? {
649
+ set: props.eps
650
+ } : undefined,
651
+ revenuePerShareTTM: props.revenuePerShareTTM !== undefined ? {
652
+ set: props.revenuePerShareTTM
653
+ } : undefined,
654
+ profitMargin: props.profitMargin !== undefined ? {
655
+ set: props.profitMargin
656
+ } : undefined,
657
+ operatingMarginTTM: props.operatingMarginTTM !== undefined ? {
658
+ set: props.operatingMarginTTM
659
+ } : undefined,
660
+ returnOnAssetsTTM: props.returnOnAssetsTTM !== undefined ? {
661
+ set: props.returnOnAssetsTTM
662
+ } : undefined,
663
+ returnOnEquityTTM: props.returnOnEquityTTM !== undefined ? {
664
+ set: props.returnOnEquityTTM
665
+ } : undefined,
666
+ revenueTTM: props.revenueTTM !== undefined ? {
667
+ set: props.revenueTTM
668
+ } : undefined,
669
+ grossProfitTTM: props.grossProfitTTM !== undefined ? {
670
+ set: props.grossProfitTTM
671
+ } : undefined,
672
+ dilutedEPSTTM: props.dilutedEPSTTM !== undefined ? {
673
+ set: props.dilutedEPSTTM
674
+ } : undefined,
675
+ quarterlyEarningsGrowthYOY: props.quarterlyEarningsGrowthYOY !== undefined ? {
676
+ set: props.quarterlyEarningsGrowthYOY
677
+ } : undefined,
678
+ quarterlyRevenueGrowthYOY: props.quarterlyRevenueGrowthYOY !== undefined ? {
679
+ set: props.quarterlyRevenueGrowthYOY
680
+ } : undefined,
681
+ analystTargetPrice: props.analystTargetPrice !== undefined ? {
682
+ set: props.analystTargetPrice
683
+ } : undefined,
684
+ analystRatingStrongBuy: props.analystRatingStrongBuy !== undefined ? {
685
+ set: props.analystRatingStrongBuy
686
+ } : undefined,
687
+ analystRatingBuy: props.analystRatingBuy !== undefined ? {
688
+ set: props.analystRatingBuy
689
+ } : undefined,
690
+ analystRatingHold: props.analystRatingHold !== undefined ? {
691
+ set: props.analystRatingHold
692
+ } : undefined,
693
+ analystRatingSell: props.analystRatingSell !== undefined ? {
694
+ set: props.analystRatingSell
695
+ } : undefined,
696
+ analystRatingStrongSell: props.analystRatingStrongSell !== undefined ? {
697
+ set: props.analystRatingStrongSell
698
+ } : undefined,
699
+ trailingPE: props.trailingPE !== undefined ? {
700
+ set: props.trailingPE
701
+ } : undefined,
702
+ forwardPE: props.forwardPE !== undefined ? {
703
+ set: props.forwardPE
704
+ } : undefined,
705
+ priceToSalesRatioTTM: props.priceToSalesRatioTTM !== undefined ? {
706
+ set: props.priceToSalesRatioTTM
707
+ } : undefined,
708
+ priceToBookRatio: props.priceToBookRatio !== undefined ? {
709
+ set: props.priceToBookRatio
710
+ } : undefined,
711
+ evToRevenue: props.evToRevenue !== undefined ? {
712
+ set: props.evToRevenue
713
+ } : undefined,
714
+ evToEbitda: props.evToEbitda !== undefined ? {
715
+ set: props.evToEbitda
716
+ } : undefined,
717
+ beta: props.beta !== undefined ? {
718
+ set: props.beta
719
+ } : undefined,
720
+ week52High: props.week52High !== undefined ? {
721
+ set: props.week52High
722
+ } : undefined,
723
+ week52Low: props.week52Low !== undefined ? {
724
+ set: props.week52Low
725
+ } : undefined,
726
+ day50MovingAverage: props.day50MovingAverage !== undefined ? {
727
+ set: props.day50MovingAverage
728
+ } : undefined,
729
+ day200MovingAverage: props.day200MovingAverage !== undefined ? {
730
+ set: props.day200MovingAverage
731
+ } : undefined,
732
+ sharesOutstanding: props.sharesOutstanding !== undefined ? {
733
+ set: props.sharesOutstanding
734
+ } : undefined,
735
+ dividendDate: props.dividendDate !== undefined ? {
736
+ set: props.dividendDate
737
+ } : undefined,
738
+ exDividendDate: props.exDividendDate !== undefined ? {
739
+ set: props.exDividendDate
740
+ } : undefined,
741
+ askPrice: props.askPrice !== undefined ? {
742
+ set: props.askPrice
743
+ } : undefined,
744
+ bidPrice: props.bidPrice !== undefined ? {
745
+ set: props.bidPrice
746
+ } : undefined,
747
+ createdAt: props.createdAt !== undefined ? {
748
+ set: props.createdAt
749
+ } : undefined,
750
+ updatedAt: props.updatedAt !== undefined ? {
751
+ set: props.updatedAt
752
+ } : undefined,
753
+ newsMentions: props.newsMentions ?
754
+ 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) ? {
755
+ connect: props.newsMentions.map((item) => ({
756
+ id: item.id
757
+ }))
758
+ } : { upsert: props.newsMentions.map((item) => ({
759
+ where: {
760
+ id: item.id !== undefined ? item.id : undefined,
761
+ url: item.url !== undefined ? item.url : undefined,
762
+ assetId: item.assetId !== undefined ? {
763
+ equals: item.assetId
764
+ } : undefined,
765
+ newsArticleId: item.newsArticleId !== undefined ? {
766
+ equals: item.newsArticleId
767
+ } : undefined,
768
+ },
769
+ update: {
770
+ id: item.id !== undefined ? {
771
+ set: item.id
772
+ } : undefined,
773
+ url: item.url !== undefined ? {
774
+ set: item.url
775
+ } : undefined,
776
+ relevancyScore: item.relevancyScore !== undefined ? {
777
+ set: item.relevancyScore
778
+ } : undefined,
779
+ sentimentScore: item.sentimentScore !== undefined ? {
780
+ set: item.sentimentScore
781
+ } : undefined,
782
+ sentimentLabel: item.sentimentLabel !== undefined ? {
783
+ set: item.sentimentLabel
784
+ } : undefined,
785
+ news: item.news ?
786
+ typeof item.news === 'object' && Object.keys(item.news).length === 1 && (Object.keys(item.news)[0] === 'id' || Object.keys(item.news)[0] === 'symbol')
787
+ ? {
788
+ connect: {
789
+ id: item.news.id
790
+ }
791
+ } : { upsert: {
173
792
  where: {
174
- id: item.news.id !== undefined ? item.news.id : undefined,
175
- url: item.news.url !== undefined ? item.news.url : undefined,
793
+ id: item.news.id !== undefined ? {
794
+ equals: item.news.id
795
+ } : undefined,
176
796
  title: item.news.title !== undefined ? {
177
797
  equals: item.news.title
178
798
  } : undefined,
799
+ url: item.news.url !== undefined ? {
800
+ equals: item.news.url
801
+ } : undefined,
802
+ },
803
+ update: {
804
+ id: item.news.id !== undefined ? {
805
+ set: item.news.id
806
+ } : undefined,
807
+ title: item.news.title !== undefined ? {
808
+ set: item.news.title
809
+ } : undefined,
810
+ content: item.news.content !== undefined ? {
811
+ set: item.news.content
812
+ } : undefined,
813
+ source: item.news.source !== undefined ? {
814
+ set: item.news.source
815
+ } : undefined,
816
+ sourceDomain: item.news.sourceDomain !== undefined ? {
817
+ set: item.news.sourceDomain
818
+ } : undefined,
819
+ url: item.news.url !== undefined ? {
820
+ set: item.news.url
821
+ } : undefined,
822
+ sentiment: item.news.sentiment !== undefined ? {
823
+ set: item.news.sentiment
824
+ } : undefined,
825
+ authors: item.news.authors !== undefined ? {
826
+ set: item.news.authors
827
+ } : undefined,
828
+ summary: item.news.summary !== undefined ? {
829
+ set: item.news.summary
830
+ } : undefined,
831
+ bannerImage: item.news.bannerImage !== undefined ? {
832
+ set: item.news.bannerImage
833
+ } : undefined,
834
+ timePublished: item.news.timePublished !== undefined ? {
835
+ set: item.news.timePublished
836
+ } : undefined,
837
+ category: item.news.category !== undefined ? {
838
+ set: item.news.category
839
+ } : undefined,
840
+ topics: item.news.topics !== undefined ? {
841
+ set: item.news.topics
842
+ } : undefined,
843
+ logo: item.news.logo !== undefined ? {
844
+ set: item.news.logo
845
+ } : undefined,
179
846
  },
180
847
  create: {
181
848
  title: item.news.title !== undefined ? item.news.title : undefined,
@@ -198,617 +865,1225 @@ export const Asset = {
198
865
  },
199
866
  }
200
867
  } : 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;
868
+ },
869
+ create: {
870
+ url: item.url !== undefined ? item.url : undefined,
871
+ relevancyScore: item.relevancyScore !== undefined ? item.relevancyScore : undefined,
872
+ sentimentScore: item.sentimentScore !== undefined ? item.sentimentScore : undefined,
873
+ sentimentLabel: item.sentimentLabel !== undefined ? item.sentimentLabel : undefined,
874
+ news: item.news ?
875
+ typeof item.news === 'object' && Object.keys(item.news).length === 1 && Object.keys(item.news)[0] === 'id'
876
+ ? { connect: {
877
+ id: item.news.id
878
+ }
879
+ }
880
+ : { connectOrCreate: {
881
+ where: {
882
+ id: item.news.id !== undefined ? item.news.id : undefined,
883
+ url: item.news.url !== undefined ? item.news.url : undefined,
884
+ title: item.news.title !== undefined ? {
885
+ equals: item.news.title
886
+ } : undefined,
887
+ },
888
+ create: {
889
+ title: item.news.title !== undefined ? item.news.title : undefined,
890
+ content: item.news.content !== undefined ? item.news.content : undefined,
891
+ source: item.news.source !== undefined ? item.news.source : undefined,
892
+ sourceDomain: item.news.sourceDomain !== undefined ? item.news.sourceDomain : undefined,
893
+ url: item.news.url !== undefined ? item.news.url : undefined,
894
+ sentiment: item.news.sentiment !== undefined ? item.news.sentiment : undefined,
895
+ authors: item.news.authors !== undefined ? {
896
+ set: item.news.authors
897
+ } : undefined,
898
+ summary: item.news.summary !== undefined ? item.news.summary : undefined,
899
+ bannerImage: item.news.bannerImage !== undefined ? item.news.bannerImage : undefined,
900
+ timePublished: item.news.timePublished !== undefined ? item.news.timePublished : undefined,
901
+ category: item.news.category !== undefined ? item.news.category : undefined,
902
+ topics: item.news.topics !== undefined ? {
903
+ set: item.news.topics
904
+ } : undefined,
905
+ logo: item.news.logo !== undefined ? item.news.logo : undefined,
906
+ },
907
+ }
908
+ } : undefined,
909
+ },
910
+ }))
911
+ } : undefined,
912
+ },
913
+ };
914
+ const filteredVariables = removeUndefinedProps(variables);
915
+ const response = await client.mutate({
916
+ mutation: UPDATE_ONE_ASSET,
917
+ variables: filteredVariables,
918
+ // Don't cache mutations, but ensure we're using the freshest context
919
+ fetchPolicy: 'no-cache'
920
+ });
921
+ if (response.errors && response.errors.length > 0)
922
+ throw new Error(response.errors[0].message);
923
+ if (response && response.data && response.data.updateOneAsset) {
924
+ return response.data.updateOneAsset;
925
+ }
926
+ else {
927
+ return null;
928
+ }
213
929
  }
214
- else {
215
- return null;
930
+ catch (error) {
931
+ lastError = error;
932
+ // Check if this is a database connection error that we should retry
933
+ const isConnectionError = error.message?.includes('Server has closed the connection') ||
934
+ error.message?.includes('Cannot reach database server') ||
935
+ error.message?.includes('Connection timed out') ||
936
+ error.message?.includes('Accelerate') || // Prisma Accelerate proxy errors
937
+ (error.networkError && error.networkError.message?.includes('Failed to fetch'));
938
+ if (isConnectionError && retryCount < MAX_RETRIES - 1) {
939
+ retryCount++;
940
+ const delay = Math.pow(2, retryCount) * 100; // Exponential backoff: 200ms, 400ms, 800ms
941
+ console.warn("Database connection error, retrying...");
942
+ await new Promise(resolve => setTimeout(resolve, delay));
943
+ continue;
944
+ }
945
+ // Log the error and rethrow
946
+ console.error("Database error occurred:", error);
947
+ throw error;
216
948
  }
217
949
  }
218
- catch (error) {
219
- console.error('Error in createOneAsset:', error);
220
- throw error;
221
- }
950
+ // If we exhausted retries, throw the last error
951
+ throw lastError;
222
952
  },
223
953
  /**
224
- * Create multiple Asset records.
225
- * @param props - Array of Asset objects for the new records.
954
+ * Upsert a single Asset record.
955
+ * Enhanced with connection resilience against Prisma connection errors.
956
+ * @param props - Properties to update.
226
957
  * @param globalClient - Apollo Client instance.
227
- * @returns The count of created records or null.
958
+ * @returns The updated Asset or null.
228
959
  */
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;
960
+ async upsert(props, globalClient) {
961
+ // Maximum number of retries for database connection issues
962
+ const MAX_RETRIES = 3;
963
+ let retryCount = 0;
964
+ let lastError = null;
965
+ // Retry loop to handle potential database connection issues
966
+ while (retryCount < MAX_RETRIES) {
967
+ try {
968
+ const [modules, client] = await Promise.all([
969
+ getApolloModules(),
970
+ globalClient
971
+ ? Promise.resolve(globalClient)
972
+ : importedClient
973
+ ]);
974
+ const { gql, ApolloError } = modules;
975
+ const UPSERT_ONE_ASSET = gql `
976
+ mutation upsertOneAsset($where: AssetWhereUniqueInput!, $create: AssetCreateInput!, $update: AssetUpdateInput!) {
977
+ upsertOneAsset(where: $where, create: $create, update: $update) {
978
+ ${selectionSet}
309
979
  }
310
- else {
311
- return null;
980
+ }`;
981
+ const variables = {
982
+ where: {
983
+ id: props.id !== undefined ? props.id : undefined,
984
+ symbol: props.symbol !== undefined ? props.symbol : undefined,
985
+ name: props.name !== undefined ? props.name : undefined,
986
+ type: props.type !== undefined ? {
987
+ equals: props.type
988
+ } : undefined,
989
+ logoUrl: props.logoUrl !== undefined ? {
990
+ equals: props.logoUrl
991
+ } : undefined,
992
+ description: props.description !== undefined ? {
993
+ equals: props.description
994
+ } : undefined,
995
+ cik: props.cik !== undefined ? {
996
+ equals: props.cik
997
+ } : undefined,
998
+ exchange: props.exchange !== undefined ? {
999
+ equals: props.exchange
1000
+ } : undefined,
1001
+ currency: props.currency !== undefined ? {
1002
+ equals: props.currency
1003
+ } : undefined,
1004
+ country: props.country !== undefined ? {
1005
+ equals: props.country
1006
+ } : undefined,
1007
+ sector: props.sector !== undefined ? {
1008
+ equals: props.sector
1009
+ } : undefined,
1010
+ industry: props.industry !== undefined ? {
1011
+ equals: props.industry
1012
+ } : undefined,
1013
+ address: props.address !== undefined ? {
1014
+ equals: props.address
1015
+ } : undefined,
1016
+ officialSite: props.officialSite !== undefined ? {
1017
+ equals: props.officialSite
1018
+ } : undefined,
1019
+ fiscalYearEnd: props.fiscalYearEnd !== undefined ? {
1020
+ equals: props.fiscalYearEnd
1021
+ } : undefined,
1022
+ latestQuarter: props.latestQuarter !== undefined ? {
1023
+ equals: props.latestQuarter
1024
+ } : undefined,
1025
+ marketCapitalization: props.marketCapitalization !== undefined ? {
1026
+ equals: props.marketCapitalization
1027
+ } : undefined,
1028
+ ebitda: props.ebitda !== undefined ? {
1029
+ equals: props.ebitda
1030
+ } : undefined,
1031
+ peRatio: props.peRatio !== undefined ? {
1032
+ equals: props.peRatio
1033
+ } : undefined,
1034
+ pegRatio: props.pegRatio !== undefined ? {
1035
+ equals: props.pegRatio
1036
+ } : undefined,
1037
+ bookValue: props.bookValue !== undefined ? {
1038
+ equals: props.bookValue
1039
+ } : undefined,
1040
+ dividendPerShare: props.dividendPerShare !== undefined ? {
1041
+ equals: props.dividendPerShare
1042
+ } : undefined,
1043
+ dividendYield: props.dividendYield !== undefined ? {
1044
+ equals: props.dividendYield
1045
+ } : undefined,
1046
+ eps: props.eps !== undefined ? {
1047
+ equals: props.eps
1048
+ } : undefined,
1049
+ revenuePerShareTTM: props.revenuePerShareTTM !== undefined ? {
1050
+ equals: props.revenuePerShareTTM
1051
+ } : undefined,
1052
+ profitMargin: props.profitMargin !== undefined ? {
1053
+ equals: props.profitMargin
1054
+ } : undefined,
1055
+ operatingMarginTTM: props.operatingMarginTTM !== undefined ? {
1056
+ equals: props.operatingMarginTTM
1057
+ } : undefined,
1058
+ returnOnAssetsTTM: props.returnOnAssetsTTM !== undefined ? {
1059
+ equals: props.returnOnAssetsTTM
1060
+ } : undefined,
1061
+ returnOnEquityTTM: props.returnOnEquityTTM !== undefined ? {
1062
+ equals: props.returnOnEquityTTM
1063
+ } : undefined,
1064
+ revenueTTM: props.revenueTTM !== undefined ? {
1065
+ equals: props.revenueTTM
1066
+ } : undefined,
1067
+ grossProfitTTM: props.grossProfitTTM !== undefined ? {
1068
+ equals: props.grossProfitTTM
1069
+ } : undefined,
1070
+ dilutedEPSTTM: props.dilutedEPSTTM !== undefined ? {
1071
+ equals: props.dilutedEPSTTM
1072
+ } : undefined,
1073
+ quarterlyEarningsGrowthYOY: props.quarterlyEarningsGrowthYOY !== undefined ? {
1074
+ equals: props.quarterlyEarningsGrowthYOY
1075
+ } : undefined,
1076
+ quarterlyRevenueGrowthYOY: props.quarterlyRevenueGrowthYOY !== undefined ? {
1077
+ equals: props.quarterlyRevenueGrowthYOY
1078
+ } : undefined,
1079
+ analystTargetPrice: props.analystTargetPrice !== undefined ? {
1080
+ equals: props.analystTargetPrice
1081
+ } : undefined,
1082
+ analystRatingStrongBuy: props.analystRatingStrongBuy !== undefined ? {
1083
+ equals: props.analystRatingStrongBuy
1084
+ } : undefined,
1085
+ analystRatingBuy: props.analystRatingBuy !== undefined ? {
1086
+ equals: props.analystRatingBuy
1087
+ } : undefined,
1088
+ analystRatingHold: props.analystRatingHold !== undefined ? {
1089
+ equals: props.analystRatingHold
1090
+ } : undefined,
1091
+ analystRatingSell: props.analystRatingSell !== undefined ? {
1092
+ equals: props.analystRatingSell
1093
+ } : undefined,
1094
+ analystRatingStrongSell: props.analystRatingStrongSell !== undefined ? {
1095
+ equals: props.analystRatingStrongSell
1096
+ } : undefined,
1097
+ trailingPE: props.trailingPE !== undefined ? {
1098
+ equals: props.trailingPE
1099
+ } : undefined,
1100
+ forwardPE: props.forwardPE !== undefined ? {
1101
+ equals: props.forwardPE
1102
+ } : undefined,
1103
+ priceToSalesRatioTTM: props.priceToSalesRatioTTM !== undefined ? {
1104
+ equals: props.priceToSalesRatioTTM
1105
+ } : undefined,
1106
+ priceToBookRatio: props.priceToBookRatio !== undefined ? {
1107
+ equals: props.priceToBookRatio
1108
+ } : undefined,
1109
+ evToRevenue: props.evToRevenue !== undefined ? {
1110
+ equals: props.evToRevenue
1111
+ } : undefined,
1112
+ evToEbitda: props.evToEbitda !== undefined ? {
1113
+ equals: props.evToEbitda
1114
+ } : undefined,
1115
+ beta: props.beta !== undefined ? {
1116
+ equals: props.beta
1117
+ } : undefined,
1118
+ week52High: props.week52High !== undefined ? {
1119
+ equals: props.week52High
1120
+ } : undefined,
1121
+ week52Low: props.week52Low !== undefined ? {
1122
+ equals: props.week52Low
1123
+ } : undefined,
1124
+ day50MovingAverage: props.day50MovingAverage !== undefined ? {
1125
+ equals: props.day50MovingAverage
1126
+ } : undefined,
1127
+ day200MovingAverage: props.day200MovingAverage !== undefined ? {
1128
+ equals: props.day200MovingAverage
1129
+ } : undefined,
1130
+ sharesOutstanding: props.sharesOutstanding !== undefined ? {
1131
+ equals: props.sharesOutstanding
1132
+ } : undefined,
1133
+ dividendDate: props.dividendDate !== undefined ? {
1134
+ equals: props.dividendDate
1135
+ } : undefined,
1136
+ exDividendDate: props.exDividendDate !== undefined ? {
1137
+ equals: props.exDividendDate
1138
+ } : undefined,
1139
+ createdAt: props.createdAt !== undefined ? {
1140
+ equals: props.createdAt
1141
+ } : undefined,
1142
+ updatedAt: props.updatedAt !== undefined ? {
1143
+ equals: props.updatedAt
1144
+ } : undefined,
1145
+ },
1146
+ create: {
1147
+ symbol: props.symbol !== undefined ? props.symbol : undefined,
1148
+ name: props.name !== undefined ? props.name : undefined,
1149
+ type: props.type !== undefined ? props.type : undefined,
1150
+ logoUrl: props.logoUrl !== undefined ? props.logoUrl : undefined,
1151
+ description: props.description !== undefined ? props.description : undefined,
1152
+ cik: props.cik !== undefined ? props.cik : undefined,
1153
+ exchange: props.exchange !== undefined ? props.exchange : undefined,
1154
+ currency: props.currency !== undefined ? props.currency : undefined,
1155
+ country: props.country !== undefined ? props.country : undefined,
1156
+ sector: props.sector !== undefined ? props.sector : undefined,
1157
+ industry: props.industry !== undefined ? props.industry : undefined,
1158
+ address: props.address !== undefined ? props.address : undefined,
1159
+ officialSite: props.officialSite !== undefined ? props.officialSite : undefined,
1160
+ fiscalYearEnd: props.fiscalYearEnd !== undefined ? props.fiscalYearEnd : undefined,
1161
+ latestQuarter: props.latestQuarter !== undefined ? props.latestQuarter : undefined,
1162
+ marketCapitalization: props.marketCapitalization !== undefined ? props.marketCapitalization : undefined,
1163
+ ebitda: props.ebitda !== undefined ? props.ebitda : undefined,
1164
+ peRatio: props.peRatio !== undefined ? props.peRatio : undefined,
1165
+ pegRatio: props.pegRatio !== undefined ? props.pegRatio : undefined,
1166
+ bookValue: props.bookValue !== undefined ? props.bookValue : undefined,
1167
+ dividendPerShare: props.dividendPerShare !== undefined ? props.dividendPerShare : undefined,
1168
+ dividendYield: props.dividendYield !== undefined ? props.dividendYield : undefined,
1169
+ eps: props.eps !== undefined ? props.eps : undefined,
1170
+ revenuePerShareTTM: props.revenuePerShareTTM !== undefined ? props.revenuePerShareTTM : undefined,
1171
+ profitMargin: props.profitMargin !== undefined ? props.profitMargin : undefined,
1172
+ operatingMarginTTM: props.operatingMarginTTM !== undefined ? props.operatingMarginTTM : undefined,
1173
+ returnOnAssetsTTM: props.returnOnAssetsTTM !== undefined ? props.returnOnAssetsTTM : undefined,
1174
+ returnOnEquityTTM: props.returnOnEquityTTM !== undefined ? props.returnOnEquityTTM : undefined,
1175
+ revenueTTM: props.revenueTTM !== undefined ? props.revenueTTM : undefined,
1176
+ grossProfitTTM: props.grossProfitTTM !== undefined ? props.grossProfitTTM : undefined,
1177
+ dilutedEPSTTM: props.dilutedEPSTTM !== undefined ? props.dilutedEPSTTM : undefined,
1178
+ quarterlyEarningsGrowthYOY: props.quarterlyEarningsGrowthYOY !== undefined ? props.quarterlyEarningsGrowthYOY : undefined,
1179
+ quarterlyRevenueGrowthYOY: props.quarterlyRevenueGrowthYOY !== undefined ? props.quarterlyRevenueGrowthYOY : undefined,
1180
+ analystTargetPrice: props.analystTargetPrice !== undefined ? props.analystTargetPrice : undefined,
1181
+ analystRatingStrongBuy: props.analystRatingStrongBuy !== undefined ? props.analystRatingStrongBuy : undefined,
1182
+ analystRatingBuy: props.analystRatingBuy !== undefined ? props.analystRatingBuy : undefined,
1183
+ analystRatingHold: props.analystRatingHold !== undefined ? props.analystRatingHold : undefined,
1184
+ analystRatingSell: props.analystRatingSell !== undefined ? props.analystRatingSell : undefined,
1185
+ analystRatingStrongSell: props.analystRatingStrongSell !== undefined ? props.analystRatingStrongSell : undefined,
1186
+ trailingPE: props.trailingPE !== undefined ? props.trailingPE : undefined,
1187
+ forwardPE: props.forwardPE !== undefined ? props.forwardPE : undefined,
1188
+ priceToSalesRatioTTM: props.priceToSalesRatioTTM !== undefined ? props.priceToSalesRatioTTM : undefined,
1189
+ priceToBookRatio: props.priceToBookRatio !== undefined ? props.priceToBookRatio : undefined,
1190
+ evToRevenue: props.evToRevenue !== undefined ? props.evToRevenue : undefined,
1191
+ evToEbitda: props.evToEbitda !== undefined ? props.evToEbitda : undefined,
1192
+ beta: props.beta !== undefined ? props.beta : undefined,
1193
+ week52High: props.week52High !== undefined ? props.week52High : undefined,
1194
+ week52Low: props.week52Low !== undefined ? props.week52Low : undefined,
1195
+ day50MovingAverage: props.day50MovingAverage !== undefined ? props.day50MovingAverage : undefined,
1196
+ day200MovingAverage: props.day200MovingAverage !== undefined ? props.day200MovingAverage : undefined,
1197
+ sharesOutstanding: props.sharesOutstanding !== undefined ? props.sharesOutstanding : undefined,
1198
+ dividendDate: props.dividendDate !== undefined ? props.dividendDate : undefined,
1199
+ exDividendDate: props.exDividendDate !== undefined ? props.exDividendDate : undefined,
1200
+ askPrice: props.askPrice !== undefined ? props.askPrice : undefined,
1201
+ bidPrice: props.bidPrice !== undefined ? props.bidPrice : undefined,
1202
+ newsMentions: props.newsMentions ?
1203
+ Array.isArray(props.newsMentions) && props.newsMentions.length > 0 && props.newsMentions.every((item) => typeof item === 'object' && 'id' in item && Object.keys(item).length === 1) ? {
1204
+ connect: props.newsMentions.map((item) => ({
1205
+ id: item.id
1206
+ }))
1207
+ }
1208
+ : { connectOrCreate: props.newsMentions.map((item) => ({
1209
+ where: {
1210
+ id: item.id !== undefined ? item.id : undefined,
1211
+ url: item.url !== undefined ? item.url : undefined,
1212
+ newsArticleId: item.newsArticleId !== undefined ? {
1213
+ equals: item.newsArticleId
1214
+ } : undefined,
1215
+ },
1216
+ create: {
1217
+ url: item.url !== undefined ? item.url : undefined,
1218
+ relevancyScore: item.relevancyScore !== undefined ? item.relevancyScore : undefined,
1219
+ sentimentScore: item.sentimentScore !== undefined ? item.sentimentScore : undefined,
1220
+ sentimentLabel: item.sentimentLabel !== undefined ? item.sentimentLabel : undefined,
1221
+ news: item.news ?
1222
+ typeof item.news === 'object' && Object.keys(item.news).length === 1 && Object.keys(item.news)[0] === 'id'
1223
+ ? { connect: {
1224
+ id: item.news.id
1225
+ }
1226
+ }
1227
+ : { connectOrCreate: {
1228
+ where: {
1229
+ id: item.news.id !== undefined ? item.news.id : undefined,
1230
+ url: item.news.url !== undefined ? item.news.url : undefined,
1231
+ title: item.news.title !== undefined ? {
1232
+ equals: item.news.title
1233
+ } : undefined,
1234
+ },
1235
+ create: {
1236
+ title: item.news.title !== undefined ? item.news.title : undefined,
1237
+ content: item.news.content !== undefined ? item.news.content : undefined,
1238
+ source: item.news.source !== undefined ? item.news.source : undefined,
1239
+ sourceDomain: item.news.sourceDomain !== undefined ? item.news.sourceDomain : undefined,
1240
+ url: item.news.url !== undefined ? item.news.url : undefined,
1241
+ sentiment: item.news.sentiment !== undefined ? item.news.sentiment : undefined,
1242
+ authors: item.news.authors !== undefined ? {
1243
+ set: item.news.authors
1244
+ } : undefined,
1245
+ summary: item.news.summary !== undefined ? item.news.summary : undefined,
1246
+ bannerImage: item.news.bannerImage !== undefined ? item.news.bannerImage : undefined,
1247
+ timePublished: item.news.timePublished !== undefined ? item.news.timePublished : undefined,
1248
+ category: item.news.category !== undefined ? item.news.category : undefined,
1249
+ topics: item.news.topics !== undefined ? {
1250
+ set: item.news.topics
1251
+ } : undefined,
1252
+ logo: item.news.logo !== undefined ? item.news.logo : undefined,
1253
+ },
1254
+ }
1255
+ } : undefined,
1256
+ },
1257
+ }))
1258
+ } : undefined,
1259
+ },
1260
+ update: {
1261
+ symbol: props.symbol !== undefined ? {
1262
+ set: props.symbol
1263
+ } : undefined,
1264
+ name: props.name !== undefined ? {
1265
+ set: props.name
1266
+ } : undefined,
1267
+ type: props.type !== undefined ? {
1268
+ set: props.type
1269
+ } : undefined,
1270
+ logoUrl: props.logoUrl !== undefined ? {
1271
+ set: props.logoUrl
1272
+ } : undefined,
1273
+ description: props.description !== undefined ? {
1274
+ set: props.description
1275
+ } : undefined,
1276
+ cik: props.cik !== undefined ? {
1277
+ set: props.cik
1278
+ } : undefined,
1279
+ exchange: props.exchange !== undefined ? {
1280
+ set: props.exchange
1281
+ } : undefined,
1282
+ currency: props.currency !== undefined ? {
1283
+ set: props.currency
1284
+ } : undefined,
1285
+ country: props.country !== undefined ? {
1286
+ set: props.country
1287
+ } : undefined,
1288
+ sector: props.sector !== undefined ? {
1289
+ set: props.sector
1290
+ } : undefined,
1291
+ industry: props.industry !== undefined ? {
1292
+ set: props.industry
1293
+ } : undefined,
1294
+ address: props.address !== undefined ? {
1295
+ set: props.address
1296
+ } : undefined,
1297
+ officialSite: props.officialSite !== undefined ? {
1298
+ set: props.officialSite
1299
+ } : undefined,
1300
+ fiscalYearEnd: props.fiscalYearEnd !== undefined ? {
1301
+ set: props.fiscalYearEnd
1302
+ } : undefined,
1303
+ latestQuarter: props.latestQuarter !== undefined ? {
1304
+ set: props.latestQuarter
1305
+ } : undefined,
1306
+ marketCapitalization: props.marketCapitalization !== undefined ? {
1307
+ set: props.marketCapitalization
1308
+ } : undefined,
1309
+ ebitda: props.ebitda !== undefined ? {
1310
+ set: props.ebitda
1311
+ } : undefined,
1312
+ peRatio: props.peRatio !== undefined ? {
1313
+ set: props.peRatio
1314
+ } : undefined,
1315
+ pegRatio: props.pegRatio !== undefined ? {
1316
+ set: props.pegRatio
1317
+ } : undefined,
1318
+ bookValue: props.bookValue !== undefined ? {
1319
+ set: props.bookValue
1320
+ } : undefined,
1321
+ dividendPerShare: props.dividendPerShare !== undefined ? {
1322
+ set: props.dividendPerShare
1323
+ } : undefined,
1324
+ dividendYield: props.dividendYield !== undefined ? {
1325
+ set: props.dividendYield
1326
+ } : undefined,
1327
+ eps: props.eps !== undefined ? {
1328
+ set: props.eps
1329
+ } : undefined,
1330
+ revenuePerShareTTM: props.revenuePerShareTTM !== undefined ? {
1331
+ set: props.revenuePerShareTTM
1332
+ } : undefined,
1333
+ profitMargin: props.profitMargin !== undefined ? {
1334
+ set: props.profitMargin
1335
+ } : undefined,
1336
+ operatingMarginTTM: props.operatingMarginTTM !== undefined ? {
1337
+ set: props.operatingMarginTTM
1338
+ } : undefined,
1339
+ returnOnAssetsTTM: props.returnOnAssetsTTM !== undefined ? {
1340
+ set: props.returnOnAssetsTTM
1341
+ } : undefined,
1342
+ returnOnEquityTTM: props.returnOnEquityTTM !== undefined ? {
1343
+ set: props.returnOnEquityTTM
1344
+ } : undefined,
1345
+ revenueTTM: props.revenueTTM !== undefined ? {
1346
+ set: props.revenueTTM
1347
+ } : undefined,
1348
+ grossProfitTTM: props.grossProfitTTM !== undefined ? {
1349
+ set: props.grossProfitTTM
1350
+ } : undefined,
1351
+ dilutedEPSTTM: props.dilutedEPSTTM !== undefined ? {
1352
+ set: props.dilutedEPSTTM
1353
+ } : undefined,
1354
+ quarterlyEarningsGrowthYOY: props.quarterlyEarningsGrowthYOY !== undefined ? {
1355
+ set: props.quarterlyEarningsGrowthYOY
1356
+ } : undefined,
1357
+ quarterlyRevenueGrowthYOY: props.quarterlyRevenueGrowthYOY !== undefined ? {
1358
+ set: props.quarterlyRevenueGrowthYOY
1359
+ } : undefined,
1360
+ analystTargetPrice: props.analystTargetPrice !== undefined ? {
1361
+ set: props.analystTargetPrice
1362
+ } : undefined,
1363
+ analystRatingStrongBuy: props.analystRatingStrongBuy !== undefined ? {
1364
+ set: props.analystRatingStrongBuy
1365
+ } : undefined,
1366
+ analystRatingBuy: props.analystRatingBuy !== undefined ? {
1367
+ set: props.analystRatingBuy
1368
+ } : undefined,
1369
+ analystRatingHold: props.analystRatingHold !== undefined ? {
1370
+ set: props.analystRatingHold
1371
+ } : undefined,
1372
+ analystRatingSell: props.analystRatingSell !== undefined ? {
1373
+ set: props.analystRatingSell
1374
+ } : undefined,
1375
+ analystRatingStrongSell: props.analystRatingStrongSell !== undefined ? {
1376
+ set: props.analystRatingStrongSell
1377
+ } : undefined,
1378
+ trailingPE: props.trailingPE !== undefined ? {
1379
+ set: props.trailingPE
1380
+ } : undefined,
1381
+ forwardPE: props.forwardPE !== undefined ? {
1382
+ set: props.forwardPE
1383
+ } : undefined,
1384
+ priceToSalesRatioTTM: props.priceToSalesRatioTTM !== undefined ? {
1385
+ set: props.priceToSalesRatioTTM
1386
+ } : undefined,
1387
+ priceToBookRatio: props.priceToBookRatio !== undefined ? {
1388
+ set: props.priceToBookRatio
1389
+ } : undefined,
1390
+ evToRevenue: props.evToRevenue !== undefined ? {
1391
+ set: props.evToRevenue
1392
+ } : undefined,
1393
+ evToEbitda: props.evToEbitda !== undefined ? {
1394
+ set: props.evToEbitda
1395
+ } : undefined,
1396
+ beta: props.beta !== undefined ? {
1397
+ set: props.beta
1398
+ } : undefined,
1399
+ week52High: props.week52High !== undefined ? {
1400
+ set: props.week52High
1401
+ } : undefined,
1402
+ week52Low: props.week52Low !== undefined ? {
1403
+ set: props.week52Low
1404
+ } : undefined,
1405
+ day50MovingAverage: props.day50MovingAverage !== undefined ? {
1406
+ set: props.day50MovingAverage
1407
+ } : undefined,
1408
+ day200MovingAverage: props.day200MovingAverage !== undefined ? {
1409
+ set: props.day200MovingAverage
1410
+ } : undefined,
1411
+ sharesOutstanding: props.sharesOutstanding !== undefined ? {
1412
+ set: props.sharesOutstanding
1413
+ } : undefined,
1414
+ dividendDate: props.dividendDate !== undefined ? {
1415
+ set: props.dividendDate
1416
+ } : undefined,
1417
+ exDividendDate: props.exDividendDate !== undefined ? {
1418
+ set: props.exDividendDate
1419
+ } : undefined,
1420
+ askPrice: props.askPrice !== undefined ? {
1421
+ set: props.askPrice
1422
+ } : undefined,
1423
+ bidPrice: props.bidPrice !== undefined ? {
1424
+ set: props.bidPrice
1425
+ } : undefined,
1426
+ newsMentions: props.newsMentions ?
1427
+ 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) ? {
1428
+ connect: props.newsMentions.map((item) => ({
1429
+ id: item.id
1430
+ }))
1431
+ } : { upsert: props.newsMentions.map((item) => ({
1432
+ where: {
1433
+ id: item.id !== undefined ? item.id : undefined,
1434
+ url: item.url !== undefined ? item.url : undefined,
1435
+ assetId: item.assetId !== undefined ? {
1436
+ equals: item.assetId
1437
+ } : undefined,
1438
+ newsArticleId: item.newsArticleId !== undefined ? {
1439
+ equals: item.newsArticleId
1440
+ } : undefined,
1441
+ },
1442
+ update: {
1443
+ id: item.id !== undefined ? {
1444
+ set: item.id
1445
+ } : undefined,
1446
+ url: item.url !== undefined ? {
1447
+ set: item.url
1448
+ } : undefined,
1449
+ relevancyScore: item.relevancyScore !== undefined ? {
1450
+ set: item.relevancyScore
1451
+ } : undefined,
1452
+ sentimentScore: item.sentimentScore !== undefined ? {
1453
+ set: item.sentimentScore
1454
+ } : undefined,
1455
+ sentimentLabel: item.sentimentLabel !== undefined ? {
1456
+ set: item.sentimentLabel
1457
+ } : undefined,
1458
+ news: item.news ?
1459
+ typeof item.news === 'object' && Object.keys(item.news).length === 1 && (Object.keys(item.news)[0] === 'id' || Object.keys(item.news)[0] === 'symbol')
1460
+ ? {
1461
+ connect: {
1462
+ id: item.news.id
1463
+ }
1464
+ } : { upsert: {
1465
+ where: {
1466
+ id: item.news.id !== undefined ? {
1467
+ equals: item.news.id
1468
+ } : undefined,
1469
+ title: item.news.title !== undefined ? {
1470
+ equals: item.news.title
1471
+ } : undefined,
1472
+ url: item.news.url !== undefined ? {
1473
+ equals: item.news.url
1474
+ } : undefined,
1475
+ },
1476
+ update: {
1477
+ id: item.news.id !== undefined ? {
1478
+ set: item.news.id
1479
+ } : undefined,
1480
+ title: item.news.title !== undefined ? {
1481
+ set: item.news.title
1482
+ } : undefined,
1483
+ content: item.news.content !== undefined ? {
1484
+ set: item.news.content
1485
+ } : undefined,
1486
+ source: item.news.source !== undefined ? {
1487
+ set: item.news.source
1488
+ } : undefined,
1489
+ sourceDomain: item.news.sourceDomain !== undefined ? {
1490
+ set: item.news.sourceDomain
1491
+ } : undefined,
1492
+ url: item.news.url !== undefined ? {
1493
+ set: item.news.url
1494
+ } : undefined,
1495
+ sentiment: item.news.sentiment !== undefined ? {
1496
+ set: item.news.sentiment
1497
+ } : undefined,
1498
+ authors: item.news.authors !== undefined ? {
1499
+ set: item.news.authors
1500
+ } : undefined,
1501
+ summary: item.news.summary !== undefined ? {
1502
+ set: item.news.summary
1503
+ } : undefined,
1504
+ bannerImage: item.news.bannerImage !== undefined ? {
1505
+ set: item.news.bannerImage
1506
+ } : undefined,
1507
+ timePublished: item.news.timePublished !== undefined ? {
1508
+ set: item.news.timePublished
1509
+ } : undefined,
1510
+ category: item.news.category !== undefined ? {
1511
+ set: item.news.category
1512
+ } : undefined,
1513
+ topics: item.news.topics !== undefined ? {
1514
+ set: item.news.topics
1515
+ } : undefined,
1516
+ logo: item.news.logo !== undefined ? {
1517
+ set: item.news.logo
1518
+ } : undefined,
1519
+ },
1520
+ create: {
1521
+ title: item.news.title !== undefined ? item.news.title : undefined,
1522
+ content: item.news.content !== undefined ? item.news.content : undefined,
1523
+ source: item.news.source !== undefined ? item.news.source : undefined,
1524
+ sourceDomain: item.news.sourceDomain !== undefined ? item.news.sourceDomain : undefined,
1525
+ url: item.news.url !== undefined ? item.news.url : undefined,
1526
+ sentiment: item.news.sentiment !== undefined ? item.news.sentiment : undefined,
1527
+ authors: item.news.authors !== undefined ? {
1528
+ set: item.news.authors
1529
+ } : undefined,
1530
+ summary: item.news.summary !== undefined ? item.news.summary : undefined,
1531
+ bannerImage: item.news.bannerImage !== undefined ? item.news.bannerImage : undefined,
1532
+ timePublished: item.news.timePublished !== undefined ? item.news.timePublished : undefined,
1533
+ category: item.news.category !== undefined ? item.news.category : undefined,
1534
+ topics: item.news.topics !== undefined ? {
1535
+ set: item.news.topics
1536
+ } : undefined,
1537
+ logo: item.news.logo !== undefined ? item.news.logo : undefined,
1538
+ },
1539
+ }
1540
+ } : undefined,
1541
+ },
1542
+ create: {
1543
+ url: item.url !== undefined ? item.url : undefined,
1544
+ relevancyScore: item.relevancyScore !== undefined ? item.relevancyScore : undefined,
1545
+ sentimentScore: item.sentimentScore !== undefined ? item.sentimentScore : undefined,
1546
+ sentimentLabel: item.sentimentLabel !== undefined ? item.sentimentLabel : undefined,
1547
+ news: item.news ?
1548
+ typeof item.news === 'object' && Object.keys(item.news).length === 1 && Object.keys(item.news)[0] === 'id'
1549
+ ? { connect: {
1550
+ id: item.news.id
1551
+ }
1552
+ }
1553
+ : { connectOrCreate: {
1554
+ where: {
1555
+ id: item.news.id !== undefined ? item.news.id : undefined,
1556
+ url: item.news.url !== undefined ? item.news.url : undefined,
1557
+ title: item.news.title !== undefined ? {
1558
+ equals: item.news.title
1559
+ } : undefined,
1560
+ },
1561
+ create: {
1562
+ title: item.news.title !== undefined ? item.news.title : undefined,
1563
+ content: item.news.content !== undefined ? item.news.content : undefined,
1564
+ source: item.news.source !== undefined ? item.news.source : undefined,
1565
+ sourceDomain: item.news.sourceDomain !== undefined ? item.news.sourceDomain : undefined,
1566
+ url: item.news.url !== undefined ? item.news.url : undefined,
1567
+ sentiment: item.news.sentiment !== undefined ? item.news.sentiment : undefined,
1568
+ authors: item.news.authors !== undefined ? {
1569
+ set: item.news.authors
1570
+ } : undefined,
1571
+ summary: item.news.summary !== undefined ? item.news.summary : undefined,
1572
+ bannerImage: item.news.bannerImage !== undefined ? item.news.bannerImage : undefined,
1573
+ timePublished: item.news.timePublished !== undefined ? item.news.timePublished : undefined,
1574
+ category: item.news.category !== undefined ? item.news.category : undefined,
1575
+ topics: item.news.topics !== undefined ? {
1576
+ set: item.news.topics
1577
+ } : undefined,
1578
+ logo: item.news.logo !== undefined ? item.news.logo : undefined,
1579
+ },
1580
+ }
1581
+ } : undefined,
1582
+ },
1583
+ }))
1584
+ } : undefined,
1585
+ },
1586
+ };
1587
+ const filteredVariables = removeUndefinedProps(variables);
1588
+ const response = await client.mutate({
1589
+ mutation: UPSERT_ONE_ASSET,
1590
+ variables: filteredVariables,
1591
+ // Don't cache mutations, but ensure we're using the freshest context
1592
+ fetchPolicy: 'no-cache'
1593
+ });
1594
+ if (response.errors && response.errors.length > 0)
1595
+ throw new Error(response.errors[0].message);
1596
+ if (response && response.data && response.data.upsertOneAsset) {
1597
+ return response.data.upsertOneAsset;
1598
+ }
1599
+ else {
1600
+ return null;
1601
+ }
1602
+ }
1603
+ catch (error) {
1604
+ lastError = error;
1605
+ // Check if this is a database connection error that we should retry
1606
+ const isConnectionError = error.message?.includes('Server has closed the connection') ||
1607
+ error.message?.includes('Cannot reach database server') ||
1608
+ error.message?.includes('Connection timed out') ||
1609
+ error.message?.includes('Accelerate') || // Prisma Accelerate proxy errors
1610
+ (error.networkError && error.networkError.message?.includes('Failed to fetch'));
1611
+ if (isConnectionError && retryCount < MAX_RETRIES - 1) {
1612
+ retryCount++;
1613
+ const delay = Math.pow(2, retryCount) * 100; // Exponential backoff: 200ms, 400ms, 800ms
1614
+ console.warn("Database connection error, retrying...");
1615
+ await new Promise(resolve => setTimeout(resolve, delay));
1616
+ continue;
1617
+ }
1618
+ // Log the error and rethrow
1619
+ console.error("Database error occurred:", error);
1620
+ throw error;
312
1621
  }
313
1622
  }
314
- catch (error) {
315
- console.error('Error in createManyAsset:', error);
316
- throw error;
317
- }
1623
+ // If we exhausted retries, throw the last error
1624
+ throw lastError;
318
1625
  },
319
1626
  /**
320
- * Update a single Asset record.
321
- * @param props - Properties to update.
1627
+ * Update multiple Asset records.
1628
+ * Enhanced with connection resilience against Prisma connection errors.
1629
+ * @param props - Array of Asset objects for the updated records.
322
1630
  * @param globalClient - Apollo Client instance.
323
- * @returns The updated Asset or null.
1631
+ * @returns The count of created records or null.
324
1632
  */
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
630
- } : 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
- }
1633
+ async updateMany(props, globalClient) {
1634
+ // Maximum number of retries for database connection issues
1635
+ const MAX_RETRIES = 3;
1636
+ let retryCount = 0;
1637
+ let lastError = null;
1638
+ // Retry loop to handle potential database connection issues
1639
+ while (retryCount < MAX_RETRIES) {
1640
+ try {
1641
+ const [modules, client] = await Promise.all([
1642
+ getApolloModules(),
1643
+ globalClient
1644
+ ? Promise.resolve(globalClient)
1645
+ : importedClient
1646
+ ]);
1647
+ const { gql, ApolloError } = modules;
1648
+ const UPDATE_MANY_ASSET = gql `
1649
+ mutation updateManyAsset($data: [AssetCreateManyInput!]!) {
1650
+ updateManyAsset(data: $data) {
1651
+ count
1652
+ }
1653
+ }`;
1654
+ const variables = props.map(prop => ({
1655
+ where: {
1656
+ id: prop.id !== undefined ? prop.id : undefined,
1657
+ symbol: prop.symbol !== undefined ? prop.symbol : undefined,
1658
+ name: prop.name !== undefined ? prop.name : undefined,
1659
+ type: prop.type !== undefined ? {
1660
+ equals: prop.type
1661
+ } : undefined,
1662
+ logoUrl: prop.logoUrl !== undefined ? {
1663
+ equals: prop.logoUrl
1664
+ } : undefined,
1665
+ description: prop.description !== undefined ? {
1666
+ equals: prop.description
1667
+ } : undefined,
1668
+ cik: prop.cik !== undefined ? {
1669
+ equals: prop.cik
1670
+ } : undefined,
1671
+ exchange: prop.exchange !== undefined ? {
1672
+ equals: prop.exchange
1673
+ } : undefined,
1674
+ currency: prop.currency !== undefined ? {
1675
+ equals: prop.currency
1676
+ } : undefined,
1677
+ country: prop.country !== undefined ? {
1678
+ equals: prop.country
1679
+ } : undefined,
1680
+ sector: prop.sector !== undefined ? {
1681
+ equals: prop.sector
1682
+ } : undefined,
1683
+ industry: prop.industry !== undefined ? {
1684
+ equals: prop.industry
1685
+ } : undefined,
1686
+ address: prop.address !== undefined ? {
1687
+ equals: prop.address
1688
+ } : undefined,
1689
+ officialSite: prop.officialSite !== undefined ? {
1690
+ equals: prop.officialSite
1691
+ } : undefined,
1692
+ fiscalYearEnd: prop.fiscalYearEnd !== undefined ? {
1693
+ equals: prop.fiscalYearEnd
1694
+ } : undefined,
1695
+ latestQuarter: prop.latestQuarter !== undefined ? {
1696
+ equals: prop.latestQuarter
1697
+ } : undefined,
1698
+ marketCapitalization: prop.marketCapitalization !== undefined ? {
1699
+ equals: prop.marketCapitalization
1700
+ } : undefined,
1701
+ ebitda: prop.ebitda !== undefined ? {
1702
+ equals: prop.ebitda
1703
+ } : undefined,
1704
+ peRatio: prop.peRatio !== undefined ? {
1705
+ equals: prop.peRatio
1706
+ } : undefined,
1707
+ pegRatio: prop.pegRatio !== undefined ? {
1708
+ equals: prop.pegRatio
1709
+ } : undefined,
1710
+ bookValue: prop.bookValue !== undefined ? {
1711
+ equals: prop.bookValue
1712
+ } : undefined,
1713
+ dividendPerShare: prop.dividendPerShare !== undefined ? {
1714
+ equals: prop.dividendPerShare
1715
+ } : undefined,
1716
+ dividendYield: prop.dividendYield !== undefined ? {
1717
+ equals: prop.dividendYield
1718
+ } : undefined,
1719
+ eps: prop.eps !== undefined ? {
1720
+ equals: prop.eps
1721
+ } : undefined,
1722
+ revenuePerShareTTM: prop.revenuePerShareTTM !== undefined ? {
1723
+ equals: prop.revenuePerShareTTM
1724
+ } : undefined,
1725
+ profitMargin: prop.profitMargin !== undefined ? {
1726
+ equals: prop.profitMargin
1727
+ } : undefined,
1728
+ operatingMarginTTM: prop.operatingMarginTTM !== undefined ? {
1729
+ equals: prop.operatingMarginTTM
1730
+ } : undefined,
1731
+ returnOnAssetsTTM: prop.returnOnAssetsTTM !== undefined ? {
1732
+ equals: prop.returnOnAssetsTTM
1733
+ } : undefined,
1734
+ returnOnEquityTTM: prop.returnOnEquityTTM !== undefined ? {
1735
+ equals: prop.returnOnEquityTTM
1736
+ } : undefined,
1737
+ revenueTTM: prop.revenueTTM !== undefined ? {
1738
+ equals: prop.revenueTTM
1739
+ } : undefined,
1740
+ grossProfitTTM: prop.grossProfitTTM !== undefined ? {
1741
+ equals: prop.grossProfitTTM
1742
+ } : undefined,
1743
+ dilutedEPSTTM: prop.dilutedEPSTTM !== undefined ? {
1744
+ equals: prop.dilutedEPSTTM
1745
+ } : undefined,
1746
+ quarterlyEarningsGrowthYOY: prop.quarterlyEarningsGrowthYOY !== undefined ? {
1747
+ equals: prop.quarterlyEarningsGrowthYOY
1748
+ } : undefined,
1749
+ quarterlyRevenueGrowthYOY: prop.quarterlyRevenueGrowthYOY !== undefined ? {
1750
+ equals: prop.quarterlyRevenueGrowthYOY
1751
+ } : undefined,
1752
+ analystTargetPrice: prop.analystTargetPrice !== undefined ? {
1753
+ equals: prop.analystTargetPrice
1754
+ } : undefined,
1755
+ analystRatingStrongBuy: prop.analystRatingStrongBuy !== undefined ? {
1756
+ equals: prop.analystRatingStrongBuy
1757
+ } : undefined,
1758
+ analystRatingBuy: prop.analystRatingBuy !== undefined ? {
1759
+ equals: prop.analystRatingBuy
1760
+ } : undefined,
1761
+ analystRatingHold: prop.analystRatingHold !== undefined ? {
1762
+ equals: prop.analystRatingHold
1763
+ } : undefined,
1764
+ analystRatingSell: prop.analystRatingSell !== undefined ? {
1765
+ equals: prop.analystRatingSell
1766
+ } : undefined,
1767
+ analystRatingStrongSell: prop.analystRatingStrongSell !== undefined ? {
1768
+ equals: prop.analystRatingStrongSell
1769
+ } : undefined,
1770
+ trailingPE: prop.trailingPE !== undefined ? {
1771
+ equals: prop.trailingPE
1772
+ } : undefined,
1773
+ forwardPE: prop.forwardPE !== undefined ? {
1774
+ equals: prop.forwardPE
1775
+ } : undefined,
1776
+ priceToSalesRatioTTM: prop.priceToSalesRatioTTM !== undefined ? {
1777
+ equals: prop.priceToSalesRatioTTM
1778
+ } : undefined,
1779
+ priceToBookRatio: prop.priceToBookRatio !== undefined ? {
1780
+ equals: prop.priceToBookRatio
1781
+ } : undefined,
1782
+ evToRevenue: prop.evToRevenue !== undefined ? {
1783
+ equals: prop.evToRevenue
1784
+ } : undefined,
1785
+ evToEbitda: prop.evToEbitda !== undefined ? {
1786
+ equals: prop.evToEbitda
1787
+ } : undefined,
1788
+ beta: prop.beta !== undefined ? {
1789
+ equals: prop.beta
1790
+ } : undefined,
1791
+ week52High: prop.week52High !== undefined ? {
1792
+ equals: prop.week52High
1793
+ } : undefined,
1794
+ week52Low: prop.week52Low !== undefined ? {
1795
+ equals: prop.week52Low
1796
+ } : undefined,
1797
+ day50MovingAverage: prop.day50MovingAverage !== undefined ? {
1798
+ equals: prop.day50MovingAverage
1799
+ } : undefined,
1800
+ day200MovingAverage: prop.day200MovingAverage !== undefined ? {
1801
+ equals: prop.day200MovingAverage
1802
+ } : undefined,
1803
+ sharesOutstanding: prop.sharesOutstanding !== undefined ? {
1804
+ equals: prop.sharesOutstanding
1805
+ } : undefined,
1806
+ dividendDate: prop.dividendDate !== undefined ? {
1807
+ equals: prop.dividendDate
1808
+ } : undefined,
1809
+ exDividendDate: prop.exDividendDate !== undefined ? {
1810
+ equals: prop.exDividendDate
1811
+ } : undefined,
1812
+ createdAt: prop.createdAt !== undefined ? {
1813
+ equals: prop.createdAt
1814
+ } : undefined,
1815
+ updatedAt: prop.updatedAt !== undefined ? {
1816
+ equals: prop.updatedAt
1817
+ } : undefined,
1818
+ },
1819
+ data: {
1820
+ id: prop.id !== undefined ? {
1821
+ set: prop.id
1822
+ } : undefined,
1823
+ symbol: prop.symbol !== undefined ? {
1824
+ set: prop.symbol
1825
+ } : undefined,
1826
+ name: prop.name !== undefined ? {
1827
+ set: prop.name
1828
+ } : undefined,
1829
+ type: prop.type !== undefined ? {
1830
+ set: prop.type
1831
+ } : undefined,
1832
+ logoUrl: prop.logoUrl !== undefined ? {
1833
+ set: prop.logoUrl
1834
+ } : undefined,
1835
+ description: prop.description !== undefined ? {
1836
+ set: prop.description
1837
+ } : undefined,
1838
+ cik: prop.cik !== undefined ? {
1839
+ set: prop.cik
1840
+ } : undefined,
1841
+ exchange: prop.exchange !== undefined ? {
1842
+ set: prop.exchange
1843
+ } : undefined,
1844
+ currency: prop.currency !== undefined ? {
1845
+ set: prop.currency
1846
+ } : undefined,
1847
+ country: prop.country !== undefined ? {
1848
+ set: prop.country
1849
+ } : undefined,
1850
+ sector: prop.sector !== undefined ? {
1851
+ set: prop.sector
1852
+ } : undefined,
1853
+ industry: prop.industry !== undefined ? {
1854
+ set: prop.industry
1855
+ } : undefined,
1856
+ address: prop.address !== undefined ? {
1857
+ set: prop.address
1858
+ } : undefined,
1859
+ officialSite: prop.officialSite !== undefined ? {
1860
+ set: prop.officialSite
1861
+ } : undefined,
1862
+ fiscalYearEnd: prop.fiscalYearEnd !== undefined ? {
1863
+ set: prop.fiscalYearEnd
1864
+ } : undefined,
1865
+ latestQuarter: prop.latestQuarter !== undefined ? {
1866
+ set: prop.latestQuarter
1867
+ } : undefined,
1868
+ marketCapitalization: prop.marketCapitalization !== undefined ? {
1869
+ set: prop.marketCapitalization
1870
+ } : undefined,
1871
+ ebitda: prop.ebitda !== undefined ? {
1872
+ set: prop.ebitda
1873
+ } : undefined,
1874
+ peRatio: prop.peRatio !== undefined ? {
1875
+ set: prop.peRatio
1876
+ } : undefined,
1877
+ pegRatio: prop.pegRatio !== undefined ? {
1878
+ set: prop.pegRatio
1879
+ } : undefined,
1880
+ bookValue: prop.bookValue !== undefined ? {
1881
+ set: prop.bookValue
1882
+ } : undefined,
1883
+ dividendPerShare: prop.dividendPerShare !== undefined ? {
1884
+ set: prop.dividendPerShare
1885
+ } : undefined,
1886
+ dividendYield: prop.dividendYield !== undefined ? {
1887
+ set: prop.dividendYield
1888
+ } : undefined,
1889
+ eps: prop.eps !== undefined ? {
1890
+ set: prop.eps
1891
+ } : undefined,
1892
+ revenuePerShareTTM: prop.revenuePerShareTTM !== undefined ? {
1893
+ set: prop.revenuePerShareTTM
1894
+ } : undefined,
1895
+ profitMargin: prop.profitMargin !== undefined ? {
1896
+ set: prop.profitMargin
1897
+ } : undefined,
1898
+ operatingMarginTTM: prop.operatingMarginTTM !== undefined ? {
1899
+ set: prop.operatingMarginTTM
1900
+ } : undefined,
1901
+ returnOnAssetsTTM: prop.returnOnAssetsTTM !== undefined ? {
1902
+ set: prop.returnOnAssetsTTM
1903
+ } : undefined,
1904
+ returnOnEquityTTM: prop.returnOnEquityTTM !== undefined ? {
1905
+ set: prop.returnOnEquityTTM
1906
+ } : undefined,
1907
+ revenueTTM: prop.revenueTTM !== undefined ? {
1908
+ set: prop.revenueTTM
1909
+ } : undefined,
1910
+ grossProfitTTM: prop.grossProfitTTM !== undefined ? {
1911
+ set: prop.grossProfitTTM
1912
+ } : undefined,
1913
+ dilutedEPSTTM: prop.dilutedEPSTTM !== undefined ? {
1914
+ set: prop.dilutedEPSTTM
1915
+ } : undefined,
1916
+ quarterlyEarningsGrowthYOY: prop.quarterlyEarningsGrowthYOY !== undefined ? {
1917
+ set: prop.quarterlyEarningsGrowthYOY
1918
+ } : undefined,
1919
+ quarterlyRevenueGrowthYOY: prop.quarterlyRevenueGrowthYOY !== undefined ? {
1920
+ set: prop.quarterlyRevenueGrowthYOY
1921
+ } : undefined,
1922
+ analystTargetPrice: prop.analystTargetPrice !== undefined ? {
1923
+ set: prop.analystTargetPrice
1924
+ } : undefined,
1925
+ analystRatingStrongBuy: prop.analystRatingStrongBuy !== undefined ? {
1926
+ set: prop.analystRatingStrongBuy
1927
+ } : undefined,
1928
+ analystRatingBuy: prop.analystRatingBuy !== undefined ? {
1929
+ set: prop.analystRatingBuy
1930
+ } : undefined,
1931
+ analystRatingHold: prop.analystRatingHold !== undefined ? {
1932
+ set: prop.analystRatingHold
1933
+ } : undefined,
1934
+ analystRatingSell: prop.analystRatingSell !== undefined ? {
1935
+ set: prop.analystRatingSell
1936
+ } : undefined,
1937
+ analystRatingStrongSell: prop.analystRatingStrongSell !== undefined ? {
1938
+ set: prop.analystRatingStrongSell
1939
+ } : undefined,
1940
+ trailingPE: prop.trailingPE !== undefined ? {
1941
+ set: prop.trailingPE
1942
+ } : undefined,
1943
+ forwardPE: prop.forwardPE !== undefined ? {
1944
+ set: prop.forwardPE
1945
+ } : undefined,
1946
+ priceToSalesRatioTTM: prop.priceToSalesRatioTTM !== undefined ? {
1947
+ set: prop.priceToSalesRatioTTM
1948
+ } : undefined,
1949
+ priceToBookRatio: prop.priceToBookRatio !== undefined ? {
1950
+ set: prop.priceToBookRatio
1951
+ } : undefined,
1952
+ evToRevenue: prop.evToRevenue !== undefined ? {
1953
+ set: prop.evToRevenue
1954
+ } : undefined,
1955
+ evToEbitda: prop.evToEbitda !== undefined ? {
1956
+ set: prop.evToEbitda
1957
+ } : undefined,
1958
+ beta: prop.beta !== undefined ? {
1959
+ set: prop.beta
1960
+ } : undefined,
1961
+ week52High: prop.week52High !== undefined ? {
1962
+ set: prop.week52High
1963
+ } : undefined,
1964
+ week52Low: prop.week52Low !== undefined ? {
1965
+ set: prop.week52Low
1966
+ } : undefined,
1967
+ day50MovingAverage: prop.day50MovingAverage !== undefined ? {
1968
+ set: prop.day50MovingAverage
1969
+ } : undefined,
1970
+ day200MovingAverage: prop.day200MovingAverage !== undefined ? {
1971
+ set: prop.day200MovingAverage
1972
+ } : undefined,
1973
+ sharesOutstanding: prop.sharesOutstanding !== undefined ? {
1974
+ set: prop.sharesOutstanding
1975
+ } : undefined,
1976
+ dividendDate: prop.dividendDate !== undefined ? {
1977
+ set: prop.dividendDate
1978
+ } : undefined,
1979
+ exDividendDate: prop.exDividendDate !== undefined ? {
1980
+ set: prop.exDividendDate
1981
+ } : undefined,
1982
+ askPrice: prop.askPrice !== undefined ? {
1983
+ set: prop.askPrice
1984
+ } : undefined,
1985
+ bidPrice: prop.bidPrice !== undefined ? {
1986
+ set: prop.bidPrice
1987
+ } : undefined,
1988
+ createdAt: prop.createdAt !== undefined ? {
1989
+ set: prop.createdAt
1990
+ } : undefined,
1991
+ updatedAt: prop.updatedAt !== undefined ? {
1992
+ set: prop.updatedAt
1993
+ } : undefined,
1994
+ newsMentions: prop.newsMentions ?
1995
+ 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) ? {
1996
+ connect: prop.newsMentions.map((item) => ({
1997
+ id: item.id
1998
+ }))
1999
+ } : { upsert: prop.newsMentions.map((item) => ({
2000
+ where: {
2001
+ id: item.id !== undefined ? item.id : undefined,
2002
+ url: item.url !== undefined ? item.url : undefined,
2003
+ assetId: item.assetId !== undefined ? {
2004
+ equals: item.assetId
675
2005
  } : 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;
688
- }
689
- else {
690
- return null;
691
- }
692
- }
693
- catch (error) {
694
- console.error('Error in updateOneAsset:', error);
695
- throw error;
696
- }
697
- },
698
- /**
699
- * Upsert a single Asset record.
700
- * @param props - Properties to update.
701
- * @param globalClient - Apollo Client instance.
702
- * @returns The updated Asset or null.
703
- */
704
- 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: {
2006
+ newsArticleId: item.newsArticleId !== undefined ? {
2007
+ equals: item.newsArticleId
2008
+ } : undefined,
2009
+ },
2010
+ update: {
2011
+ id: item.id !== undefined ? {
2012
+ set: item.id
2013
+ } : undefined,
2014
+ url: item.url !== undefined ? {
2015
+ set: item.url
2016
+ } : undefined,
2017
+ relevancyScore: item.relevancyScore !== undefined ? {
2018
+ set: item.relevancyScore
2019
+ } : undefined,
2020
+ sentimentScore: item.sentimentScore !== undefined ? {
2021
+ set: item.sentimentScore
2022
+ } : undefined,
2023
+ sentimentLabel: item.sentimentLabel !== undefined ? {
2024
+ set: item.sentimentLabel
2025
+ } : undefined,
2026
+ news: item.news ?
2027
+ typeof item.news === 'object' && Object.keys(item.news).length === 1 && (Object.keys(item.news)[0] === 'id' || Object.keys(item.news)[0] === 'symbol')
2028
+ ? {
2029
+ connect: {
2030
+ id: item.news.id
2031
+ }
2032
+ } : { upsert: {
806
2033
  where: {
807
- id: item.news.id !== undefined ? item.news.id : undefined,
808
- url: item.news.url !== undefined ? item.news.url : undefined,
2034
+ id: item.news.id !== undefined ? {
2035
+ equals: item.news.id
2036
+ } : undefined,
809
2037
  title: item.news.title !== undefined ? {
810
2038
  equals: item.news.title
811
2039
  } : undefined,
2040
+ url: item.news.url !== undefined ? {
2041
+ equals: item.news.url
2042
+ } : undefined,
2043
+ },
2044
+ update: {
2045
+ id: item.news.id !== undefined ? {
2046
+ set: item.news.id
2047
+ } : undefined,
2048
+ title: item.news.title !== undefined ? {
2049
+ set: item.news.title
2050
+ } : undefined,
2051
+ content: item.news.content !== undefined ? {
2052
+ set: item.news.content
2053
+ } : undefined,
2054
+ source: item.news.source !== undefined ? {
2055
+ set: item.news.source
2056
+ } : undefined,
2057
+ sourceDomain: item.news.sourceDomain !== undefined ? {
2058
+ set: item.news.sourceDomain
2059
+ } : undefined,
2060
+ url: item.news.url !== undefined ? {
2061
+ set: item.news.url
2062
+ } : undefined,
2063
+ sentiment: item.news.sentiment !== undefined ? {
2064
+ set: item.news.sentiment
2065
+ } : undefined,
2066
+ authors: item.news.authors !== undefined ? {
2067
+ set: item.news.authors
2068
+ } : undefined,
2069
+ summary: item.news.summary !== undefined ? {
2070
+ set: item.news.summary
2071
+ } : undefined,
2072
+ bannerImage: item.news.bannerImage !== undefined ? {
2073
+ set: item.news.bannerImage
2074
+ } : undefined,
2075
+ timePublished: item.news.timePublished !== undefined ? {
2076
+ set: item.news.timePublished
2077
+ } : undefined,
2078
+ category: item.news.category !== undefined ? {
2079
+ set: item.news.category
2080
+ } : undefined,
2081
+ topics: item.news.topics !== undefined ? {
2082
+ set: item.news.topics
2083
+ } : undefined,
2084
+ logo: item.news.logo !== undefined ? {
2085
+ set: item.news.logo
2086
+ } : undefined,
812
2087
  },
813
2088
  create: {
814
2089
  title: item.news.title !== undefined ? item.news.title : undefined,
@@ -831,908 +2106,693 @@ export const Asset = {
831
2106
  },
832
2107
  }
833
2108
  } : 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
1114
- } : 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;
1172
- }
1173
- else {
1174
- return null;
1175
- }
1176
- }
1177
- catch (error) {
1178
- console.error('Error in upsertOneAsset:', error);
1179
- throw error;
1180
- }
1181
- },
1182
- /**
1183
- * Update multiple Asset records.
1184
- * @param props - Array of Asset objects for the updated records.
1185
- * @param globalClient - Apollo Client instance.
1186
- * @returns The count of created records or null.
1187
- */
1188
- 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
2109
+ },
2110
+ create: {
2111
+ url: item.url !== undefined ? item.url : undefined,
2112
+ relevancyScore: item.relevancyScore !== undefined ? item.relevancyScore : undefined,
2113
+ sentimentScore: item.sentimentScore !== undefined ? item.sentimentScore : undefined,
2114
+ sentimentLabel: item.sentimentLabel !== undefined ? item.sentimentLabel : undefined,
2115
+ news: item.news ?
2116
+ typeof item.news === 'object' && Object.keys(item.news).length === 1 && Object.keys(item.news)[0] === 'id'
2117
+ ? { connect: {
2118
+ id: item.news.id
2119
+ }
2120
+ }
2121
+ : { connectOrCreate: {
2122
+ where: {
2123
+ id: item.news.id !== undefined ? item.news.id : undefined,
2124
+ url: item.news.url !== undefined ? item.news.url : undefined,
2125
+ title: item.news.title !== undefined ? {
2126
+ equals: item.news.title
2127
+ } : undefined,
2128
+ },
2129
+ create: {
2130
+ title: item.news.title !== undefined ? item.news.title : undefined,
2131
+ content: item.news.content !== undefined ? item.news.content : undefined,
2132
+ source: item.news.source !== undefined ? item.news.source : undefined,
2133
+ sourceDomain: item.news.sourceDomain !== undefined ? item.news.sourceDomain : undefined,
2134
+ url: item.news.url !== undefined ? item.news.url : undefined,
2135
+ sentiment: item.news.sentiment !== undefined ? item.news.sentiment : undefined,
2136
+ authors: item.news.authors !== undefined ? {
2137
+ set: item.news.authors
2138
+ } : undefined,
2139
+ summary: item.news.summary !== undefined ? item.news.summary : undefined,
2140
+ bannerImage: item.news.bannerImage !== undefined ? item.news.bannerImage : undefined,
2141
+ timePublished: item.news.timePublished !== undefined ? item.news.timePublished : undefined,
2142
+ category: item.news.category !== undefined ? item.news.category : undefined,
2143
+ topics: item.news.topics !== undefined ? {
2144
+ set: item.news.topics
2145
+ } : undefined,
2146
+ logo: item.news.logo !== undefined ? item.news.logo : undefined,
2147
+ },
2148
+ }
1493
2149
  } : 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
- }
1538
- } : 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;
2150
+ },
2151
+ }))
2152
+ } : undefined,
2153
+ },
2154
+ }));
2155
+ const filteredVariables = removeUndefinedProps(variables);
2156
+ const response = await client.mutate({
2157
+ mutation: UPDATE_MANY_ASSET,
2158
+ variables: filteredVariables,
2159
+ // Don't cache mutations, but ensure we're using the freshest context
2160
+ fetchPolicy: 'no-cache'
2161
+ });
2162
+ if (response.errors && response.errors.length > 0)
2163
+ throw new Error(response.errors[0].message);
2164
+ if (response && response.data && response.data.updateManyAsset) {
2165
+ return response.data.updateManyAsset;
2166
+ }
2167
+ else {
2168
+ return null;
2169
+ }
1551
2170
  }
1552
- else {
1553
- return null;
2171
+ catch (error) {
2172
+ lastError = error;
2173
+ // Check if this is a database connection error that we should retry
2174
+ const isConnectionError = error.message?.includes('Server has closed the connection') ||
2175
+ error.message?.includes('Cannot reach database server') ||
2176
+ error.message?.includes('Connection timed out') ||
2177
+ error.message?.includes('Accelerate') || // Prisma Accelerate proxy errors
2178
+ (error.networkError && error.networkError.message?.includes('Failed to fetch'));
2179
+ if (isConnectionError && retryCount < MAX_RETRIES - 1) {
2180
+ retryCount++;
2181
+ const delay = Math.pow(2, retryCount) * 100; // Exponential backoff: 200ms, 400ms, 800ms
2182
+ console.warn("Database connection error, retrying...");
2183
+ await new Promise(resolve => setTimeout(resolve, delay));
2184
+ continue;
2185
+ }
2186
+ // Log the error and rethrow
2187
+ console.error("Database error occurred:", error);
2188
+ throw error;
1554
2189
  }
1555
2190
  }
1556
- catch (error) {
1557
- console.error('Error in updateManyAsset:', error);
1558
- throw error;
1559
- }
2191
+ // If we exhausted retries, throw the last error
2192
+ throw lastError;
1560
2193
  },
1561
2194
  /**
1562
2195
  * Delete a single Asset record.
1563
- * @param props - Properties to update.
2196
+ * Enhanced with connection resilience against Prisma connection errors.
2197
+ * @param props - Properties to identify the record to delete.
1564
2198
  * @param globalClient - Apollo Client instance.
1565
2199
  * @returns The deleted Asset or null.
1566
2200
  */
1567
2201
  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,
2202
+ // Maximum number of retries for database connection issues
2203
+ const MAX_RETRIES = 3;
2204
+ let retryCount = 0;
2205
+ let lastError = null;
2206
+ // Retry loop to handle potential database connection issues
2207
+ while (retryCount < MAX_RETRIES) {
2208
+ try {
2209
+ const [modules, client] = await Promise.all([
2210
+ getApolloModules(),
2211
+ globalClient
2212
+ ? Promise.resolve(globalClient)
2213
+ : importedClient
2214
+ ]);
2215
+ const { gql, ApolloError } = modules;
2216
+ const DELETE_ONE_ASSET = gql `
2217
+ mutation deleteOneAsset($where: AssetWhereUniqueInput!) {
2218
+ deleteOneAsset(where: $where) {
2219
+ id
1584
2220
  }
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;
2221
+ }`;
2222
+ const variables = {
2223
+ where: {
2224
+ id: props.id ? props.id : undefined,
2225
+ }
2226
+ };
2227
+ const filteredVariables = removeUndefinedProps(variables);
2228
+ const response = await client.mutate({
2229
+ mutation: DELETE_ONE_ASSET,
2230
+ variables: filteredVariables,
2231
+ // Don't cache mutations, but ensure we're using the freshest context
2232
+ fetchPolicy: 'no-cache'
2233
+ });
2234
+ if (response.errors && response.errors.length > 0)
2235
+ throw new Error(response.errors[0].message);
2236
+ if (response && response.data && response.data.deleteOneAsset) {
2237
+ return response.data.deleteOneAsset;
2238
+ }
2239
+ else {
2240
+ return null;
2241
+ }
1593
2242
  }
1594
- else {
1595
- return null;
2243
+ catch (error) {
2244
+ lastError = error;
2245
+ // Check if this is a database connection error that we should retry
2246
+ const isConnectionError = error.message?.includes('Server has closed the connection') ||
2247
+ error.message?.includes('Cannot reach database server') ||
2248
+ error.message?.includes('Connection timed out') ||
2249
+ error.message?.includes('Accelerate') || // Prisma Accelerate proxy errors
2250
+ (error.networkError && error.networkError.message?.includes('Failed to fetch'));
2251
+ if (isConnectionError && retryCount < MAX_RETRIES - 1) {
2252
+ retryCount++;
2253
+ const delay = Math.pow(2, retryCount) * 100; // Exponential backoff: 200ms, 400ms, 800ms
2254
+ console.warn("Database connection error, retrying...");
2255
+ await new Promise(resolve => setTimeout(resolve, delay));
2256
+ continue;
2257
+ }
2258
+ // Log the error and rethrow
2259
+ console.error("Database error occurred:", error);
2260
+ throw error;
1596
2261
  }
1597
2262
  }
1598
- catch (error) {
1599
- console.error('Error in deleteOneAsset:', error);
1600
- throw error;
1601
- }
2263
+ // If we exhausted retries, throw the last error
2264
+ throw lastError;
1602
2265
  },
1603
2266
  /**
1604
2267
  * Retrieve a single Asset record by ID.
1605
- * @param props - Properties to update.
2268
+ * Enhanced with connection resilience against Prisma connection errors.
2269
+ * @param props - Properties to identify the record.
1606
2270
  * @param globalClient - Apollo Client instance.
2271
+ * @param whereInput - Optional custom where input.
1607
2272
  * @returns The retrieved Asset or null.
1608
2273
  */
1609
2274
  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;
2275
+ // Maximum number of retries for database connection issues
2276
+ const MAX_RETRIES = 3;
2277
+ let retryCount = 0;
2278
+ let lastError = null;
2279
+ // Retry loop to handle potential database connection issues
2280
+ while (retryCount < MAX_RETRIES) {
2281
+ try {
2282
+ const [modules, client] = await Promise.all([
2283
+ getApolloModules(),
2284
+ globalClient
2285
+ ? Promise.resolve(globalClient)
2286
+ : importedClient
2287
+ ]);
2288
+ const { gql, ApolloError } = modules;
2289
+ const GET_ASSET = gql `
2290
+ query getAsset($where: AssetWhereUniqueInput!) {
2291
+ getAsset(where: $where) {
2292
+ ${selectionSet}
2293
+ }
2294
+ }`;
2295
+ const variables = {
2296
+ where: whereInput ? whereInput : {
2297
+ id: props.id !== undefined ? props.id : undefined,
2298
+ symbol: props.symbol !== undefined ? props.symbol : undefined,
2299
+ name: props.name !== undefined ? props.name : undefined,
2300
+ type: props.type !== undefined ? {
2301
+ equals: props.type
2302
+ } : undefined,
2303
+ logoUrl: props.logoUrl !== undefined ? {
2304
+ equals: props.logoUrl
2305
+ } : undefined,
2306
+ description: props.description !== undefined ? {
2307
+ equals: props.description
2308
+ } : undefined,
2309
+ cik: props.cik !== undefined ? {
2310
+ equals: props.cik
2311
+ } : undefined,
2312
+ exchange: props.exchange !== undefined ? {
2313
+ equals: props.exchange
2314
+ } : undefined,
2315
+ currency: props.currency !== undefined ? {
2316
+ equals: props.currency
2317
+ } : undefined,
2318
+ country: props.country !== undefined ? {
2319
+ equals: props.country
2320
+ } : undefined,
2321
+ sector: props.sector !== undefined ? {
2322
+ equals: props.sector
2323
+ } : undefined,
2324
+ industry: props.industry !== undefined ? {
2325
+ equals: props.industry
2326
+ } : undefined,
2327
+ address: props.address !== undefined ? {
2328
+ equals: props.address
2329
+ } : undefined,
2330
+ officialSite: props.officialSite !== undefined ? {
2331
+ equals: props.officialSite
2332
+ } : undefined,
2333
+ fiscalYearEnd: props.fiscalYearEnd !== undefined ? {
2334
+ equals: props.fiscalYearEnd
2335
+ } : undefined,
2336
+ latestQuarter: props.latestQuarter !== undefined ? {
2337
+ equals: props.latestQuarter
2338
+ } : undefined,
2339
+ marketCapitalization: props.marketCapitalization !== undefined ? {
2340
+ equals: props.marketCapitalization
2341
+ } : undefined,
2342
+ ebitda: props.ebitda !== undefined ? {
2343
+ equals: props.ebitda
2344
+ } : undefined,
2345
+ peRatio: props.peRatio !== undefined ? {
2346
+ equals: props.peRatio
2347
+ } : undefined,
2348
+ pegRatio: props.pegRatio !== undefined ? {
2349
+ equals: props.pegRatio
2350
+ } : undefined,
2351
+ bookValue: props.bookValue !== undefined ? {
2352
+ equals: props.bookValue
2353
+ } : undefined,
2354
+ dividendPerShare: props.dividendPerShare !== undefined ? {
2355
+ equals: props.dividendPerShare
2356
+ } : undefined,
2357
+ dividendYield: props.dividendYield !== undefined ? {
2358
+ equals: props.dividendYield
2359
+ } : undefined,
2360
+ eps: props.eps !== undefined ? {
2361
+ equals: props.eps
2362
+ } : undefined,
2363
+ revenuePerShareTTM: props.revenuePerShareTTM !== undefined ? {
2364
+ equals: props.revenuePerShareTTM
2365
+ } : undefined,
2366
+ profitMargin: props.profitMargin !== undefined ? {
2367
+ equals: props.profitMargin
2368
+ } : undefined,
2369
+ operatingMarginTTM: props.operatingMarginTTM !== undefined ? {
2370
+ equals: props.operatingMarginTTM
2371
+ } : undefined,
2372
+ returnOnAssetsTTM: props.returnOnAssetsTTM !== undefined ? {
2373
+ equals: props.returnOnAssetsTTM
2374
+ } : undefined,
2375
+ returnOnEquityTTM: props.returnOnEquityTTM !== undefined ? {
2376
+ equals: props.returnOnEquityTTM
2377
+ } : undefined,
2378
+ revenueTTM: props.revenueTTM !== undefined ? {
2379
+ equals: props.revenueTTM
2380
+ } : undefined,
2381
+ grossProfitTTM: props.grossProfitTTM !== undefined ? {
2382
+ equals: props.grossProfitTTM
2383
+ } : undefined,
2384
+ dilutedEPSTTM: props.dilutedEPSTTM !== undefined ? {
2385
+ equals: props.dilutedEPSTTM
2386
+ } : undefined,
2387
+ quarterlyEarningsGrowthYOY: props.quarterlyEarningsGrowthYOY !== undefined ? {
2388
+ equals: props.quarterlyEarningsGrowthYOY
2389
+ } : undefined,
2390
+ quarterlyRevenueGrowthYOY: props.quarterlyRevenueGrowthYOY !== undefined ? {
2391
+ equals: props.quarterlyRevenueGrowthYOY
2392
+ } : undefined,
2393
+ analystTargetPrice: props.analystTargetPrice !== undefined ? {
2394
+ equals: props.analystTargetPrice
2395
+ } : undefined,
2396
+ analystRatingStrongBuy: props.analystRatingStrongBuy !== undefined ? {
2397
+ equals: props.analystRatingStrongBuy
2398
+ } : undefined,
2399
+ analystRatingBuy: props.analystRatingBuy !== undefined ? {
2400
+ equals: props.analystRatingBuy
2401
+ } : undefined,
2402
+ analystRatingHold: props.analystRatingHold !== undefined ? {
2403
+ equals: props.analystRatingHold
2404
+ } : undefined,
2405
+ analystRatingSell: props.analystRatingSell !== undefined ? {
2406
+ equals: props.analystRatingSell
2407
+ } : undefined,
2408
+ analystRatingStrongSell: props.analystRatingStrongSell !== undefined ? {
2409
+ equals: props.analystRatingStrongSell
2410
+ } : undefined,
2411
+ trailingPE: props.trailingPE !== undefined ? {
2412
+ equals: props.trailingPE
2413
+ } : undefined,
2414
+ forwardPE: props.forwardPE !== undefined ? {
2415
+ equals: props.forwardPE
2416
+ } : undefined,
2417
+ priceToSalesRatioTTM: props.priceToSalesRatioTTM !== undefined ? {
2418
+ equals: props.priceToSalesRatioTTM
2419
+ } : undefined,
2420
+ priceToBookRatio: props.priceToBookRatio !== undefined ? {
2421
+ equals: props.priceToBookRatio
2422
+ } : undefined,
2423
+ evToRevenue: props.evToRevenue !== undefined ? {
2424
+ equals: props.evToRevenue
2425
+ } : undefined,
2426
+ evToEbitda: props.evToEbitda !== undefined ? {
2427
+ equals: props.evToEbitda
2428
+ } : undefined,
2429
+ beta: props.beta !== undefined ? {
2430
+ equals: props.beta
2431
+ } : undefined,
2432
+ week52High: props.week52High !== undefined ? {
2433
+ equals: props.week52High
2434
+ } : undefined,
2435
+ week52Low: props.week52Low !== undefined ? {
2436
+ equals: props.week52Low
2437
+ } : undefined,
2438
+ day50MovingAverage: props.day50MovingAverage !== undefined ? {
2439
+ equals: props.day50MovingAverage
2440
+ } : undefined,
2441
+ day200MovingAverage: props.day200MovingAverage !== undefined ? {
2442
+ equals: props.day200MovingAverage
2443
+ } : undefined,
2444
+ sharesOutstanding: props.sharesOutstanding !== undefined ? {
2445
+ equals: props.sharesOutstanding
2446
+ } : undefined,
2447
+ dividendDate: props.dividendDate !== undefined ? {
2448
+ equals: props.dividendDate
2449
+ } : undefined,
2450
+ exDividendDate: props.exDividendDate !== undefined ? {
2451
+ equals: props.exDividendDate
2452
+ } : undefined,
2453
+ createdAt: props.createdAt !== undefined ? {
2454
+ equals: props.createdAt
2455
+ } : undefined,
2456
+ updatedAt: props.updatedAt !== undefined ? {
2457
+ equals: props.updatedAt
2458
+ } : undefined,
2459
+ },
2460
+ };
2461
+ const filteredVariables = removeUndefinedProps(variables);
2462
+ const response = await client.query({
2463
+ query: GET_ASSET,
2464
+ variables: filteredVariables,
2465
+ fetchPolicy: 'network-only', // Force network request to avoid stale cache
2466
+ });
2467
+ if (response.errors && response.errors.length > 0)
2468
+ throw new Error(response.errors[0].message);
2469
+ return response.data?.getAsset ?? null;
1640
2470
  }
1641
- else {
1642
- console.error('Error in getAsset:', error);
2471
+ catch (error) {
2472
+ lastError = error;
2473
+ // Check if this is a "No record found" error - this is an expected condition, not a failure
2474
+ if (error.message === 'No Asset found') {
2475
+ return null;
2476
+ }
2477
+ // Check if this is a database connection error that we should retry
2478
+ const isConnectionError = error.message?.includes('Server has closed the connection') ||
2479
+ error.message?.includes('Cannot reach database server') ||
2480
+ error.message?.includes('Connection timed out') ||
2481
+ error.message?.includes('Accelerate') || // Prisma Accelerate proxy errors
2482
+ (error.networkError && error.networkError.message?.includes('Failed to fetch'));
2483
+ if (isConnectionError && retryCount < MAX_RETRIES - 1) {
2484
+ retryCount++;
2485
+ const delay = Math.pow(2, retryCount) * 100; // Exponential backoff: 200ms, 400ms, 800ms
2486
+ console.warn("Database connection error, retrying...");
2487
+ await new Promise(resolve => setTimeout(resolve, delay));
2488
+ continue;
2489
+ }
2490
+ // Log the error and rethrow
2491
+ console.error("Database error occurred:", error);
1643
2492
  throw error;
1644
2493
  }
1645
2494
  }
2495
+ // If we exhausted retries, throw the last error
2496
+ throw lastError;
1646
2497
  },
1647
2498
  /**
1648
2499
  * Retrieve all Assets records.
2500
+ * Enhanced with connection resilience against Prisma connection errors.
1649
2501
  * @param globalClient - Apollo Client instance.
1650
2502
  * @returns An array of Asset records or null.
1651
2503
  */
1652
2504
  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;
2505
+ // Maximum number of retries for database connection issues
2506
+ const MAX_RETRIES = 3;
2507
+ let retryCount = 0;
2508
+ let lastError = null;
2509
+ // Retry loop to handle potential database connection issues
2510
+ while (retryCount < MAX_RETRIES) {
2511
+ try {
2512
+ const [modules, client] = await Promise.all([
2513
+ getApolloModules(),
2514
+ globalClient
2515
+ ? Promise.resolve(globalClient)
2516
+ : importedClient
2517
+ ]);
2518
+ const { gql, ApolloError } = modules;
2519
+ const GET_ALL_ASSET = gql `
2520
+ query getAllAsset {
2521
+ assets {
2522
+ ${selectionSet}
2523
+ }
2524
+ }`;
2525
+ const response = await client.query({
2526
+ query: GET_ALL_ASSET,
2527
+ fetchPolicy: 'network-only', // Force network request to avoid stale cache
2528
+ });
2529
+ if (response.errors && response.errors.length > 0)
2530
+ throw new Error(response.errors[0].message);
2531
+ return response.data?.assets ?? null;
1675
2532
  }
1676
- else {
1677
- console.error('Error in getAsset:', error);
2533
+ catch (error) {
2534
+ lastError = error;
2535
+ // Check if this is a "No record found" error - this is an expected condition, not a failure
2536
+ if (error.message === 'No Asset found') {
2537
+ return null;
2538
+ }
2539
+ // Check if this is a database connection error that we should retry
2540
+ const isConnectionError = error.message?.includes('Server has closed the connection') ||
2541
+ error.message?.includes('Cannot reach database server') ||
2542
+ error.message?.includes('Connection timed out') ||
2543
+ error.message?.includes('Accelerate') || // Prisma Accelerate proxy errors
2544
+ (error.networkError && error.networkError.message?.includes('Failed to fetch'));
2545
+ if (isConnectionError && retryCount < MAX_RETRIES - 1) {
2546
+ retryCount++;
2547
+ const delay = Math.pow(2, retryCount) * 100; // Exponential backoff: 200ms, 400ms, 800ms
2548
+ console.warn("Database connection error, retrying...");
2549
+ await new Promise(resolve => setTimeout(resolve, delay));
2550
+ continue;
2551
+ }
2552
+ // Log the error and rethrow
2553
+ console.error("Database error occurred:", error);
1678
2554
  throw error;
1679
2555
  }
1680
2556
  }
2557
+ // If we exhausted retries, throw the last error
2558
+ throw lastError;
1681
2559
  },
1682
2560
  /**
1683
2561
  * Find multiple Asset records based on conditions.
2562
+ * Enhanced with connection resilience against Prisma connection errors.
1684
2563
  * @param props - Conditions to find records.
1685
2564
  * @param globalClient - Apollo Client instance.
2565
+ * @param whereInput - Optional custom where input.
1686
2566
  * @returns An array of found Asset records or null.
1687
2567
  */
1688
2568
  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;
1722
- }
1723
- else {
1724
- return [];
2569
+ // Maximum number of retries for database connection issues
2570
+ const MAX_RETRIES = 3;
2571
+ let retryCount = 0;
2572
+ let lastError = null;
2573
+ // Retry loop to handle potential database connection issues
2574
+ while (retryCount < MAX_RETRIES) {
2575
+ try {
2576
+ const [modules, client] = await Promise.all([
2577
+ getApolloModules(),
2578
+ globalClient
2579
+ ? Promise.resolve(globalClient)
2580
+ : importedClient
2581
+ ]);
2582
+ const { gql, ApolloError } = modules;
2583
+ const FIND_MANY_ASSET = gql `
2584
+ query findManyAsset($where: AssetWhereInput!) {
2585
+ assets(where: $where) {
2586
+ ${selectionSet}
1725
2587
  }
1726
- }
1727
- catch (error) {
1728
- if (error instanceof ApolloError && error.message === 'No Asset found') {
1729
- return null;
2588
+ }`;
2589
+ const variables = {
2590
+ where: whereInput ? whereInput : {
2591
+ id: props.id !== undefined ? props.id : undefined,
2592
+ symbol: props.symbol !== undefined ? props.symbol : undefined,
2593
+ name: props.name !== undefined ? props.name : undefined,
2594
+ type: props.type !== undefined ? {
2595
+ equals: props.type
2596
+ } : undefined,
2597
+ logoUrl: props.logoUrl !== undefined ? {
2598
+ equals: props.logoUrl
2599
+ } : undefined,
2600
+ description: props.description !== undefined ? {
2601
+ equals: props.description
2602
+ } : undefined,
2603
+ cik: props.cik !== undefined ? {
2604
+ equals: props.cik
2605
+ } : undefined,
2606
+ exchange: props.exchange !== undefined ? {
2607
+ equals: props.exchange
2608
+ } : undefined,
2609
+ currency: props.currency !== undefined ? {
2610
+ equals: props.currency
2611
+ } : undefined,
2612
+ country: props.country !== undefined ? {
2613
+ equals: props.country
2614
+ } : undefined,
2615
+ sector: props.sector !== undefined ? {
2616
+ equals: props.sector
2617
+ } : undefined,
2618
+ industry: props.industry !== undefined ? {
2619
+ equals: props.industry
2620
+ } : undefined,
2621
+ address: props.address !== undefined ? {
2622
+ equals: props.address
2623
+ } : undefined,
2624
+ officialSite: props.officialSite !== undefined ? {
2625
+ equals: props.officialSite
2626
+ } : undefined,
2627
+ fiscalYearEnd: props.fiscalYearEnd !== undefined ? {
2628
+ equals: props.fiscalYearEnd
2629
+ } : undefined,
2630
+ latestQuarter: props.latestQuarter !== undefined ? {
2631
+ equals: props.latestQuarter
2632
+ } : undefined,
2633
+ marketCapitalization: props.marketCapitalization !== undefined ? {
2634
+ equals: props.marketCapitalization
2635
+ } : undefined,
2636
+ ebitda: props.ebitda !== undefined ? {
2637
+ equals: props.ebitda
2638
+ } : undefined,
2639
+ peRatio: props.peRatio !== undefined ? {
2640
+ equals: props.peRatio
2641
+ } : undefined,
2642
+ pegRatio: props.pegRatio !== undefined ? {
2643
+ equals: props.pegRatio
2644
+ } : undefined,
2645
+ bookValue: props.bookValue !== undefined ? {
2646
+ equals: props.bookValue
2647
+ } : undefined,
2648
+ dividendPerShare: props.dividendPerShare !== undefined ? {
2649
+ equals: props.dividendPerShare
2650
+ } : undefined,
2651
+ dividendYield: props.dividendYield !== undefined ? {
2652
+ equals: props.dividendYield
2653
+ } : undefined,
2654
+ eps: props.eps !== undefined ? {
2655
+ equals: props.eps
2656
+ } : undefined,
2657
+ revenuePerShareTTM: props.revenuePerShareTTM !== undefined ? {
2658
+ equals: props.revenuePerShareTTM
2659
+ } : undefined,
2660
+ profitMargin: props.profitMargin !== undefined ? {
2661
+ equals: props.profitMargin
2662
+ } : undefined,
2663
+ operatingMarginTTM: props.operatingMarginTTM !== undefined ? {
2664
+ equals: props.operatingMarginTTM
2665
+ } : undefined,
2666
+ returnOnAssetsTTM: props.returnOnAssetsTTM !== undefined ? {
2667
+ equals: props.returnOnAssetsTTM
2668
+ } : undefined,
2669
+ returnOnEquityTTM: props.returnOnEquityTTM !== undefined ? {
2670
+ equals: props.returnOnEquityTTM
2671
+ } : undefined,
2672
+ revenueTTM: props.revenueTTM !== undefined ? {
2673
+ equals: props.revenueTTM
2674
+ } : undefined,
2675
+ grossProfitTTM: props.grossProfitTTM !== undefined ? {
2676
+ equals: props.grossProfitTTM
2677
+ } : undefined,
2678
+ dilutedEPSTTM: props.dilutedEPSTTM !== undefined ? {
2679
+ equals: props.dilutedEPSTTM
2680
+ } : undefined,
2681
+ quarterlyEarningsGrowthYOY: props.quarterlyEarningsGrowthYOY !== undefined ? {
2682
+ equals: props.quarterlyEarningsGrowthYOY
2683
+ } : undefined,
2684
+ quarterlyRevenueGrowthYOY: props.quarterlyRevenueGrowthYOY !== undefined ? {
2685
+ equals: props.quarterlyRevenueGrowthYOY
2686
+ } : undefined,
2687
+ analystTargetPrice: props.analystTargetPrice !== undefined ? {
2688
+ equals: props.analystTargetPrice
2689
+ } : undefined,
2690
+ analystRatingStrongBuy: props.analystRatingStrongBuy !== undefined ? {
2691
+ equals: props.analystRatingStrongBuy
2692
+ } : undefined,
2693
+ analystRatingBuy: props.analystRatingBuy !== undefined ? {
2694
+ equals: props.analystRatingBuy
2695
+ } : undefined,
2696
+ analystRatingHold: props.analystRatingHold !== undefined ? {
2697
+ equals: props.analystRatingHold
2698
+ } : undefined,
2699
+ analystRatingSell: props.analystRatingSell !== undefined ? {
2700
+ equals: props.analystRatingSell
2701
+ } : undefined,
2702
+ analystRatingStrongSell: props.analystRatingStrongSell !== undefined ? {
2703
+ equals: props.analystRatingStrongSell
2704
+ } : undefined,
2705
+ trailingPE: props.trailingPE !== undefined ? {
2706
+ equals: props.trailingPE
2707
+ } : undefined,
2708
+ forwardPE: props.forwardPE !== undefined ? {
2709
+ equals: props.forwardPE
2710
+ } : undefined,
2711
+ priceToSalesRatioTTM: props.priceToSalesRatioTTM !== undefined ? {
2712
+ equals: props.priceToSalesRatioTTM
2713
+ } : undefined,
2714
+ priceToBookRatio: props.priceToBookRatio !== undefined ? {
2715
+ equals: props.priceToBookRatio
2716
+ } : undefined,
2717
+ evToRevenue: props.evToRevenue !== undefined ? {
2718
+ equals: props.evToRevenue
2719
+ } : undefined,
2720
+ evToEbitda: props.evToEbitda !== undefined ? {
2721
+ equals: props.evToEbitda
2722
+ } : undefined,
2723
+ beta: props.beta !== undefined ? {
2724
+ equals: props.beta
2725
+ } : undefined,
2726
+ week52High: props.week52High !== undefined ? {
2727
+ equals: props.week52High
2728
+ } : undefined,
2729
+ week52Low: props.week52Low !== undefined ? {
2730
+ equals: props.week52Low
2731
+ } : undefined,
2732
+ day50MovingAverage: props.day50MovingAverage !== undefined ? {
2733
+ equals: props.day50MovingAverage
2734
+ } : undefined,
2735
+ day200MovingAverage: props.day200MovingAverage !== undefined ? {
2736
+ equals: props.day200MovingAverage
2737
+ } : undefined,
2738
+ sharesOutstanding: props.sharesOutstanding !== undefined ? {
2739
+ equals: props.sharesOutstanding
2740
+ } : undefined,
2741
+ dividendDate: props.dividendDate !== undefined ? {
2742
+ equals: props.dividendDate
2743
+ } : undefined,
2744
+ exDividendDate: props.exDividendDate !== undefined ? {
2745
+ equals: props.exDividendDate
2746
+ } : undefined,
2747
+ createdAt: props.createdAt !== undefined ? {
2748
+ equals: props.createdAt
2749
+ } : undefined,
2750
+ updatedAt: props.updatedAt !== undefined ? {
2751
+ equals: props.updatedAt
2752
+ } : undefined,
2753
+ },
2754
+ };
2755
+ const filteredVariables = removeUndefinedProps(variables);
2756
+ const response = await client.query({
2757
+ query: FIND_MANY_ASSET,
2758
+ variables: filteredVariables,
2759
+ fetchPolicy: 'network-only', // Force network request to avoid stale cache
2760
+ });
2761
+ if (response.errors && response.errors.length > 0)
2762
+ throw new Error(response.errors[0].message);
2763
+ if (response && response.data && response.data.assets) {
2764
+ return response.data.assets;
2765
+ }
2766
+ else {
2767
+ return [];
2768
+ }
1730
2769
  }
1731
- else {
1732
- console.error('Error in getAsset:', error);
2770
+ catch (error) {
2771
+ lastError = error;
2772
+ // Check if this is a "No record found" error - this is an expected condition, not a failure
2773
+ if (error.message === 'No Asset found') {
2774
+ return null;
2775
+ }
2776
+ // Check if this is a database connection error that we should retry
2777
+ const isConnectionError = error.message?.includes('Server has closed the connection') ||
2778
+ error.message?.includes('Cannot reach database server') ||
2779
+ error.message?.includes('Connection timed out') ||
2780
+ error.message?.includes('Accelerate') || // Prisma Accelerate proxy errors
2781
+ (error.networkError && error.networkError.message?.includes('Failed to fetch'));
2782
+ if (isConnectionError && retryCount < MAX_RETRIES - 1) {
2783
+ retryCount++;
2784
+ const delay = Math.pow(2, retryCount) * 100; // Exponential backoff: 200ms, 400ms, 800ms
2785
+ console.warn("Database connection error, retrying...");
2786
+ await new Promise(resolve => setTimeout(resolve, delay));
2787
+ continue;
2788
+ }
2789
+ // Log the error and rethrow
2790
+ console.error("Database error occurred:", error);
1733
2791
  throw error;
1734
2792
  }
1735
2793
  }
2794
+ // If we exhausted retries, throw the last error
2795
+ throw lastError;
1736
2796
  }
1737
2797
  };
1738
2798
  //# sourceMappingURL=Asset.js.map