@solidxai/core 0.1.9-beta.8 → 0.1.10-alpha.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.
- package/LICENSE +89 -0
- package/README.md +3 -1
- package/dist/commands/run-tests.command.d.ts +2 -0
- package/dist/commands/run-tests.command.d.ts.map +1 -1
- package/dist/commands/run-tests.command.js +49 -17
- package/dist/commands/run-tests.command.js.map +1 -1
- package/dist/controllers/action-metadata.controller.js +1 -1
- package/dist/controllers/action-metadata.controller.js.map +1 -1
- package/dist/controllers/facebook-authentication.controller.js +1 -1
- package/dist/controllers/facebook-authentication.controller.js.map +1 -1
- package/dist/controllers/google-authentication.controller.js +1 -1
- package/dist/controllers/google-authentication.controller.js.map +1 -1
- package/dist/controllers/menu-item-metadata.controller.js +1 -1
- package/dist/controllers/menu-item-metadata.controller.js.map +1 -1
- package/dist/controllers/microsoft-authentication.controller.js +1 -1
- package/dist/controllers/microsoft-authentication.controller.js.map +1 -1
- package/dist/controllers/mq-message-queue.controller.js +1 -1
- package/dist/controllers/mq-message-queue.controller.js.map +1 -1
- package/dist/controllers/mq-message.controller.js +1 -1
- package/dist/controllers/mq-message.controller.js.map +1 -1
- package/dist/controllers/user.controller.d.ts.map +1 -1
- package/dist/controllers/user.controller.js.map +1 -1
- package/dist/controllers/view-metadata.controller.js +1 -1
- package/dist/controllers/view-metadata.controller.js.map +1 -1
- package/dist/helpers/bootstrap.helper.d.ts.map +1 -1
- package/dist/helpers/bootstrap.helper.js +2 -0
- package/dist/helpers/bootstrap.helper.js.map +1 -1
- package/dist/helpers/field-crud-managers/BigIntFieldCrudManager.js.map +1 -1
- package/dist/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.js.map +1 -1
- package/dist/helpers/module-metadata-helper.service.js.map +1 -1
- package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js.map +1 -1
- package/dist/passport-strategies/facebook-oauth.strategy.d.ts +5 -3
- package/dist/passport-strategies/facebook-oauth.strategy.d.ts.map +1 -1
- package/dist/passport-strategies/facebook-oauth.strategy.js +41 -18
- package/dist/passport-strategies/facebook-oauth.strategy.js.map +1 -1
- package/dist/repository/security-rule.repository.js.map +1 -1
- package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
- package/dist/seeders/permission-metadata-seeder.service.js.map +1 -1
- package/dist/seeders/seed-data/solid-core-metadata.json +14 -3
- package/dist/services/authentication.service.d.ts +12 -13
- package/dist/services/authentication.service.d.ts.map +1 -1
- package/dist/services/authentication.service.js +42 -18
- package/dist/services/authentication.service.js.map +1 -1
- package/dist/services/chatter-message.service.js.map +1 -1
- package/dist/services/crud.service.js.map +1 -1
- package/dist/services/csv.service.js.map +1 -1
- package/dist/services/dashboard.service.js.map +1 -1
- package/dist/services/database/database-bootstrap.service.js.map +1 -1
- package/dist/services/excel.service.js.map +1 -1
- package/dist/services/export-transaction.service.js.map +1 -1
- package/dist/services/field-metadata.service.js +2 -2
- package/dist/services/field-metadata.service.js.map +1 -1
- package/dist/services/fixtures.service.js.map +1 -1
- package/dist/services/import-transaction.service.js.map +1 -1
- package/dist/services/list-of-values.service.js.map +1 -1
- package/dist/services/model-metadata.service.d.ts.map +1 -1
- package/dist/services/model-metadata.service.js +3 -13
- package/dist/services/model-metadata.service.js.map +1 -1
- package/dist/services/module-metadata.service.js.map +1 -1
- package/dist/services/queues/database-publisher.service.js +3 -3
- package/dist/services/queues/database-publisher.service.js.map +1 -1
- package/dist/services/queues/database-subscriber.service.js +3 -3
- package/dist/services/queues/database-subscriber.service.js.map +1 -1
- package/dist/services/queues/rabbitmq-publisher.service.js +3 -3
- package/dist/services/queues/rabbitmq-publisher.service.js.map +1 -1
- package/dist/services/queues/rabbitmq-subscriber.service.js +4 -4
- package/dist/services/queues/rabbitmq-subscriber.service.js.map +1 -1
- package/dist/services/queues/redis-publisher.service.d.ts.map +1 -1
- package/dist/services/queues/redis-publisher.service.js +4 -1
- package/dist/services/queues/redis-publisher.service.js.map +1 -1
- package/dist/services/queues/redis-subscriber.service.d.ts.map +1 -1
- package/dist/services/queues/redis-subscriber.service.js +4 -1
- package/dist/services/queues/redis-subscriber.service.js.map +1 -1
- package/dist/services/role-metadata.service.js.map +1 -1
- package/dist/services/scheduled-jobs/scheduler.service.js.map +1 -1
- package/dist/services/settings/default-settings-provider.service.d.ts +74 -8
- package/dist/services/settings/default-settings-provider.service.d.ts.map +1 -1
- package/dist/services/settings/default-settings-provider.service.js +96 -16
- package/dist/services/settings/default-settings-provider.service.js.map +1 -1
- package/dist/services/sms/TwilioSMSService.js.map +1 -1
- package/dist/services/solid-introspect.service.js.map +1 -1
- package/dist/services/user-activity-history.service.js.map +1 -1
- package/dist/services/user.service.d.ts +10 -8
- package/dist/services/user.service.d.ts.map +1 -1
- package/dist/services/user.service.js +85 -46
- package/dist/services/user.service.js.map +1 -1
- package/dist/services/view-metadata.service.d.ts.map +1 -1
- package/dist/services/view-metadata.service.js +17 -2
- package/dist/services/view-metadata.service.js.map +1 -1
- package/dist/solid-core.module.d.ts +1 -0
- package/dist/solid-core.module.d.ts.map +1 -1
- package/dist/solid-core.module.js +1 -0
- package/dist/solid-core.module.js.map +1 -1
- package/dist/subscribers/computed-entity-field.subscriber.js.map +1 -1
- package/dist/subscribers/security-rule.subscriber.d.ts.map +1 -1
- package/dist/subscribers/security-rule.subscriber.js.map +1 -1
- package/dist/subscribers/view-metadata.subscriber.js.map +1 -1
- package/dist/testing/core/testing-engine.js.map +1 -1
- package/dist/testing/reporter/webhook-reporter.d.ts +54 -0
- package/dist/testing/reporter/webhook-reporter.d.ts.map +1 -0
- package/dist/testing/reporter/webhook-reporter.js +74 -0
- package/dist/testing/reporter/webhook-reporter.js.map +1 -0
- package/package.json +6 -2
- package/src/commands/run-tests.command.ts +45 -17
- package/src/controllers/action-metadata.controller.ts +1 -1
- package/src/controllers/facebook-authentication.controller.ts +1 -1
- package/src/controllers/google-authentication.controller.ts +1 -1
- package/src/controllers/menu-item-metadata.controller.ts +1 -1
- package/src/controllers/microsoft-authentication.controller.ts +1 -1
- package/src/controllers/mq-message-queue.controller.ts +1 -1
- package/src/controllers/mq-message.controller.ts +1 -1
- package/src/controllers/user.controller.ts +16 -16
- package/src/controllers/view-metadata.controller.ts +1 -1
- package/src/helpers/bootstrap.helper.ts +3 -0
- package/src/helpers/field-crud-managers/BigIntFieldCrudManager.ts +1 -1
- package/src/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.ts +1 -1
- package/src/helpers/module-metadata-helper.service.ts +1 -1
- package/src/jobs/database/trigger-mcp-client-subscriber-database.service.ts +1 -1
- package/src/passport-strategies/facebook-oauth.strategy.ts +82 -31
- package/src/repository/security-rule.repository.ts +1 -1
- package/src/seeders/module-metadata-seeder.service.ts +4 -4
- package/src/seeders/permission-metadata-seeder.service.ts +1 -1
- package/src/seeders/seed-data/solid-core-metadata.json +14 -3
- package/src/services/authentication.service.ts +215 -151
- package/src/services/chatter-message.service.ts +1 -1
- package/src/services/crud.service.ts +3 -3
- package/src/services/csv.service.ts +1 -1
- package/src/services/dashboard.service.ts +1 -1
- package/src/services/database/database-bootstrap.service.ts +1 -1
- package/src/services/excel.service.ts +1 -1
- package/src/services/export-transaction.service.ts +2 -2
- package/src/services/field-metadata.service.ts +3 -3
- package/src/services/fixtures.service.ts +2 -2
- package/src/services/import-transaction.service.ts +2 -2
- package/src/services/list-of-values.service.ts +1 -1
- package/src/services/model-metadata.service.ts +22 -21
- package/src/services/module-metadata.service.ts +7 -7
- package/src/services/queues/database-publisher.service.ts +4 -4
- package/src/services/queues/database-subscriber.service.ts +7 -7
- package/src/services/queues/rabbitmq-publisher.service.ts +7 -7
- package/src/services/queues/rabbitmq-subscriber.service.ts +13 -13
- package/src/services/queues/redis-publisher.service.ts +7 -4
- package/src/services/queues/redis-subscriber.service.ts +9 -6
- package/src/services/role-metadata.service.ts +1 -1
- package/src/services/scheduled-jobs/scheduler.service.ts +5 -5
- package/src/services/settings/default-settings-provider.service.ts +101 -21
- package/src/services/sms/TwilioSMSService.ts +2 -2
- package/src/services/solid-introspect.service.ts +2 -2
- package/src/services/user-activity-history.service.ts +1 -1
- package/src/services/user.service.ts +149 -77
- package/src/services/view-metadata.service.ts +25 -8
- package/src/solid-core.module.ts +1 -0
- package/src/subscribers/computed-entity-field.subscriber.ts +1 -1
- package/src/subscribers/security-rule.subscriber.ts +8 -8
- package/src/subscribers/view-metadata.subscriber.ts +1 -1
- package/src/testing/core/testing-engine.ts +2 -2
- package/src/testing/reporter/webhook-reporter.ts +116 -0
- package/dev-grooming-docs/ozzy-prompts.txt +0 -70
|
@@ -140,7 +140,7 @@ export class ListOfValuesService extends CRUDService<ListOfValues> {
|
|
|
140
140
|
const filePath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(moduleName);
|
|
141
141
|
try {
|
|
142
142
|
await fs.access(filePath);
|
|
143
|
-
} catch (error) {
|
|
143
|
+
} catch (error: any) {
|
|
144
144
|
throw new Error(`Configuration file not found for module: ${moduleName}`);
|
|
145
145
|
}
|
|
146
146
|
const metaData = await this.moduleMetadataHelperService.getModuleMetadataConfiguration(filePath);
|
|
@@ -154,7 +154,7 @@ export class ModelMetadataService {
|
|
|
154
154
|
|
|
155
155
|
return model
|
|
156
156
|
});
|
|
157
|
-
} catch (error) {
|
|
157
|
+
} catch (error: any) {
|
|
158
158
|
// console.error('Transaction failed:', error);
|
|
159
159
|
this.logger.error('Transaction failed:', error);
|
|
160
160
|
throw error;
|
|
@@ -189,7 +189,7 @@ export class ModelMetadataService {
|
|
|
189
189
|
|
|
190
190
|
// return model
|
|
191
191
|
});
|
|
192
|
-
} catch (error) {
|
|
192
|
+
} catch (error: any) {
|
|
193
193
|
// console.error('Transaction failed:', error);
|
|
194
194
|
this.logger.error('Transaction failed:', error);
|
|
195
195
|
throw error;
|
|
@@ -309,7 +309,7 @@ export class ModelMetadataService {
|
|
|
309
309
|
const updatedContent = JSON.stringify(metaData, null, 2);
|
|
310
310
|
await fs.writeFile(filePath, updatedContent);
|
|
311
311
|
|
|
312
|
-
} catch (error) {
|
|
312
|
+
} catch (error: any) {
|
|
313
313
|
// console.error('File creation failed:', error);
|
|
314
314
|
this.logger.error('File creation failed:', error);
|
|
315
315
|
throw new Error(ERROR_MESSAGES.FILE_WRITE_FAILED); // Trigger rollback
|
|
@@ -490,7 +490,7 @@ export class ModelMetadataService {
|
|
|
490
490
|
const updatedContent = JSON.stringify(metaData, null, 2);
|
|
491
491
|
await fs.writeFile(filePath, updatedContent);
|
|
492
492
|
|
|
493
|
-
} catch (error) {
|
|
493
|
+
} catch (error: any) {
|
|
494
494
|
// console.error('File creation failed:', error);
|
|
495
495
|
this.logger.error('File creation failed:', error);
|
|
496
496
|
throw new Error(ERROR_MESSAGES.FILE_WRITE_FAILED); // Trigger rollback
|
|
@@ -524,7 +524,7 @@ export class ModelMetadataService {
|
|
|
524
524
|
await this.cleanupOnDelete(entity.id);
|
|
525
525
|
const r = await this.modelMetadataRepo.remove(entity);
|
|
526
526
|
return r;
|
|
527
|
-
} catch (error) {
|
|
527
|
+
} catch (error: any) {
|
|
528
528
|
}
|
|
529
529
|
}
|
|
530
530
|
|
|
@@ -621,7 +621,7 @@ export class ModelMetadataService {
|
|
|
621
621
|
try {
|
|
622
622
|
await fs.unlink(fileToDelete);
|
|
623
623
|
this.logger.log(`Deleted file: ${fileToDelete}`);
|
|
624
|
-
} catch (error) {
|
|
624
|
+
} catch (error: any) {
|
|
625
625
|
this.logger.error(`Error deleting file: ${fileToDelete}`, error);
|
|
626
626
|
}
|
|
627
627
|
}
|
|
@@ -725,7 +725,7 @@ export class ModelMetadataService {
|
|
|
725
725
|
);
|
|
726
726
|
this.solidTsMorphService.removeModuleMembers(moduleFilePath, removedIdentifiers);
|
|
727
727
|
await this.solidTsMorphService.commit();
|
|
728
|
-
} catch (error) {
|
|
728
|
+
} catch (error: any) {
|
|
729
729
|
this.solidTsMorphService.rollback();
|
|
730
730
|
this.logger.error(`Failed to clean up module file for model '${modelEntity.singularName}':`, error);
|
|
731
731
|
}
|
|
@@ -789,7 +789,7 @@ export class ModelMetadataService {
|
|
|
789
789
|
await this.populateVAMConfigInDb(model);
|
|
790
790
|
await this.populateVAMConfigInFile(model);
|
|
791
791
|
});
|
|
792
|
-
} catch (error) {
|
|
792
|
+
} catch (error: any) {
|
|
793
793
|
this.logger.error('generateVAMConfig Transaction failed:', error);
|
|
794
794
|
throw error;
|
|
795
795
|
}
|
|
@@ -816,7 +816,7 @@ export class ModelMetadataService {
|
|
|
816
816
|
const updatedContent = JSON.stringify(metaData, null, 2);
|
|
817
817
|
await fs.writeFile(filePath, updatedContent);
|
|
818
818
|
|
|
819
|
-
} catch (error) {
|
|
819
|
+
} catch (error: any) {
|
|
820
820
|
// console.error('File creation failed:', error);
|
|
821
821
|
this.logger.error('File updation failed for View, action, menus config:', error);
|
|
822
822
|
throw new Error('File updation failed for View, action, menus config'); // Trigger rollback
|
|
@@ -826,15 +826,15 @@ export class ModelMetadataService {
|
|
|
826
826
|
// Populate the View, Actions and Menus in the config file
|
|
827
827
|
private populateVAMConfigInFileInternal(formViewLayoutFields: any[], model: ModelMetadata, listViewLayoutFields: { type: string; attrs: { name: string; }; }[], treeViewLayoutFields: { type: string; attrs: { name: string; }; }[], metaData: any) {
|
|
828
828
|
const column1Fields = [];
|
|
829
|
-
const column2Fields = [];
|
|
829
|
+
// const column2Fields = [];
|
|
830
830
|
|
|
831
831
|
// Distribute fields between two columns
|
|
832
832
|
for (let i = 0; i < formViewLayoutFields.length; i++) {
|
|
833
|
-
if (i % 2 === 0) {
|
|
834
|
-
|
|
835
|
-
} else {
|
|
836
|
-
|
|
837
|
-
}
|
|
833
|
+
// if (i % 2 === 0) {
|
|
834
|
+
column1Fields.push(formViewLayoutFields[i]);
|
|
835
|
+
// } else {
|
|
836
|
+
// column2Fields.push(formViewLayoutFields[i]);
|
|
837
|
+
// }
|
|
838
838
|
}
|
|
839
839
|
const actionName = `${model.singularName}-list-action`;
|
|
840
840
|
const treeViewActionName = `${model.singularName}-tree-action`;
|
|
@@ -842,6 +842,7 @@ export class ModelMetadataService {
|
|
|
842
842
|
const treeViewName = `${model.singularName}-tree-view`;
|
|
843
843
|
const formViewName = `${model.singularName}-form-view`;
|
|
844
844
|
const menuName = `${model.singularName}-menu-item`;
|
|
845
|
+
const nextMenuSequenceNumber = (metaData.menus?.length ?? 0) + 1;
|
|
845
846
|
|
|
846
847
|
const action = {
|
|
847
848
|
displayName: `${model.displayName} List Action`,
|
|
@@ -874,7 +875,7 @@ export class ModelMetadataService {
|
|
|
874
875
|
const menu = {
|
|
875
876
|
displayName: `${model.displayName}`,
|
|
876
877
|
name: menuName,
|
|
877
|
-
sequenceNumber:
|
|
878
|
+
sequenceNumber: nextMenuSequenceNumber,
|
|
878
879
|
actionUserKey: actionName,
|
|
879
880
|
moduleUserKey: `${model.module.name}`,
|
|
880
881
|
parentMenuItemUserKey: "",
|
|
@@ -955,11 +956,11 @@ export class ModelMetadataService {
|
|
|
955
956
|
attrs: { name: "group-1", label: "", className: "col-12 sm:col-12 md:col-6 lg:col-6" },
|
|
956
957
|
children: column1Fields
|
|
957
958
|
},
|
|
958
|
-
{
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
}
|
|
959
|
+
// {
|
|
960
|
+
// type: "column",
|
|
961
|
+
// attrs: { name: "group-2", label: "", className: "col-12 sm:col-12 md:col-6 lg:col-6" },
|
|
962
|
+
// children: column2Fields
|
|
963
|
+
// }
|
|
963
964
|
]
|
|
964
965
|
},
|
|
965
966
|
]
|
|
@@ -123,7 +123,7 @@ export class ModuleMetadataService {
|
|
|
123
123
|
await this.createInFile(module);
|
|
124
124
|
return module
|
|
125
125
|
});
|
|
126
|
-
} catch (error) {
|
|
126
|
+
} catch (error: any) {
|
|
127
127
|
// console.error('Transaction failed:', error);
|
|
128
128
|
this.logger.error('Transaction failed:', error);
|
|
129
129
|
throw error;
|
|
@@ -181,7 +181,7 @@ export class ModuleMetadataService {
|
|
|
181
181
|
actionUserKey: `${module?.name}-home-action`,
|
|
182
182
|
moduleUserKey: module?.name,
|
|
183
183
|
parentMenuItemUserKey: "",
|
|
184
|
-
iconName
|
|
184
|
+
iconName: "home"
|
|
185
185
|
}
|
|
186
186
|
],
|
|
187
187
|
views: [],
|
|
@@ -204,7 +204,7 @@ export class ModuleMetadataService {
|
|
|
204
204
|
// Write the JSON to the file
|
|
205
205
|
await fs.writeFile(filePath, metadataJson);
|
|
206
206
|
|
|
207
|
-
} catch (error) {
|
|
207
|
+
} catch (error: any) {
|
|
208
208
|
// console.error('File creation failed:', error);
|
|
209
209
|
this.logger.error('File creation failed:', error);
|
|
210
210
|
throw new Error(ERROR_MESSAGES.FILE_WRITE_FAILED); // Trigger rollback
|
|
@@ -219,7 +219,7 @@ export class ModuleMetadataService {
|
|
|
219
219
|
await this.updateInFile(module);
|
|
220
220
|
return module
|
|
221
221
|
});
|
|
222
|
-
} catch (error) {
|
|
222
|
+
} catch (error: any) {
|
|
223
223
|
// console.error('Transaction failed:', error);
|
|
224
224
|
this.logger.error('Transaction failed:', error);
|
|
225
225
|
throw error;
|
|
@@ -255,7 +255,7 @@ export class ModuleMetadataService {
|
|
|
255
255
|
try {
|
|
256
256
|
metaData = await this.moduleMetadataHelperService.getModuleMetadataConfiguration(filePath);
|
|
257
257
|
|
|
258
|
-
} catch (error) {
|
|
258
|
+
} catch (error: any) {
|
|
259
259
|
metaData = {
|
|
260
260
|
moduleMetadata: {
|
|
261
261
|
name: null,
|
|
@@ -290,7 +290,7 @@ export class ModuleMetadataService {
|
|
|
290
290
|
const updatedContent = JSON.stringify(metaData, null, 2);
|
|
291
291
|
await fs.writeFile(filePath, updatedContent);
|
|
292
292
|
|
|
293
|
-
} catch (error) {
|
|
293
|
+
} catch (error: any) {
|
|
294
294
|
// console.error('File creation failed:', error);
|
|
295
295
|
this.logger.error('File creation failed:', error);
|
|
296
296
|
throw new Error(ERROR_MESSAGES.FILE_WRITE_FAILED); // Trigger rollback
|
|
@@ -365,7 +365,7 @@ export class ModuleMetadataService {
|
|
|
365
365
|
await fs.rm(modulePath, { recursive: true, force: true });
|
|
366
366
|
await fs.rm(moduleMetadataPAth, { recursive: true, force: true });
|
|
367
367
|
this.logger.log(`Deleted file: ${moduleMetadataPAth}`);
|
|
368
|
-
} catch (error) {
|
|
368
|
+
} catch (error: any) {
|
|
369
369
|
this.logger.error(`Error deleting file: ${moduleMetadataPAth}`, error);
|
|
370
370
|
throw new Error(ERROR_MESSAGES.FILE_DELETE_FAILED); // Trigger rollback
|
|
371
371
|
}
|
|
@@ -15,9 +15,9 @@ export abstract class DatabasePublisher<T> implements QueuePublisher<T> {
|
|
|
15
15
|
protected readonly mqMessageService: MqMessageService,
|
|
16
16
|
protected readonly mqMessageQueueService: MqMessageQueueService,
|
|
17
17
|
) {
|
|
18
|
-
this.serviceRole = process.env.QUEUES_SERVICE_ROLE;
|
|
19
|
-
if (!
|
|
20
|
-
this.logger.debug('
|
|
18
|
+
this.serviceRole = process.env.QUEUES_SERVICE_ROLE || 'both';
|
|
19
|
+
if (!process.env.QUEUES_SERVICE_ROLE) {
|
|
20
|
+
this.logger.debug('QUEUES_SERVICE_ROLE is not defined. Defaulting DatabasePublisher service role to "both".');
|
|
21
21
|
}
|
|
22
22
|
// this.logger.debug(`DatabasePublisher instance created with options: ${JSON.stringify(this.options())}`);
|
|
23
23
|
}
|
|
@@ -74,7 +74,7 @@ export abstract class DatabasePublisher<T> implements QueuePublisher<T> {
|
|
|
74
74
|
mqMessageQueueId: mqMessageQueue.id,
|
|
75
75
|
});
|
|
76
76
|
}
|
|
77
|
-
catch (error) {
|
|
77
|
+
catch (error: any) {
|
|
78
78
|
this.logger.error(error.message, error.stack);
|
|
79
79
|
}
|
|
80
80
|
|
|
@@ -16,9 +16,9 @@ export abstract class DatabaseSubscriber<T> implements OnModuleInit, QueueSubscr
|
|
|
16
16
|
protected readonly mqMessageQueueService: MqMessageQueueService,
|
|
17
17
|
protected readonly poller: PollerService,
|
|
18
18
|
) {
|
|
19
|
-
this.serviceRole = process.env.QUEUES_SERVICE_ROLE;
|
|
20
|
-
if (!
|
|
21
|
-
this.logger.debug('
|
|
19
|
+
this.serviceRole = process.env.QUEUES_SERVICE_ROLE || 'both';
|
|
20
|
+
if (!process.env.QUEUES_SERVICE_ROLE) {
|
|
21
|
+
this.logger.debug('QUEUES_SERVICE_ROLE is not defined. Defaulting DatabaseSubscriber service role to "both".');
|
|
22
22
|
}
|
|
23
23
|
// this.logger.debug(`DatabaseSubscriber instance created with options: ${JSON.stringify(this.options())}`);
|
|
24
24
|
}
|
|
@@ -60,7 +60,7 @@ export abstract class DatabaseSubscriber<T> implements OnModuleInit, QueueSubscr
|
|
|
60
60
|
|
|
61
61
|
await this.processMessage(message);
|
|
62
62
|
}
|
|
63
|
-
catch (error) {
|
|
63
|
+
catch (error: any) {
|
|
64
64
|
this.logger.error(`Error processing message: ${error.message}`);
|
|
65
65
|
|
|
66
66
|
// if an error occurs then if retryCount is set we start retrying.
|
|
@@ -108,7 +108,7 @@ export abstract class DatabaseSubscriber<T> implements OnModuleInit, QueueSubscr
|
|
|
108
108
|
this.logger.log(`DatabaseSubscriber for queue ${queueName} is disabled because it does not match QUEUES_QUEUE_NAME_REGEX_TO_ENABLE=${queueNameRegex}`);
|
|
109
109
|
return;
|
|
110
110
|
}
|
|
111
|
-
} catch (error) {
|
|
111
|
+
} catch (error: any) {
|
|
112
112
|
this.logger.error(`Invalid QUEUES_QUEUE_NAME_REGEX_TO_ENABLE regex "${queueNameRegex}". Subscriber for queue ${queueName} will not start.`);
|
|
113
113
|
return;
|
|
114
114
|
}
|
|
@@ -152,7 +152,7 @@ export abstract class DatabaseSubscriber<T> implements OnModuleInit, QueueSubscr
|
|
|
152
152
|
private async retryMessage(message: QueueMessage<T>) {
|
|
153
153
|
try {
|
|
154
154
|
await this.processMessage(message);
|
|
155
|
-
} catch (error) {
|
|
155
|
+
} catch (error: any) {
|
|
156
156
|
if (message.currentRetry < message.retryCount) {
|
|
157
157
|
await this.updateStatusInDatabase('retrying', message);
|
|
158
158
|
|
|
@@ -203,7 +203,7 @@ export abstract class DatabaseSubscriber<T> implements OnModuleInit, QueueSubscr
|
|
|
203
203
|
this.logger.debug(`Message status updated to ${stage} for messageId: ${mqMessage.id}`);
|
|
204
204
|
}
|
|
205
205
|
}
|
|
206
|
-
catch (error) {
|
|
206
|
+
catch (error: any) {
|
|
207
207
|
this.logger.error(error.message, error.stack);
|
|
208
208
|
}
|
|
209
209
|
}
|
|
@@ -22,12 +22,12 @@ export abstract class RabbitMqPublisher<T> implements OnModuleDestroy, QueuePubl
|
|
|
22
22
|
protected readonly mqMessageQueueService: MqMessageQueueService,
|
|
23
23
|
) {
|
|
24
24
|
this.url = process.env.QUEUES_RABBIT_MQ_URL;
|
|
25
|
-
this.serviceRole = process.env.QUEUES_SERVICE_ROLE;
|
|
25
|
+
this.serviceRole = process.env.QUEUES_SERVICE_ROLE || 'both';
|
|
26
26
|
if (!this.url) {
|
|
27
27
|
this.logger.debug('RabbitMqPublisher url is not defined in the environment variables');
|
|
28
28
|
}
|
|
29
|
-
if (!
|
|
30
|
-
this.logger.debug('
|
|
29
|
+
if (!process.env.QUEUES_SERVICE_ROLE) {
|
|
30
|
+
this.logger.debug('QUEUES_SERVICE_ROLE is not defined. Defaulting RabbitMqPublisher service role to "both".');
|
|
31
31
|
}
|
|
32
32
|
// this.logger.debug(`RabbitMqPublisher instance created with options: ${JSON.stringify(this.options())} and url: ${this.url}`);
|
|
33
33
|
}
|
|
@@ -118,7 +118,7 @@ export abstract class RabbitMqPublisher<T> implements OnModuleDestroy, QueuePubl
|
|
|
118
118
|
if (this.channel) {
|
|
119
119
|
try {
|
|
120
120
|
await this.channel.close();
|
|
121
|
-
} catch (err) {
|
|
121
|
+
} catch (err: any) {
|
|
122
122
|
this.logger.warn(
|
|
123
123
|
`RabbitMqPublisher error closing channel: ${(err as Error).message}`,
|
|
124
124
|
);
|
|
@@ -130,7 +130,7 @@ export abstract class RabbitMqPublisher<T> implements OnModuleDestroy, QueuePubl
|
|
|
130
130
|
if (this.connection) {
|
|
131
131
|
try {
|
|
132
132
|
await this.connection.close();
|
|
133
|
-
} catch (err) {
|
|
133
|
+
} catch (err: any) {
|
|
134
134
|
this.logger.warn(
|
|
135
135
|
`RabbitMqPublisher error closing connection: ${(err as Error).message}`,
|
|
136
136
|
);
|
|
@@ -189,7 +189,7 @@ export abstract class RabbitMqPublisher<T> implements OnModuleDestroy, QueuePubl
|
|
|
189
189
|
// }
|
|
190
190
|
// await channel.waitForConfirms();
|
|
191
191
|
// this.logger.debug('RabbitMqPublisher Message published successfully');
|
|
192
|
-
} catch (err) {
|
|
192
|
+
} catch (err: any) {
|
|
193
193
|
this.logger.error(`RabbitMqPublisher Message publish failed: ${JSON.stringify(err)}`);
|
|
194
194
|
if (err instanceof Error) {
|
|
195
195
|
this.logger.error(`RabbitMqPublisher Error stack: ${err.stack}`);
|
|
@@ -224,7 +224,7 @@ export abstract class RabbitMqPublisher<T> implements OnModuleDestroy, QueuePubl
|
|
|
224
224
|
mqMessageQueueId: mqMessageQueue.id,
|
|
225
225
|
});
|
|
226
226
|
}
|
|
227
|
-
catch (error) {
|
|
227
|
+
catch (error: any) {
|
|
228
228
|
this.logger.error(error.message, error.stack);
|
|
229
229
|
}
|
|
230
230
|
|
|
@@ -31,12 +31,12 @@ export abstract class RabbitMqSubscriber<T> implements OnModuleInit, QueueSubscr
|
|
|
31
31
|
|
|
32
32
|
constructor(protected readonly mqMessageService: MqMessageService, protected readonly mqMessageQueueService: MqMessageQueueService) {
|
|
33
33
|
this.url = process.env.QUEUES_RABBIT_MQ_URL;
|
|
34
|
-
this.serviceRole = process.env.QUEUES_SERVICE_ROLE;
|
|
34
|
+
this.serviceRole = process.env.QUEUES_SERVICE_ROLE || 'both';
|
|
35
35
|
if (!this.url) {
|
|
36
36
|
this.logger.debug('RabbitMqPublisher url is not defined in the environment variables');
|
|
37
37
|
}
|
|
38
|
-
if (!
|
|
39
|
-
this.logger.debug('
|
|
38
|
+
if (!process.env.QUEUES_SERVICE_ROLE) {
|
|
39
|
+
this.logger.debug('QUEUES_SERVICE_ROLE is not defined. Defaulting RabbitMqSubscriber service role to "both".');
|
|
40
40
|
}
|
|
41
41
|
// this.logger.debug(`RabbitMqSubscriber instance created with options: ${JSON.stringify(this.options())} and url: ${this.url}`);
|
|
42
42
|
}
|
|
@@ -85,7 +85,7 @@ export abstract class RabbitMqSubscriber<T> implements OnModuleInit, QueueSubscr
|
|
|
85
85
|
async onModuleInit(): Promise<void> {
|
|
86
86
|
// Not using SettingService here as that will necessitate all implementors of RabbitMqSubscriber to also inject SettingService which is not ideal.
|
|
87
87
|
// Instead we directly read the environment variables here.
|
|
88
|
-
const defaultBroker = process.env.QUEUES_DEFAULT_BROKER || '
|
|
88
|
+
const defaultBroker = process.env.QUEUES_DEFAULT_BROKER || 'database';
|
|
89
89
|
const solidCliRunning = process.env.SOLID_CLI_RUNNING || "false";
|
|
90
90
|
const queueNameRegex = (process.env.QUEUES_QUEUE_NAME_REGEX_TO_ENABLE || '').trim();
|
|
91
91
|
const roleAllowed = ['both', 'subscriber'].includes(this.serviceRole);
|
|
@@ -107,7 +107,7 @@ export abstract class RabbitMqSubscriber<T> implements OnModuleInit, QueueSubscr
|
|
|
107
107
|
this.logger.log(`RabbitMqSubscriber for queue ${queueName} is disabled because it does not match QUEUES_QUEUE_NAME_REGEX_TO_ENABLE=${queueNameRegex}`);
|
|
108
108
|
return;
|
|
109
109
|
}
|
|
110
|
-
} catch (error) {
|
|
110
|
+
} catch (error: any) {
|
|
111
111
|
this.logger.error(`Invalid QUEUES_QUEUE_NAME_REGEX_TO_ENABLE regex "${queueNameRegex}". Subscriber for queue ${queueName} will not start.`);
|
|
112
112
|
return;
|
|
113
113
|
}
|
|
@@ -116,7 +116,7 @@ export abstract class RabbitMqSubscriber<T> implements OnModuleInit, QueueSubscr
|
|
|
116
116
|
const namespacedQueueName = buildNamespacedQueueName(queueName);
|
|
117
117
|
try {
|
|
118
118
|
await this.connectAndConsume(namespacedQueueName);
|
|
119
|
-
} catch (err) {
|
|
119
|
+
} catch (err: any) {
|
|
120
120
|
this.logger.error(`Failed to connect to RabbitMQ for queue ${namespacedQueueName}: ${(err as Error).message}`, (err as Error).stack);
|
|
121
121
|
this.triggerReconnect(namespacedQueueName, 'initial connection failure');
|
|
122
122
|
}
|
|
@@ -142,7 +142,7 @@ export abstract class RabbitMqSubscriber<T> implements OnModuleInit, QueueSubscr
|
|
|
142
142
|
let connection: amqp.Connection;
|
|
143
143
|
try {
|
|
144
144
|
connection = await this.establishConnection();
|
|
145
|
-
} catch (err) {
|
|
145
|
+
} catch (err: any) {
|
|
146
146
|
this.logger.error(`Failed to connect to RabbitMQ for queue ${queueName}: ${(err as Error).message}`, (err as Error).stack);
|
|
147
147
|
throw err;
|
|
148
148
|
}
|
|
@@ -210,7 +210,7 @@ export abstract class RabbitMqSubscriber<T> implements OnModuleInit, QueueSubscr
|
|
|
210
210
|
const messageContentString = rawMessage.content.toString();
|
|
211
211
|
message = JSON.parse(messageContentString) as QueueMessage<T>;
|
|
212
212
|
this.logger.debug(`rabbitmq subscriber received message with id: ${message.messageId} for queue ${queueName}`);
|
|
213
|
-
} catch (error) {
|
|
213
|
+
} catch (error: any) {
|
|
214
214
|
this.logger.error(`Invalid JSON message on queue ${queueName}: ${(error as Error).message}`);
|
|
215
215
|
await this.publishToFailedQueue(queueName, rawMessage.content, channel, error);
|
|
216
216
|
channel.ack(rawMessage);
|
|
@@ -223,7 +223,7 @@ export abstract class RabbitMqSubscriber<T> implements OnModuleInit, QueueSubscr
|
|
|
223
223
|
|
|
224
224
|
try {
|
|
225
225
|
await this.processMessage(message, rawMessage, channel, queueName);
|
|
226
|
-
} catch (error) {
|
|
226
|
+
} catch (error: any) {
|
|
227
227
|
await this.handleProcessingError(message, rawMessage, channel, error, queueName);
|
|
228
228
|
}
|
|
229
229
|
},
|
|
@@ -277,7 +277,7 @@ export abstract class RabbitMqSubscriber<T> implements OnModuleInit, QueueSubscr
|
|
|
277
277
|
channel.sendToQueue(failedQueue, body, errorMessage ? {
|
|
278
278
|
headers: { 'x-error': errorMessage }
|
|
279
279
|
} : undefined);
|
|
280
|
-
} catch (err) {
|
|
280
|
+
} catch (err: any) {
|
|
281
281
|
this.logger.error(`Failed to publish to failed queue ${failedQueue}: ${(err as Error).message}`);
|
|
282
282
|
}
|
|
283
283
|
}
|
|
@@ -302,7 +302,7 @@ export abstract class RabbitMqSubscriber<T> implements OnModuleInit, QueueSubscr
|
|
|
302
302
|
this.reconnectAttempt = 0;
|
|
303
303
|
this.logger.log(`RabbitMqSubscriber reconnected for queue ${queueName}`);
|
|
304
304
|
return;
|
|
305
|
-
} catch (err) {
|
|
305
|
+
} catch (err: any) {
|
|
306
306
|
this.reconnectAttempt += 1;
|
|
307
307
|
const delay = this.backoff();
|
|
308
308
|
this.logger.warn(`RabbitMqSubscriber reconnect failed for queue ${queueName}; retrying in ${delay}ms`);
|
|
@@ -407,7 +407,7 @@ export abstract class RabbitMqSubscriber<T> implements OnModuleInit, QueueSubscr
|
|
|
407
407
|
await this.mqMessageService.repo.update(mqMessage.id, updatedFields);
|
|
408
408
|
}
|
|
409
409
|
}
|
|
410
|
-
catch (error) {
|
|
410
|
+
catch (error: any) {
|
|
411
411
|
this.logger.error(error.message, error.stack);
|
|
412
412
|
}
|
|
413
413
|
|
|
@@ -485,7 +485,7 @@ export abstract class RabbitMqSubscriber<T> implements OnModuleInit, QueueSubscr
|
|
|
485
485
|
// - If timeoutPromise rejects first, we fail fast with timeout error.
|
|
486
486
|
// This ensures we mark DB status via normal error handling before broker ack-timeout.
|
|
487
487
|
return await Promise.race([subscribePromise, timeoutPromise]);
|
|
488
|
-
} catch (error) {
|
|
488
|
+
} catch (error: any) {
|
|
489
489
|
const errorMessage = (error as Error)?.message || String(error);
|
|
490
490
|
this.logger.error(
|
|
491
491
|
`Subscriber execution failed for queue ${queueName} and messageId ${messageId}: ${errorMessage}`,
|
|
@@ -16,7 +16,10 @@ export abstract class RedisPublisher<T> implements OnModuleDestroy, QueuePublish
|
|
|
16
16
|
protected readonly mqMessageService: MqMessageService,
|
|
17
17
|
protected readonly mqMessageQueueService: MqMessageQueueService,
|
|
18
18
|
) {
|
|
19
|
-
this.serviceRole = process.env.QUEUES_SERVICE_ROLE;
|
|
19
|
+
this.serviceRole = process.env.QUEUES_SERVICE_ROLE || 'both';
|
|
20
|
+
if (!process.env.QUEUES_SERVICE_ROLE) {
|
|
21
|
+
this.logger.debug('QUEUES_SERVICE_ROLE is not defined. Defaulting RedisPublisher service role to "both".');
|
|
22
|
+
}
|
|
20
23
|
if (!process.env.QUEUES_REDIS_URL) {
|
|
21
24
|
this.logger.debug('RedisPublisher: QUEUES_REDIS_URL is not defined in the environment variables');
|
|
22
25
|
}
|
|
@@ -65,7 +68,7 @@ export abstract class RedisPublisher<T> implements OnModuleDestroy, QueuePublish
|
|
|
65
68
|
const client = this.getClient();
|
|
66
69
|
await client.publish(namespacedQueueName, JSON.stringify(message));
|
|
67
70
|
this.logger.debug(`RedisPublisher published message ${message.messageId} to channel ${namespacedQueueName}`);
|
|
68
|
-
} catch (err) {
|
|
71
|
+
} catch (err: any) {
|
|
69
72
|
this.logger.error(`RedisPublisher failed to publish message: ${(err as Error).message}`, (err as Error).stack);
|
|
70
73
|
}
|
|
71
74
|
|
|
@@ -87,8 +90,8 @@ export abstract class RedisPublisher<T> implements OnModuleDestroy, QueuePublish
|
|
|
87
90
|
parentEntity: message.parentEntity,
|
|
88
91
|
mqMessageQueueId: mqMessageQueue.id,
|
|
89
92
|
});
|
|
90
|
-
} catch (error) {
|
|
93
|
+
} catch (error: any) {
|
|
91
94
|
this.logger.error(error.message, error.stack);
|
|
92
95
|
}
|
|
93
96
|
}
|
|
94
|
-
}
|
|
97
|
+
}
|
|
@@ -17,7 +17,10 @@ export abstract class RedisSubscriber<T> implements OnModuleInit, OnModuleDestro
|
|
|
17
17
|
protected readonly mqMessageService: MqMessageService,
|
|
18
18
|
protected readonly mqMessageQueueService: MqMessageQueueService,
|
|
19
19
|
) {
|
|
20
|
-
this.serviceRole = process.env.QUEUES_SERVICE_ROLE;
|
|
20
|
+
this.serviceRole = process.env.QUEUES_SERVICE_ROLE || 'both';
|
|
21
|
+
if (!process.env.QUEUES_SERVICE_ROLE) {
|
|
22
|
+
this.logger.debug('QUEUES_SERVICE_ROLE is not defined. Defaulting RedisSubscriber service role to "both".');
|
|
23
|
+
}
|
|
21
24
|
if (!process.env.QUEUES_REDIS_URL) {
|
|
22
25
|
this.logger.debug('RedisSubscriber: QUEUES_REDIS_URL is not defined in the environment variables');
|
|
23
26
|
}
|
|
@@ -50,7 +53,7 @@ export abstract class RedisSubscriber<T> implements OnModuleInit, OnModuleDestro
|
|
|
50
53
|
);
|
|
51
54
|
return;
|
|
52
55
|
}
|
|
53
|
-
} catch (error) {
|
|
56
|
+
} catch (error: any) {
|
|
54
57
|
this.logger.error(
|
|
55
58
|
`Invalid QUEUES_QUEUE_NAME_REGEX_TO_ENABLE regex "${queueNameRegex}". Subscriber for queue ${queueName} will not start.`,
|
|
56
59
|
);
|
|
@@ -92,7 +95,7 @@ export abstract class RedisSubscriber<T> implements OnModuleInit, OnModuleDestro
|
|
|
92
95
|
let message: QueueMessage<T> = null;
|
|
93
96
|
try {
|
|
94
97
|
message = JSON.parse(rawMessage) as QueueMessage<T>;
|
|
95
|
-
} catch (error) {
|
|
98
|
+
} catch (error: any) {
|
|
96
99
|
this.logger.error(`RedisSubscriber invalid JSON on channel ${channel}: ${(error as Error).message}`);
|
|
97
100
|
return;
|
|
98
101
|
}
|
|
@@ -103,7 +106,7 @@ export abstract class RedisSubscriber<T> implements OnModuleInit, OnModuleDestro
|
|
|
103
106
|
|
|
104
107
|
try {
|
|
105
108
|
await this.processMessage(message);
|
|
106
|
-
} catch (error) {
|
|
109
|
+
} catch (error: any) {
|
|
107
110
|
await this.handleProcessingError(message, error, channel);
|
|
108
111
|
}
|
|
109
112
|
});
|
|
@@ -147,7 +150,7 @@ export abstract class RedisSubscriber<T> implements OnModuleInit, OnModuleDestro
|
|
|
147
150
|
try {
|
|
148
151
|
await this.connectAndSubscribe(channel);
|
|
149
152
|
this.logger.log(`RedisSubscriber reconnected for channel ${channel}`);
|
|
150
|
-
} catch (err) {
|
|
153
|
+
} catch (err: any) {
|
|
151
154
|
this.triggerReconnect(channel, `reconnect failed: ${(err as Error).message}`);
|
|
152
155
|
}
|
|
153
156
|
}, delay);
|
|
@@ -201,7 +204,7 @@ export abstract class RedisSubscriber<T> implements OnModuleInit, OnModuleDestro
|
|
|
201
204
|
if (stage === 'failed') updatedFields['error'] = error;
|
|
202
205
|
await this.mqMessageService.repo.update(mqMessage.id, updatedFields);
|
|
203
206
|
}
|
|
204
|
-
} catch (err) {
|
|
207
|
+
} catch (err: any) {
|
|
205
208
|
this.logger.error(err.message, err.stack);
|
|
206
209
|
}
|
|
207
210
|
}
|
|
@@ -36,7 +36,7 @@ export class SchedulerServiceImpl implements ISchedulerService {
|
|
|
36
36
|
if (jobsRegexToEnable && jobsRegexToEnable !== "all") {
|
|
37
37
|
try {
|
|
38
38
|
jobsRegex = new RegExp(jobsRegexToEnable);
|
|
39
|
-
} catch (error) {
|
|
39
|
+
} catch (error: any) {
|
|
40
40
|
this.logger.error(`Invalid SOLID_SCHEDULER_JOBS_REGEX_TO_ENABLE regex "${jobsRegexToEnable}". Scheduler loop will skip this run.`);
|
|
41
41
|
return;
|
|
42
42
|
}
|
|
@@ -101,7 +101,7 @@ export class SchedulerServiceImpl implements ISchedulerService {
|
|
|
101
101
|
|
|
102
102
|
await this.scheduledJobRepo.save(job);
|
|
103
103
|
this.logger.log(`[${now.getTime()}]: scheduler service finished running job: ${job.job}`);
|
|
104
|
-
} catch (err) {
|
|
104
|
+
} catch (err: any) {
|
|
105
105
|
this.logger.error(`[${now.getTime()}]: scheduler service failed to run job ${job.job}`, err.stack);
|
|
106
106
|
} finally {
|
|
107
107
|
this.runningJobs.delete(jobKey);
|
|
@@ -153,7 +153,7 @@ export class SchedulerServiceImpl implements ISchedulerService {
|
|
|
153
153
|
try {
|
|
154
154
|
const parsed = JSON.parse(dayOfWeek);
|
|
155
155
|
return Array.isArray(parsed) ? parsed : [];
|
|
156
|
-
} catch (error) {
|
|
156
|
+
} catch (error: any) {
|
|
157
157
|
this.logger.warn(`Invalid dayOfWeek JSON '${dayOfWeek}'`, error as any);
|
|
158
158
|
return [];
|
|
159
159
|
}
|
|
@@ -217,10 +217,10 @@ export class SchedulerServiceImpl implements ISchedulerService {
|
|
|
217
217
|
if (runAfterNext.getTime() - nextRun.getTime() < 60000) {
|
|
218
218
|
throw new Error('Cron expression interval must be at least 1 minute');
|
|
219
219
|
}
|
|
220
|
-
|
|
220
|
+
|
|
221
221
|
this.logger.log(`Custom cron '${job.cronExpression}' next run: ${nextRun}`);
|
|
222
222
|
return nextRun;
|
|
223
|
-
} catch (error) {
|
|
223
|
+
} catch (error: any) {
|
|
224
224
|
this.logger.error(`Invalid cron expression for job ${job.scheduleName}: ${job.cronExpression}. Reason: ${(error as Error).message}`);
|
|
225
225
|
// Fallback to daily if cron parsing fails
|
|
226
226
|
return new Date(base.getTime() + 24 * 60 * 60 * 1000);
|