@memberjunction/codegen-lib 0.9.2

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 (50) hide show
  1. package/dist/angular_client_codegen.d.ts +2 -0
  2. package/dist/angular_client_codegen.js +360 -0
  3. package/dist/angular_client_codegen.js.map +1 -0
  4. package/dist/config.d.ts +101 -0
  5. package/dist/config.js +55 -0
  6. package/dist/config.js.map +1 -0
  7. package/dist/db.d.ts +3 -0
  8. package/dist/db.js +19 -0
  9. package/dist/db.js.map +1 -0
  10. package/dist/dbSchema.d.ts +3 -0
  11. package/dist/dbSchema.js +143 -0
  12. package/dist/dbSchema.js.map +1 -0
  13. package/dist/entity_subclasses_codegen.d.ts +4 -0
  14. package/dist/entity_subclasses_codegen.js +84 -0
  15. package/dist/entity_subclasses_codegen.js.map +1 -0
  16. package/dist/graphql_client_codegen.d.ts +4 -0
  17. package/dist/graphql_client_codegen.js +161 -0
  18. package/dist/graphql_client_codegen.js.map +1 -0
  19. package/dist/graphql_server_codegen.d.ts +5 -0
  20. package/dist/graphql_server_codegen.js +509 -0
  21. package/dist/graphql_server_codegen.js.map +1 -0
  22. package/dist/index.d.ts +15 -0
  23. package/dist/index.js +32 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/logging.d.ts +2 -0
  26. package/dist/logging.js +36 -0
  27. package/dist/logging.js.map +1 -0
  28. package/dist/manageMetadata.d.ts +9 -0
  29. package/dist/manageMetadata.js +603 -0
  30. package/dist/manageMetadata.js.map +1 -0
  31. package/dist/react_client_codegen.d.ts +4 -0
  32. package/dist/react_client_codegen.js +147 -0
  33. package/dist/react_client_codegen.js.map +1 -0
  34. package/dist/runCodeGen.d.ts +1 -0
  35. package/dist/runCodeGen.js +213 -0
  36. package/dist/runCodeGen.js.map +1 -0
  37. package/dist/runCommand.d.ts +9 -0
  38. package/dist/runCommand.js +111 -0
  39. package/dist/runCommand.js.map +1 -0
  40. package/dist/sql.d.ts +6 -0
  41. package/dist/sql.js +78 -0
  42. package/dist/sql.js.map +1 -0
  43. package/dist/sql_codegen.d.ts +11 -0
  44. package/dist/sql_codegen.js +753 -0
  45. package/dist/sql_codegen.js.map +1 -0
  46. package/dist/util.d.ts +4 -0
  47. package/dist/util.js +36 -0
  48. package/dist/util.js.map +1 -0
  49. package/package.json +28 -0
  50. package/readme.md +3 -0
@@ -0,0 +1,603 @@
1
+ "use strict";
2
+ /* Steps in this process are:
3
+ 1) Create New Entity Records from new tables
4
+ 2)
5
+
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.updateEntityFieldRelatedEntityNameFieldMap = exports.manageEntityFields = exports.manageManyToManyEntityRelationships = exports.manageOneToManyEntityRelationships = exports.manageEntityRelationships = exports.manageMetadata = exports.newEntityList = void 0;
9
+ const config_1 = require("./config");
10
+ const core_1 = require("@memberjunction/core");
11
+ const logging_1 = require("./logging");
12
+ const sql_1 = require("./sql");
13
+ exports.newEntityList = [];
14
+ async function manageMetadata(ds) {
15
+ const md = new core_1.Metadata();
16
+ let bSuccess = true;
17
+ if (!await createNewEntities(ds)) {
18
+ (0, logging_1.logError)('Error creating new entities');
19
+ bSuccess = false;
20
+ }
21
+ if (!await (0, sql_1.recompileAllBaseViews)(ds)) {
22
+ (0, logging_1.logError)('Error recompiling base views');
23
+ // many times the former versions of base views will NOT succesfully recompile, so don't consider that scenario to be a
24
+ // failure for this entire function
25
+ // bSuccess = false;
26
+ }
27
+ if (!await manageEntityFields(ds)) {
28
+ (0, logging_1.logError)('Error managing entity fields');
29
+ bSuccess = false;
30
+ }
31
+ if (!await manageEntityRelationships(ds, md)) {
32
+ (0, logging_1.logError)('Error managing entity relationships');
33
+ bSuccess = false;
34
+ }
35
+ // if (! await manageVirtualEntities(ds)) {
36
+ // logError('Error managing virtual entities');
37
+ // bSuccess = false;
38
+ // }
39
+ // now - we need to tell our metadata object to refresh itself
40
+ await md.Refresh();
41
+ return bSuccess;
42
+ }
43
+ exports.manageMetadata = manageMetadata;
44
+ // COMMENTED OUT FOR NOW - FUTURE FUNCTIONALITY...
45
+ // ------------------------------------------------
46
+ // export async function manageVirtualEntities(ds: DataSource): Promise<boolean> {
47
+ // let bSuccess = true;
48
+ // // virtual entities are records defined in the entity metadata and do NOT define a distinct base table
49
+ // // but they do specify a base view. We DO NOT generate a base view for a virtual entity, we simply use it to figure
50
+ // // out the fields that should be in the entity definition and add/update/delete the entity definition to match what's in the view when this runs
51
+ // const sql = 'SELECT * FROM vwEntities WHERE VirtualEntity = 1';
52
+ // const virtualEntities = await ds.query(sql);
53
+ // if (virtualEntities && virtualEntities.length > 0) {
54
+ // // we have 1+ virtual entities, now loop through them and process each one
55
+ // for (const ve of virtualEntities) {
56
+ // if (! await manageSingleVirtualEntity(ds, ve)) {
57
+ // logError(`Error managing virtual entity ${ve.Name}`);
58
+ // bSuccess = false;
59
+ // }
60
+ // }
61
+ // }
62
+ // return bSuccess;
63
+ // }
64
+ // async function manageSingleVirtualEntity(ds: DataSource, ve: any): Promise<boolean> {
65
+ // try {
66
+ // // for a given virtual entity, we need to loop through the fields that exist in the current SQL definition for the view
67
+ // // and add/update/delete the entity fields to match what's in the view
68
+ // let bSuccess = true;
69
+ // const sql = `SELECT * FROM vwSQLColumnsAndEntityFields WHERE EntityID = ${ve.ID}`;
70
+ // const veFields = await ds.query(sql);
71
+ // if (veFields && veFields.length > 0) {
72
+ // // we have 1+ fields, now loop through them and process each one
73
+ // // first though, remove any fields that are no longer in the view
74
+ // const md = new Metadata();
75
+ // const entity = md.Entities.find(e => e.Name === ve.Name);
76
+ // if (entity) {
77
+ // const removeList = [];
78
+ // const fieldsToRemove = entity.Fields.filter(f => !veFields.find(vf => vf.FieldName === f.Name));
79
+ // for (const f of fieldsToRemove) {
80
+ // removeList.push(f.ID);
81
+ // }
82
+ // const sqlRemove = `DELETE FROM [${mj_core_schema()}].EntityField WHERE ID IN (${removeList.join(',')})`;
83
+ // await ds.query(sqlRemove); // this removes the fields that shouldn't be there anymore
84
+ // }
85
+ // for (const vef of veFields) {
86
+ // if (! await manageSingleVirtualEntityField(ds, ve, vef)) {
87
+ // logError(`Error managing virtual entity field ${vef.FieldName} for virtual entity ${ve.Name}`);
88
+ // bSuccess = false;
89
+ // }
90
+ // }
91
+ // }
92
+ // // finally make sure we update the UpdatedAt field for the entity
93
+ // const sqlUpdate = `UPDATE [${mj_core_schema()}].Entity SET UpdatedAt=GETDATE() WHERE ID = ${ve.ID}`;
94
+ // await ds.query(sqlUpdate);
95
+ // return true;
96
+ // }
97
+ // catch (e) {
98
+ // logError(e);
99
+ // return false;
100
+ // }
101
+ // }
102
+ // async function manageSingleVirtualEntityField(ds: DataSource, ve: any, veField: any): Promise<boolean> {
103
+ // // this function checks to see if the field exists in the entity definition, and if not, adds it
104
+ // // if it exist it updates the entity field to match the view's data type and nullability attributes
105
+ // // first, get the entity definition
106
+ // const md = new Metadata();
107
+ // const entity = md.Entities.find(e => e.Name === ve.Name);
108
+ // if (entity) {
109
+ // const field = entity.Fields.find(f => f.Name === veField.FieldName);
110
+ // if (field) {
111
+ // // have a match, so the field exists in the entity definition, now check to see if it needs to be updated
112
+ // if (field.Type !== veField.Type || field.AllowsNull !== veField.AllowsNull) {
113
+ // // the field needs to be updated, so update it
114
+ // const sqlUpdate = `UPDATE [${mj_core_schema()}].EntityField SET Type='${veField.Type}', AllowsNull=${veField.AllowsNull ? 1 : 0}, UpdatedAt=GETDATE() WHERE ID = ${field.ID}`;
115
+ // await ds.query(sqlUpdate);
116
+ // }
117
+ // }
118
+ // }
119
+ // return true;
120
+ // }
121
+ async function manageEntityRelationships(ds, md) {
122
+ let bResult = true;
123
+ bResult = bResult && await manageManyToManyEntityRelationships(ds);
124
+ bResult = bResult && await manageOneToManyEntityRelationships(ds, md);
125
+ return bResult;
126
+ }
127
+ exports.manageEntityRelationships = manageEntityRelationships;
128
+ async function manageOneToManyEntityRelationships(ds, md) {
129
+ // the way this works is that we look for entities in our catalog and we look for
130
+ // foreign keys in those entities. For example, if we saw an entity called Persons and that entity
131
+ // had a foreign key linking to an entity called Organizations via a field called OrganizationID, then we would create a relationship
132
+ // record in the EntityRelationship table for that relationships. In that example we would create the
133
+ // relationship record with the following values:
134
+ // EntityID = ID of Organizations entity
135
+ // RelatedEntityID = ID of Persons entity
136
+ // RelatedEntityJoinField = OrganizationID
137
+ // Type = "One To Many"
138
+ // BundleInAPI = 1
139
+ // DisplayInForm = 1
140
+ // DisplayName = Persons (name of the entity)
141
+ try {
142
+ // STEP 1 - search for all foreign keys in the vwEntityFields view, we use the RelatedEntityID field to determine our FKs
143
+ const sSQL = "SELECT * FROM vwEntityFields WHERE RelatedEntityID IS NOT NULL AND IsVirtual = 0 ORDER BY RelatedEntityID";
144
+ const entityFields = await ds.query(sSQL);
145
+ // now loop through all of our fkey fields
146
+ for (const f of entityFields) {
147
+ // for each field determine if an existing relationship exists, if not, create it
148
+ const sSQLRelationship = `SELECT * FROM ${(0, config_1.mj_core_schema)()}.EntityRelationship WHERE EntityID = ${f.RelatedEntityID} AND RelatedEntityID = ${f.EntityID}`;
149
+ const relationships = await ds.query(sSQLRelationship);
150
+ if (relationships && relationships.length === 0) {
151
+ // no relationship exists, so create it
152
+ const e = md.Entities.find(e => e.ID === f.EntityID);
153
+ const sSQLInsert = `INSERT INTO ${(0, config_1.mj_core_schema)()}.EntityRelationship (EntityID, RelatedEntityID, RelatedEntityJoinField, Type, BundleInAPI, DisplayInForm, DisplayName)
154
+ VALUES (${f.RelatedEntityID}, ${f.EntityID}, '${f.Name}', 'One To Many', 1, 1, '${e.Name}')`;
155
+ await ds.query(sSQLInsert);
156
+ }
157
+ }
158
+ return true;
159
+ }
160
+ catch (e) {
161
+ (0, logging_1.logError)(e);
162
+ return false;
163
+ }
164
+ }
165
+ exports.manageOneToManyEntityRelationships = manageOneToManyEntityRelationships;
166
+ async function manageManyToManyEntityRelationships(ds) {
167
+ return true; // not implemented for now
168
+ }
169
+ exports.manageManyToManyEntityRelationships = manageManyToManyEntityRelationships;
170
+ async function manageEntityFields(ds) {
171
+ let bSuccess = true;
172
+ const startTime = new Date();
173
+ if (!await deleteUnneededEntityFields(ds)) {
174
+ (0, logging_1.logError)('Error deleting unneeded entity fields');
175
+ bSuccess = false;
176
+ }
177
+ console.log(` Deleted unneeded entity fields in ${(new Date().getTime() - startTime.getTime()) / 1000} seconds`);
178
+ const step2StartTime = new Date();
179
+ if (!await updateExistingEntityFieldsFromSchema(ds)) {
180
+ (0, logging_1.logError)('Error updating existing entity fields from schema');
181
+ bSuccess = false;
182
+ }
183
+ console.log(` Updated existing entity fields from schema in ${(new Date().getTime() - step2StartTime.getTime()) / 1000} seconds`);
184
+ const step3StartTime = new Date();
185
+ if (!await createNewEntityFieldsFromSchema(ds)) {
186
+ (0, logging_1.logError)('Error creating new entity fields from schema');
187
+ bSuccess = false;
188
+ }
189
+ console.log(` Created new entity fields from schema in ${(new Date().getTime() - step3StartTime.getTime()) / 1000} seconds`);
190
+ const step4StartTime = new Date();
191
+ if (!await setDefaultColumnWidthWhereNeeded(ds)) {
192
+ (0, logging_1.logError)('Error setting default column width where needed');
193
+ bSuccess = false;
194
+ }
195
+ console.log(` Set default column width where needed in ${(new Date().getTime() - step4StartTime.getTime()) / 1000} seconds`);
196
+ const step5StartTime = new Date();
197
+ if (!await updateEntityFieldDisplayNameWhereNull(ds)) {
198
+ (0, logging_1.logError)('Error updating entity field display name where null');
199
+ bSuccess = false;
200
+ }
201
+ console.log(` Updated entity field display name where null in ${(new Date().getTime() - step5StartTime.getTime()) / 1000} seconds`);
202
+ console.log(` Total time to manage entity fields: ${(new Date().getTime() - startTime.getTime()) / 1000} seconds`);
203
+ return bSuccess;
204
+ }
205
+ exports.manageEntityFields = manageEntityFields;
206
+ async function updateEntityFieldDisplayNameWhereNull(ds) {
207
+ try {
208
+ const fields = await ds.query('SELECT ID, Name FROM vwEntityFields WHERE DisplayName IS NULL AND Name <> \'ID\'');
209
+ if (fields && fields.length > 0)
210
+ for (const field of fields) {
211
+ const sDisplayName = stripTrailingChars(convertCamelCaseToHaveSpaces(field.Name), 'ID', true).trim();
212
+ if (sDisplayName.length > 0 && sDisplayName.toLowerCase().trim() !== field.Name.toLowerCase().trim()) {
213
+ const sSQL = `UPDATE [${(0, config_1.mj_core_schema)()}].EntityField SET UpdatedAt=GETDATE(), DisplayName = '${sDisplayName}' WHERE ID = ${field.ID}`;
214
+ await ds.query(sSQL);
215
+ }
216
+ }
217
+ return true;
218
+ }
219
+ catch (e) {
220
+ (0, logging_1.logError)(e);
221
+ return false;
222
+ }
223
+ }
224
+ async function setDefaultColumnWidthWhereNeeded(ds) {
225
+ try {
226
+ await ds.query('EXEC spSetDefaultColumnWidthWhereNeeded');
227
+ return true;
228
+ }
229
+ catch (e) {
230
+ (0, logging_1.logError)(e);
231
+ return false;
232
+ }
233
+ }
234
+ function getPendingEntityFieldsSELECTSQL() {
235
+ const sSQL = `WITH NumberedRows AS (
236
+ SELECT
237
+ sf.EntityID,
238
+ sf.Sequence,
239
+ sf.FieldName,
240
+ sf.Type,
241
+ sf.Length,
242
+ sf.Precision,
243
+ sf.Scale,
244
+ sf.AllowsNull,
245
+ sf.DefaultValue,
246
+ sf.AutoIncrement,
247
+ IIF(sf.IsVirtual = 1, 0, IIF(sf.FieldName = 'CreatedAt' OR sf.FieldName = 'UpdatedAt' OR sf.FieldName = 'ID', 0, 1)) AllowUpdateAPI,
248
+ sf.IsVirtual,
249
+ re.ID RelatedEntityID,
250
+ fk.referenced_column RelatedEntityFieldName,
251
+ IIF(sf.FieldName = 'Name', 1, 0) IsNameField,
252
+ ROW_NUMBER() OVER (PARTITION BY sf.EntityID, sf.FieldName ORDER BY (SELECT NULL)) AS rn
253
+ FROM
254
+ vwSQLColumnsAndEntityFields sf
255
+ LEFT OUTER JOIN
256
+ [${(0, config_1.mj_core_schema)()}].Entity e
257
+ ON
258
+ sf.EntityID = e.ID
259
+ LEFT OUTER JOIN
260
+ vwForeignKeys fk
261
+ ON
262
+ sf.FieldName = fk.[column] AND
263
+ e.BaseTable = fk.[table] AND
264
+ e.SchemaName = fk.[schema_name]
265
+ LEFT OUTER JOIN
266
+ [${(0, config_1.mj_core_schema)()}].Entity re -- Related Entity
267
+ ON
268
+ re.BaseTable = fk.referenced_table AND
269
+ re.SchemaName = fk.[schema_name]
270
+ WHERE
271
+ EntityFieldID IS NULL -- only where we have NOT YET CREATED EntityField records\n${createExcludeTablesAndSchemasFilter('sf.')}
272
+ )
273
+ SELECT
274
+ *
275
+ FROM
276
+ NumberedRows WHERE rn = 1 -- if someone has two foreign keys with same to/from table and field name this makes sure we only get the field info ONCE
277
+ ORDER BY EntityID, Sequence`;
278
+ return sSQL;
279
+ }
280
+ function getPendingEntityFieldINSERTSQL(n) {
281
+ const bDefaultInView = (n.FieldName?.trim().toLowerCase() === 'id' ||
282
+ n.FieldName?.trim().toLowerCase() === 'name' ||
283
+ n.Sequence <= config_1.configInfo.newEntityDefaults?.IncludeFirstNFieldsAsDefaultInView ||
284
+ n.IsNameField ? true : false);
285
+ return `
286
+ INSERT INTO [${(0, config_1.mj_core_schema)()}].EntityField
287
+ (
288
+ EntityID,
289
+ Sequence,
290
+ Name,
291
+ DisplayName,
292
+ Type,
293
+ Length,
294
+ Precision,
295
+ Scale,
296
+ AllowsNull,
297
+ DefaultValue,
298
+ AutoIncrement,
299
+ AllowUpdateAPI,
300
+ IsVirtual,
301
+ RelatedEntityID,
302
+ RelatedEntityFieldName,
303
+ IsNameField,
304
+ IncludeInUserSearchAPI,
305
+ IncludeRelatedEntityNameFieldInBaseView,
306
+ DefaultInView
307
+ )
308
+ VALUES
309
+ (
310
+ ${n.EntityID},
311
+ ${n.Sequence},
312
+ '${n.FieldName}',
313
+ '${convertCamelCaseToHaveSpaces(n.FieldName).trim()}',
314
+ '${n.Type}',
315
+ ${n.Length},
316
+ ${n.Precision},
317
+ ${n.Scale},
318
+ ${n.AllowsNull ? 1 : 0},
319
+ '${parseDefaultValue(n.DefaultValue)}',
320
+ ${n.AutoIncrement ? 1 : 0},
321
+ ${n.AllowUpdateAPI ? 1 : 0},
322
+ ${n.IsVirtual ? 1 : 0},
323
+ ${n.RelatedEntityID},
324
+ ${n.RelatedEntityFieldName && n.RelatedEntityFieldName.length > 0 ? `'${n.RelatedEntityFieldName}'` : 'NULL'},
325
+ ${n.IsNameField !== null ? n.IsNameField : 0},
326
+ ${n.FieldName === 'ID' || n.IsNameField ? 1 : 0},
327
+ ${n.RelatedEntityID && n.RelatedEntityID > 0 && n.Type.trim().toLowerCase() === 'int' ? 1 : 0},
328
+ ${bDefaultInView ? 1 : 0}
329
+ )`;
330
+ }
331
+ function parseDefaultValue(sqlDefaultValue) {
332
+ let sResult = null;
333
+ if (sqlDefaultValue !== null && sqlDefaultValue !== undefined) {
334
+ if (sqlDefaultValue.startsWith('(') && sqlDefaultValue.endsWith(')'))
335
+ sResult = sqlDefaultValue.substring(1, sqlDefaultValue.length - 1);
336
+ else
337
+ sResult = sqlDefaultValue;
338
+ if (sResult.toUpperCase().startsWith('N\'') && sResult.endsWith('\''))
339
+ sResult = sResult.substring(2, sResult.length - 1);
340
+ if (sResult.startsWith('\'') && sResult.endsWith('\''))
341
+ sResult = sResult.substring(1, sResult.length - 1);
342
+ }
343
+ return sResult;
344
+ }
345
+ async function createNewEntityFieldsFromSchema(ds) {
346
+ try {
347
+ const sSQL = getPendingEntityFieldsSELECTSQL();
348
+ const newEntityFields = await ds.query(sSQL);
349
+ await ds.transaction(async () => {
350
+ // wrap in a transaction so we get all of it or none of it
351
+ for (let i = 0; i < newEntityFields.length; ++i) {
352
+ const n = newEntityFields[i];
353
+ const sSQLInsert = getPendingEntityFieldINSERTSQL(n);
354
+ await ds.query(sSQLInsert);
355
+ // if we get here, we're okay, otherwise we have an exception, which we want as it blows up transaction
356
+ }
357
+ });
358
+ return true;
359
+ }
360
+ catch (e) {
361
+ (0, logging_1.logError)(e);
362
+ return false;
363
+ }
364
+ }
365
+ async function updateEntityFieldRelatedEntityNameFieldMap(ds, entityFieldID, relatedEntityNameFieldMap) {
366
+ try {
367
+ const sSQL = `EXEC spUpdateEntityFieldRelatedEntityNameFieldMap
368
+ @EntityFieldID=${entityFieldID} ,
369
+ @RelatedEntityNameFieldMap='${relatedEntityNameFieldMap}'`;
370
+ await ds.query(sSQL);
371
+ return true;
372
+ }
373
+ catch (e) {
374
+ (0, logging_1.logError)(e);
375
+ return false;
376
+ }
377
+ }
378
+ exports.updateEntityFieldRelatedEntityNameFieldMap = updateEntityFieldRelatedEntityNameFieldMap;
379
+ async function updateExistingEntityFieldsFromSchema(ds) {
380
+ try {
381
+ await ds.query('EXEC spUpdateExistingEntityFieldsFromSchema');
382
+ return true;
383
+ }
384
+ catch (e) {
385
+ (0, logging_1.logError)(e);
386
+ return false;
387
+ }
388
+ }
389
+ async function deleteUnneededEntityFields(ds) {
390
+ try {
391
+ await ds.query('EXEC spDeleteUnneededEntityFields');
392
+ return true;
393
+ }
394
+ catch (e) {
395
+ (0, logging_1.logError)(e);
396
+ return false;
397
+ }
398
+ }
399
+ function createExcludeTablesAndSchemasFilter(fieldPrefix) {
400
+ let sExcludeTables = '';
401
+ let sExcludeSchemas = '';
402
+ if (config_1.configInfo.excludeTables) {
403
+ for (let i = 0; i < config_1.configInfo.excludeTables.length; ++i) {
404
+ const t = config_1.configInfo.excludeTables[i];
405
+ sExcludeTables += (sExcludeTables.length > 0 ? ' AND ' : '') +
406
+ (t.schema.indexOf('%') > -1 ? ` NOT ( ${fieldPrefix}SchemaName LIKE '${t.schema}'` :
407
+ ` NOT ( ${fieldPrefix}SchemaName = '${t.schema}'`);
408
+ sExcludeTables += (t.table.indexOf('%') > -1 ? ` AND ${fieldPrefix}TableName LIKE '${t.table}') ` :
409
+ ` AND ${fieldPrefix}TableName = '${t.table}') `);
410
+ }
411
+ }
412
+ if (config_1.configInfo.excludeSchemas) {
413
+ for (let i = 0; i < config_1.configInfo.excludeSchemas.length; ++i) {
414
+ const s = config_1.configInfo.excludeSchemas[i];
415
+ sExcludeSchemas += (sExcludeSchemas.length > 0 ? ' AND ' : '') +
416
+ (s.indexOf('%') > -1 ? `${fieldPrefix}SchemaName NOT LIKE '${s}'` : `${fieldPrefix}SchemaName <> '${s}'`);
417
+ }
418
+ }
419
+ const sWhere = (sExcludeTables.length > 0 || sExcludeSchemas.length > 0 ? ` AND ` : '') +
420
+ (sExcludeTables.length > 0 ? `(${sExcludeTables})` : '') +
421
+ (sExcludeSchemas.length > 0 ? (sExcludeTables.length > 0 ? ` AND ` : ``) + '(' + sExcludeSchemas + ')' : '');
422
+ return sWhere;
423
+ }
424
+ async function createNewEntities(ds) {
425
+ try {
426
+ const sSQL = `SELECT * FROM vwSQLTablesAndEntities WHERE EntityID IS NULL ` + createExcludeTablesAndSchemasFilter('');
427
+ const newEntities = await ds.query(sSQL);
428
+ if (newEntities && newEntities.length > 0) {
429
+ const md = new core_1.Metadata();
430
+ await ds.transaction(async () => {
431
+ // wrap in a transaction so we get all of it or none of it
432
+ for (let i = 0; i < newEntities.length; ++i) {
433
+ // process each of the new entities
434
+ await createNewEntity(ds, newEntities[i], md);
435
+ }
436
+ });
437
+ (0, core_1.LogStatus)(` Done creating entities, refreshing metadata to reflect new entities...`);
438
+ await md.Refresh(); // refresh now since we've added some new entities
439
+ }
440
+ return true; // if we get here, we succeeded
441
+ }
442
+ catch (e) {
443
+ (0, core_1.LogError)(e);
444
+ return false;
445
+ }
446
+ }
447
+ async function createNewEntity(ds, newEntity, md) {
448
+ // process a single new entity
449
+ let newEntityName = convertCamelCaseToHaveSpaces(generatePluralName(newEntity.TableName));
450
+ let suffix = '';
451
+ const existingEntity = md.Entities.find(e => e.Name === newEntityName);
452
+ if (existingEntity) {
453
+ // the generated name is already in place, so we need another name
454
+ // use Entity Name __ SchemaName instead of just the table name as basis
455
+ suffix = '__' + newEntity.SchemaName;
456
+ newEntityName = newEntityName + suffix;
457
+ (0, core_1.LogError)(` >>>> WARNING: Entity name already exists, so using ${newEntityName} instead. If you did not intend for this, please rename the ${newEntity.SchemaName}.${newEntity.TableName} table in the database.`);
458
+ }
459
+ // get the next entity ID
460
+ const params = [newEntity.SchemaName];
461
+ const sSQLNewEntityID = `EXEC spGetNextEntityID @SchemaName=@0`;
462
+ const newEntityIDRaw = await ds.query(sSQLNewEntityID, params);
463
+ const newEntityID = newEntityIDRaw && newEntityIDRaw.length > 0 ? newEntityIDRaw[0].NextID : null;
464
+ if (newEntityID && newEntityID > 0) {
465
+ const isNewSchema = await isSchemaNew(ds, newEntity.SchemaName);
466
+ const sSQLInsert = createNewEntityInsertSQL(newEntityID, newEntityName, newEntity, suffix);
467
+ await ds.query(sSQLInsert);
468
+ // if we get here we created a new entity safely, otherwise we get exception
469
+ // add it to the new entity list
470
+ exports.newEntityList.push(newEntityName);
471
+ // next, check if this entity is in a schema that is new (e.g. no other entities have been added to this schema yet), if so and if
472
+ // our config option is set to create new applications from new schemas, then create a new application for this schema
473
+ if (isNewSchema && config_1.configInfo.newSchemaDefaults.CreateNewApplicationWithSchemaName) {
474
+ // new schema and config option is to create a new application from the schema name so do that
475
+ if (!await applicationExists(ds, newEntity.SchemaName))
476
+ await createNewApplication(ds, newEntity.SchemaName);
477
+ }
478
+ else {
479
+ // not a new schema, attempt to look up the application for this schema
480
+ await getApplicationIDForSchema(ds, newEntity.SchemaName);
481
+ }
482
+ // now we have an application ID, but make sure that we are configured to add this new entity to an application at all
483
+ if (config_1.configInfo.newEntityDefaults.AddToApplicationWithSchemaName) {
484
+ // we should add this entity to the application
485
+ const sSQLInsertApplicationEntity = `INSERT INTO ${(0, config_1.mj_core_schema)()}.ApplicationEntity
486
+ (ApplicationName, EntityID, Sequence) VALUES
487
+ ('${newEntity.SchemaName}', ${newEntityID}, (SELECT ISNULL(MAX(Sequence),0)+1 FROM ${(0, config_1.mj_core_schema)()}.ApplicationEntity WHERE ApplicationName = '${newEntity.SchemaName}'))`;
488
+ await ds.query(sSQLInsertApplicationEntity);
489
+ }
490
+ // next up, we need to check if we're configured to add permissions for new entities, and if so, add them
491
+ if (config_1.configInfo.newEntityDefaults.PermissionDefaults && config_1.configInfo.newEntityDefaults.PermissionDefaults.AutoAddPermissionsForNewEntities) {
492
+ // we are asked to add permissions for new entities, so do that by looping through the permissions and adding them
493
+ const permissions = config_1.configInfo.newEntityDefaults.PermissionDefaults.Permissions;
494
+ for (const p of permissions) {
495
+ const sSQLInsertPermission = `INSERT INTO ${(0, config_1.mj_core_schema)()}.EntityPermission
496
+ (EntityID, RoleName, CanRead, CanCreate, CanUpdate, CanDelete) VALUES
497
+ (${newEntityID}, '${p.RoleName}', ${p.CanRead ? 1 : 0}, ${p.CanCreate ? 1 : 0}, ${p.CanUpdate ? 1 : 0}, ${p.CanDelete ? 1 : 0})`;
498
+ await ds.query(sSQLInsertPermission);
499
+ }
500
+ }
501
+ (0, core_1.LogStatus)(` Created new entity ${newEntityName} for table ${newEntity.SchemaName}.${newEntity.TableName}`);
502
+ }
503
+ else {
504
+ (0, core_1.LogError)(`ERROR: Unable to get next entity ID for ${newEntity.SchemaName}.${newEntity.TableName} - it is possible that the schema has reached its MAX Id,
505
+ check the Schema Info entity for this schema to see if all ID values have been allocated.`);
506
+ }
507
+ }
508
+ async function isSchemaNew(ds, schemaName) {
509
+ // check to see if there are any entities in the db with this schema name
510
+ const sSQL = `SELECT COUNT(*) AS Count FROM ${(0, config_1.mj_core_schema)()}.Entity WHERE SchemaName = '${schemaName}'`;
511
+ const result = await ds.query(sSQL);
512
+ return result && result.length > 0 ? result[0].Count === 0 : true;
513
+ }
514
+ async function createNewApplication(ds, appName) {
515
+ const sSQL = "INSERT INTO " + (0, config_1.mj_core_schema)() + ".Application (Name, Description) VALUES ('" + appName + "', 'Generated for Schema'); SELECT @@IDENTITY AS ID";
516
+ const result = await ds.query(sSQL);
517
+ return result && result.length > 0 ? result[0].ID : null;
518
+ }
519
+ async function applicationExists(ds, applicationName) {
520
+ const sSQL = `SELECT ID FROM ${(0, config_1.mj_core_schema)()}.Application WHERE Name = '${applicationName}'`;
521
+ const result = await ds.query(sSQL);
522
+ return result && result.length > 0 ? result[0].ID > 0 : false;
523
+ }
524
+ async function getApplicationIDForSchema(ds, schemaName) {
525
+ const sSQL = `SELECT ID FROM ${(0, config_1.mj_core_schema)()}.Application WHERE Name = '${schemaName}'`;
526
+ const result = await ds.query(sSQL);
527
+ return result && result.length > 0 ? result[0].ID : null;
528
+ }
529
+ function createNewEntityInsertSQL(newEntityID, newEntityName, newEntity, newEntitySuffix) {
530
+ const newEntityDefaults = config_1.configInfo.newEntityDefaults;
531
+ const sSQLInsert = `INSERT INTO ${(0, config_1.mj_core_schema)()}.Entity (
532
+ ID,
533
+ Name,
534
+ NameSuffix,
535
+ BaseTable,
536
+ BaseView,
537
+ SchemaName,
538
+ IncludeInAPI,
539
+ AllowUserSearchAPI
540
+ ${newEntityDefaults.TrackRecordChanges === undefined ? '' : ', TrackRecordChanges'}
541
+ ${newEntityDefaults.AuditRecordAccess === undefined ? '' : ', AuditRecordAccess'}
542
+ ${newEntityDefaults.AuditViewRuns === undefined ? '' : ', AuditViewRuns'}
543
+ ${newEntityDefaults.AllowAllRowsAPI === undefined ? '' : ', AllowAllRowsAPI'}
544
+ ${newEntityDefaults.AllowCreateAPI === undefined ? '' : ', AllowCreateAPI'}
545
+ ${newEntityDefaults.AllowUpdateAPI === undefined ? '' : ', AllowUpdateAPI'}
546
+ ${newEntityDefaults.AllowDeleteAPI === undefined ? '' : ', AllowDeleteAPI'}
547
+ ${newEntityDefaults.UserViewMaxRows === undefined ? '' : ', UserViewMaxRows'}
548
+ )
549
+ VALUES (
550
+ ${newEntityID},
551
+ '${newEntityName}',
552
+ ${newEntitySuffix && newEntitySuffix.length > 0 ? `'${newEntitySuffix}'` : 'NULL'},
553
+ '${newEntity.TableName}',
554
+ 'vw${generatePluralName(newEntity.TableName) + (newEntitySuffix && newEntitySuffix.length > 0 ? newEntitySuffix : '')}',
555
+ '${newEntity.SchemaName}',
556
+ 1,
557
+ ${newEntityDefaults.AllowUserSearchAPI === undefined ? 1 : newEntityDefaults.AllowUserSearchAPI ? 1 : 0}
558
+ ${newEntityDefaults.TrackRecordChanges === undefined ? '' : ', ' + (newEntityDefaults.TrackRecordChanges ? '1' : '0')}
559
+ ${newEntityDefaults.AuditRecordAccess === undefined ? '' : ', ' + (newEntityDefaults.AuditRecordAccess ? '1' : '0')}
560
+ ${newEntityDefaults.AuditViewRuns === undefined ? '' : ', ' + (newEntityDefaults.AuditViewRuns ? '1' : '0')}
561
+ ${newEntityDefaults.AllowAllRowsAPI === undefined ? '' : ', ' + (newEntityDefaults.AllowAllRowsAPI ? '1' : '0')}
562
+ ${newEntityDefaults.AllowCreateAPI === undefined ? '' : ', ' + (newEntityDefaults.AllowCreateAPI ? '1' : '0')}
563
+ ${newEntityDefaults.AllowUpdateAPI === undefined ? '' : ', ' + (newEntityDefaults.AllowUpdateAPI ? '1' : '0')}
564
+ ${newEntityDefaults.AllowDeleteAPI === undefined ? '' : ', ' + (newEntityDefaults.AllowDeleteAPI ? '1' : '0')}
565
+ ${newEntityDefaults.UserViewMaxRows === undefined ? '' : ', ' + (newEntityDefaults.UserViewMaxRows)}
566
+ )`;
567
+ return sSQLInsert;
568
+ }
569
+ function stripTrailingChars(s, charsToStrip, skipIfExactMatch) {
570
+ if (s && charsToStrip) {
571
+ if (s.endsWith(charsToStrip) && (skipIfExactMatch ? s !== charsToStrip : true))
572
+ return s.substring(0, s.length - charsToStrip.length);
573
+ else
574
+ return s;
575
+ }
576
+ else
577
+ return s;
578
+ }
579
+ function convertCamelCaseToHaveSpaces(s) {
580
+ let result = '';
581
+ for (let i = 0; i < s.length; ++i) {
582
+ if (s[i] === s[i].toUpperCase() && // current character is upper case
583
+ i > 0 && // not first character
584
+ (s[i - 1] !== s[i - 1].toUpperCase()) // previous character is not upper case handles not putting space between I and D in ID as an example of consecutive upper case
585
+ ) {
586
+ result += ' ';
587
+ }
588
+ result += s[i];
589
+ }
590
+ return result;
591
+ }
592
+ function generatePluralName(singularName) {
593
+ if (singularName.endsWith('y')) {
594
+ return singularName.substring(0, singularName.length - 1) + 'ies';
595
+ }
596
+ else if (singularName.endsWith('s')) {
597
+ return singularName + 'es';
598
+ }
599
+ else {
600
+ return singularName + 's';
601
+ }
602
+ }
603
+ //# sourceMappingURL=manageMetadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manageMetadata.js","sourceRoot":"","sources":["../src/manageMetadata.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { EntityInfo } from '@memberjunction/core';
2
+ export declare function generateReactCode(entities: EntityInfo[], directory: string): boolean;
3
+ export declare function generateSingleEntityReactFile(entity: EntityInfo): string;
4
+ export declare function generateReactEntityPagesFile(entities: EntityInfo[]): string;