@memberjunction/server 2.112.0 → 2.113.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 +951 -808
- 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 +43 -53
- 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 +3 -1
- 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 +2 -3
- 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 +6 -3
- 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 +10 -22
- 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 +7 -9
- 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 +788 -658
- package/dist/generated/generated.d.ts.map +1 -1
- package/dist/generated/generated.js +2050 -3054
- 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 +10 -15
- 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 +13 -18
- 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 +30 -28
- 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 +50 -60
- package/dist/resolvers/AskSkipResolver.js.map +1 -1
- package/dist/resolvers/ComponentRegistryResolver.d.ts.map +1 -1
- package/dist/resolvers/ComponentRegistryResolver.js +38 -36
- 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 +40 -43
- 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 +6 -8
- 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 +28 -27
- 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 +14 -15
- 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 +44 -48
- 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 +16 -14
- package/dist/rest/EntityCRUDHandler.js.map +1 -1
- package/dist/rest/RESTEndpointHandler.d.ts.map +1 -1
- package/dist/rest/RESTEndpointHandler.js +25 -23
- 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 +21 -17
- 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 +6 -4
- 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 +1 -0
- 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 +39 -36
- package/src/agents/skip-agent.ts +1200 -1067
- package/src/agents/skip-sdk.ts +851 -877
- package/src/apolloServer/index.ts +2 -2
- package/src/auth/AuthProviderFactory.ts +14 -8
- package/src/auth/BaseAuthProvider.ts +4 -5
- package/src/auth/IAuthProvider.ts +2 -2
- package/src/auth/exampleNewUserSubClass.ts +2 -9
- package/src/auth/index.ts +26 -31
- package/src/auth/initializeProviders.ts +3 -3
- package/src/auth/newUsers.ts +134 -166
- package/src/auth/providers/Auth0Provider.ts +5 -5
- package/src/auth/providers/CognitoProvider.ts +10 -7
- package/src/auth/providers/GoogleProvider.ts +5 -4
- package/src/auth/providers/MSALProvider.ts +5 -5
- package/src/auth/providers/OktaProvider.ts +7 -6
- package/src/config.ts +54 -63
- package/src/context.ts +30 -42
- package/src/entitySubclasses/entityPermissions.server.ts +3 -3
- package/src/generated/generated.ts +40442 -48106
- package/src/generic/KeyInputOutputTypes.ts +6 -3
- package/src/generic/ResolverBase.ts +78 -119
- package/src/generic/RunViewResolver.ts +23 -27
- package/src/index.ts +48 -66
- package/src/resolvers/ActionResolver.ts +57 -46
- package/src/resolvers/AskSkipResolver.ts +533 -607
- package/src/resolvers/ComponentRegistryResolver.ts +562 -547
- package/src/resolvers/CreateQueryResolver.ts +655 -683
- package/src/resolvers/DatasetResolver.ts +6 -5
- package/src/resolvers/EntityCommunicationsResolver.ts +1 -1
- package/src/resolvers/EntityRecordNameResolver.ts +5 -9
- package/src/resolvers/EntityResolver.ts +7 -9
- package/src/resolvers/FileCategoryResolver.ts +2 -2
- package/src/resolvers/FileResolver.ts +4 -4
- package/src/resolvers/GetDataContextDataResolver.ts +118 -106
- package/src/resolvers/GetDataResolver.ts +205 -194
- package/src/resolvers/MergeRecordsResolver.ts +5 -5
- package/src/resolvers/PotentialDuplicateRecordResolver.ts +1 -1
- package/src/resolvers/QueryResolver.ts +78 -95
- package/src/resolvers/ReportResolver.ts +2 -2
- package/src/resolvers/RunAIAgentResolver.ts +828 -818
- package/src/resolvers/RunAIPromptResolver.ts +709 -693
- package/src/resolvers/RunTemplateResolver.ts +103 -105
- package/src/resolvers/SqlLoggingConfigResolver.ts +72 -69
- package/src/resolvers/SyncDataResolver.ts +352 -386
- package/src/resolvers/SyncRolesUsersResolver.ts +350 -387
- package/src/resolvers/TaskResolver.ts +115 -110
- package/src/resolvers/TransactionGroupResolver.ts +138 -143
- package/src/resolvers/UserFavoriteResolver.ts +8 -17
- package/src/resolvers/UserViewResolver.ts +12 -17
- package/src/rest/EntityCRUDHandler.ts +268 -291
- package/src/rest/RESTEndpointHandler.ts +776 -782
- package/src/rest/ViewOperationsHandler.ts +195 -191
- package/src/scheduler/LearningCycleScheduler.ts +52 -8
- package/src/services/ScheduledJobsService.ts +132 -129
- package/src/services/TaskOrchestrator.ts +776 -792
- package/src/types.ts +9 -15
- package/src/util.ts +109 -112
|
@@ -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/core';
|
|
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(
|
|
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, {
|
|
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, {
|
|
338
|
+
const provider = GetReadOnlyProvider(context.providers, {allowFallbackToReadWrite: true}) as SQLServerDataProvider;
|
|
339
339
|
const sessions = provider.GetActiveSqlLoggingSessions();
|
|
340
340
|
|
|
341
|
-
return sessions.map(
|
|
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, {
|
|
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,14 +476,17 @@ export class SqlLoggingConfigResolver extends ResolverBase {
|
|
|
476
476
|
* ```
|
|
477
477
|
*/
|
|
478
478
|
@Mutation(() => Boolean)
|
|
479
|
-
async stopSqlLogging(
|
|
479
|
+
async stopSqlLogging(
|
|
480
|
+
@Arg('sessionId', () => String) sessionId: string,
|
|
481
|
+
@Ctx() context: AppContext
|
|
482
|
+
): Promise<boolean> {
|
|
480
483
|
await this.checkOwnerAccess(context);
|
|
481
|
-
const provider = GetReadOnlyProvider(context.providers, {
|
|
482
|
-
|
|
484
|
+
const provider = GetReadOnlyProvider(context.providers, {allowFallbackToReadWrite: true}) as SQLServerDataProvider;
|
|
485
|
+
|
|
483
486
|
// Get the actual session from the private map to call dispose
|
|
484
487
|
const sessionMap = (provider as any)._sqlLoggingSessions as Map<string, any>;
|
|
485
488
|
const session = sessionMap.get(sessionId);
|
|
486
|
-
|
|
489
|
+
|
|
487
490
|
if (!session) {
|
|
488
491
|
throw new Error(`SQL logging session ${sessionId} not found`);
|
|
489
492
|
}
|
|
@@ -494,17 +497,17 @@ export class SqlLoggingConfigResolver extends ResolverBase {
|
|
|
494
497
|
|
|
495
498
|
/**
|
|
496
499
|
* Stops and disposes of all currently active SQL logging sessions.
|
|
497
|
-
*
|
|
500
|
+
*
|
|
498
501
|
* This is a convenience method that:
|
|
499
502
|
* - Calls DisposeAllSqlLoggingSessions() on the data provider
|
|
500
503
|
* - Ensures all file handles are properly closed
|
|
501
504
|
* - Clears the active sessions map
|
|
502
505
|
* - Performs cleanup for all sessions at once
|
|
503
|
-
*
|
|
506
|
+
*
|
|
504
507
|
* @param context - GraphQL context (requires Owner privileges)
|
|
505
508
|
* @returns Promise resolving to true if all sessions were successfully stopped
|
|
506
509
|
* @throws Error if user lacks Owner privileges
|
|
507
|
-
*
|
|
510
|
+
*
|
|
508
511
|
* @example
|
|
509
512
|
* ```graphql
|
|
510
513
|
* mutation {
|
|
@@ -515,23 +518,23 @@ export class SqlLoggingConfigResolver extends ResolverBase {
|
|
|
515
518
|
@Mutation(() => Boolean)
|
|
516
519
|
async stopAllSqlLogging(@Ctx() context: AppContext): Promise<boolean> {
|
|
517
520
|
await this.checkOwnerAccess(context);
|
|
518
|
-
const provider = GetReadOnlyProvider(context.providers, {
|
|
521
|
+
const provider = GetReadOnlyProvider(context.providers, {allowFallbackToReadWrite: true}) as SQLServerDataProvider;
|
|
519
522
|
await provider.DisposeAllSqlLoggingSessions();
|
|
520
523
|
return true;
|
|
521
524
|
}
|
|
522
525
|
|
|
523
526
|
/**
|
|
524
527
|
* Updates the default SQL logging options for new sessions.
|
|
525
|
-
*
|
|
528
|
+
*
|
|
526
529
|
* **Note**: This updates runtime configuration only, not the static config file.
|
|
527
530
|
* Changes apply to new sessions but do not persist across server restarts.
|
|
528
531
|
* In a production system, consider persisting changes to a database.
|
|
529
|
-
*
|
|
532
|
+
*
|
|
530
533
|
* @param options - New default options to apply (partial update supported)
|
|
531
534
|
* @param context - GraphQL context (requires Owner privileges)
|
|
532
535
|
* @returns Promise resolving to the updated SqlLoggingOptions object
|
|
533
536
|
* @throws Error if SQL logging not configured or user lacks Owner privileges
|
|
534
|
-
*
|
|
537
|
+
*
|
|
535
538
|
* @example
|
|
536
539
|
* ```graphql
|
|
537
540
|
* mutation {
|
|
@@ -562,7 +565,7 @@ export class SqlLoggingConfigResolver extends ResolverBase {
|
|
|
562
565
|
|
|
563
566
|
config.sqlLogging.defaultOptions = {
|
|
564
567
|
...config.sqlLogging.defaultOptions,
|
|
565
|
-
...options
|
|
568
|
+
...options
|
|
566
569
|
};
|
|
567
570
|
|
|
568
571
|
return config.sqlLogging.defaultOptions;
|
|
@@ -570,19 +573,19 @@ export class SqlLoggingConfigResolver extends ResolverBase {
|
|
|
570
573
|
|
|
571
574
|
/**
|
|
572
575
|
* Reads the contents of a specific SQL log file.
|
|
573
|
-
*
|
|
576
|
+
*
|
|
574
577
|
* This method:
|
|
575
578
|
* - Validates the session exists and user has access
|
|
576
579
|
* - Ensures the file path is within the allowed log directory
|
|
577
580
|
* - Reads the file content with optional line limits
|
|
578
581
|
* - Returns the content as a string
|
|
579
|
-
*
|
|
582
|
+
*
|
|
580
583
|
* @param sessionId - Unique identifier of the logging session
|
|
581
584
|
* @param maxLines - Maximum number of lines to read (optional, defaults to all)
|
|
582
585
|
* @param context - GraphQL context (requires Owner privileges)
|
|
583
586
|
* @returns Promise resolving to the log file content
|
|
584
587
|
* @throws Error if session not found, file not accessible, or user lacks privileges
|
|
585
|
-
*
|
|
588
|
+
*
|
|
586
589
|
* @example
|
|
587
590
|
* ```graphql
|
|
588
591
|
* query {
|
|
@@ -598,17 +601,17 @@ export class SqlLoggingConfigResolver extends ResolverBase {
|
|
|
598
601
|
): Promise<string> {
|
|
599
602
|
await this.checkOwnerAccess(context);
|
|
600
603
|
const config = await loadConfig();
|
|
601
|
-
|
|
604
|
+
|
|
602
605
|
// Check if SQL logging is enabled
|
|
603
606
|
if (!config.sqlLogging?.enabled) {
|
|
604
607
|
throw new Error('SQL logging is not enabled in the server configuration');
|
|
605
608
|
}
|
|
606
609
|
|
|
607
610
|
// Find the session
|
|
608
|
-
const provider = GetReadOnlyProvider(context.providers, {
|
|
611
|
+
const provider = GetReadOnlyProvider(context.providers, {allowFallbackToReadWrite: true}) as SQLServerDataProvider;
|
|
609
612
|
const sessions = provider.GetActiveSqlLoggingSessions();
|
|
610
|
-
const session = sessions.find(
|
|
611
|
-
|
|
613
|
+
const session = sessions.find(s => s.id === sessionId);
|
|
614
|
+
|
|
612
615
|
if (!session) {
|
|
613
616
|
throw new Error(`SQL logging session ${sessionId} not found`);
|
|
614
617
|
}
|
|
@@ -623,10 +626,10 @@ export class SqlLoggingConfigResolver extends ResolverBase {
|
|
|
623
626
|
try {
|
|
624
627
|
// Check if file exists
|
|
625
628
|
await fs.access(session.filePath);
|
|
626
|
-
|
|
629
|
+
|
|
627
630
|
// Read file content
|
|
628
631
|
const content = await fs.readFile(session.filePath, 'utf-8');
|
|
629
|
-
|
|
632
|
+
|
|
630
633
|
// Apply line limit if specified
|
|
631
634
|
if (maxLines && maxLines > 0) {
|
|
632
635
|
const lines = content.split('\n');
|
|
@@ -635,7 +638,7 @@ export class SqlLoggingConfigResolver extends ResolverBase {
|
|
|
635
638
|
return lines.slice(-maxLines).join('\n');
|
|
636
639
|
}
|
|
637
640
|
}
|
|
638
|
-
|
|
641
|
+
|
|
639
642
|
return content;
|
|
640
643
|
} catch (error: any) {
|
|
641
644
|
if (error.code === 'ENOENT') {
|
|
@@ -648,11 +651,11 @@ export class SqlLoggingConfigResolver extends ResolverBase {
|
|
|
648
651
|
/**
|
|
649
652
|
* Debug query to check what the current user email is in the SQL provider.
|
|
650
653
|
* This helps diagnose user filtering issues when SQL statements aren't being captured.
|
|
651
|
-
*
|
|
654
|
+
*
|
|
652
655
|
* Returns a comparison of the user email stored in the SQLServerDataProvider
|
|
653
656
|
* versus the user email from the GraphQL context, which helps identify mismatches
|
|
654
657
|
* that could prevent SQL filtering from working correctly.
|
|
655
|
-
*
|
|
658
|
+
*
|
|
656
659
|
* @param context - GraphQL context containing user information
|
|
657
660
|
* @returns Formatted string showing both email values and whether they match
|
|
658
661
|
* @throws Error if user doesn't have Owner privileges
|
|
@@ -662,21 +665,21 @@ export class SqlLoggingConfigResolver extends ResolverBase {
|
|
|
662
665
|
await this.checkOwnerAccess(context);
|
|
663
666
|
|
|
664
667
|
const contextUserEmail = context.userPayload?.email || 'NOT_SET';
|
|
665
|
-
|
|
668
|
+
|
|
666
669
|
return `Context User Email: "${contextUserEmail}" | Note: Provider no longer stores user email - uses contextUser parameter for SQL logging`;
|
|
667
670
|
}
|
|
668
671
|
|
|
669
672
|
/**
|
|
670
673
|
* Ensures the specified log directory exists, creating it if necessary.
|
|
671
|
-
*
|
|
674
|
+
*
|
|
672
675
|
* This method:
|
|
673
676
|
* - Attempts to access the directory to check if it exists
|
|
674
677
|
* - Creates the directory recursively if it doesn't exist
|
|
675
678
|
* - Handles permission and file system errors gracefully
|
|
676
|
-
*
|
|
679
|
+
*
|
|
677
680
|
* @param dir - Absolute path to the directory to ensure exists
|
|
678
681
|
* @throws Error if directory cannot be created due to permissions or other issues
|
|
679
|
-
*
|
|
682
|
+
*
|
|
680
683
|
* @private
|
|
681
684
|
*/
|
|
682
685
|
private async ensureDirectoryExists(dir: string): Promise<void> {
|
|
@@ -686,4 +689,4 @@ export class SqlLoggingConfigResolver extends ResolverBase {
|
|
|
686
689
|
await fs.mkdir(dir, { recursive: true });
|
|
687
690
|
}
|
|
688
691
|
}
|
|
689
|
-
}
|
|
692
|
+
}
|