@memberjunction/server 2.111.1 → 2.112.0
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/dist/agents/skip-agent.d.ts +4 -4
- package/dist/agents/skip-agent.d.ts.map +1 -1
- package/dist/agents/skip-agent.js +808 -951
- package/dist/agents/skip-agent.js.map +1 -1
- package/dist/agents/skip-sdk.d.ts +1 -1
- package/dist/agents/skip-sdk.d.ts.map +1 -1
- package/dist/agents/skip-sdk.js +53 -43
- package/dist/agents/skip-sdk.js.map +1 -1
- package/dist/apolloServer/index.js +1 -1
- package/dist/auth/AuthProviderFactory.d.ts +1 -1
- package/dist/auth/AuthProviderFactory.d.ts.map +1 -1
- package/dist/auth/AuthProviderFactory.js +1 -3
- package/dist/auth/AuthProviderFactory.js.map +1 -1
- package/dist/auth/BaseAuthProvider.d.ts +1 -1
- package/dist/auth/BaseAuthProvider.d.ts.map +1 -1
- package/dist/auth/BaseAuthProvider.js +3 -2
- package/dist/auth/BaseAuthProvider.js.map +1 -1
- package/dist/auth/IAuthProvider.d.ts +1 -1
- package/dist/auth/IAuthProvider.d.ts.map +1 -1
- package/dist/auth/exampleNewUserSubClass.d.ts.map +1 -1
- package/dist/auth/exampleNewUserSubClass.js +1 -1
- package/dist/auth/exampleNewUserSubClass.js.map +1 -1
- package/dist/auth/index.d.ts +1 -1
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +6 -6
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/initializeProviders.js +1 -1
- package/dist/auth/initializeProviders.js.map +1 -1
- package/dist/auth/newUsers.d.ts +1 -1
- package/dist/auth/newUsers.d.ts.map +1 -1
- package/dist/auth/newUsers.js +7 -7
- package/dist/auth/newUsers.js.map +1 -1
- package/dist/auth/providers/Auth0Provider.d.ts +1 -1
- package/dist/auth/providers/Auth0Provider.d.ts.map +1 -1
- package/dist/auth/providers/Auth0Provider.js +1 -1
- package/dist/auth/providers/Auth0Provider.js.map +1 -1
- package/dist/auth/providers/CognitoProvider.d.ts +1 -1
- package/dist/auth/providers/CognitoProvider.d.ts.map +1 -1
- package/dist/auth/providers/CognitoProvider.js +3 -6
- package/dist/auth/providers/CognitoProvider.js.map +1 -1
- package/dist/auth/providers/GoogleProvider.d.ts +1 -1
- package/dist/auth/providers/GoogleProvider.d.ts.map +1 -1
- package/dist/auth/providers/GoogleProvider.js +1 -1
- package/dist/auth/providers/GoogleProvider.js.map +1 -1
- package/dist/auth/providers/MSALProvider.d.ts +1 -1
- package/dist/auth/providers/MSALProvider.d.ts.map +1 -1
- package/dist/auth/providers/MSALProvider.js +1 -1
- package/dist/auth/providers/MSALProvider.js.map +1 -1
- package/dist/auth/providers/OktaProvider.d.ts +1 -1
- package/dist/auth/providers/OktaProvider.d.ts.map +1 -1
- package/dist/auth/providers/OktaProvider.js +1 -1
- package/dist/auth/providers/OktaProvider.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +22 -10
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts +1 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +9 -7
- package/dist/context.js.map +1 -1
- package/dist/entitySubclasses/entityPermissions.server.d.ts +1 -1
- package/dist/entitySubclasses/entityPermissions.server.d.ts.map +1 -1
- package/dist/entitySubclasses/entityPermissions.server.js +1 -1
- package/dist/entitySubclasses/entityPermissions.server.js.map +1 -1
- package/dist/generated/generated.d.ts +648 -648
- package/dist/generated/generated.d.ts.map +1 -1
- package/dist/generated/generated.js +2986 -1133
- package/dist/generated/generated.js.map +1 -1
- package/dist/generic/KeyInputOutputTypes.d.ts +1 -1
- package/dist/generic/KeyInputOutputTypes.d.ts.map +1 -1
- package/dist/generic/KeyInputOutputTypes.js +1 -1
- package/dist/generic/KeyInputOutputTypes.js.map +1 -1
- package/dist/generic/ResolverBase.d.ts +1 -1
- package/dist/generic/ResolverBase.d.ts.map +1 -1
- package/dist/generic/ResolverBase.js +15 -10
- package/dist/generic/ResolverBase.js.map +1 -1
- package/dist/generic/RunViewResolver.d.ts +1 -1
- package/dist/generic/RunViewResolver.d.ts.map +1 -1
- package/dist/generic/RunViewResolver.js +15 -15
- package/dist/generic/RunViewResolver.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -9
- package/dist/index.js.map +1 -1
- package/dist/resolvers/ActionResolver.d.ts +2 -2
- package/dist/resolvers/ActionResolver.d.ts.map +1 -1
- package/dist/resolvers/ActionResolver.js +28 -30
- package/dist/resolvers/ActionResolver.js.map +1 -1
- package/dist/resolvers/AskSkipResolver.d.ts +2 -2
- package/dist/resolvers/AskSkipResolver.d.ts.map +1 -1
- package/dist/resolvers/AskSkipResolver.js +60 -50
- package/dist/resolvers/AskSkipResolver.js.map +1 -1
- package/dist/resolvers/ComponentRegistryResolver.d.ts.map +1 -1
- package/dist/resolvers/ComponentRegistryResolver.js +36 -38
- package/dist/resolvers/ComponentRegistryResolver.js.map +1 -1
- package/dist/resolvers/CreateQueryResolver.d.ts +1 -1
- package/dist/resolvers/CreateQueryResolver.d.ts.map +1 -1
- package/dist/resolvers/CreateQueryResolver.js +43 -40
- package/dist/resolvers/CreateQueryResolver.js.map +1 -1
- package/dist/resolvers/DatasetResolver.d.ts.map +1 -1
- package/dist/resolvers/DatasetResolver.js +1 -1
- package/dist/resolvers/DatasetResolver.js.map +1 -1
- package/dist/resolvers/EntityRecordNameResolver.d.ts +1 -1
- package/dist/resolvers/EntityRecordNameResolver.d.ts.map +1 -1
- package/dist/resolvers/EntityRecordNameResolver.js +1 -1
- package/dist/resolvers/EntityRecordNameResolver.js.map +1 -1
- package/dist/resolvers/EntityResolver.d.ts.map +1 -1
- package/dist/resolvers/EntityResolver.js +1 -1
- package/dist/resolvers/EntityResolver.js.map +1 -1
- package/dist/resolvers/FileCategoryResolver.js +1 -1
- package/dist/resolvers/FileCategoryResolver.js.map +1 -1
- package/dist/resolvers/FileResolver.js +1 -1
- package/dist/resolvers/FileResolver.js.map +1 -1
- package/dist/resolvers/GetDataContextDataResolver.d.ts +1 -1
- package/dist/resolvers/GetDataContextDataResolver.d.ts.map +1 -1
- package/dist/resolvers/GetDataContextDataResolver.js +5 -5
- package/dist/resolvers/GetDataContextDataResolver.js.map +1 -1
- package/dist/resolvers/GetDataResolver.d.ts.map +1 -1
- package/dist/resolvers/GetDataResolver.js +8 -6
- package/dist/resolvers/GetDataResolver.js.map +1 -1
- package/dist/resolvers/MergeRecordsResolver.d.ts +3 -3
- package/dist/resolvers/MergeRecordsResolver.d.ts.map +1 -1
- package/dist/resolvers/MergeRecordsResolver.js +3 -3
- package/dist/resolvers/MergeRecordsResolver.js.map +1 -1
- package/dist/resolvers/PotentialDuplicateRecordResolver.d.ts +1 -1
- package/dist/resolvers/PotentialDuplicateRecordResolver.d.ts.map +1 -1
- package/dist/resolvers/PotentialDuplicateRecordResolver.js +1 -1
- package/dist/resolvers/PotentialDuplicateRecordResolver.js.map +1 -1
- package/dist/resolvers/QueryResolver.d.ts.map +1 -1
- package/dist/resolvers/QueryResolver.js +11 -11
- package/dist/resolvers/QueryResolver.js.map +1 -1
- package/dist/resolvers/ReportResolver.js +1 -1
- package/dist/resolvers/ReportResolver.js.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.js +27 -28
- package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
- package/dist/resolvers/RunAIPromptResolver.d.ts.map +1 -1
- package/dist/resolvers/RunAIPromptResolver.js +31 -31
- package/dist/resolvers/RunAIPromptResolver.js.map +1 -1
- package/dist/resolvers/RunTemplateResolver.d.ts.map +1 -1
- package/dist/resolvers/RunTemplateResolver.js +9 -9
- package/dist/resolvers/RunTemplateResolver.js.map +1 -1
- package/dist/resolvers/SqlLoggingConfigResolver.d.ts.map +1 -1
- package/dist/resolvers/SqlLoggingConfigResolver.js +10 -10
- package/dist/resolvers/SqlLoggingConfigResolver.js.map +1 -1
- package/dist/resolvers/SyncDataResolver.d.ts +1 -1
- package/dist/resolvers/SyncDataResolver.d.ts.map +1 -1
- package/dist/resolvers/SyncDataResolver.js +15 -14
- package/dist/resolvers/SyncDataResolver.js.map +1 -1
- package/dist/resolvers/SyncRolesUsersResolver.d.ts +1 -1
- package/dist/resolvers/SyncRolesUsersResolver.d.ts.map +1 -1
- package/dist/resolvers/SyncRolesUsersResolver.js +48 -44
- package/dist/resolvers/SyncRolesUsersResolver.js.map +1 -1
- package/dist/resolvers/TaskResolver.d.ts.map +1 -1
- package/dist/resolvers/TaskResolver.js +7 -7
- package/dist/resolvers/TaskResolver.js.map +1 -1
- package/dist/resolvers/TransactionGroupResolver.d.ts +1 -1
- package/dist/resolvers/TransactionGroupResolver.d.ts.map +1 -1
- package/dist/resolvers/TransactionGroupResolver.js +12 -12
- package/dist/resolvers/TransactionGroupResolver.js.map +1 -1
- package/dist/resolvers/UserFavoriteResolver.d.ts +1 -1
- package/dist/resolvers/UserFavoriteResolver.d.ts.map +1 -1
- package/dist/resolvers/UserFavoriteResolver.js +1 -1
- package/dist/resolvers/UserFavoriteResolver.js.map +1 -1
- package/dist/resolvers/UserViewResolver.d.ts.map +1 -1
- package/dist/resolvers/UserViewResolver.js.map +1 -1
- package/dist/rest/EntityCRUDHandler.d.ts +1 -1
- package/dist/rest/EntityCRUDHandler.d.ts.map +1 -1
- package/dist/rest/EntityCRUDHandler.js +14 -16
- package/dist/rest/EntityCRUDHandler.js.map +1 -1
- package/dist/rest/RESTEndpointHandler.d.ts.map +1 -1
- package/dist/rest/RESTEndpointHandler.js +23 -25
- package/dist/rest/RESTEndpointHandler.js.map +1 -1
- package/dist/rest/ViewOperationsHandler.d.ts +1 -1
- package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
- package/dist/rest/ViewOperationsHandler.js +17 -21
- package/dist/rest/ViewOperationsHandler.js.map +1 -1
- package/dist/scheduler/LearningCycleScheduler.d.ts.map +1 -1
- package/dist/scheduler/LearningCycleScheduler.js.map +1 -1
- package/dist/services/ScheduledJobsService.d.ts.map +1 -1
- package/dist/services/ScheduledJobsService.js +4 -6
- package/dist/services/ScheduledJobsService.js.map +1 -1
- package/dist/services/TaskOrchestrator.d.ts +1 -1
- package/dist/services/TaskOrchestrator.d.ts.map +1 -1
- package/dist/services/TaskOrchestrator.js +30 -30
- package/dist/services/TaskOrchestrator.js.map +1 -1
- package/dist/types.d.ts +3 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +0 -1
- package/dist/types.js.map +1 -1
- package/dist/util.d.ts +1 -1
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +2 -2
- package/dist/util.js.map +1 -1
- package/package.json +36 -37
- package/src/agents/skip-agent.ts +1067 -1200
- package/src/agents/skip-sdk.ts +877 -851
- package/src/apolloServer/index.ts +2 -2
- package/src/auth/AuthProviderFactory.ts +8 -14
- package/src/auth/BaseAuthProvider.ts +5 -4
- package/src/auth/IAuthProvider.ts +2 -2
- package/src/auth/exampleNewUserSubClass.ts +9 -2
- package/src/auth/index.ts +31 -26
- package/src/auth/initializeProviders.ts +3 -3
- package/src/auth/newUsers.ts +166 -134
- package/src/auth/providers/Auth0Provider.ts +5 -5
- package/src/auth/providers/CognitoProvider.ts +7 -10
- package/src/auth/providers/GoogleProvider.ts +4 -5
- package/src/auth/providers/MSALProvider.ts +5 -5
- package/src/auth/providers/OktaProvider.ts +6 -7
- package/src/config.ts +63 -54
- package/src/context.ts +42 -30
- package/src/entitySubclasses/entityPermissions.server.ts +3 -3
- package/src/generated/generated.ts +48130 -39930
- package/src/generic/KeyInputOutputTypes.ts +3 -6
- package/src/generic/ResolverBase.ts +119 -78
- package/src/generic/RunViewResolver.ts +27 -23
- package/src/index.ts +66 -42
- package/src/resolvers/ActionResolver.ts +46 -57
- package/src/resolvers/AskSkipResolver.ts +607 -533
- package/src/resolvers/ComponentRegistryResolver.ts +547 -562
- package/src/resolvers/CreateQueryResolver.ts +683 -655
- package/src/resolvers/DatasetResolver.ts +5 -6
- package/src/resolvers/EntityCommunicationsResolver.ts +1 -1
- package/src/resolvers/EntityRecordNameResolver.ts +9 -5
- package/src/resolvers/EntityResolver.ts +9 -7
- package/src/resolvers/FileCategoryResolver.ts +2 -2
- package/src/resolvers/FileResolver.ts +4 -4
- package/src/resolvers/GetDataContextDataResolver.ts +106 -118
- package/src/resolvers/GetDataResolver.ts +194 -205
- package/src/resolvers/MergeRecordsResolver.ts +5 -5
- package/src/resolvers/PotentialDuplicateRecordResolver.ts +1 -1
- package/src/resolvers/QueryResolver.ts +95 -78
- package/src/resolvers/ReportResolver.ts +2 -2
- package/src/resolvers/RunAIAgentResolver.ts +818 -828
- package/src/resolvers/RunAIPromptResolver.ts +693 -709
- package/src/resolvers/RunTemplateResolver.ts +105 -103
- package/src/resolvers/SqlLoggingConfigResolver.ts +69 -72
- package/src/resolvers/SyncDataResolver.ts +386 -352
- package/src/resolvers/SyncRolesUsersResolver.ts +387 -350
- package/src/resolvers/TaskResolver.ts +110 -115
- package/src/resolvers/TransactionGroupResolver.ts +143 -138
- package/src/resolvers/UserFavoriteResolver.ts +17 -8
- package/src/resolvers/UserViewResolver.ts +17 -12
- package/src/rest/EntityCRUDHandler.ts +291 -268
- package/src/rest/RESTEndpointHandler.ts +782 -776
- package/src/rest/ViewOperationsHandler.ts +191 -195
- package/src/scheduler/LearningCycleScheduler.ts +8 -52
- package/src/services/ScheduledJobsService.ts +129 -132
- package/src/services/TaskOrchestrator.ts +792 -776
- package/src/types.ts +15 -9
- package/src/util.ts +112 -109
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Arg, Ctx, Field, InputType, Mutation, ObjectType, Query, Int, Resolver } from 'type-graphql';
|
|
2
2
|
import { AppContext } from '../types.js';
|
|
3
|
-
import { Metadata, UserInfo } from '@memberjunction/
|
|
3
|
+
import { Metadata, UserInfo } from '@memberjunction/global';
|
|
4
4
|
import { SQLServerDataProvider } from '@memberjunction/sqlserver-dataprovider';
|
|
5
5
|
import { UserCache } from '@memberjunction/sqlserver-dataprovider';
|
|
6
6
|
import { v4 as uuidv4 } from 'uuid';
|
|
@@ -172,9 +172,9 @@ export class SqlLoggingConfig {
|
|
|
172
172
|
/**
|
|
173
173
|
* GraphQL resolver for SQL logging configuration and session management.
|
|
174
174
|
* Provides queries and mutations for controlling SQL logging functionality.
|
|
175
|
-
*
|
|
175
|
+
*
|
|
176
176
|
* **Security**: All operations require Owner-level privileges.
|
|
177
|
-
*
|
|
177
|
+
*
|
|
178
178
|
* @example
|
|
179
179
|
* ```typescript
|
|
180
180
|
* // Start a new logging session
|
|
@@ -186,13 +186,13 @@ export class SqlLoggingConfig {
|
|
|
186
186
|
* statementTypes: "both"
|
|
187
187
|
* }
|
|
188
188
|
* });
|
|
189
|
-
*
|
|
189
|
+
*
|
|
190
190
|
* // Get current configuration
|
|
191
191
|
* const config = await sqlLoggingConfig();
|
|
192
|
-
*
|
|
192
|
+
*
|
|
193
193
|
* // List active sessions
|
|
194
194
|
* const sessions = await activeSqlLoggingSessions();
|
|
195
|
-
*
|
|
195
|
+
*
|
|
196
196
|
* // Stop a session
|
|
197
197
|
* await stopSqlLogging(session.id);
|
|
198
198
|
* ```
|
|
@@ -201,19 +201,19 @@ export class SqlLoggingConfig {
|
|
|
201
201
|
export class SqlLoggingConfigResolver extends ResolverBase {
|
|
202
202
|
/** Default prefix for auto-generated SQL log filenames */
|
|
203
203
|
private static readonly LOG_FILE_PREFIX = 'sql-log-';
|
|
204
|
-
|
|
204
|
+
|
|
205
205
|
/**
|
|
206
206
|
* Validates that the current user has Owner-level privileges required for SQL logging operations.
|
|
207
|
-
*
|
|
207
|
+
*
|
|
208
208
|
* This method performs authentication and authorization checks:
|
|
209
209
|
* - Verifies user is authenticated (has email in context)
|
|
210
210
|
* - Looks up user in UserCache by email (case-insensitive)
|
|
211
211
|
* - Checks that user Type field equals 'Owner' (trimmed for nchar padding)
|
|
212
|
-
*
|
|
212
|
+
*
|
|
213
213
|
* @param context - The GraphQL application context containing user authentication data
|
|
214
214
|
* @returns Promise resolving to the authenticated UserInfo object
|
|
215
215
|
* @throws Error if user is not authenticated, not found, or lacks Owner privileges
|
|
216
|
-
*
|
|
216
|
+
*
|
|
217
217
|
* @private
|
|
218
218
|
*/
|
|
219
219
|
private async checkOwnerAccess(context: AppContext): Promise<UserInfo> {
|
|
@@ -221,45 +221,45 @@ export class SqlLoggingConfigResolver extends ResolverBase {
|
|
|
221
221
|
if (!userEmail) {
|
|
222
222
|
throw new Error('User not authenticated');
|
|
223
223
|
}
|
|
224
|
-
|
|
224
|
+
|
|
225
225
|
// Get the user from cache
|
|
226
226
|
const users = UserCache.Instance.Users;
|
|
227
|
-
const user = users.find(u => u.Email.toLowerCase() === userEmail.toLowerCase());
|
|
227
|
+
const user = users.find((u) => u.Email.toLowerCase() === userEmail.toLowerCase());
|
|
228
228
|
if (!user) {
|
|
229
229
|
throw new Error('User not found');
|
|
230
230
|
}
|
|
231
|
-
|
|
231
|
+
|
|
232
232
|
// Debug logging
|
|
233
233
|
console.log('SQL Logging access check:', {
|
|
234
234
|
email: user.Email,
|
|
235
235
|
type: user.Type,
|
|
236
236
|
typeLength: user.Type?.length,
|
|
237
237
|
typeTrimmed: user.Type?.trim(),
|
|
238
|
-
isOwner: user.Type?.trim().toLowerCase() === 'owner'
|
|
238
|
+
isOwner: user.Type?.trim().toLowerCase() === 'owner',
|
|
239
239
|
});
|
|
240
|
-
|
|
240
|
+
|
|
241
241
|
// Check if user has Type = 'Owner' (trim and case-insensitive for nchar fields)
|
|
242
242
|
if (user.Type?.trim().toLowerCase() !== 'owner') {
|
|
243
243
|
throw new Error('Access denied. This feature requires Owner privileges.');
|
|
244
244
|
}
|
|
245
|
-
|
|
245
|
+
|
|
246
246
|
return user;
|
|
247
247
|
}
|
|
248
|
-
|
|
248
|
+
|
|
249
249
|
/**
|
|
250
250
|
* Retrieves the current SQL logging configuration and status information.
|
|
251
|
-
*
|
|
251
|
+
*
|
|
252
252
|
* Returns comprehensive configuration details including:
|
|
253
253
|
* - Whether SQL logging is enabled in server config
|
|
254
254
|
* - Default logging options (formatting, statement types, etc.)
|
|
255
255
|
* - File system settings (log directory, cleanup options)
|
|
256
256
|
* - Session limits and timeout settings
|
|
257
257
|
* - Count of currently active logging sessions
|
|
258
|
-
*
|
|
258
|
+
*
|
|
259
259
|
* @param context - GraphQL context (requires Owner privileges)
|
|
260
260
|
* @returns Promise resolving to complete SQL logging configuration
|
|
261
261
|
* @throws Error if user lacks Owner privileges
|
|
262
|
-
*
|
|
262
|
+
*
|
|
263
263
|
* @example
|
|
264
264
|
* ```graphql
|
|
265
265
|
* query {
|
|
@@ -280,7 +280,7 @@ export class SqlLoggingConfigResolver extends ResolverBase {
|
|
|
280
280
|
async sqlLoggingConfig(@Ctx() context: AppContext): Promise<SqlLoggingConfig> {
|
|
281
281
|
await this.checkOwnerAccess(context);
|
|
282
282
|
const config = await loadConfig();
|
|
283
|
-
const provider = GetReadOnlyProvider(context.providers, {allowFallbackToReadWrite: true}) as SQLServerDataProvider;
|
|
283
|
+
const provider = GetReadOnlyProvider(context.providers, { allowFallbackToReadWrite: true }) as SQLServerDataProvider;
|
|
284
284
|
const activeSessions = provider.GetActiveSqlLoggingSessions();
|
|
285
285
|
|
|
286
286
|
return {
|
|
@@ -291,29 +291,29 @@ export class SqlLoggingConfigResolver extends ResolverBase {
|
|
|
291
291
|
batchSeparator: 'GO',
|
|
292
292
|
prettyPrint: true,
|
|
293
293
|
logRecordChangeMetadata: false,
|
|
294
|
-
retainEmptyLogFiles: false
|
|
294
|
+
retainEmptyLogFiles: false,
|
|
295
295
|
},
|
|
296
296
|
allowedLogDirectory: config.sqlLogging?.allowedLogDirectory ?? './logs/sql',
|
|
297
297
|
maxActiveSessions: config.sqlLogging?.maxActiveSessions ?? 5,
|
|
298
298
|
autoCleanupEmptyFiles: config.sqlLogging?.autoCleanupEmptyFiles ?? true,
|
|
299
299
|
sessionTimeout: config.sqlLogging?.sessionTimeout ?? 3600000,
|
|
300
|
-
activeSessionCount: activeSessions.length
|
|
300
|
+
activeSessionCount: activeSessions.length,
|
|
301
301
|
};
|
|
302
302
|
}
|
|
303
303
|
|
|
304
304
|
/**
|
|
305
305
|
* Retrieves a list of all currently active SQL logging sessions.
|
|
306
|
-
*
|
|
306
|
+
*
|
|
307
307
|
* Returns detailed information for each active session including:
|
|
308
308
|
* - Unique session identifier and file path
|
|
309
309
|
* - Start time and statement count
|
|
310
310
|
* - Session configuration options
|
|
311
311
|
* - User filtering settings
|
|
312
|
-
*
|
|
312
|
+
*
|
|
313
313
|
* @param context - GraphQL context (requires Owner privileges)
|
|
314
314
|
* @returns Promise resolving to array of active SqlLoggingSession objects
|
|
315
315
|
* @throws Error if user lacks Owner privileges
|
|
316
|
-
*
|
|
316
|
+
*
|
|
317
317
|
* @example
|
|
318
318
|
* ```graphql
|
|
319
319
|
* query {
|
|
@@ -335,30 +335,30 @@ export class SqlLoggingConfigResolver extends ResolverBase {
|
|
|
335
335
|
@Query(() => [SqlLoggingSession])
|
|
336
336
|
async activeSqlLoggingSessions(@Ctx() context: AppContext): Promise<SqlLoggingSession[]> {
|
|
337
337
|
await this.checkOwnerAccess(context);
|
|
338
|
-
const provider = GetReadOnlyProvider(context.providers, {allowFallbackToReadWrite: true}) as SQLServerDataProvider;
|
|
338
|
+
const provider = GetReadOnlyProvider(context.providers, { allowFallbackToReadWrite: true }) as SQLServerDataProvider;
|
|
339
339
|
const sessions = provider.GetActiveSqlLoggingSessions();
|
|
340
340
|
|
|
341
|
-
return sessions.map(session => ({
|
|
341
|
+
return sessions.map((session) => ({
|
|
342
342
|
id: session.id,
|
|
343
343
|
filePath: session.filePath,
|
|
344
344
|
startTime: session.startTime,
|
|
345
345
|
statementCount: session.statementCount,
|
|
346
346
|
options: session.options,
|
|
347
347
|
sessionName: session.options.sessionName,
|
|
348
|
-
filterByUserId: session.options.filterByUserId
|
|
348
|
+
filterByUserId: session.options.filterByUserId,
|
|
349
349
|
}));
|
|
350
350
|
}
|
|
351
351
|
|
|
352
352
|
/**
|
|
353
353
|
* Creates and starts a new SQL logging session with specified configuration.
|
|
354
|
-
*
|
|
354
|
+
*
|
|
355
355
|
* This mutation:
|
|
356
356
|
* - Validates SQL logging is enabled and session limits
|
|
357
357
|
* - Creates a secure file path within the allowed log directory
|
|
358
358
|
* - Configures session options (filtering, formatting, etc.)
|
|
359
359
|
* - Starts the logging session in SQLServerDataProvider
|
|
360
360
|
* - Sets up automatic cleanup after session timeout
|
|
361
|
-
*
|
|
361
|
+
*
|
|
362
362
|
* @param input - Configuration for the new logging session
|
|
363
363
|
* @param input.fileName - Optional custom filename for the log file
|
|
364
364
|
* @param input.filterToCurrentUser - Whether to filter SQL to current user only
|
|
@@ -366,7 +366,7 @@ export class SqlLoggingConfigResolver extends ResolverBase {
|
|
|
366
366
|
* @param context - GraphQL context (requires Owner privileges)
|
|
367
367
|
* @returns Promise resolving to the created SqlLoggingSession object
|
|
368
368
|
* @throws Error if logging disabled, session limit reached, or invalid file path
|
|
369
|
-
*
|
|
369
|
+
*
|
|
370
370
|
* @example
|
|
371
371
|
* ```graphql
|
|
372
372
|
* mutation {
|
|
@@ -393,14 +393,14 @@ export class SqlLoggingConfigResolver extends ResolverBase {
|
|
|
393
393
|
): Promise<SqlLoggingSession> {
|
|
394
394
|
await this.checkOwnerAccess(context);
|
|
395
395
|
const config = await loadConfig();
|
|
396
|
-
|
|
396
|
+
|
|
397
397
|
// Check if SQL logging is enabled
|
|
398
398
|
if (!config.sqlLogging?.enabled) {
|
|
399
399
|
throw new Error('SQL logging is not enabled in the server configuration');
|
|
400
400
|
}
|
|
401
401
|
|
|
402
402
|
// Check max active sessions
|
|
403
|
-
const provider = GetReadOnlyProvider(context.providers, {allowFallbackToReadWrite: true}) as SQLServerDataProvider;
|
|
403
|
+
const provider = GetReadOnlyProvider(context.providers, { allowFallbackToReadWrite: true }) as SQLServerDataProvider;
|
|
404
404
|
const activeSessions = provider.GetActiveSqlLoggingSessions();
|
|
405
405
|
if (activeSessions.length >= (config.sqlLogging.maxActiveSessions ?? 5)) {
|
|
406
406
|
throw new Error(`Maximum number of active SQL logging sessions (${config.sqlLogging.maxActiveSessions}) reached`);
|
|
@@ -409,7 +409,7 @@ export class SqlLoggingConfigResolver extends ResolverBase {
|
|
|
409
409
|
// Prepare file path
|
|
410
410
|
const allowedDir = path.resolve(config.sqlLogging.allowedLogDirectory ?? './logs/sql');
|
|
411
411
|
await this.ensureDirectoryExists(allowedDir);
|
|
412
|
-
|
|
412
|
+
|
|
413
413
|
const fileName = input.fileName || `${SqlLoggingConfigResolver.LOG_FILE_PREFIX}${new Date().toISOString().replace(/[:.]/g, '-')}.sql`;
|
|
414
414
|
const filePath = path.join(allowedDir, fileName);
|
|
415
415
|
|
|
@@ -426,7 +426,7 @@ export class SqlLoggingConfigResolver extends ResolverBase {
|
|
|
426
426
|
...defaultOptions,
|
|
427
427
|
...input.options,
|
|
428
428
|
sessionName: input.options?.sessionName || `Session started by ${context.userPayload.email}`,
|
|
429
|
-
filterByUserId: input.filterToCurrentUser ? userInfo?.ID : input.options?.filterByUserId
|
|
429
|
+
filterByUserId: input.filterToCurrentUser ? userInfo?.ID : input.options?.filterByUserId,
|
|
430
430
|
};
|
|
431
431
|
|
|
432
432
|
// Create the logging session
|
|
@@ -450,24 +450,24 @@ export class SqlLoggingConfigResolver extends ResolverBase {
|
|
|
450
450
|
statementCount: session.statementCount,
|
|
451
451
|
options: session.options,
|
|
452
452
|
sessionName: session.options.sessionName,
|
|
453
|
-
filterByUserId: session.options.filterByUserId
|
|
453
|
+
filterByUserId: session.options.filterByUserId,
|
|
454
454
|
};
|
|
455
455
|
}
|
|
456
456
|
|
|
457
457
|
/**
|
|
458
458
|
* Stops and disposes of a specific SQL logging session.
|
|
459
|
-
*
|
|
459
|
+
*
|
|
460
460
|
* This mutation:
|
|
461
461
|
* - Validates the session exists and user has access
|
|
462
462
|
* - Calls dispose() on the session to close file handles
|
|
463
463
|
* - Removes the session from the active sessions map
|
|
464
464
|
* - Performs any configured cleanup operations
|
|
465
|
-
*
|
|
465
|
+
*
|
|
466
466
|
* @param sessionId - Unique identifier of the session to stop
|
|
467
467
|
* @param context - GraphQL context (requires Owner privileges)
|
|
468
468
|
* @returns Promise resolving to true if session was successfully stopped
|
|
469
469
|
* @throws Error if session not found or user lacks Owner privileges
|
|
470
|
-
*
|
|
470
|
+
*
|
|
471
471
|
* @example
|
|
472
472
|
* ```graphql
|
|
473
473
|
* mutation {
|
|
@@ -476,17 +476,14 @@ export class SqlLoggingConfigResolver extends ResolverBase {
|
|
|
476
476
|
* ```
|
|
477
477
|
*/
|
|
478
478
|
@Mutation(() => Boolean)
|
|
479
|
-
async stopSqlLogging(
|
|
480
|
-
@Arg('sessionId', () => String) sessionId: string,
|
|
481
|
-
@Ctx() context: AppContext
|
|
482
|
-
): Promise<boolean> {
|
|
479
|
+
async stopSqlLogging(@Arg('sessionId', () => String) sessionId: string, @Ctx() context: AppContext): Promise<boolean> {
|
|
483
480
|
await this.checkOwnerAccess(context);
|
|
484
|
-
const provider = GetReadOnlyProvider(context.providers, {allowFallbackToReadWrite: true}) as SQLServerDataProvider;
|
|
485
|
-
|
|
481
|
+
const provider = GetReadOnlyProvider(context.providers, { allowFallbackToReadWrite: true }) as SQLServerDataProvider;
|
|
482
|
+
|
|
486
483
|
// Get the actual session from the private map to call dispose
|
|
487
484
|
const sessionMap = (provider as any)._sqlLoggingSessions as Map<string, any>;
|
|
488
485
|
const session = sessionMap.get(sessionId);
|
|
489
|
-
|
|
486
|
+
|
|
490
487
|
if (!session) {
|
|
491
488
|
throw new Error(`SQL logging session ${sessionId} not found`);
|
|
492
489
|
}
|
|
@@ -497,17 +494,17 @@ export class SqlLoggingConfigResolver extends ResolverBase {
|
|
|
497
494
|
|
|
498
495
|
/**
|
|
499
496
|
* Stops and disposes of all currently active SQL logging sessions.
|
|
500
|
-
*
|
|
497
|
+
*
|
|
501
498
|
* This is a convenience method that:
|
|
502
499
|
* - Calls DisposeAllSqlLoggingSessions() on the data provider
|
|
503
500
|
* - Ensures all file handles are properly closed
|
|
504
501
|
* - Clears the active sessions map
|
|
505
502
|
* - Performs cleanup for all sessions at once
|
|
506
|
-
*
|
|
503
|
+
*
|
|
507
504
|
* @param context - GraphQL context (requires Owner privileges)
|
|
508
505
|
* @returns Promise resolving to true if all sessions were successfully stopped
|
|
509
506
|
* @throws Error if user lacks Owner privileges
|
|
510
|
-
*
|
|
507
|
+
*
|
|
511
508
|
* @example
|
|
512
509
|
* ```graphql
|
|
513
510
|
* mutation {
|
|
@@ -518,23 +515,23 @@ export class SqlLoggingConfigResolver extends ResolverBase {
|
|
|
518
515
|
@Mutation(() => Boolean)
|
|
519
516
|
async stopAllSqlLogging(@Ctx() context: AppContext): Promise<boolean> {
|
|
520
517
|
await this.checkOwnerAccess(context);
|
|
521
|
-
const provider = GetReadOnlyProvider(context.providers, {allowFallbackToReadWrite: true}) as SQLServerDataProvider;
|
|
518
|
+
const provider = GetReadOnlyProvider(context.providers, { allowFallbackToReadWrite: true }) as SQLServerDataProvider;
|
|
522
519
|
await provider.DisposeAllSqlLoggingSessions();
|
|
523
520
|
return true;
|
|
524
521
|
}
|
|
525
522
|
|
|
526
523
|
/**
|
|
527
524
|
* Updates the default SQL logging options for new sessions.
|
|
528
|
-
*
|
|
525
|
+
*
|
|
529
526
|
* **Note**: This updates runtime configuration only, not the static config file.
|
|
530
527
|
* Changes apply to new sessions but do not persist across server restarts.
|
|
531
528
|
* In a production system, consider persisting changes to a database.
|
|
532
|
-
*
|
|
529
|
+
*
|
|
533
530
|
* @param options - New default options to apply (partial update supported)
|
|
534
531
|
* @param context - GraphQL context (requires Owner privileges)
|
|
535
532
|
* @returns Promise resolving to the updated SqlLoggingOptions object
|
|
536
533
|
* @throws Error if SQL logging not configured or user lacks Owner privileges
|
|
537
|
-
*
|
|
534
|
+
*
|
|
538
535
|
* @example
|
|
539
536
|
* ```graphql
|
|
540
537
|
* mutation {
|
|
@@ -565,7 +562,7 @@ export class SqlLoggingConfigResolver extends ResolverBase {
|
|
|
565
562
|
|
|
566
563
|
config.sqlLogging.defaultOptions = {
|
|
567
564
|
...config.sqlLogging.defaultOptions,
|
|
568
|
-
...options
|
|
565
|
+
...options,
|
|
569
566
|
};
|
|
570
567
|
|
|
571
568
|
return config.sqlLogging.defaultOptions;
|
|
@@ -573,19 +570,19 @@ export class SqlLoggingConfigResolver extends ResolverBase {
|
|
|
573
570
|
|
|
574
571
|
/**
|
|
575
572
|
* Reads the contents of a specific SQL log file.
|
|
576
|
-
*
|
|
573
|
+
*
|
|
577
574
|
* This method:
|
|
578
575
|
* - Validates the session exists and user has access
|
|
579
576
|
* - Ensures the file path is within the allowed log directory
|
|
580
577
|
* - Reads the file content with optional line limits
|
|
581
578
|
* - Returns the content as a string
|
|
582
|
-
*
|
|
579
|
+
*
|
|
583
580
|
* @param sessionId - Unique identifier of the logging session
|
|
584
581
|
* @param maxLines - Maximum number of lines to read (optional, defaults to all)
|
|
585
582
|
* @param context - GraphQL context (requires Owner privileges)
|
|
586
583
|
* @returns Promise resolving to the log file content
|
|
587
584
|
* @throws Error if session not found, file not accessible, or user lacks privileges
|
|
588
|
-
*
|
|
585
|
+
*
|
|
589
586
|
* @example
|
|
590
587
|
* ```graphql
|
|
591
588
|
* query {
|
|
@@ -601,17 +598,17 @@ export class SqlLoggingConfigResolver extends ResolverBase {
|
|
|
601
598
|
): Promise<string> {
|
|
602
599
|
await this.checkOwnerAccess(context);
|
|
603
600
|
const config = await loadConfig();
|
|
604
|
-
|
|
601
|
+
|
|
605
602
|
// Check if SQL logging is enabled
|
|
606
603
|
if (!config.sqlLogging?.enabled) {
|
|
607
604
|
throw new Error('SQL logging is not enabled in the server configuration');
|
|
608
605
|
}
|
|
609
606
|
|
|
610
607
|
// Find the session
|
|
611
|
-
const provider = GetReadOnlyProvider(context.providers, {allowFallbackToReadWrite: true}) as SQLServerDataProvider;
|
|
608
|
+
const provider = GetReadOnlyProvider(context.providers, { allowFallbackToReadWrite: true }) as SQLServerDataProvider;
|
|
612
609
|
const sessions = provider.GetActiveSqlLoggingSessions();
|
|
613
|
-
const session = sessions.find(s => s.id === sessionId);
|
|
614
|
-
|
|
610
|
+
const session = sessions.find((s) => s.id === sessionId);
|
|
611
|
+
|
|
615
612
|
if (!session) {
|
|
616
613
|
throw new Error(`SQL logging session ${sessionId} not found`);
|
|
617
614
|
}
|
|
@@ -626,10 +623,10 @@ export class SqlLoggingConfigResolver extends ResolverBase {
|
|
|
626
623
|
try {
|
|
627
624
|
// Check if file exists
|
|
628
625
|
await fs.access(session.filePath);
|
|
629
|
-
|
|
626
|
+
|
|
630
627
|
// Read file content
|
|
631
628
|
const content = await fs.readFile(session.filePath, 'utf-8');
|
|
632
|
-
|
|
629
|
+
|
|
633
630
|
// Apply line limit if specified
|
|
634
631
|
if (maxLines && maxLines > 0) {
|
|
635
632
|
const lines = content.split('\n');
|
|
@@ -638,7 +635,7 @@ export class SqlLoggingConfigResolver extends ResolverBase {
|
|
|
638
635
|
return lines.slice(-maxLines).join('\n');
|
|
639
636
|
}
|
|
640
637
|
}
|
|
641
|
-
|
|
638
|
+
|
|
642
639
|
return content;
|
|
643
640
|
} catch (error: any) {
|
|
644
641
|
if (error.code === 'ENOENT') {
|
|
@@ -651,11 +648,11 @@ export class SqlLoggingConfigResolver extends ResolverBase {
|
|
|
651
648
|
/**
|
|
652
649
|
* Debug query to check what the current user email is in the SQL provider.
|
|
653
650
|
* This helps diagnose user filtering issues when SQL statements aren't being captured.
|
|
654
|
-
*
|
|
651
|
+
*
|
|
655
652
|
* Returns a comparison of the user email stored in the SQLServerDataProvider
|
|
656
653
|
* versus the user email from the GraphQL context, which helps identify mismatches
|
|
657
654
|
* that could prevent SQL filtering from working correctly.
|
|
658
|
-
*
|
|
655
|
+
*
|
|
659
656
|
* @param context - GraphQL context containing user information
|
|
660
657
|
* @returns Formatted string showing both email values and whether they match
|
|
661
658
|
* @throws Error if user doesn't have Owner privileges
|
|
@@ -665,21 +662,21 @@ export class SqlLoggingConfigResolver extends ResolverBase {
|
|
|
665
662
|
await this.checkOwnerAccess(context);
|
|
666
663
|
|
|
667
664
|
const contextUserEmail = context.userPayload?.email || 'NOT_SET';
|
|
668
|
-
|
|
665
|
+
|
|
669
666
|
return `Context User Email: "${contextUserEmail}" | Note: Provider no longer stores user email - uses contextUser parameter for SQL logging`;
|
|
670
667
|
}
|
|
671
668
|
|
|
672
669
|
/**
|
|
673
670
|
* Ensures the specified log directory exists, creating it if necessary.
|
|
674
|
-
*
|
|
671
|
+
*
|
|
675
672
|
* This method:
|
|
676
673
|
* - Attempts to access the directory to check if it exists
|
|
677
674
|
* - Creates the directory recursively if it doesn't exist
|
|
678
675
|
* - Handles permission and file system errors gracefully
|
|
679
|
-
*
|
|
676
|
+
*
|
|
680
677
|
* @param dir - Absolute path to the directory to ensure exists
|
|
681
678
|
* @throws Error if directory cannot be created due to permissions or other issues
|
|
682
|
-
*
|
|
679
|
+
*
|
|
683
680
|
* @private
|
|
684
681
|
*/
|
|
685
682
|
private async ensureDirectoryExists(dir: string): Promise<void> {
|
|
@@ -689,4 +686,4 @@ export class SqlLoggingConfigResolver extends ResolverBase {
|
|
|
689
686
|
await fs.mkdir(dir, { recursive: true });
|
|
690
687
|
}
|
|
691
688
|
}
|
|
692
|
-
}
|
|
689
|
+
}
|