@memberjunction/server 2.75.0 → 2.77.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 (127) hide show
  1. package/README.md +61 -2
  2. package/dist/apolloServer/index.d.ts.map +1 -1
  3. package/dist/apolloServer/index.js +1 -3
  4. package/dist/apolloServer/index.js.map +1 -1
  5. package/dist/auth/exampleNewUserSubClass.d.ts +1 -1
  6. package/dist/auth/exampleNewUserSubClass.d.ts.map +1 -1
  7. package/dist/auth/exampleNewUserSubClass.js +1 -1
  8. package/dist/auth/exampleNewUserSubClass.js.map +1 -1
  9. package/dist/auth/newUsers.js.map +1 -1
  10. package/dist/context.d.ts +5 -0
  11. package/dist/context.d.ts.map +1 -1
  12. package/dist/context.js +34 -3
  13. package/dist/context.js.map +1 -1
  14. package/dist/entitySubclasses/entityPermissions.server.d.ts +2 -2
  15. package/dist/entitySubclasses/entityPermissions.server.d.ts.map +1 -1
  16. package/dist/entitySubclasses/entityPermissions.server.js +2 -2
  17. package/dist/entitySubclasses/entityPermissions.server.js.map +1 -1
  18. package/dist/generated/generated.d.ts +1787 -1628
  19. package/dist/generated/generated.d.ts.map +1 -1
  20. package/dist/generated/generated.js +5871 -4367
  21. package/dist/generated/generated.js.map +1 -1
  22. package/dist/generic/ResolverBase.d.ts +20 -21
  23. package/dist/generic/ResolverBase.d.ts.map +1 -1
  24. package/dist/generic/ResolverBase.js +75 -59
  25. package/dist/generic/ResolverBase.js.map +1 -1
  26. package/dist/generic/RunViewResolver.d.ts +8 -8
  27. package/dist/generic/RunViewResolver.d.ts.map +1 -1
  28. package/dist/generic/RunViewResolver.js +50 -48
  29. package/dist/generic/RunViewResolver.js.map +1 -1
  30. package/dist/index.d.ts +1 -1
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +1 -1
  33. package/dist/index.js.map +1 -1
  34. package/dist/resolvers/AskSkipResolver.d.ts +6 -6
  35. package/dist/resolvers/AskSkipResolver.d.ts.map +1 -1
  36. package/dist/resolvers/AskSkipResolver.js +33 -21
  37. package/dist/resolvers/AskSkipResolver.js.map +1 -1
  38. package/dist/resolvers/CreateQueryResolver.d.ts +12 -3
  39. package/dist/resolvers/CreateQueryResolver.d.ts.map +1 -1
  40. package/dist/resolvers/CreateQueryResolver.js +121 -65
  41. package/dist/resolvers/CreateQueryResolver.js.map +1 -1
  42. package/dist/resolvers/EntityResolver.d.ts +1 -2
  43. package/dist/resolvers/EntityResolver.d.ts.map +1 -1
  44. package/dist/resolvers/EntityResolver.js +17 -9
  45. package/dist/resolvers/EntityResolver.js.map +1 -1
  46. package/dist/resolvers/FileCategoryResolver.d.ts +1 -1
  47. package/dist/resolvers/FileCategoryResolver.d.ts.map +1 -1
  48. package/dist/resolvers/FileCategoryResolver.js +9 -9
  49. package/dist/resolvers/FileCategoryResolver.js.map +1 -1
  50. package/dist/resolvers/FileResolver.d.ts.map +1 -1
  51. package/dist/resolvers/FileResolver.js +3 -1
  52. package/dist/resolvers/FileResolver.js.map +1 -1
  53. package/dist/resolvers/GetDataResolver.d.ts.map +1 -1
  54. package/dist/resolvers/GetDataResolver.js +3 -0
  55. package/dist/resolvers/GetDataResolver.js.map +1 -1
  56. package/dist/resolvers/MergeRecordsResolver.d.ts.map +1 -1
  57. package/dist/resolvers/MergeRecordsResolver.js +2 -1
  58. package/dist/resolvers/MergeRecordsResolver.js.map +1 -1
  59. package/dist/resolvers/QueryResolver.d.ts +4 -4
  60. package/dist/resolvers/QueryResolver.js +18 -18
  61. package/dist/resolvers/ReportResolver.js.map +1 -1
  62. package/dist/resolvers/SyncDataResolver.d.ts +8 -8
  63. package/dist/resolvers/SyncDataResolver.d.ts.map +1 -1
  64. package/dist/resolvers/SyncDataResolver.js +19 -19
  65. package/dist/resolvers/SyncDataResolver.js.map +1 -1
  66. package/dist/resolvers/SyncRolesUsersResolver.d.ts +10 -10
  67. package/dist/resolvers/SyncRolesUsersResolver.d.ts.map +1 -1
  68. package/dist/resolvers/SyncRolesUsersResolver.js +19 -19
  69. package/dist/resolvers/SyncRolesUsersResolver.js.map +1 -1
  70. package/dist/resolvers/TransactionGroupResolver.d.ts.map +1 -1
  71. package/dist/resolvers/TransactionGroupResolver.js.map +1 -1
  72. package/dist/resolvers/UserFavoriteResolver.d.ts +2 -2
  73. package/dist/resolvers/UserFavoriteResolver.d.ts.map +1 -1
  74. package/dist/resolvers/UserFavoriteResolver.js +7 -4
  75. package/dist/resolvers/UserFavoriteResolver.js.map +1 -1
  76. package/dist/resolvers/UserResolver.d.ts +3 -3
  77. package/dist/resolvers/UserResolver.d.ts.map +1 -1
  78. package/dist/resolvers/UserResolver.js +10 -6
  79. package/dist/resolvers/UserResolver.js.map +1 -1
  80. package/dist/resolvers/UserViewResolver.d.ts +2 -2
  81. package/dist/resolvers/UserViewResolver.d.ts.map +1 -1
  82. package/dist/resolvers/UserViewResolver.js +11 -6
  83. package/dist/resolvers/UserViewResolver.js.map +1 -1
  84. package/dist/scheduler/LearningCycleScheduler.d.ts.map +1 -1
  85. package/dist/scheduler/LearningCycleScheduler.js +7 -1
  86. package/dist/scheduler/LearningCycleScheduler.js.map +1 -1
  87. package/dist/types.d.ts +7 -4
  88. package/dist/types.d.ts.map +1 -1
  89. package/dist/types.js +4 -0
  90. package/dist/types.js.map +1 -1
  91. package/dist/util.d.ts +8 -1
  92. package/dist/util.d.ts.map +1 -1
  93. package/dist/util.js +28 -0
  94. package/dist/util.js.map +1 -1
  95. package/package.json +34 -34
  96. package/src/apolloServer/index.ts +3 -3
  97. package/src/auth/exampleNewUserSubClass.ts +3 -2
  98. package/src/auth/newUsers.ts +1 -1
  99. package/src/context.ts +49 -9
  100. package/src/entitySubclasses/entityPermissions.server.ts +3 -3
  101. package/src/generated/generated.ts +5506 -4368
  102. package/src/generic/ResolverBase.ts +103 -86
  103. package/src/generic/RunViewResolver.ts +55 -54
  104. package/src/index.ts +1 -1
  105. package/src/resolvers/AskSkipResolver.ts +44 -23
  106. package/src/resolvers/CreateQueryResolver.ts +104 -62
  107. package/src/resolvers/EntityResolver.ts +18 -9
  108. package/src/resolvers/FileCategoryResolver.ts +12 -9
  109. package/src/resolvers/FileResolver.ts +4 -2
  110. package/src/resolvers/GetDataResolver.ts +3 -0
  111. package/src/resolvers/MergeRecordsResolver.ts +2 -1
  112. package/src/resolvers/QueryResolver.ts +14 -14
  113. package/src/resolvers/ReportResolver.ts +1 -1
  114. package/src/resolvers/SyncDataResolver.ts +21 -21
  115. package/src/resolvers/SyncRolesUsersResolver.ts +24 -21
  116. package/src/resolvers/TransactionGroupResolver.ts +1 -1
  117. package/src/resolvers/UserFavoriteResolver.ts +7 -5
  118. package/src/resolvers/UserResolver.ts +10 -6
  119. package/src/resolvers/UserViewResolver.ts +13 -7
  120. package/src/scheduler/LearningCycleScheduler.ts +10 -4
  121. package/src/types.ts +14 -4
  122. package/src/util.ts +45 -2
  123. package/dist/apolloServer/TransactionPlugin.d.ts +0 -4
  124. package/dist/apolloServer/TransactionPlugin.d.ts.map +0 -1
  125. package/dist/apolloServer/TransactionPlugin.js +0 -46
  126. package/dist/apolloServer/TransactionPlugin.js.map +0 -1
  127. package/src/apolloServer/TransactionPlugin.ts +0 -53
package/src/util.ts CHANGED
@@ -4,8 +4,9 @@ import { gzip as gzipCallback, createGunzip } from 'zlib';
4
4
  import { promisify } from 'util';
5
5
  import { URL } from 'url';
6
6
  import { z } from 'zod';
7
- import { DataSourceInfo } from './types';
7
+ import { DataSourceInfo, ProviderInfo } from './types';
8
8
  import sql from 'mssql';
9
+ import { DatabaseProviderBase } from '@memberjunction/core';
9
10
 
10
11
  const gzip = promisify(gzipCallback);
11
12
 
@@ -29,7 +30,7 @@ export async function sendPostRequest(url: string, payload: any, useCompression:
29
30
  let data;
30
31
  if (useCompression) {
31
32
  try {
32
- data = await gzip(Buffer.from(JSON.stringify(payload)));
33
+ data = await gzip(Buffer.from(JSON.stringify(payload)) as any);
33
34
  headers = headers || {}; // Ensure headers is an object
34
35
  headers['Content-Encoding'] = 'gzip';
35
36
  } catch (error) {
@@ -136,6 +137,48 @@ export async function sendPostRequest(url: string, payload: any, useCompression:
136
137
  throw new Error('No suitable data source found');
137
138
  }
138
139
 
140
+ /**
141
+ * Returns the read-only provider if it exists, otherwise returns the original provider if options is not provided or if options.allowFallbackToReadWrite is true.
142
+ * @param options
143
+ * @returns
144
+ */
145
+ export function GetReadOnlyProvider(providers: Array<ProviderInfo>, options?: {allowFallbackToReadWrite: boolean}): DatabaseProviderBase {
146
+ if (!providers || providers.length === 0)
147
+ return null; // no providers available
148
+
149
+ const readOnlyProvider = providers.find((p) => p.type === 'Read-Only');
150
+ if (readOnlyProvider) {
151
+ return readOnlyProvider.provider;
152
+ }
153
+ else if (options?.allowFallbackToReadWrite) {
154
+ return providers[0].provider; // if no read-only provider is provided, use the original provider since we are allowed to fallback to read-write
155
+ }
156
+ else {
157
+ return null; // no read only provider available and we are not allowed to fallback to read-write
158
+ }
159
+ }
160
+
161
+ /**
162
+ * Returns the read-write provider if it exists, otherwise returns the original provider if options is not provided or if options.allowFallbackToReadOnly is true.
163
+ * @param options
164
+ * @returns
165
+ */
166
+ export function GetReadWriteProvider(providers: Array<ProviderInfo>, options?: {allowFallbackToReadOnly: boolean}): DatabaseProviderBase {
167
+ if (!providers || providers.length === 0)
168
+ return null; // no providers available
169
+
170
+ const readWriteProvider = providers.find((p) => p.type === 'Read-Write');
171
+ if (readWriteProvider) {
172
+ return readWriteProvider.provider;
173
+ }
174
+ else if (options?.allowFallbackToReadOnly) {
175
+ return GetReadOnlyProvider(providers, { allowFallbackToReadWrite: false }); // if no read-write provider is provided, use the read-only provider since we are allowed to fallback to read-only
176
+ }
177
+ else {
178
+ return null; // no read-write provider available and we are not allowed to fallback to read-only
179
+ }
180
+ }
181
+
139
182
  /**
140
183
  * Returns the read-write data source if it exists, otherwise throws an error.
141
184
  * @param dataSources
@@ -1,4 +0,0 @@
1
- import { ApolloServerPlugin } from '@apollo/server';
2
- import { AppContext } from '../types.js';
3
- export declare const TransactionPlugin: ApolloServerPlugin<AppContext>;
4
- //# sourceMappingURL=TransactionPlugin.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TransactionPlugin.d.ts","sourceRoot":"","sources":["../../src/apolloServer/TransactionPlugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAgF,MAAM,gBAAgB,CAAC;AAElI,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,eAAO,MAAM,iBAAiB,EAAE,kBAAkB,CAAC,UAAU,CAgD5D,CAAC"}
@@ -1,46 +0,0 @@
1
- import sql from 'mssql';
2
- export const TransactionPlugin = {
3
- async requestDidStart(requestContext) {
4
- const start = Date.now();
5
- const query = requestContext.request.query || '';
6
- const isMutation = /^\s*mutation\b/i.test(query);
7
- if (!isMutation) {
8
- return null;
9
- }
10
- const pool = requestContext.contextValue.dataSource;
11
- const transaction = new sql.Transaction(pool);
12
- requestContext.contextValue.transaction = transaction;
13
- console.log('Starting transaction wrapper, time spent: ', Date.now() - start, 'ms ');
14
- await transaction.begin();
15
- return {
16
- didEncounterErrors: async (requestContext) => {
17
- console.log('Error in transaction wrapper: ' + requestContext.errors, 'time spent: ', Date.now() - start, 'ms');
18
- },
19
- executionDidStart: async () => {
20
- return {
21
- executionDidEnd: async (err) => {
22
- try {
23
- if (err) {
24
- console.log('Error in transaction, rolling back, time spent: ', Date.now() - start, 'ms ');
25
- console.error('Rolling back transaction', err);
26
- await transaction.rollback();
27
- }
28
- else {
29
- console.log('Committing transaction, time spent: ', Date.now() - start, 'ms ');
30
- await transaction.commit();
31
- }
32
- }
33
- catch (execErr) {
34
- console.log('Execution Error, time spent: ', Date.now() - start, 'ms ');
35
- console.error(execErr);
36
- }
37
- finally {
38
- console.log('Transaction complete, time spent: ', Date.now() - start, 'ms ');
39
- }
40
- },
41
- };
42
- },
43
- };
44
- },
45
- };
46
- //# sourceMappingURL=TransactionPlugin.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TransactionPlugin.js","sourceRoot":"","sources":["../../src/apolloServer/TransactionPlugin.ts"],"names":[],"mappings":"AACA,OAAO,GAAG,MAAM,OAAO,CAAC;AAGxB,MAAM,CAAC,MAAM,iBAAiB,GAAmC;IAC/D,KAAK,CAAC,eAAe,CAAC,cAAc;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;QACjD,MAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEjD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC;QACd,CAAC;QAKD,MAAM,IAAI,GAAuB,cAAc,CAAC,YAAY,CAAC,UAAU,CAAC;QACxE,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAG7C,cAAc,CAAC,YAAoB,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,4CAA4C,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,KAAK,CAAC,CAAC;QACrF,MAAM,WAAW,CAAC,KAAK,EAAE,CAAC;QAE1B,OAAO;YACL,kBAAkB,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE;gBAC3C,OAAO,CAAC,GAAG,CAAC,gCAAgC,GAAG,cAAc,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC;YAClH,CAAC;YACD,iBAAiB,EAAE,KAAK,IAAI,EAAE;gBAC5B,OAAO;oBACL,eAAe,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;wBAC7B,IAAI,CAAC;4BACH,IAAI,GAAG,EAAE,CAAC;gCACR,OAAO,CAAC,GAAG,CAAC,kDAAkD,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,KAAK,CAAC,CAAC;gCAC3F,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,GAAG,CAAC,CAAC;gCAC/C,MAAM,WAAW,CAAC,QAAQ,EAAE,CAAC;4BAC/B,CAAC;iCAAM,CAAC;gCACN,OAAO,CAAC,GAAG,CAAC,sCAAsC,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,KAAK,CAAC,CAAC;gCAC/E,MAAM,WAAW,CAAC,MAAM,EAAE,CAAC;4BAC7B,CAAC;wBACH,CAAC;wBAAC,OAAO,OAAO,EAAE,CAAC;4BACjB,OAAO,CAAC,GAAG,CAAC,+BAA+B,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,KAAK,CAAC,CAAC;4BACxE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;wBACzB,CAAC;gCAAS,CAAC;4BACT,OAAO,CAAC,GAAG,CAAC,oCAAoC,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,KAAK,CAAC,CAAC;wBAC/E,CAAC;oBACH,CAAC;iBACF,CAAC;YACJ,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC"}
@@ -1,53 +0,0 @@
1
- import { ApolloServerPlugin, GraphQLRequestContextDidEncounterErrors, GraphQLRequestListenerParsingDidEnd } from '@apollo/server';
2
- import sql from 'mssql';
3
- import { AppContext } from '../types.js';
4
-
5
- export const TransactionPlugin: ApolloServerPlugin<AppContext> = {
6
- async requestDidStart(requestContext) {
7
- const start = Date.now();
8
- const query = requestContext.request.query || '';
9
- const isMutation = /^\s*mutation\b/i.test(query);
10
-
11
- if (!isMutation) {
12
- return null;
13
- }
14
-
15
- // Start transaction, one or more mutations. If it is just one mutation, this trans wrapper isn't really needed
16
- // but there's no good way to know if it's one or more mutations, so we just start a transaction anyway and it isn't terribly expensive
17
- // to do so with SQL Server anyway.
18
- const pool: sql.ConnectionPool = requestContext.contextValue.dataSource;
19
- const transaction = new sql.Transaction(pool);
20
-
21
- // Store transaction in context for resolvers to use
22
- (requestContext.contextValue as any).transaction = transaction;
23
- console.log('Starting transaction wrapper, time spent: ', Date.now() - start, 'ms ');
24
- await transaction.begin();
25
-
26
- return {
27
- didEncounterErrors: async (requestContext) => {
28
- console.log('Error in transaction wrapper: ' + requestContext.errors, 'time spent: ', Date.now() - start, 'ms');
29
- },
30
- executionDidStart: async () => {
31
- return {
32
- executionDidEnd: async (err) => {
33
- try {
34
- if (err) {
35
- console.log('Error in transaction, rolling back, time spent: ', Date.now() - start, 'ms ');
36
- console.error('Rolling back transaction', err);
37
- await transaction.rollback();
38
- } else {
39
- console.log('Committing transaction, time spent: ', Date.now() - start, 'ms ');
40
- await transaction.commit();
41
- }
42
- } catch (execErr) {
43
- console.log('Execution Error, time spent: ', Date.now() - start, 'ms ');
44
- console.error(execErr);
45
- } finally {
46
- console.log('Transaction complete, time spent: ', Date.now() - start, 'ms ');
47
- }
48
- },
49
- };
50
- },
51
- };
52
- },
53
- };