@memberjunction/server 2.1.5 → 2.2.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 (149) hide show
  1. package/dist/apolloServer/TransactionPlugin.d.ts +1 -1
  2. package/dist/apolloServer/TransactionPlugin.d.ts.map +1 -1
  3. package/dist/apolloServer/TransactionPlugin.js.map +1 -1
  4. package/dist/apolloServer/index.d.ts +1 -1
  5. package/dist/apolloServer/index.d.ts.map +1 -1
  6. package/dist/apolloServer/index.js +2 -2
  7. package/dist/apolloServer/index.js.map +1 -1
  8. package/dist/auth/exampleNewUserSubClass.d.ts +1 -1
  9. package/dist/auth/exampleNewUserSubClass.d.ts.map +1 -1
  10. package/dist/auth/exampleNewUserSubClass.js +7 -7
  11. package/dist/auth/exampleNewUserSubClass.js.map +1 -1
  12. package/dist/auth/index.d.ts +1 -1
  13. package/dist/auth/index.d.ts.map +1 -1
  14. package/dist/auth/index.js +18 -8
  15. package/dist/auth/index.js.map +1 -1
  16. package/dist/auth/newUsers.js +1 -1
  17. package/dist/auth/newUsers.js.map +1 -1
  18. package/dist/context.d.ts +1 -1
  19. package/dist/context.d.ts.map +1 -1
  20. package/dist/context.js +4 -4
  21. package/dist/context.js.map +1 -1
  22. package/dist/directives/Public.d.ts +1 -1
  23. package/dist/directives/Public.d.ts.map +1 -1
  24. package/dist/directives/index.d.ts +1 -1
  25. package/dist/directives/index.d.ts.map +1 -1
  26. package/dist/directives/index.js +1 -1
  27. package/dist/directives/index.js.map +1 -1
  28. package/dist/entitySubclasses/entityPermissions.server.d.ts +1 -1
  29. package/dist/entitySubclasses/entityPermissions.server.d.ts.map +1 -1
  30. package/dist/entitySubclasses/entityPermissions.server.js +5 -6
  31. package/dist/entitySubclasses/entityPermissions.server.js.map +1 -1
  32. package/dist/generated/generated.d.ts +14 -2
  33. package/dist/generated/generated.d.ts.map +1 -1
  34. package/dist/generated/generated.js +79 -18
  35. package/dist/generated/generated.js.map +1 -1
  36. package/dist/generic/ResolverBase.d.ts +3 -3
  37. package/dist/generic/ResolverBase.d.ts.map +1 -1
  38. package/dist/generic/ResolverBase.js +1 -1
  39. package/dist/generic/ResolverBase.js.map +1 -1
  40. package/dist/generic/RunViewResolver.d.ts +2 -2
  41. package/dist/generic/RunViewResolver.d.ts.map +1 -1
  42. package/dist/generic/RunViewResolver.js +1 -1
  43. package/dist/generic/RunViewResolver.js.map +1 -1
  44. package/dist/index.d.ts +21 -21
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +36 -27
  47. package/dist/index.js.map +1 -1
  48. package/dist/orm.js +4 -4
  49. package/dist/orm.js.map +1 -1
  50. package/dist/resolvers/AskSkipResolver.d.ts +3 -3
  51. package/dist/resolvers/AskSkipResolver.d.ts.map +1 -1
  52. package/dist/resolvers/AskSkipResolver.js +64 -59
  53. package/dist/resolvers/AskSkipResolver.js.map +1 -1
  54. package/dist/resolvers/ColorResolver.d.ts +1 -1
  55. package/dist/resolvers/ColorResolver.d.ts.map +1 -1
  56. package/dist/resolvers/ColorResolver.js +1 -1
  57. package/dist/resolvers/ColorResolver.js.map +1 -1
  58. package/dist/resolvers/DatasetResolver.d.ts +1 -1
  59. package/dist/resolvers/DatasetResolver.d.ts.map +1 -1
  60. package/dist/resolvers/EntityCommunicationsResolver.d.ts +2 -2
  61. package/dist/resolvers/EntityCommunicationsResolver.d.ts.map +1 -1
  62. package/dist/resolvers/EntityCommunicationsResolver.js +9 -4
  63. package/dist/resolvers/EntityCommunicationsResolver.js.map +1 -1
  64. package/dist/resolvers/EntityRecordNameResolver.d.ts +2 -2
  65. package/dist/resolvers/EntityRecordNameResolver.d.ts.map +1 -1
  66. package/dist/resolvers/EntityRecordNameResolver.js +2 -2
  67. package/dist/resolvers/EntityRecordNameResolver.js.map +1 -1
  68. package/dist/resolvers/EntityResolver.d.ts +2 -2
  69. package/dist/resolvers/EntityResolver.d.ts.map +1 -1
  70. package/dist/resolvers/EntityResolver.js +1 -1
  71. package/dist/resolvers/EntityResolver.js.map +1 -1
  72. package/dist/resolvers/FileCategoryResolver.d.ts +1 -1
  73. package/dist/resolvers/FileCategoryResolver.d.ts.map +1 -1
  74. package/dist/resolvers/FileCategoryResolver.js +2 -2
  75. package/dist/resolvers/FileCategoryResolver.js.map +1 -1
  76. package/dist/resolvers/FileResolver.d.ts +2 -2
  77. package/dist/resolvers/FileResolver.d.ts.map +1 -1
  78. package/dist/resolvers/FileResolver.js +3 -3
  79. package/dist/resolvers/FileResolver.js.map +1 -1
  80. package/dist/resolvers/MergeRecordsResolver.d.ts +2 -2
  81. package/dist/resolvers/MergeRecordsResolver.d.ts.map +1 -1
  82. package/dist/resolvers/MergeRecordsResolver.js +4 -2
  83. package/dist/resolvers/MergeRecordsResolver.js.map +1 -1
  84. package/dist/resolvers/PotentialDuplicateRecordResolver.d.ts +2 -2
  85. package/dist/resolvers/PotentialDuplicateRecordResolver.d.ts.map +1 -1
  86. package/dist/resolvers/PotentialDuplicateRecordResolver.js +1 -1
  87. package/dist/resolvers/PotentialDuplicateRecordResolver.js.map +1 -1
  88. package/dist/resolvers/QueryResolver.d.ts +1 -1
  89. package/dist/resolvers/QueryResolver.d.ts.map +1 -1
  90. package/dist/resolvers/ReportResolver.d.ts +1 -1
  91. package/dist/resolvers/ReportResolver.d.ts.map +1 -1
  92. package/dist/resolvers/ReportResolver.js +16 -14
  93. package/dist/resolvers/ReportResolver.js.map +1 -1
  94. package/dist/resolvers/UserFavoriteResolver.d.ts +1 -1
  95. package/dist/resolvers/UserFavoriteResolver.d.ts.map +1 -1
  96. package/dist/resolvers/UserFavoriteResolver.js +17 -16
  97. package/dist/resolvers/UserFavoriteResolver.js.map +1 -1
  98. package/dist/resolvers/UserResolver.d.ts +1 -1
  99. package/dist/resolvers/UserResolver.d.ts.map +1 -1
  100. package/dist/resolvers/UserResolver.js +1 -1
  101. package/dist/resolvers/UserResolver.js.map +1 -1
  102. package/dist/resolvers/UserViewResolver.d.ts +1 -1
  103. package/dist/resolvers/UserViewResolver.d.ts.map +1 -1
  104. package/dist/resolvers/UserViewResolver.js +2 -2
  105. package/dist/resolvers/UserViewResolver.js.map +1 -1
  106. package/dist/util.d.ts.map +1 -1
  107. package/dist/util.js +11 -5
  108. package/dist/util.js.map +1 -1
  109. package/package.json +27 -23
  110. package/src/apolloServer/TransactionPlugin.ts +53 -0
  111. package/src/apolloServer/index.ts +33 -0
  112. package/src/auth/exampleNewUserSubClass.ts +79 -0
  113. package/src/auth/index.ts +171 -0
  114. package/src/auth/newUsers.ts +58 -0
  115. package/src/auth/tokenExpiredError.ts +12 -0
  116. package/src/cache.ts +10 -0
  117. package/src/config.ts +89 -0
  118. package/src/context.ts +111 -0
  119. package/src/directives/Public.ts +42 -0
  120. package/src/directives/index.ts +1 -0
  121. package/src/entitySubclasses/DuplicateRunEntity.server.ts +29 -0
  122. package/src/entitySubclasses/entityPermissions.server.ts +104 -0
  123. package/src/entitySubclasses/userViewEntity.server.ts +187 -0
  124. package/src/generated/generated.ts +25406 -0
  125. package/src/generic/DeleteOptionsInput.ts +13 -0
  126. package/src/generic/KeyInputOutputTypes.ts +35 -0
  127. package/src/generic/KeyValuePairInput.ts +14 -0
  128. package/src/generic/PushStatusResolver.ts +40 -0
  129. package/src/generic/ResolverBase.ts +767 -0
  130. package/src/generic/RunViewResolver.ts +579 -0
  131. package/src/index.ts +171 -0
  132. package/src/orm.ts +36 -0
  133. package/src/resolvers/AskSkipResolver.ts +1112 -0
  134. package/src/resolvers/ColorResolver.ts +61 -0
  135. package/src/resolvers/DatasetResolver.ts +115 -0
  136. package/src/resolvers/EntityCommunicationsResolver.ts +221 -0
  137. package/src/resolvers/EntityRecordNameResolver.ts +75 -0
  138. package/src/resolvers/EntityResolver.ts +35 -0
  139. package/src/resolvers/FileCategoryResolver.ts +69 -0
  140. package/src/resolvers/FileResolver.ts +152 -0
  141. package/src/resolvers/MergeRecordsResolver.ts +175 -0
  142. package/src/resolvers/PotentialDuplicateRecordResolver.ts +91 -0
  143. package/src/resolvers/QueryResolver.ts +42 -0
  144. package/src/resolvers/ReportResolver.ts +144 -0
  145. package/src/resolvers/UserFavoriteResolver.ts +176 -0
  146. package/src/resolvers/UserResolver.ts +33 -0
  147. package/src/resolvers/UserViewResolver.ts +64 -0
  148. package/src/types.ts +40 -0
  149. package/src/util.ts +112 -0
package/src/index.ts ADDED
@@ -0,0 +1,171 @@
1
+ import dotenv from 'dotenv';
2
+
3
+ dotenv.config();
4
+
5
+ import { expressMiddleware } from '@apollo/server/express4';
6
+ import { mergeSchemas } from '@graphql-tools/schema';
7
+ import { Metadata } from '@memberjunction/core';
8
+ import { setupSQLServerClient, SQLServerProviderConfigData, UserCache } from '@memberjunction/sqlserver-dataprovider';
9
+ import { default as BodyParser } from 'body-parser';
10
+ import cors from 'cors';
11
+ import express from 'express';
12
+ import { default as fg } from 'fast-glob';
13
+ import { useServer } from 'graphql-ws/lib/use/ws';
14
+ import { createServer } from 'node:http';
15
+ import { fileURLToPath } from 'node:url';
16
+ import { sep } from 'node:path';
17
+ import 'reflect-metadata';
18
+ import { ReplaySubject } from 'rxjs';
19
+ import { BuildSchemaOptions, buildSchemaSync, GraphQLTimestamp } from 'type-graphql';
20
+ import { DataSource } from 'typeorm';
21
+ import { WebSocketServer } from 'ws';
22
+ import buildApolloServer from './apolloServer/index.js';
23
+ import { configInfo, graphqlPort, graphqlRootPath, mj_core_schema, websiteRunFromPackage } from './config.js';
24
+ import { contextFunction, getUserPayload } from './context.js';
25
+ import { publicDirective } from './directives/index.js';
26
+ import orm from './orm.js';
27
+
28
+ import { LoadActionEntityServer } from '@memberjunction/actions';
29
+ LoadActionEntityServer(); // prevent tree shaking for this dynamic module
30
+
31
+ import { LoadGeneratedActions } from '@memberjunction/core-actions';
32
+ LoadGeneratedActions(); // prevent tree shaking for this dynamic module
33
+
34
+ import { ExternalChangeDetectorEngine } from '@memberjunction/external-change-detection';
35
+
36
+ const cacheRefreshInterval = configInfo.databaseSettings.metadataCacheRefreshInterval;
37
+
38
+ export { MaxLength } from 'class-validator';
39
+ export * from 'type-graphql';
40
+ export { NewUserBase } from './auth/newUsers.js';
41
+ export { configInfo } from './config.js';
42
+ export * from './directives/index.js';
43
+ export * from './entitySubclasses/userViewEntity.server.js';
44
+ export * from './entitySubclasses/entityPermissions.server.js';
45
+ export * from './entitySubclasses/DuplicateRunEntity.server.js';
46
+ export * from './types.js';
47
+ export { TokenExpiredError } from './auth/index.js';
48
+
49
+ export * from './generic/PushStatusResolver.js';
50
+ export * from './generic/ResolverBase.js';
51
+ export * from './generic/RunViewResolver.js';
52
+ export * from './generic/KeyValuePairInput.js';
53
+ export * from './generic/KeyInputOutputTypes.js';
54
+ export * from './generic/DeleteOptionsInput.js';
55
+
56
+ export * from './resolvers/AskSkipResolver.js';
57
+ export * from './resolvers/ColorResolver.js';
58
+ export * from './resolvers/DatasetResolver.js';
59
+ export * from './resolvers/EntityRecordNameResolver.js';
60
+ export * from './resolvers/MergeRecordsResolver.js';
61
+ export * from './resolvers/ReportResolver.js';
62
+
63
+ export * from './generated/generated.js';
64
+
65
+ import { resolve } from 'node:path';
66
+
67
+ const localPath = (p: string) => {
68
+ // Convert import.meta.url to a local directory path
69
+ const dirname = fileURLToPath(new URL('.', import.meta.url));
70
+ // Resolve the provided path relative to the derived directory path
71
+ const resolvedPath = resolve(dirname, p);
72
+ return resolvedPath;
73
+ };
74
+
75
+ export const serve = async (resolverPaths: Array<string>) => {
76
+ const localResolverPaths = ['resolvers/**/*Resolver.{js,ts}', 'generic/*Resolver.{js,ts}', 'generated/generated.{js,ts}'].map(localPath);
77
+
78
+ const combinedResolverPaths = [...resolverPaths, ...localResolverPaths];
79
+
80
+ const isWindows = sep === '\\';
81
+ const globs = combinedResolverPaths.flatMap((path) => (isWindows ? path.replace(/\\/g, '/') : path));
82
+ const paths = fg.globSync(globs);
83
+ if (paths.length === 0) {
84
+ console.warn(`No resolvers found in ${combinedResolverPaths.join(', ')}`);
85
+ console.log({ combinedResolverPaths, paths, cwd: process.cwd() });
86
+ }
87
+
88
+ const dataSource = new DataSource(orm(paths));
89
+ const setupComplete$ = new ReplaySubject(1);
90
+ await dataSource.initialize();
91
+
92
+ const config = new SQLServerProviderConfigData(dataSource, '', mj_core_schema, cacheRefreshInterval);
93
+ await setupSQLServerClient(config); // datasource is already initialized, so we can setup the client right away
94
+ const md = new Metadata();
95
+ console.log(`Data Source has been initialized. ${md?.Entities ? md.Entities.length : 0} entities loaded.`);
96
+ setupComplete$.next(true);
97
+
98
+ /******TEST HARNESS FOR CHANGE DETECTION */
99
+ /******TEST HARNESS FOR CHANGE DETECTION */
100
+ // const cd = ExternalChangeDetectorEngine.Instance;
101
+ // await cd.Config(false, UserCache.Users[0]);
102
+
103
+ // // don't wait for this, just run it and show in console whenever done.
104
+ // cd.DetectChangesForAllEligibleEntities().then(result => {
105
+ // console.log(result)
106
+ // cd.ReplayChanges(result.Changes).then(replayResult => {
107
+ // console.log(replayResult)
108
+ // });
109
+ // });
110
+ /******TEST HARNESS FOR CHANGE DETECTION */
111
+ /******TEST HARNESS FOR CHANGE DETECTION */
112
+
113
+ const dynamicModules = await Promise.all(
114
+ paths.map((modulePath) => {
115
+ try {
116
+ const module = import(isWindows ? `file://${modulePath}` : modulePath);
117
+ return module;
118
+ } catch (e) {
119
+ console.error(`Error loading dynamic module at '${modulePath}'`, e);
120
+ throw e;
121
+ }
122
+ })
123
+ );
124
+ const resolvers = dynamicModules.flatMap((module) =>
125
+ Object.values(module).filter((value) => typeof value === 'function')
126
+ ) as BuildSchemaOptions['resolvers'];
127
+
128
+ const schema = publicDirective.transformer(
129
+ mergeSchemas({
130
+ schemas: [
131
+ buildSchemaSync({
132
+ resolvers,
133
+ validate: false,
134
+ scalarsMap: [{ type: Date, scalar: GraphQLTimestamp }],
135
+ emitSchemaFile: websiteRunFromPackage !== 1,
136
+ }),
137
+ ],
138
+ typeDefs: [publicDirective.typeDefs],
139
+ })
140
+ );
141
+
142
+ const app = express();
143
+ const httpServer = createServer(app);
144
+
145
+ const webSocketServer = new WebSocketServer({ server: httpServer, path: graphqlRootPath });
146
+ const serverCleanup = useServer(
147
+ {
148
+ schema,
149
+ context: async ({ connectionParams }) => {
150
+ const userPayload = await getUserPayload(String(connectionParams?.Authorization), undefined, dataSource);
151
+ return { userPayload };
152
+ },
153
+ },
154
+ webSocketServer
155
+ );
156
+
157
+ const apolloServer = buildApolloServer({ schema }, { httpServer, serverCleanup });
158
+ await apolloServer.start();
159
+
160
+ app.use(
161
+ graphqlRootPath,
162
+ cors<cors.CorsRequest>(),
163
+ BodyParser.json({ limit: '50mb' }),
164
+ expressMiddleware(apolloServer, {
165
+ context: contextFunction({ setupComplete$, dataSource }),
166
+ })
167
+ );
168
+
169
+ await new Promise<void>((resolve) => httpServer.listen({ port: graphqlPort }, resolve));
170
+ console.log(`🚀 Server ready at http://localhost:${graphqlPort}/`);
171
+ };
package/src/orm.ts ADDED
@@ -0,0 +1,36 @@
1
+ import { DataSourceOptions } from 'typeorm';
2
+ import { configInfo, dbDatabase, dbHost, dbPassword, dbPort, dbUsername, dbInstanceName, dbTrustServerCertificate } from './config.js';
3
+
4
+ const orm = (entities: Array<string>): DataSourceOptions => {
5
+ const ormConfig = {
6
+ type: 'mssql' as const,
7
+ entities,
8
+ logging: false,
9
+ host: dbHost,
10
+ port: dbPort,
11
+ username: dbUsername,
12
+ password: dbPassword,
13
+ database: dbDatabase,
14
+ synchronize: false,
15
+ requestTimeout: configInfo.databaseSettings.requestTimeout,
16
+ connectionTimeout: configInfo.databaseSettings.connectionTimeout,
17
+ options: {},
18
+ };
19
+ if (dbInstanceName !== null && dbInstanceName !== undefined && dbInstanceName.trim().length > 0) {
20
+ ormConfig.options = {
21
+ ...ormConfig.options,
22
+ instanceName: dbInstanceName,
23
+ };
24
+ }
25
+ if (dbTrustServerCertificate !== null && dbTrustServerCertificate !== undefined) {
26
+ ormConfig.options = {
27
+ ...ormConfig.options,
28
+ trustServerCertificate: dbTrustServerCertificate,
29
+ };
30
+ }
31
+
32
+ //console.log({ ormConfig: { ...ormConfig, password: '***' } });
33
+ return ormConfig;
34
+ };
35
+
36
+ export default orm;