@memberjunction/server 2.112.0 → 2.113.1

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 +951 -808
  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 +43 -53
  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 +3 -1
  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 +2 -3
  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 +6 -3
  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 +10 -22
  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 +7 -9
  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 +788 -658
  65. package/dist/generated/generated.d.ts.map +1 -1
  66. package/dist/generated/generated.js +2050 -3054
  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 +10 -15
  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 +13 -18
  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 +30 -28
  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 +50 -60
  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 +38 -36
  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 +40 -43
  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 +6 -8
  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 +28 -27
  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 +14 -15
  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 +44 -48
  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 +16 -14
  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 +25 -23
  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 +21 -17
  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 +6 -4
  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 +1 -0
  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 +39 -36
  194. package/src/agents/skip-agent.ts +1200 -1067
  195. package/src/agents/skip-sdk.ts +851 -877
  196. package/src/apolloServer/index.ts +2 -2
  197. package/src/auth/AuthProviderFactory.ts +14 -8
  198. package/src/auth/BaseAuthProvider.ts +4 -5
  199. package/src/auth/IAuthProvider.ts +2 -2
  200. package/src/auth/exampleNewUserSubClass.ts +2 -9
  201. package/src/auth/index.ts +26 -31
  202. package/src/auth/initializeProviders.ts +3 -3
  203. package/src/auth/newUsers.ts +134 -166
  204. package/src/auth/providers/Auth0Provider.ts +5 -5
  205. package/src/auth/providers/CognitoProvider.ts +10 -7
  206. package/src/auth/providers/GoogleProvider.ts +5 -4
  207. package/src/auth/providers/MSALProvider.ts +5 -5
  208. package/src/auth/providers/OktaProvider.ts +7 -6
  209. package/src/config.ts +54 -63
  210. package/src/context.ts +30 -42
  211. package/src/entitySubclasses/entityPermissions.server.ts +3 -3
  212. package/src/generated/generated.ts +40442 -48106
  213. package/src/generic/KeyInputOutputTypes.ts +6 -3
  214. package/src/generic/ResolverBase.ts +78 -119
  215. package/src/generic/RunViewResolver.ts +23 -27
  216. package/src/index.ts +48 -66
  217. package/src/resolvers/ActionResolver.ts +57 -46
  218. package/src/resolvers/AskSkipResolver.ts +533 -607
  219. package/src/resolvers/ComponentRegistryResolver.ts +562 -547
  220. package/src/resolvers/CreateQueryResolver.ts +655 -683
  221. package/src/resolvers/DatasetResolver.ts +6 -5
  222. package/src/resolvers/EntityCommunicationsResolver.ts +1 -1
  223. package/src/resolvers/EntityRecordNameResolver.ts +5 -9
  224. package/src/resolvers/EntityResolver.ts +7 -9
  225. package/src/resolvers/FileCategoryResolver.ts +2 -2
  226. package/src/resolvers/FileResolver.ts +4 -4
  227. package/src/resolvers/GetDataContextDataResolver.ts +118 -106
  228. package/src/resolvers/GetDataResolver.ts +205 -194
  229. package/src/resolvers/MergeRecordsResolver.ts +5 -5
  230. package/src/resolvers/PotentialDuplicateRecordResolver.ts +1 -1
  231. package/src/resolvers/QueryResolver.ts +78 -95
  232. package/src/resolvers/ReportResolver.ts +2 -2
  233. package/src/resolvers/RunAIAgentResolver.ts +828 -818
  234. package/src/resolvers/RunAIPromptResolver.ts +709 -693
  235. package/src/resolvers/RunTemplateResolver.ts +103 -105
  236. package/src/resolvers/SqlLoggingConfigResolver.ts +72 -69
  237. package/src/resolvers/SyncDataResolver.ts +352 -386
  238. package/src/resolvers/SyncRolesUsersResolver.ts +350 -387
  239. package/src/resolvers/TaskResolver.ts +115 -110
  240. package/src/resolvers/TransactionGroupResolver.ts +138 -143
  241. package/src/resolvers/UserFavoriteResolver.ts +8 -17
  242. package/src/resolvers/UserViewResolver.ts +12 -17
  243. package/src/rest/EntityCRUDHandler.ts +268 -291
  244. package/src/rest/RESTEndpointHandler.ts +776 -782
  245. package/src/rest/ViewOperationsHandler.ts +195 -191
  246. package/src/scheduler/LearningCycleScheduler.ts +52 -8
  247. package/src/services/ScheduledJobsService.ts +132 -129
  248. package/src/services/TaskOrchestrator.ts +776 -792
  249. package/src/types.ts +9 -15
  250. 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/global';
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((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,14 +476,17 @@ export class SqlLoggingConfigResolver extends ResolverBase {
476
476
  * ```
477
477
  */
478
478
  @Mutation(() => Boolean)
479
- async stopSqlLogging(@Arg('sessionId', () => String) sessionId: string, @Ctx() context: AppContext): Promise<boolean> {
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, { allowFallbackToReadWrite: true }) as SQLServerDataProvider;
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, { allowFallbackToReadWrite: true }) as SQLServerDataProvider;
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, { allowFallbackToReadWrite: true }) as SQLServerDataProvider;
611
+ const provider = GetReadOnlyProvider(context.providers, {allowFallbackToReadWrite: true}) as SQLServerDataProvider;
609
612
  const sessions = provider.GetActiveSqlLoggingSessions();
610
- const session = sessions.find((s) => s.id === sessionId);
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
+ }