@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.
Files changed (250) hide show
  1. package/dist/agents/skip-agent.d.ts +4 -4
  2. package/dist/agents/skip-agent.d.ts.map +1 -1
  3. package/dist/agents/skip-agent.js +808 -951
  4. package/dist/agents/skip-agent.js.map +1 -1
  5. package/dist/agents/skip-sdk.d.ts +1 -1
  6. package/dist/agents/skip-sdk.d.ts.map +1 -1
  7. package/dist/agents/skip-sdk.js +53 -43
  8. package/dist/agents/skip-sdk.js.map +1 -1
  9. package/dist/apolloServer/index.js +1 -1
  10. package/dist/auth/AuthProviderFactory.d.ts +1 -1
  11. package/dist/auth/AuthProviderFactory.d.ts.map +1 -1
  12. package/dist/auth/AuthProviderFactory.js +1 -3
  13. package/dist/auth/AuthProviderFactory.js.map +1 -1
  14. package/dist/auth/BaseAuthProvider.d.ts +1 -1
  15. package/dist/auth/BaseAuthProvider.d.ts.map +1 -1
  16. package/dist/auth/BaseAuthProvider.js +3 -2
  17. package/dist/auth/BaseAuthProvider.js.map +1 -1
  18. package/dist/auth/IAuthProvider.d.ts +1 -1
  19. package/dist/auth/IAuthProvider.d.ts.map +1 -1
  20. package/dist/auth/exampleNewUserSubClass.d.ts.map +1 -1
  21. package/dist/auth/exampleNewUserSubClass.js +1 -1
  22. package/dist/auth/exampleNewUserSubClass.js.map +1 -1
  23. package/dist/auth/index.d.ts +1 -1
  24. package/dist/auth/index.d.ts.map +1 -1
  25. package/dist/auth/index.js +6 -6
  26. package/dist/auth/index.js.map +1 -1
  27. package/dist/auth/initializeProviders.js +1 -1
  28. package/dist/auth/initializeProviders.js.map +1 -1
  29. package/dist/auth/newUsers.d.ts +1 -1
  30. package/dist/auth/newUsers.d.ts.map +1 -1
  31. package/dist/auth/newUsers.js +7 -7
  32. package/dist/auth/newUsers.js.map +1 -1
  33. package/dist/auth/providers/Auth0Provider.d.ts +1 -1
  34. package/dist/auth/providers/Auth0Provider.d.ts.map +1 -1
  35. package/dist/auth/providers/Auth0Provider.js +1 -1
  36. package/dist/auth/providers/Auth0Provider.js.map +1 -1
  37. package/dist/auth/providers/CognitoProvider.d.ts +1 -1
  38. package/dist/auth/providers/CognitoProvider.d.ts.map +1 -1
  39. package/dist/auth/providers/CognitoProvider.js +3 -6
  40. package/dist/auth/providers/CognitoProvider.js.map +1 -1
  41. package/dist/auth/providers/GoogleProvider.d.ts +1 -1
  42. package/dist/auth/providers/GoogleProvider.d.ts.map +1 -1
  43. package/dist/auth/providers/GoogleProvider.js +1 -1
  44. package/dist/auth/providers/GoogleProvider.js.map +1 -1
  45. package/dist/auth/providers/MSALProvider.d.ts +1 -1
  46. package/dist/auth/providers/MSALProvider.d.ts.map +1 -1
  47. package/dist/auth/providers/MSALProvider.js +1 -1
  48. package/dist/auth/providers/MSALProvider.js.map +1 -1
  49. package/dist/auth/providers/OktaProvider.d.ts +1 -1
  50. package/dist/auth/providers/OktaProvider.d.ts.map +1 -1
  51. package/dist/auth/providers/OktaProvider.js +1 -1
  52. package/dist/auth/providers/OktaProvider.js.map +1 -1
  53. package/dist/config.d.ts.map +1 -1
  54. package/dist/config.js +22 -10
  55. package/dist/config.js.map +1 -1
  56. package/dist/context.d.ts +1 -1
  57. package/dist/context.d.ts.map +1 -1
  58. package/dist/context.js +9 -7
  59. package/dist/context.js.map +1 -1
  60. package/dist/entitySubclasses/entityPermissions.server.d.ts +1 -1
  61. package/dist/entitySubclasses/entityPermissions.server.d.ts.map +1 -1
  62. package/dist/entitySubclasses/entityPermissions.server.js +1 -1
  63. package/dist/entitySubclasses/entityPermissions.server.js.map +1 -1
  64. package/dist/generated/generated.d.ts +648 -648
  65. package/dist/generated/generated.d.ts.map +1 -1
  66. package/dist/generated/generated.js +2986 -1133
  67. package/dist/generated/generated.js.map +1 -1
  68. package/dist/generic/KeyInputOutputTypes.d.ts +1 -1
  69. package/dist/generic/KeyInputOutputTypes.d.ts.map +1 -1
  70. package/dist/generic/KeyInputOutputTypes.js +1 -1
  71. package/dist/generic/KeyInputOutputTypes.js.map +1 -1
  72. package/dist/generic/ResolverBase.d.ts +1 -1
  73. package/dist/generic/ResolverBase.d.ts.map +1 -1
  74. package/dist/generic/ResolverBase.js +15 -10
  75. package/dist/generic/ResolverBase.js.map +1 -1
  76. package/dist/generic/RunViewResolver.d.ts +1 -1
  77. package/dist/generic/RunViewResolver.d.ts.map +1 -1
  78. package/dist/generic/RunViewResolver.js +15 -15
  79. package/dist/generic/RunViewResolver.js.map +1 -1
  80. package/dist/index.d.ts.map +1 -1
  81. package/dist/index.js +18 -9
  82. package/dist/index.js.map +1 -1
  83. package/dist/resolvers/ActionResolver.d.ts +2 -2
  84. package/dist/resolvers/ActionResolver.d.ts.map +1 -1
  85. package/dist/resolvers/ActionResolver.js +28 -30
  86. package/dist/resolvers/ActionResolver.js.map +1 -1
  87. package/dist/resolvers/AskSkipResolver.d.ts +2 -2
  88. package/dist/resolvers/AskSkipResolver.d.ts.map +1 -1
  89. package/dist/resolvers/AskSkipResolver.js +60 -50
  90. package/dist/resolvers/AskSkipResolver.js.map +1 -1
  91. package/dist/resolvers/ComponentRegistryResolver.d.ts.map +1 -1
  92. package/dist/resolvers/ComponentRegistryResolver.js +36 -38
  93. package/dist/resolvers/ComponentRegistryResolver.js.map +1 -1
  94. package/dist/resolvers/CreateQueryResolver.d.ts +1 -1
  95. package/dist/resolvers/CreateQueryResolver.d.ts.map +1 -1
  96. package/dist/resolvers/CreateQueryResolver.js +43 -40
  97. package/dist/resolvers/CreateQueryResolver.js.map +1 -1
  98. package/dist/resolvers/DatasetResolver.d.ts.map +1 -1
  99. package/dist/resolvers/DatasetResolver.js +1 -1
  100. package/dist/resolvers/DatasetResolver.js.map +1 -1
  101. package/dist/resolvers/EntityRecordNameResolver.d.ts +1 -1
  102. package/dist/resolvers/EntityRecordNameResolver.d.ts.map +1 -1
  103. package/dist/resolvers/EntityRecordNameResolver.js +1 -1
  104. package/dist/resolvers/EntityRecordNameResolver.js.map +1 -1
  105. package/dist/resolvers/EntityResolver.d.ts.map +1 -1
  106. package/dist/resolvers/EntityResolver.js +1 -1
  107. package/dist/resolvers/EntityResolver.js.map +1 -1
  108. package/dist/resolvers/FileCategoryResolver.js +1 -1
  109. package/dist/resolvers/FileCategoryResolver.js.map +1 -1
  110. package/dist/resolvers/FileResolver.js +1 -1
  111. package/dist/resolvers/FileResolver.js.map +1 -1
  112. package/dist/resolvers/GetDataContextDataResolver.d.ts +1 -1
  113. package/dist/resolvers/GetDataContextDataResolver.d.ts.map +1 -1
  114. package/dist/resolvers/GetDataContextDataResolver.js +5 -5
  115. package/dist/resolvers/GetDataContextDataResolver.js.map +1 -1
  116. package/dist/resolvers/GetDataResolver.d.ts.map +1 -1
  117. package/dist/resolvers/GetDataResolver.js +8 -6
  118. package/dist/resolvers/GetDataResolver.js.map +1 -1
  119. package/dist/resolvers/MergeRecordsResolver.d.ts +3 -3
  120. package/dist/resolvers/MergeRecordsResolver.d.ts.map +1 -1
  121. package/dist/resolvers/MergeRecordsResolver.js +3 -3
  122. package/dist/resolvers/MergeRecordsResolver.js.map +1 -1
  123. package/dist/resolvers/PotentialDuplicateRecordResolver.d.ts +1 -1
  124. package/dist/resolvers/PotentialDuplicateRecordResolver.d.ts.map +1 -1
  125. package/dist/resolvers/PotentialDuplicateRecordResolver.js +1 -1
  126. package/dist/resolvers/PotentialDuplicateRecordResolver.js.map +1 -1
  127. package/dist/resolvers/QueryResolver.d.ts.map +1 -1
  128. package/dist/resolvers/QueryResolver.js +11 -11
  129. package/dist/resolvers/QueryResolver.js.map +1 -1
  130. package/dist/resolvers/ReportResolver.js +1 -1
  131. package/dist/resolvers/ReportResolver.js.map +1 -1
  132. package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
  133. package/dist/resolvers/RunAIAgentResolver.js +27 -28
  134. package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
  135. package/dist/resolvers/RunAIPromptResolver.d.ts.map +1 -1
  136. package/dist/resolvers/RunAIPromptResolver.js +31 -31
  137. package/dist/resolvers/RunAIPromptResolver.js.map +1 -1
  138. package/dist/resolvers/RunTemplateResolver.d.ts.map +1 -1
  139. package/dist/resolvers/RunTemplateResolver.js +9 -9
  140. package/dist/resolvers/RunTemplateResolver.js.map +1 -1
  141. package/dist/resolvers/SqlLoggingConfigResolver.d.ts.map +1 -1
  142. package/dist/resolvers/SqlLoggingConfigResolver.js +10 -10
  143. package/dist/resolvers/SqlLoggingConfigResolver.js.map +1 -1
  144. package/dist/resolvers/SyncDataResolver.d.ts +1 -1
  145. package/dist/resolvers/SyncDataResolver.d.ts.map +1 -1
  146. package/dist/resolvers/SyncDataResolver.js +15 -14
  147. package/dist/resolvers/SyncDataResolver.js.map +1 -1
  148. package/dist/resolvers/SyncRolesUsersResolver.d.ts +1 -1
  149. package/dist/resolvers/SyncRolesUsersResolver.d.ts.map +1 -1
  150. package/dist/resolvers/SyncRolesUsersResolver.js +48 -44
  151. package/dist/resolvers/SyncRolesUsersResolver.js.map +1 -1
  152. package/dist/resolvers/TaskResolver.d.ts.map +1 -1
  153. package/dist/resolvers/TaskResolver.js +7 -7
  154. package/dist/resolvers/TaskResolver.js.map +1 -1
  155. package/dist/resolvers/TransactionGroupResolver.d.ts +1 -1
  156. package/dist/resolvers/TransactionGroupResolver.d.ts.map +1 -1
  157. package/dist/resolvers/TransactionGroupResolver.js +12 -12
  158. package/dist/resolvers/TransactionGroupResolver.js.map +1 -1
  159. package/dist/resolvers/UserFavoriteResolver.d.ts +1 -1
  160. package/dist/resolvers/UserFavoriteResolver.d.ts.map +1 -1
  161. package/dist/resolvers/UserFavoriteResolver.js +1 -1
  162. package/dist/resolvers/UserFavoriteResolver.js.map +1 -1
  163. package/dist/resolvers/UserViewResolver.d.ts.map +1 -1
  164. package/dist/resolvers/UserViewResolver.js.map +1 -1
  165. package/dist/rest/EntityCRUDHandler.d.ts +1 -1
  166. package/dist/rest/EntityCRUDHandler.d.ts.map +1 -1
  167. package/dist/rest/EntityCRUDHandler.js +14 -16
  168. package/dist/rest/EntityCRUDHandler.js.map +1 -1
  169. package/dist/rest/RESTEndpointHandler.d.ts.map +1 -1
  170. package/dist/rest/RESTEndpointHandler.js +23 -25
  171. package/dist/rest/RESTEndpointHandler.js.map +1 -1
  172. package/dist/rest/ViewOperationsHandler.d.ts +1 -1
  173. package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
  174. package/dist/rest/ViewOperationsHandler.js +17 -21
  175. package/dist/rest/ViewOperationsHandler.js.map +1 -1
  176. package/dist/scheduler/LearningCycleScheduler.d.ts.map +1 -1
  177. package/dist/scheduler/LearningCycleScheduler.js.map +1 -1
  178. package/dist/services/ScheduledJobsService.d.ts.map +1 -1
  179. package/dist/services/ScheduledJobsService.js +4 -6
  180. package/dist/services/ScheduledJobsService.js.map +1 -1
  181. package/dist/services/TaskOrchestrator.d.ts +1 -1
  182. package/dist/services/TaskOrchestrator.d.ts.map +1 -1
  183. package/dist/services/TaskOrchestrator.js +30 -30
  184. package/dist/services/TaskOrchestrator.js.map +1 -1
  185. package/dist/types.d.ts +3 -3
  186. package/dist/types.d.ts.map +1 -1
  187. package/dist/types.js +0 -1
  188. package/dist/types.js.map +1 -1
  189. package/dist/util.d.ts +1 -1
  190. package/dist/util.d.ts.map +1 -1
  191. package/dist/util.js +2 -2
  192. package/dist/util.js.map +1 -1
  193. package/package.json +36 -37
  194. package/src/agents/skip-agent.ts +1067 -1200
  195. package/src/agents/skip-sdk.ts +877 -851
  196. package/src/apolloServer/index.ts +2 -2
  197. package/src/auth/AuthProviderFactory.ts +8 -14
  198. package/src/auth/BaseAuthProvider.ts +5 -4
  199. package/src/auth/IAuthProvider.ts +2 -2
  200. package/src/auth/exampleNewUserSubClass.ts +9 -2
  201. package/src/auth/index.ts +31 -26
  202. package/src/auth/initializeProviders.ts +3 -3
  203. package/src/auth/newUsers.ts +166 -134
  204. package/src/auth/providers/Auth0Provider.ts +5 -5
  205. package/src/auth/providers/CognitoProvider.ts +7 -10
  206. package/src/auth/providers/GoogleProvider.ts +4 -5
  207. package/src/auth/providers/MSALProvider.ts +5 -5
  208. package/src/auth/providers/OktaProvider.ts +6 -7
  209. package/src/config.ts +63 -54
  210. package/src/context.ts +42 -30
  211. package/src/entitySubclasses/entityPermissions.server.ts +3 -3
  212. package/src/generated/generated.ts +48130 -39930
  213. package/src/generic/KeyInputOutputTypes.ts +3 -6
  214. package/src/generic/ResolverBase.ts +119 -78
  215. package/src/generic/RunViewResolver.ts +27 -23
  216. package/src/index.ts +66 -42
  217. package/src/resolvers/ActionResolver.ts +46 -57
  218. package/src/resolvers/AskSkipResolver.ts +607 -533
  219. package/src/resolvers/ComponentRegistryResolver.ts +547 -562
  220. package/src/resolvers/CreateQueryResolver.ts +683 -655
  221. package/src/resolvers/DatasetResolver.ts +5 -6
  222. package/src/resolvers/EntityCommunicationsResolver.ts +1 -1
  223. package/src/resolvers/EntityRecordNameResolver.ts +9 -5
  224. package/src/resolvers/EntityResolver.ts +9 -7
  225. package/src/resolvers/FileCategoryResolver.ts +2 -2
  226. package/src/resolvers/FileResolver.ts +4 -4
  227. package/src/resolvers/GetDataContextDataResolver.ts +106 -118
  228. package/src/resolvers/GetDataResolver.ts +194 -205
  229. package/src/resolvers/MergeRecordsResolver.ts +5 -5
  230. package/src/resolvers/PotentialDuplicateRecordResolver.ts +1 -1
  231. package/src/resolvers/QueryResolver.ts +95 -78
  232. package/src/resolvers/ReportResolver.ts +2 -2
  233. package/src/resolvers/RunAIAgentResolver.ts +818 -828
  234. package/src/resolvers/RunAIPromptResolver.ts +693 -709
  235. package/src/resolvers/RunTemplateResolver.ts +105 -103
  236. package/src/resolvers/SqlLoggingConfigResolver.ts +69 -72
  237. package/src/resolvers/SyncDataResolver.ts +386 -352
  238. package/src/resolvers/SyncRolesUsersResolver.ts +387 -350
  239. package/src/resolvers/TaskResolver.ts +110 -115
  240. package/src/resolvers/TransactionGroupResolver.ts +143 -138
  241. package/src/resolvers/UserFavoriteResolver.ts +17 -8
  242. package/src/resolvers/UserViewResolver.ts +17 -12
  243. package/src/rest/EntityCRUDHandler.ts +291 -268
  244. package/src/rest/RESTEndpointHandler.ts +782 -776
  245. package/src/rest/ViewOperationsHandler.ts +191 -195
  246. package/src/scheduler/LearningCycleScheduler.ts +8 -52
  247. package/src/services/ScheduledJobsService.ts +129 -132
  248. package/src/services/TaskOrchestrator.ts +792 -776
  249. package/src/types.ts +15 -9
  250. 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/core';
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
+ }