@adaptic/backend-legacy 0.0.45 → 0.0.47
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ABTest.cjs +19 -18
- package/Account.cjs +19 -18
- package/AccountLinkingRequest.cjs +19 -18
- package/Action.cjs +19 -18
- package/Alert.cjs +19 -18
- package/Allocation.cjs +19 -18
- package/AlpacaAccount.cjs +19 -18
- package/AnalyticsConfiguration.cjs +19 -18
- package/AnalyticsSnapshot.cjs +19 -18
- package/Asset.cjs +19 -18
- package/Authenticator.cjs +19 -18
- package/Configuration.cjs +19 -18
- package/ConflictEvent.cjs +19 -18
- package/ConnectionHealthSnapshot.cjs +19 -18
- package/Customer.cjs +19 -18
- package/DeadLetterMessage.cjs +19 -18
- package/EconomicEvent.cjs +19 -18
- package/Event.cjs +19 -18
- package/EventSnapshot.cjs +19 -18
- package/FeatureImportanceAnalysis.cjs +19 -18
- package/InstitutionalFlowSignal.cjs +19 -18
- package/InstitutionalHolding.cjs +19 -18
- package/InstitutionalSentimentAlerts.cjs +19 -18
- package/InstitutionalSentimentErrors.cjs +19 -18
- package/InstitutionalSentimentHistory.cjs +19 -18
- package/InstitutionalSentimentMetrics.cjs +19 -18
- package/InviteToken.cjs +19 -18
- package/LinkedProvider.cjs +19 -18
- package/MLTrainingData.cjs +19 -18
- package/MarketSentiment.cjs +19 -18
- package/ModelArtifact.cjs +19 -18
- package/ModelVersion.cjs +19 -18
- package/ModelVersionArtifact.cjs +19 -18
- package/NewsArticle.cjs +19 -18
- package/NewsArticleAssetSentiment.cjs +19 -18
- package/OptionsContract.cjs +19 -18
- package/OptionsGreeksHistory.cjs +19 -18
- package/OptionsPosition.cjs +19 -18
- package/OptionsTradeExecution.cjs +19 -18
- package/PortfolioGreeksHistory.cjs +19 -18
- package/ScheduledOptionOrder.cjs +19 -18
- package/Session.cjs +19 -18
- package/SignalGeneratorMetrics.cjs +19 -18
- package/SignalLineage.cjs +19 -18
- package/SignalOutcome.cjs +19 -18
- package/SignalPriorityQueue.cjs +19 -18
- package/SyncEvent.cjs +19 -18
- package/SystemAlert.cjs +19 -18
- package/Trade.cjs +19 -18
- package/TradeAuditEvent.cjs +19 -18
- package/TradeExecutionHistory.cjs +19 -18
- package/User.cjs +19 -18
- package/VerificationToken.cjs +19 -18
- package/WaitlistEntry.cjs +19 -18
- package/client.cjs +11 -10
- package/esm/ABTest.d.ts.map +1 -1
- package/esm/ABTest.js.map +1 -1
- package/esm/ABTest.mjs +19 -18
- package/esm/Account.d.ts.map +1 -1
- package/esm/Account.js.map +1 -1
- package/esm/Account.mjs +19 -18
- package/esm/AccountLinkingRequest.d.ts.map +1 -1
- package/esm/AccountLinkingRequest.js.map +1 -1
- package/esm/AccountLinkingRequest.mjs +19 -18
- package/esm/Action.d.ts.map +1 -1
- package/esm/Action.js.map +1 -1
- package/esm/Action.mjs +19 -18
- package/esm/Alert.d.ts.map +1 -1
- package/esm/Alert.js.map +1 -1
- package/esm/Alert.mjs +19 -18
- package/esm/Allocation.d.ts.map +1 -1
- package/esm/Allocation.js.map +1 -1
- package/esm/Allocation.mjs +19 -18
- package/esm/AlpacaAccount.d.ts.map +1 -1
- package/esm/AlpacaAccount.js.map +1 -1
- package/esm/AlpacaAccount.mjs +19 -18
- package/esm/AnalyticsConfiguration.d.ts.map +1 -1
- package/esm/AnalyticsConfiguration.js.map +1 -1
- package/esm/AnalyticsConfiguration.mjs +19 -18
- package/esm/AnalyticsSnapshot.d.ts.map +1 -1
- package/esm/AnalyticsSnapshot.js.map +1 -1
- package/esm/AnalyticsSnapshot.mjs +19 -18
- package/esm/Asset.d.ts.map +1 -1
- package/esm/Asset.js.map +1 -1
- package/esm/Asset.mjs +19 -18
- package/esm/Authenticator.d.ts.map +1 -1
- package/esm/Authenticator.js.map +1 -1
- package/esm/Authenticator.mjs +19 -18
- package/esm/Configuration.d.ts.map +1 -1
- package/esm/Configuration.js.map +1 -1
- package/esm/Configuration.mjs +19 -18
- package/esm/ConflictEvent.d.ts.map +1 -1
- package/esm/ConflictEvent.js.map +1 -1
- package/esm/ConflictEvent.mjs +19 -18
- package/esm/ConnectionHealthSnapshot.d.ts.map +1 -1
- package/esm/ConnectionHealthSnapshot.js.map +1 -1
- package/esm/ConnectionHealthSnapshot.mjs +19 -18
- package/esm/Customer.d.ts.map +1 -1
- package/esm/Customer.js.map +1 -1
- package/esm/Customer.mjs +19 -18
- package/esm/DeadLetterMessage.d.ts.map +1 -1
- package/esm/DeadLetterMessage.js.map +1 -1
- package/esm/DeadLetterMessage.mjs +19 -18
- package/esm/EconomicEvent.d.ts.map +1 -1
- package/esm/EconomicEvent.js.map +1 -1
- package/esm/EconomicEvent.mjs +19 -18
- package/esm/Event.d.ts.map +1 -1
- package/esm/Event.js.map +1 -1
- package/esm/Event.mjs +19 -18
- package/esm/EventSnapshot.d.ts.map +1 -1
- package/esm/EventSnapshot.js.map +1 -1
- package/esm/EventSnapshot.mjs +19 -18
- package/esm/FeatureImportanceAnalysis.d.ts.map +1 -1
- package/esm/FeatureImportanceAnalysis.js.map +1 -1
- package/esm/FeatureImportanceAnalysis.mjs +19 -18
- package/esm/InstitutionalFlowSignal.d.ts.map +1 -1
- package/esm/InstitutionalFlowSignal.js.map +1 -1
- package/esm/InstitutionalFlowSignal.mjs +19 -18
- package/esm/InstitutionalHolding.d.ts.map +1 -1
- package/esm/InstitutionalHolding.js.map +1 -1
- package/esm/InstitutionalHolding.mjs +19 -18
- package/esm/InstitutionalSentimentAlerts.d.ts.map +1 -1
- package/esm/InstitutionalSentimentAlerts.js.map +1 -1
- package/esm/InstitutionalSentimentAlerts.mjs +19 -18
- package/esm/InstitutionalSentimentErrors.d.ts.map +1 -1
- package/esm/InstitutionalSentimentErrors.js.map +1 -1
- package/esm/InstitutionalSentimentErrors.mjs +19 -18
- package/esm/InstitutionalSentimentHistory.d.ts.map +1 -1
- package/esm/InstitutionalSentimentHistory.js.map +1 -1
- package/esm/InstitutionalSentimentHistory.mjs +19 -18
- package/esm/InstitutionalSentimentMetrics.d.ts.map +1 -1
- package/esm/InstitutionalSentimentMetrics.js.map +1 -1
- package/esm/InstitutionalSentimentMetrics.mjs +19 -18
- package/esm/InviteToken.d.ts.map +1 -1
- package/esm/InviteToken.js.map +1 -1
- package/esm/InviteToken.mjs +19 -18
- package/esm/LinkedProvider.d.ts.map +1 -1
- package/esm/LinkedProvider.js.map +1 -1
- package/esm/LinkedProvider.mjs +19 -18
- package/esm/MLTrainingData.d.ts.map +1 -1
- package/esm/MLTrainingData.js.map +1 -1
- package/esm/MLTrainingData.mjs +19 -18
- package/esm/MarketSentiment.d.ts.map +1 -1
- package/esm/MarketSentiment.js.map +1 -1
- package/esm/MarketSentiment.mjs +19 -18
- package/esm/ModelArtifact.d.ts.map +1 -1
- package/esm/ModelArtifact.js.map +1 -1
- package/esm/ModelArtifact.mjs +19 -18
- package/esm/ModelVersion.d.ts.map +1 -1
- package/esm/ModelVersion.js.map +1 -1
- package/esm/ModelVersion.mjs +19 -18
- package/esm/ModelVersionArtifact.d.ts.map +1 -1
- package/esm/ModelVersionArtifact.js.map +1 -1
- package/esm/ModelVersionArtifact.mjs +19 -18
- package/esm/NewsArticle.d.ts.map +1 -1
- package/esm/NewsArticle.js.map +1 -1
- package/esm/NewsArticle.mjs +19 -18
- package/esm/NewsArticleAssetSentiment.d.ts.map +1 -1
- package/esm/NewsArticleAssetSentiment.js.map +1 -1
- package/esm/NewsArticleAssetSentiment.mjs +19 -18
- package/esm/OptionsContract.d.ts.map +1 -1
- package/esm/OptionsContract.js.map +1 -1
- package/esm/OptionsContract.mjs +19 -18
- package/esm/OptionsGreeksHistory.d.ts.map +1 -1
- package/esm/OptionsGreeksHistory.js.map +1 -1
- package/esm/OptionsGreeksHistory.mjs +19 -18
- package/esm/OptionsPosition.d.ts.map +1 -1
- package/esm/OptionsPosition.js.map +1 -1
- package/esm/OptionsPosition.mjs +19 -18
- package/esm/OptionsTradeExecution.d.ts.map +1 -1
- package/esm/OptionsTradeExecution.js.map +1 -1
- package/esm/OptionsTradeExecution.mjs +19 -18
- package/esm/PortfolioGreeksHistory.d.ts.map +1 -1
- package/esm/PortfolioGreeksHistory.js.map +1 -1
- package/esm/PortfolioGreeksHistory.mjs +19 -18
- package/esm/ScheduledOptionOrder.d.ts.map +1 -1
- package/esm/ScheduledOptionOrder.js.map +1 -1
- package/esm/ScheduledOptionOrder.mjs +19 -18
- package/esm/Session.d.ts.map +1 -1
- package/esm/Session.js.map +1 -1
- package/esm/Session.mjs +19 -18
- package/esm/SignalGeneratorMetrics.d.ts.map +1 -1
- package/esm/SignalGeneratorMetrics.js.map +1 -1
- package/esm/SignalGeneratorMetrics.mjs +19 -18
- package/esm/SignalLineage.d.ts.map +1 -1
- package/esm/SignalLineage.js.map +1 -1
- package/esm/SignalLineage.mjs +19 -18
- package/esm/SignalOutcome.d.ts.map +1 -1
- package/esm/SignalOutcome.js.map +1 -1
- package/esm/SignalOutcome.mjs +19 -18
- package/esm/SignalPriorityQueue.d.ts.map +1 -1
- package/esm/SignalPriorityQueue.js.map +1 -1
- package/esm/SignalPriorityQueue.mjs +19 -18
- package/esm/SyncEvent.d.ts.map +1 -1
- package/esm/SyncEvent.js.map +1 -1
- package/esm/SyncEvent.mjs +19 -18
- package/esm/SystemAlert.d.ts.map +1 -1
- package/esm/SystemAlert.js.map +1 -1
- package/esm/SystemAlert.mjs +19 -18
- package/esm/Trade.d.ts.map +1 -1
- package/esm/Trade.js.map +1 -1
- package/esm/Trade.mjs +19 -18
- package/esm/TradeAuditEvent.d.ts.map +1 -1
- package/esm/TradeAuditEvent.js.map +1 -1
- package/esm/TradeAuditEvent.mjs +19 -18
- package/esm/TradeExecutionHistory.d.ts.map +1 -1
- package/esm/TradeExecutionHistory.js.map +1 -1
- package/esm/TradeExecutionHistory.mjs +19 -18
- package/esm/User.d.ts.map +1 -1
- package/esm/User.js.map +1 -1
- package/esm/User.mjs +19 -18
- package/esm/VerificationToken.d.ts.map +1 -1
- package/esm/VerificationToken.js.map +1 -1
- package/esm/VerificationToken.mjs +19 -18
- package/esm/WaitlistEntry.d.ts.map +1 -1
- package/esm/WaitlistEntry.js.map +1 -1
- package/esm/WaitlistEntry.mjs +19 -18
- package/esm/client.d.ts.map +1 -1
- package/esm/client.js.map +1 -1
- package/esm/client.mjs +11 -10
- package/esm/config/jwtConfig.d.ts.map +1 -1
- package/esm/config/jwtConfig.js.map +1 -1
- package/esm/config/jwtConfig.mjs +5 -4
- package/esm/getToken.d.ts.map +1 -1
- package/esm/getToken.js.map +1 -1
- package/esm/getToken.mjs +3 -2
- package/esm/health.d.ts +16 -0
- package/esm/health.d.ts.map +1 -0
- package/esm/health.js.map +1 -0
- package/esm/health.mjs +74 -0
- package/esm/middleware/auth.d.ts.map +1 -1
- package/esm/middleware/auth.js.map +1 -1
- package/esm/middleware/auth.mjs +3 -2
- package/esm/middleware/rate-limiter.d.ts +8 -4
- package/esm/middleware/rate-limiter.d.ts.map +1 -1
- package/esm/middleware/rate-limiter.js.map +1 -1
- package/esm/middleware/rate-limiter.mjs +53 -16
- package/esm/plugins/error-sanitizer.d.ts.map +1 -1
- package/esm/plugins/error-sanitizer.js.map +1 -1
- package/esm/plugins/error-sanitizer.mjs +6 -5
- package/esm/plugins/query-depth-limiter.d.ts.map +1 -1
- package/esm/plugins/query-depth-limiter.js.map +1 -1
- package/esm/plugins/query-depth-limiter.mjs +2 -2
- package/esm/resolvers/custom/OptionsGreeksHistoryCustomResolver.d.ts +7 -1
- package/esm/resolvers/custom/OptionsGreeksHistoryCustomResolver.d.ts.map +1 -1
- package/esm/resolvers/custom/OptionsGreeksHistoryCustomResolver.js.map +1 -1
- package/esm/scripts/migrate-openai-model-enum.js.map +1 -1
- package/esm/scripts/migrate-openai-model-enum.mjs +11 -10
- package/esm/scripts/set-default-openai-model.js.map +1 -1
- package/esm/scripts/set-default-openai-model.mjs +7 -6
- package/esm/utils/logger.d.ts +9 -0
- package/esm/utils/logger.d.ts.map +1 -0
- package/esm/utils/logger.js.map +1 -0
- package/esm/utils/logger.mjs +28 -0
- package/esm/utils.d.ts +12 -1
- package/esm/utils.d.ts.map +1 -1
- package/esm/utils.js.map +1 -1
- package/esm/utils.mjs +20 -7
- package/getToken.cjs +3 -2
- package/health.cjs +80 -0
- package/health.d.ts +16 -0
- package/package.json +1 -1
- package/resolvers/custom/OptionsGreeksHistoryCustomResolver.d.ts +7 -1
- package/resolvers/custom/OptionsGreeksHistoryCustomResolver.d.ts.map +1 -1
- package/resolvers/custom/OptionsGreeksHistoryCustomResolver.js.map +1 -1
- package/server.cjs +35 -39
- package/utils.cjs +20 -7
- package/utils.d.ts +12 -1
|
@@ -1,6 +1,32 @@
|
|
|
1
1
|
// Integration: add to server.ts - app.use('/graphql', graphqlRateLimiter) and app.use('/auth', authRateLimiter)
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* Checks whether a request carries a valid-looking authentication token.
|
|
4
|
+
* Does not verify the token -- only checks for its presence in the
|
|
5
|
+
* Authorization header as a Bearer token with three dot-separated parts
|
|
6
|
+
* (standard JWT structure).
|
|
7
|
+
*/
|
|
8
|
+
function isAuthenticated(req) {
|
|
9
|
+
const authHeader = req.headers.authorization || '';
|
|
10
|
+
if (!authHeader.startsWith('Bearer ')) {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
const token = authHeader.slice(7);
|
|
14
|
+
// Google OAuth tokens (ya29.) and JWTs (three dot-separated segments) count
|
|
15
|
+
if (token.startsWith('ya29.')) {
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
return token.split('.').length === 3;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Creates a simple in-memory rate limiter middleware with separate limits
|
|
22
|
+
* for authenticated and unauthenticated requests.
|
|
23
|
+
*
|
|
24
|
+
* Response headers (when standardHeaders is enabled):
|
|
25
|
+
* X-RateLimit-Limit - maximum requests allowed in the current window
|
|
26
|
+
* X-RateLimit-Remaining - requests remaining in the current window
|
|
27
|
+
* X-RateLimit-Reset - seconds until the current window resets
|
|
28
|
+
* Retry-After - seconds to wait before retrying (only on 429)
|
|
29
|
+
*
|
|
4
30
|
* @param config - Rate limit configuration
|
|
5
31
|
* @returns Express middleware function
|
|
6
32
|
*/
|
|
@@ -17,26 +43,31 @@ function createRateLimiter(config) {
|
|
|
17
43
|
}, 60000);
|
|
18
44
|
return (req, res, next) => {
|
|
19
45
|
const identifier = req.ip || req.connection.remoteAddress || 'unknown';
|
|
46
|
+
const authenticated = isAuthenticated(req);
|
|
47
|
+
const effectiveMax = authenticated ? config.maxAuthenticated : config.maxUnauthenticated;
|
|
48
|
+
const storeKey = `${identifier}:${authenticated ? 'auth' : 'anon'}`;
|
|
20
49
|
const now = Date.now();
|
|
21
|
-
if (!store[
|
|
22
|
-
store[
|
|
50
|
+
if (!store[storeKey] || store[storeKey].resetTime < now) {
|
|
51
|
+
store[storeKey] = {
|
|
23
52
|
count: 1,
|
|
24
53
|
resetTime: now + config.windowMs,
|
|
25
54
|
};
|
|
26
55
|
}
|
|
27
56
|
else {
|
|
28
|
-
store[
|
|
57
|
+
store[storeKey].count += 1;
|
|
29
58
|
}
|
|
30
|
-
const current = store[
|
|
31
|
-
const remaining = Math.max(0,
|
|
32
|
-
const
|
|
59
|
+
const current = store[storeKey];
|
|
60
|
+
const remaining = Math.max(0, effectiveMax - current.count);
|
|
61
|
+
const resetSeconds = Math.ceil((current.resetTime - now) / 1000);
|
|
33
62
|
// Add rate limit headers
|
|
34
63
|
if (config.standardHeaders !== false) {
|
|
35
|
-
res.setHeader('X-RateLimit-Limit',
|
|
64
|
+
res.setHeader('X-RateLimit-Limit', effectiveMax.toString());
|
|
36
65
|
res.setHeader('X-RateLimit-Remaining', remaining.toString());
|
|
37
|
-
res.setHeader('X-RateLimit-Reset',
|
|
66
|
+
res.setHeader('X-RateLimit-Reset', resetSeconds.toString());
|
|
38
67
|
}
|
|
39
|
-
if (current.count >
|
|
68
|
+
if (current.count > effectiveMax) {
|
|
69
|
+
// Include Retry-After header on 429 responses (RFC 6585 / RFC 7231)
|
|
70
|
+
res.setHeader('Retry-After', resetSeconds.toString());
|
|
40
71
|
res.status(429).json(config.message);
|
|
41
72
|
return;
|
|
42
73
|
}
|
|
@@ -44,23 +75,29 @@ function createRateLimiter(config) {
|
|
|
44
75
|
};
|
|
45
76
|
}
|
|
46
77
|
/**
|
|
47
|
-
* Rate limiter for GraphQL endpoint
|
|
48
|
-
*
|
|
78
|
+
* Rate limiter for GraphQL endpoint.
|
|
79
|
+
*
|
|
80
|
+
* Authenticated requests: 1000 requests per 15 minutes (configurable via RATE_LIMIT_MAX)
|
|
81
|
+
* Unauthenticated requests: 200 requests per 15 minutes (configurable via RATE_LIMIT_MAX_UNAUTH)
|
|
49
82
|
*/
|
|
50
83
|
export const graphqlRateLimiter = createRateLimiter({
|
|
51
84
|
windowMs: 15 * 60 * 1000, // 15 minutes
|
|
52
|
-
|
|
85
|
+
maxAuthenticated: parseInt(process.env.RATE_LIMIT_MAX || '1000', 10),
|
|
86
|
+
maxUnauthenticated: parseInt(process.env.RATE_LIMIT_MAX_UNAUTH || '200', 10),
|
|
53
87
|
standardHeaders: true,
|
|
54
88
|
legacyHeaders: false,
|
|
55
89
|
message: { errors: [{ message: 'Too many requests, please try again later.' }] },
|
|
56
90
|
});
|
|
57
91
|
/**
|
|
58
|
-
* Rate limiter for authentication endpoints
|
|
59
|
-
*
|
|
92
|
+
* Rate limiter for authentication endpoints.
|
|
93
|
+
*
|
|
94
|
+
* Authenticated requests: 50 requests per 15 minutes
|
|
95
|
+
* Unauthenticated requests: 20 requests per 15 minutes
|
|
60
96
|
*/
|
|
61
97
|
export const authRateLimiter = createRateLimiter({
|
|
62
98
|
windowMs: 15 * 60 * 1000, // 15 minutes
|
|
63
|
-
|
|
99
|
+
maxAuthenticated: 50,
|
|
100
|
+
maxUnauthenticated: 20,
|
|
64
101
|
standardHeaders: true,
|
|
65
102
|
legacyHeaders: false,
|
|
66
103
|
message: { errors: [{ message: 'Too many authentication attempts.' }] },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-sanitizer.d.ts","sourceRoot":"","sources":["../../../src/plugins/error-sanitizer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAgB,qBAAqB,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"error-sanitizer.d.ts","sourceRoot":"","sources":["../../../src/plugins/error-sanitizer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAgB,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAsJ9D;;GAEG;AACH,wBAAgB,oBAAoB,KAIhC,gBAAgB,qBAAqB,EACrC,OAAO,OAAO,KACb,qBAAqB,CAiDzB;AAED;;;GAGG;AACH,eAAO,MAAM,WAAW,mBAzDJ,qBAAqB,SAC9B,OAAO,KACb,qBAuD4C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-sanitizer.js","sourceRoot":"","sources":["../../../src/plugins/error-sanitizer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,YAAY,EAAyB,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"error-sanitizer.js","sourceRoot":"","sources":["../../../src/plugins/error-sanitizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
* - In development: shows full error details
|
|
26
26
|
*/
|
|
27
27
|
import { GraphQLError } from 'graphql';
|
|
28
|
+
import { logger } from '../utils/logger.mjs';
|
|
28
29
|
/**
|
|
29
30
|
* Error codes that are considered safe to expose to clients
|
|
30
31
|
*/
|
|
@@ -76,16 +77,16 @@ function logError(error, isProduction) {
|
|
|
76
77
|
};
|
|
77
78
|
// In development, include the full error details
|
|
78
79
|
if (!isProduction) {
|
|
79
|
-
|
|
80
|
+
logger.error('[GraphQL Error]', {
|
|
80
81
|
...logData,
|
|
81
|
-
extensions,
|
|
82
|
-
originalError: error.originalError,
|
|
82
|
+
extensions: extensions,
|
|
83
|
+
originalError: String(error.originalError),
|
|
83
84
|
stack: error.originalError?.stack,
|
|
84
85
|
});
|
|
85
86
|
}
|
|
86
87
|
else {
|
|
87
88
|
// In production, log full details but without stack traces in some cases
|
|
88
|
-
|
|
89
|
+
logger.error('[GraphQL Error]', {
|
|
89
90
|
...logData,
|
|
90
91
|
// Only include stack for internal errors (not validation)
|
|
91
92
|
stack: isSafeError(extensions?.code)
|
|
@@ -137,7 +138,7 @@ export function createErrorSanitizer() {
|
|
|
137
138
|
const graphqlError = error instanceof GraphQLError ? error : null;
|
|
138
139
|
if (!graphqlError) {
|
|
139
140
|
// If it's not a GraphQL error, log and sanitize
|
|
140
|
-
|
|
141
|
+
logger.error('[Non-GraphQL Error]', { error: String(error) });
|
|
141
142
|
return {
|
|
142
143
|
message: isProduction
|
|
143
144
|
? 'Internal server error'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-depth-limiter.d.ts","sourceRoot":"","sources":["../../../src/plugins/query-depth-limiter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,kBAAkB,EAA0B,MAAM,gBAAgB,CAAC;AAa5E,UAAU,mBAAmB;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE;QACJ,OAAO,CAAC,EAAE;YACR,aAAa,CAAC,EAAE,MAAM,CAAC;YACvB,cAAc,CAAC,EAAE,MAAM,CAAC;SACzB,CAAC;KACH,CAAC;IACF,IAAI,CAAC,EAAE;QACL,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,UAAU,wBAAwB;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AA+GD;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,GAAE,wBAA6B,GACrC,kBAAkB,CAAC,mBAAmB,CAAC,
|
|
1
|
+
{"version":3,"file":"query-depth-limiter.d.ts","sourceRoot":"","sources":["../../../src/plugins/query-depth-limiter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,kBAAkB,EAA0B,MAAM,gBAAgB,CAAC;AAa5E,UAAU,mBAAmB;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE;QACJ,OAAO,CAAC,EAAE;YACR,aAAa,CAAC,EAAE,MAAM,CAAC;YACvB,cAAc,CAAC,EAAE,MAAM,CAAC;SACzB,CAAC;KACH,CAAC;IACF,IAAI,CAAC,EAAE;QACL,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,UAAU,wBAAwB;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AA+GD;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,GAAE,wBAA6B,GACrC,kBAAkB,CAAC,mBAAmB,CAAC,CAgDzC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-depth-limiter.js","sourceRoot":"","sources":["../../../src/plugins/query-depth-limiter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;
|
|
1
|
+
{"version":3,"file":"query-depth-limiter.js","sourceRoot":"","sources":["../../../src/plugins/query-depth-limiter.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
* Configuration:
|
|
22
22
|
* - Set GRAPHQL_MAX_DEPTH environment variable (default: 6)
|
|
23
23
|
*/
|
|
24
|
+
import { logger } from '../utils/logger.mjs';
|
|
24
25
|
import { GraphQLError } from 'graphql';
|
|
25
26
|
/**
|
|
26
27
|
* Calculates the depth of a GraphQL query by traversing its AST
|
|
@@ -121,14 +122,13 @@ export function queryDepthLimiterPlugin(options = {}) {
|
|
|
121
122
|
const userId = contextValue?.user?.sub || contextValue?.user?.email || 'anonymous';
|
|
122
123
|
const requestId = contextValue?.req?.headers?.['x-request-id'] || 'unknown';
|
|
123
124
|
// Log the rejected query
|
|
124
|
-
|
|
125
|
+
logger.error('[QueryDepthLimiter] Query rejected', {
|
|
125
126
|
depth,
|
|
126
127
|
maxDepth,
|
|
127
128
|
queryName,
|
|
128
129
|
userId,
|
|
129
130
|
requestId,
|
|
130
131
|
query: truncatedQuery,
|
|
131
|
-
timestamp: new Date().toISOString(),
|
|
132
132
|
});
|
|
133
133
|
throw new GraphQLError(`Query depth of ${depth} exceeds maximum allowed depth of ${maxDepth}`, {
|
|
134
134
|
extensions: {
|
|
@@ -1,4 +1,9 @@
|
|
|
1
|
+
import type { PrismaClient } from '@prisma/client';
|
|
1
2
|
import { OptionsGreeksHistorySystemSummary } from './OptionsGreeksHistorySystemSummary';
|
|
3
|
+
/** GraphQL resolver context containing the Prisma client instance */
|
|
4
|
+
interface GraphQLContext {
|
|
5
|
+
prisma: PrismaClient;
|
|
6
|
+
}
|
|
2
7
|
/**
|
|
3
8
|
* Custom resolver for PortfolioGreeksHistory aggregation queries
|
|
4
9
|
* Provides system-wide analytics and summary statistics
|
|
@@ -9,6 +14,7 @@ export declare class OptionsGreeksHistoryCustomResolver {
|
|
|
9
14
|
* Get system-wide summary statistics for OptionsGreeksHistory
|
|
10
15
|
* Executes aggregation query to get total accounts, snapshots, and time range
|
|
11
16
|
*/
|
|
12
|
-
optionsGreeksHistorySystemSummary(ctx:
|
|
17
|
+
optionsGreeksHistorySystemSummary(ctx: GraphQLContext): Promise<OptionsGreeksHistorySystemSummary>;
|
|
13
18
|
}
|
|
19
|
+
export {};
|
|
14
20
|
//# sourceMappingURL=OptionsGreeksHistoryCustomResolver.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OptionsGreeksHistoryCustomResolver.d.ts","sourceRoot":"","sources":["../../../../src/resolvers/custom/OptionsGreeksHistoryCustomResolver.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"OptionsGreeksHistoryCustomResolver.d.ts","sourceRoot":"","sources":["../../../../src/resolvers/custom/OptionsGreeksHistoryCustomResolver.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD,OAAO,EAAE,iCAAiC,EAAE,MAAM,qCAAqC,CAAC;AAGxF,qEAAqE;AACrE,UAAU,cAAc;IACtB,MAAM,EAAE,YAAY,CAAC;CACtB;AAED;;;;GAIG;AACH,qBACa,kCAAkC;IAC7C;;;OAGG;IAKG,iCAAiC,CAClB,GAAG,EAAE,cAAc,GACrC,OAAO,CAAC,iCAAiC,CAAC;CAsC9C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OptionsGreeksHistoryCustomResolver.js","sourceRoot":"","sources":["../../../../src/resolvers/custom/OptionsGreeksHistoryCustomResolver.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,KAAK,WAAW,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"OptionsGreeksHistoryCustomResolver.js","sourceRoot":"","sources":["../../../../src/resolvers/custom/OptionsGreeksHistoryCustomResolver.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,KAAK,WAAW,MAAM,cAAc,CAAC;AAE5C,OAAO,EAAE,sBAAsB,EAAE,MAAM,kEAAkE,CAAC;AAC1G,OAAO,EAAE,iCAAiC,EAAE,MAAM,qCAAqC,CAAC;AACxF,OAAO,EAAE,oBAAoB,EAAE,MAAM,4CAA4C,CAAC;AAOlF;;;;GAIG;AAEI,IAAM,kCAAkC,GAAxC,MAAM,kCAAkC;IAC7C;;;OAGG;IAKG,AAAN,KAAK,CAAC,iCAAiC,CAClB,GAAmB;QAEtC,MAAM,MAAM,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;QAEzC,4BAA4B;QAC5B,yBAAyB;QACzB,SAAS;QACT,kDAAkD;QAClD,iCAAiC;QACjC,uCAAuC;QACvC,sCAAsC;QACtC,gCAAgC;QAChC,MAAM,CAAC,eAAe,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACtD,MAAM,CAAC,sBAAsB,CAAC,SAAS,CAAC;gBACtC,IAAI,EAAE;oBACJ,SAAS,EAAE,IAAI;iBAChB;gBACD,IAAI,EAAE;oBACJ,SAAS,EAAE,IAAI;iBAChB;aACF,CAAC;YACF,MAAM,CAAC,sBAAsB,CAAC,KAAK,EAAE;SACtC,CAAC,CAAC;QAEH,iDAAiD;QACjD,MAAM,gBAAgB,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,OAAO,CAAC;YACnE,EAAE,EAAE,CAAC,WAAW,CAAC;YACjB,MAAM,EAAE;gBACN,SAAS,EAAE,IAAI;aAChB;SACF,CAAC,CAAC;QAEH,OAAO;YACL,aAAa,EAAE,gBAAgB,CAAC,MAAM;YACtC,cAAc,EAAE,UAAU;YAC1B,cAAc,EAAE,eAAe,CAAC,IAAI,CAAC,SAAS;YAC9C,cAAc,EAAE,eAAe,CAAC,IAAI,CAAC,SAAS;SAC/C,CAAC;IACJ,CAAC;CACF,CAAA;AAxCO;IAJL,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,iCAAiC,EAAE;QAChE,QAAQ,EAAE,KAAK;QACf,WAAW,EAAE,4DAA4D;KAC1E,CAAC;IAEC,WAAA,WAAW,CAAC,GAAG,EAAE,CAAA;;;;2FAsCnB;AAhDU,kCAAkC;IAD9C,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,sBAAsB,CAAC;GACvC,kCAAkC,CAiD9C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrate-openai-model-enum.js","sourceRoot":"","sources":["../../../src/scripts/migrate-openai-model-enum.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"migrate-openai-model-enum.js","sourceRoot":"","sources":["../../../src/scripts/migrate-openai-model-enum.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC,MAAM,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;AAElC,KAAK,UAAU,sBAAsB;IACnC,MAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;IAEtD,IAAI,CAAC;QACH,6DAA6D;QAC7D,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,SAAS,CAE3C;;;;;KAKA,CAAC;QAEF,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;YACzD,aAAa,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;gBAC/B,MAAM,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,WAAW,KAAK,MAAM,CAAC,KAAK,QAAQ,CAAC,CAAC;YAClE,CAAC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;YAC5D,MAAM,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;QAC3E,CAAC;QAED,yDAAyD;QACzD,qDAAqD;QACrD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,CAAA;;;;KAItC,CAAC;QAEF,MAAM,CAAC,IAAI,CAAC,WAAW,MAAM,mEAAmE,CAAC,CAAC;QAClG,MAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC3D,MAAM,KAAK,CAAC;IACd,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,oBAAoB;AACpB,sBAAsB,EAAE;KACrB,IAAI,CAAC,GAAG,EAAE;IACT,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC;KACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACf,MAAM,CAAC,KAAK,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { PrismaClient } from '@prisma/client';
|
|
2
|
+
import { logger } from '../utils/logger.mjs';
|
|
2
3
|
const prisma = new PrismaClient();
|
|
3
4
|
async function migrateOpenaiModelEnum() {
|
|
4
|
-
|
|
5
|
+
logger.info('Starting OpenaiModel enum migration...');
|
|
5
6
|
try {
|
|
6
7
|
// Check which models are currently in use in the users table
|
|
7
8
|
const currentModels = await prisma.$queryRaw `
|
|
@@ -11,14 +12,14 @@ async function migrateOpenaiModelEnum() {
|
|
|
11
12
|
GROUP BY "openaiModel"
|
|
12
13
|
`;
|
|
13
14
|
if (currentModels.length > 0) {
|
|
14
|
-
|
|
15
|
+
logger.info('Found users with deprecated model values:');
|
|
15
16
|
currentModels.forEach((record) => {
|
|
16
|
-
|
|
17
|
+
logger.info(` - ${record.openaiModel}: ${record.count} users`);
|
|
17
18
|
});
|
|
18
19
|
}
|
|
19
20
|
else {
|
|
20
|
-
|
|
21
|
-
|
|
21
|
+
logger.info('No users found with deprecated model values.');
|
|
22
|
+
logger.info('Migration not needed, but will proceed anyway for safety.');
|
|
22
23
|
}
|
|
23
24
|
// Update all deprecated model values to NULL temporarily
|
|
24
25
|
// This allows the schema migration to proceed safely
|
|
@@ -27,11 +28,11 @@ async function migrateOpenaiModelEnum() {
|
|
|
27
28
|
SET "openaiModel" = NULL
|
|
28
29
|
WHERE "openaiModel" IN ('GPT_4O', 'GPT_4O_MINI', 'O1_PREVIEW', 'O1_MINI', 'O1', 'O3_MINI')
|
|
29
30
|
`;
|
|
30
|
-
|
|
31
|
-
|
|
31
|
+
logger.info(`Updated ${result} users to NULL (will be set to GPT_5_MINI after schema migration)`);
|
|
32
|
+
logger.info('Migration completed successfully!');
|
|
32
33
|
}
|
|
33
34
|
catch (error) {
|
|
34
|
-
|
|
35
|
+
logger.error('Migration failed', { error: String(error) });
|
|
35
36
|
throw error;
|
|
36
37
|
}
|
|
37
38
|
finally {
|
|
@@ -41,11 +42,11 @@ async function migrateOpenaiModelEnum() {
|
|
|
41
42
|
// Run the migration
|
|
42
43
|
migrateOpenaiModelEnum()
|
|
43
44
|
.then(() => {
|
|
44
|
-
|
|
45
|
+
logger.info('Script finished successfully');
|
|
45
46
|
process.exit(0);
|
|
46
47
|
})
|
|
47
48
|
.catch((error) => {
|
|
48
|
-
|
|
49
|
+
logger.error('Script failed', { error: String(error) });
|
|
49
50
|
process.exit(1);
|
|
50
51
|
});
|
|
51
52
|
//# sourceMappingURL=migrate-openai-model-enum.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"set-default-openai-model.js","sourceRoot":"","sources":["../../../src/scripts/set-default-openai-model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"set-default-openai-model.js","sourceRoot":"","sources":["../../../src/scripts/set-default-openai-model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC,MAAM,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;AAElC,KAAK,UAAU,qBAAqB;IAClC,MAAM,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;IAEtE,IAAI,CAAC;QACH,uDAAuD;QACvD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,CAAA;;;;KAItC,CAAC;QAEF,MAAM,CAAC,IAAI,CAAC,WAAW,MAAM,sBAAsB,CAAC,CAAC;QACrD,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IACjD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,6BAA6B,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACtE,MAAM,KAAK,CAAC;IACd,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,iBAAiB;AACjB,qBAAqB,EAAE;KACpB,IAAI,CAAC,GAAG,EAAE;IACT,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC;KACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACf,MAAM,CAAC,KAAK,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { PrismaClient } from '@prisma/client';
|
|
2
|
+
import { logger } from '../utils/logger.mjs';
|
|
2
3
|
const prisma = new PrismaClient();
|
|
3
4
|
async function setDefaultOpenaiModel() {
|
|
4
|
-
|
|
5
|
+
logger.info('Setting default OpenaiModel to GPT_5_MINI for users...');
|
|
5
6
|
try {
|
|
6
7
|
// Update all users with NULL openaiModel to GPT_5_MINI
|
|
7
8
|
const result = await prisma.$executeRaw `
|
|
@@ -9,11 +10,11 @@ async function setDefaultOpenaiModel() {
|
|
|
9
10
|
SET "openaiModel" = 'GPT_5_MINI'
|
|
10
11
|
WHERE "openaiModel" IS NULL
|
|
11
12
|
`;
|
|
12
|
-
|
|
13
|
-
|
|
13
|
+
logger.info(`Updated ${result} users to GPT_5_MINI`);
|
|
14
|
+
logger.info('Default model set successfully!');
|
|
14
15
|
}
|
|
15
16
|
catch (error) {
|
|
16
|
-
|
|
17
|
+
logger.error('Failed to set default model', { error: String(error) });
|
|
17
18
|
throw error;
|
|
18
19
|
}
|
|
19
20
|
finally {
|
|
@@ -23,11 +24,11 @@ async function setDefaultOpenaiModel() {
|
|
|
23
24
|
// Run the script
|
|
24
25
|
setDefaultOpenaiModel()
|
|
25
26
|
.then(() => {
|
|
26
|
-
|
|
27
|
+
logger.info('Script finished successfully');
|
|
27
28
|
process.exit(0);
|
|
28
29
|
})
|
|
29
30
|
.catch((error) => {
|
|
30
|
-
|
|
31
|
+
logger.error('Script failed', { error: String(error) });
|
|
31
32
|
process.exit(1);
|
|
32
33
|
});
|
|
33
34
|
//# sourceMappingURL=set-default-openai-model.js.map
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
interface Logger {
|
|
2
|
+
info: (message: string, meta?: Record<string, unknown>) => void;
|
|
3
|
+
warn: (message: string, meta?: Record<string, unknown>) => void;
|
|
4
|
+
error: (message: string, meta?: Record<string, unknown>) => void;
|
|
5
|
+
debug: (message: string, meta?: Record<string, unknown>) => void;
|
|
6
|
+
}
|
|
7
|
+
export declare const logger: Logger;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/utils/logger.ts"],"names":[],"mappings":"AAUA,UAAU,MAAM;IACd,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAChE,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAChE,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IACjE,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;CAClE;AAmCD,eAAO,MAAM,MAAM,QAAiC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/utils/logger.ts"],"names":[],"mappings":"AAiBA,SAAS,cAAc,CACrB,KAAe,EACf,OAAe,EACf,OAAe,EACf,IAA8B;IAE9B,MAAM,KAAK,GAAa;QACtB,KAAK;QACL,OAAO;QACP,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,OAAO;QACP,GAAG,IAAI;KACR,CAAC;IACF,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,YAAY,CAAC,OAAe;IACnC,OAAO;QACL,IAAI,EAAE,CAAC,OAAe,EAAE,IAA8B,EAAQ,EAAE;YAC9D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QAC9E,CAAC;QACD,IAAI,EAAE,CAAC,OAAe,EAAE,IAA8B,EAAQ,EAAE;YAC9D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QAC9E,CAAC;QACD,KAAK,EAAE,CAAC,OAAe,EAAE,IAA8B,EAAQ,EAAE;YAC/D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QAC/E,CAAC;QACD,KAAK,EAAE,CAAC,OAAe,EAAE,IAA8B,EAAQ,EAAE;YAC/D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QAC/E,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,YAAY,CAAC,gBAAgB,CAAC,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
function formatLogEntry(level, service, message, meta) {
|
|
2
|
+
const entry = {
|
|
3
|
+
level,
|
|
4
|
+
message,
|
|
5
|
+
timestamp: new Date().toISOString(),
|
|
6
|
+
service,
|
|
7
|
+
...meta,
|
|
8
|
+
};
|
|
9
|
+
return JSON.stringify(entry);
|
|
10
|
+
}
|
|
11
|
+
function createLogger(service) {
|
|
12
|
+
return {
|
|
13
|
+
info: (message, meta) => {
|
|
14
|
+
process.stdout.write(formatLogEntry('info', service, message, meta) + '\n');
|
|
15
|
+
},
|
|
16
|
+
warn: (message, meta) => {
|
|
17
|
+
process.stdout.write(formatLogEntry('warn', service, message, meta) + '\n');
|
|
18
|
+
},
|
|
19
|
+
error: (message, meta) => {
|
|
20
|
+
process.stderr.write(formatLogEntry('error', service, message, meta) + '\n');
|
|
21
|
+
},
|
|
22
|
+
debug: (message, meta) => {
|
|
23
|
+
process.stdout.write(formatLogEntry('debug', service, message, meta) + '\n');
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
export const logger = createLogger('backend-legacy');
|
|
28
|
+
//# sourceMappingURL=logger.js.map
|
package/esm/utils.d.ts
CHANGED
|
@@ -1,2 +1,13 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Recursively removes undefined and null properties from an object or array.
|
|
3
|
+
*
|
|
4
|
+
* This utility is called by generated CRUD functions to clean GraphQL variables
|
|
5
|
+
* before passing them to Apollo Client. The input objects contain Prisma-typed
|
|
6
|
+
* fields (Date, Decimal, bigint, JsonValue, nested relations, etc.) which cannot
|
|
7
|
+
* be enumerated exhaustively. The return value is used as Apollo OperationVariables.
|
|
8
|
+
*
|
|
9
|
+
* We use Record<string, unknown> for the parameter to accept all generated Prisma
|
|
10
|
+
* input shapes without needing to enumerate every possible field type.
|
|
11
|
+
*/
|
|
12
|
+
export declare function removeUndefinedProps(obj: Record<string, unknown> | Record<string, unknown>[] | unknown): Record<string, unknown> | undefined;
|
|
2
13
|
//# sourceMappingURL=utils.d.ts.map
|
package/esm/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CA8C5I"}
|
package/esm/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,oBAAoB,CAAC,
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAkE;IACrG,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,GAAG;aACP,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;aACvC,MAAM,CACL,IAAI,CAAC,EAAE,CACL,IAAI,KAAK,SAAS;YAClB,IAAI,KAAK,IAAI;YACb,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,IAA+B,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAClD,CAAC;IAC5C,CAAC;SAAM,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,CAAC,CAAC,GAAG,YAAY,IAAI,CAAC,EAAE,CAAC;QAC7E,MAAM,MAAM,GAAG,GAA8B,CAAC;QAC9C,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,GAA4B,EAAE,GAAG,EAAE,EAAE;YACtE,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YAE1B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBAC1C,IAAI,YAAqB,CAAC;gBAE1B,IAAI,GAAG,KAAK,OAAO,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,KAAK,YAAY,IAAI,CAAC,EAAE,CAAC;oBAC/F,MAAM,QAAQ,GAAG,KAAgC,CAAC;oBAClD,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,QAAQ,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;wBACtF,4CAA4C;wBAC5C,YAAY,GAAG,EAAE,EAAE,EAAE,oBAAoB,CAAC,QAAQ,CAAC,EAA6B,CAAC,EAAE,CAAC;oBACtF,CAAC;yBAAM,CAAC;wBACN,wEAAwE;wBACxE,YAAY,GAAG,oBAAoB,CAAC,KAAgC,CAAC,CAAC;oBACxE,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,8BAA8B;oBAC9B,YAAY,GAAG,oBAAoB,CAAC,KAAgC,CAAC,CAAC;gBACxE,CAAC;gBAED,IACE,YAAY,KAAK,SAAS;oBAC1B,YAAY,KAAK,IAAI;oBACrB,CAAC,OAAO,YAAY,KAAK,QAAQ,IAAI,YAAY,YAAY,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,YAAuC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,EACrI,CAAC;oBACD,GAAG,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC;gBAC1B,CAAC;YACH,CAAC;YAED,OAAO,GAAG,CAAC;QACb,CAAC,EAAE,EAAE,CAAC,CAAC;IACT,CAAC;IAED,OAAO,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,GAA8B,CAAC,CAAC,CAAC,SAAS,CAAC;AACxF,CAAC"}
|
package/esm/utils.mjs
CHANGED
|
@@ -1,3 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recursively removes undefined and null properties from an object or array.
|
|
3
|
+
*
|
|
4
|
+
* This utility is called by generated CRUD functions to clean GraphQL variables
|
|
5
|
+
* before passing them to Apollo Client. The input objects contain Prisma-typed
|
|
6
|
+
* fields (Date, Decimal, bigint, JsonValue, nested relations, etc.) which cannot
|
|
7
|
+
* be enumerated exhaustively. The return value is used as Apollo OperationVariables.
|
|
8
|
+
*
|
|
9
|
+
* We use Record<string, unknown> for the parameter to accept all generated Prisma
|
|
10
|
+
* input shapes without needing to enumerate every possible field type.
|
|
11
|
+
*/
|
|
1
12
|
export function removeUndefinedProps(obj) {
|
|
2
13
|
if (Array.isArray(obj)) {
|
|
3
14
|
return obj
|
|
@@ -6,15 +17,17 @@ export function removeUndefinedProps(obj) {
|
|
|
6
17
|
item !== null &&
|
|
7
18
|
(typeof item !== 'object' || Object.keys(item).length > 0));
|
|
8
19
|
}
|
|
9
|
-
else if (typeof obj === 'object' && obj !== null) {
|
|
10
|
-
|
|
11
|
-
|
|
20
|
+
else if (typeof obj === 'object' && obj !== null && !(obj instanceof Date)) {
|
|
21
|
+
const record = obj;
|
|
22
|
+
return Object.keys(record).reduce((acc, key) => {
|
|
23
|
+
const value = record[key];
|
|
12
24
|
if (value !== undefined && value !== null) {
|
|
13
25
|
let cleanedValue;
|
|
14
|
-
if (key === 'where' && typeof value === 'object' && value !== null) {
|
|
15
|
-
|
|
26
|
+
if (key === 'where' && typeof value === 'object' && value !== null && !(value instanceof Date)) {
|
|
27
|
+
const whereObj = value;
|
|
28
|
+
if (Object.prototype.hasOwnProperty.call(whereObj, 'id') && whereObj.id !== undefined) {
|
|
16
29
|
// Retain only the 'id' field within 'where'
|
|
17
|
-
cleanedValue = { id: removeUndefinedProps(
|
|
30
|
+
cleanedValue = { id: removeUndefinedProps(whereObj.id) };
|
|
18
31
|
}
|
|
19
32
|
else {
|
|
20
33
|
// Process 'where' object normally if 'id' is undefined or doesn't exist
|
|
@@ -27,7 +40,7 @@ export function removeUndefinedProps(obj) {
|
|
|
27
40
|
}
|
|
28
41
|
if (cleanedValue !== undefined &&
|
|
29
42
|
cleanedValue !== null &&
|
|
30
|
-
(typeof cleanedValue !== 'object' || Object.keys(cleanedValue).length > 0)) {
|
|
43
|
+
(typeof cleanedValue !== 'object' || cleanedValue instanceof Date || Object.keys(cleanedValue).length > 0)) {
|
|
31
44
|
acc[key] = cleanedValue;
|
|
32
45
|
}
|
|
33
46
|
}
|
package/getToken.cjs
CHANGED
|
@@ -39,6 +39,7 @@ exports.getToken = getToken;
|
|
|
39
39
|
const buffer_1 = require("buffer");
|
|
40
40
|
const crypto = __importStar(require("crypto"));
|
|
41
41
|
const jwtConfig_1 = require("./config/jwtConfig.cjs");
|
|
42
|
+
const logger_1 = require("./utils/logger.cjs");
|
|
42
43
|
/**
|
|
43
44
|
* Default maximum age for JWT (30 days)
|
|
44
45
|
*/
|
|
@@ -183,8 +184,8 @@ async function decode(params) {
|
|
|
183
184
|
* Default Logger using Console
|
|
184
185
|
*/
|
|
185
186
|
const defaultLogger = {
|
|
186
|
-
info:
|
|
187
|
-
error:
|
|
187
|
+
info: (message) => logger_1.logger.info(message),
|
|
188
|
+
error: (message) => logger_1.logger.error(message),
|
|
188
189
|
};
|
|
189
190
|
/**
|
|
190
191
|
* SessionStore equivalent to manage cookies
|
package/health.cjs
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.createHealthRouter = createHealthRouter;
|
|
7
|
+
const express_1 = require("express");
|
|
8
|
+
const prismaClient_1 = __importDefault(require("./prismaClient.cjs"));
|
|
9
|
+
const logger_1 = require("./utils/logger.cjs");
|
|
10
|
+
const SERVICE_NAME = 'backend-legacy';
|
|
11
|
+
/**
|
|
12
|
+
* Reads the package version from package.json at startup.
|
|
13
|
+
* Falls back to 'unknown' if the version cannot be determined.
|
|
14
|
+
*/
|
|
15
|
+
function getPackageVersion() {
|
|
16
|
+
try {
|
|
17
|
+
const pkg = require('../package.json');
|
|
18
|
+
return pkg.version || 'unknown';
|
|
19
|
+
}
|
|
20
|
+
catch (_a) {
|
|
21
|
+
return 'unknown';
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
const PACKAGE_VERSION = getPackageVersion();
|
|
25
|
+
/** Tracks the process start time for uptime calculation */
|
|
26
|
+
const startedAt = Date.now();
|
|
27
|
+
/**
|
|
28
|
+
* Checks database connectivity by issuing a lightweight query.
|
|
29
|
+
* Returns 'connected' or 'disconnected'. Never throws.
|
|
30
|
+
*/
|
|
31
|
+
async function checkDatabase() {
|
|
32
|
+
try {
|
|
33
|
+
await prismaClient_1.default.$queryRaw `SELECT 1`;
|
|
34
|
+
return 'connected';
|
|
35
|
+
}
|
|
36
|
+
catch (dbError) {
|
|
37
|
+
logger_1.logger.warn('Health check: database connectivity test failed', {
|
|
38
|
+
error: dbError instanceof Error ? dbError.message : String(dbError),
|
|
39
|
+
});
|
|
40
|
+
return 'disconnected';
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Creates an Express router with a GET /health endpoint.
|
|
45
|
+
*
|
|
46
|
+
* The endpoint returns HTTP 200 when healthy (database reachable)
|
|
47
|
+
* and HTTP 503 when degraded (database unreachable).
|
|
48
|
+
*
|
|
49
|
+
* Response includes: service name, version, uptime in seconds,
|
|
50
|
+
* memory usage (RSS, heap used, heap total in MB), database status,
|
|
51
|
+
* and an ISO 8601 timestamp.
|
|
52
|
+
*
|
|
53
|
+
* This endpoint should be mounted before auth middleware so it
|
|
54
|
+
* remains accessible without authentication.
|
|
55
|
+
*/
|
|
56
|
+
function createHealthRouter() {
|
|
57
|
+
const router = (0, express_1.Router)();
|
|
58
|
+
router.get('/health', async (_req, res) => {
|
|
59
|
+
const databaseStatus = await checkDatabase();
|
|
60
|
+
const isHealthy = databaseStatus === 'connected';
|
|
61
|
+
const statusCode = isHealthy ? 200 : 503;
|
|
62
|
+
const memoryUsage = process.memoryUsage();
|
|
63
|
+
const body = {
|
|
64
|
+
status: isHealthy ? 'ok' : 'degraded',
|
|
65
|
+
service: SERVICE_NAME,
|
|
66
|
+
version: PACKAGE_VERSION,
|
|
67
|
+
timestamp: new Date().toISOString(),
|
|
68
|
+
uptime: Math.floor((Date.now() - startedAt) / 1000),
|
|
69
|
+
memory: {
|
|
70
|
+
rss: Math.round(memoryUsage.rss / 1024 / 1024),
|
|
71
|
+
heapUsed: Math.round(memoryUsage.heapUsed / 1024 / 1024),
|
|
72
|
+
heapTotal: Math.round(memoryUsage.heapTotal / 1024 / 1024),
|
|
73
|
+
},
|
|
74
|
+
database: databaseStatus,
|
|
75
|
+
};
|
|
76
|
+
res.status(statusCode).json(body);
|
|
77
|
+
});
|
|
78
|
+
return router;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=health.js.map
|
package/health.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Router } from 'express';
|
|
2
|
+
/**
|
|
3
|
+
* Creates an Express router with a GET /health endpoint.
|
|
4
|
+
*
|
|
5
|
+
* The endpoint returns HTTP 200 when healthy (database reachable)
|
|
6
|
+
* and HTTP 503 when degraded (database unreachable).
|
|
7
|
+
*
|
|
8
|
+
* Response includes: service name, version, uptime in seconds,
|
|
9
|
+
* memory usage (RSS, heap used, heap total in MB), database status,
|
|
10
|
+
* and an ISO 8601 timestamp.
|
|
11
|
+
*
|
|
12
|
+
* This endpoint should be mounted before auth middleware so it
|
|
13
|
+
* remains accessible without authentication.
|
|
14
|
+
*/
|
|
15
|
+
export declare function createHealthRouter(): Router;
|
|
16
|
+
//# sourceMappingURL=health.d.ts.map
|