@solidxai/core 0.1.10-beta.2 → 0.1.10-beta.21
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/dist/commands/refresh-model.command.d.ts +1 -7
- package/dist/commands/refresh-model.command.d.ts.map +1 -1
- package/dist/commands/refresh-model.command.js +4 -49
- package/dist/commands/refresh-model.command.js.map +1 -1
- package/dist/commands/refresh-module.command.d.ts +0 -2
- package/dist/commands/refresh-module.command.d.ts.map +1 -1
- package/dist/commands/refresh-module.command.js +3 -16
- package/dist/commands/refresh-module.command.js.map +1 -1
- package/dist/commands/test-data.command.d.ts +2 -0
- package/dist/commands/test-data.command.d.ts.map +1 -1
- package/dist/commands/test-data.command.js +32 -6
- package/dist/commands/test-data.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/chatter-message.controller.d.ts +2 -0
- package/dist/controllers/chatter-message.controller.d.ts.map +1 -1
- package/dist/controllers/chatter-message.controller.js +17 -0
- package/dist/controllers/chatter-message.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/gupshup-webhook.controller.d.ts +11 -0
- package/dist/controllers/gupshup-webhook.controller.d.ts.map +1 -0
- package/dist/controllers/gupshup-webhook.controller.js +87 -0
- package/dist/controllers/gupshup-webhook.controller.js.map +1 -0
- package/dist/controllers/mcp-audit-log.controller.d.ts +35 -0
- package/dist/controllers/mcp-audit-log.controller.d.ts.map +1 -0
- package/dist/controllers/mcp-audit-log.controller.js +147 -0
- package/dist/controllers/mcp-audit-log.controller.js.map +1 -0
- package/dist/controllers/menu-item-metadata.controller.js +1 -1
- package/dist/controllers/menu-item-metadata.controller.js.map +1 -1
- package/dist/controllers/meta-cloud-whatsapp-webhook.controller.d.ts +16 -0
- package/dist/controllers/meta-cloud-whatsapp-webhook.controller.d.ts.map +1 -0
- package/dist/controllers/meta-cloud-whatsapp-webhook.controller.js +133 -0
- package/dist/controllers/meta-cloud-whatsapp-webhook.controller.js.map +1 -0
- package/dist/controllers/microsoft-authentication.controller.js +1 -1
- package/dist/controllers/microsoft-authentication.controller.js.map +1 -1
- package/dist/controllers/model-metadata.controller.d.ts +1 -1
- package/dist/controllers/model-metadata.controller.js +2 -2
- package/dist/controllers/model-metadata.controller.js.map +1 -1
- package/dist/controllers/module-metadata.controller.js +1 -1
- package/dist/controllers/module-metadata.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/view-metadata.controller.js +1 -1
- package/dist/controllers/view-metadata.controller.js.map +1 -1
- package/dist/dtos/create-mcp-audit-log.dto.d.ts +19 -0
- package/dist/dtos/create-mcp-audit-log.dto.d.ts.map +1 -0
- package/dist/dtos/create-mcp-audit-log.dto.js +118 -0
- package/dist/dtos/create-mcp-audit-log.dto.js.map +1 -0
- package/dist/dtos/update-chatter-note-message.dto.d.ts +5 -0
- package/dist/dtos/update-chatter-note-message.dto.d.ts.map +1 -0
- package/dist/dtos/update-chatter-note-message.dto.js +34 -0
- package/dist/dtos/update-chatter-note-message.dto.js.map +1 -0
- package/dist/dtos/update-mcp-audit-log.dto.d.ts +19 -0
- package/dist/dtos/update-mcp-audit-log.dto.d.ts.map +1 -0
- package/dist/dtos/update-mcp-audit-log.dto.js +117 -0
- package/dist/dtos/update-mcp-audit-log.dto.js.map +1 -0
- package/dist/dtos/update-user.dto.d.ts +1 -0
- package/dist/dtos/update-user.dto.d.ts.map +1 -1
- package/dist/dtos/update-user.dto.js +7 -1
- package/dist/dtos/update-user.dto.js.map +1 -1
- package/dist/entities/chatter-message-details.entity.d.ts.map +1 -1
- package/dist/entities/chatter-message-details.entity.js +0 -1
- package/dist/entities/chatter-message-details.entity.js.map +1 -1
- package/dist/entities/mcp-audit-log.entity.d.ts +19 -0
- package/dist/entities/mcp-audit-log.entity.d.ts.map +1 -0
- package/dist/entities/mcp-audit-log.entity.js +90 -0
- package/dist/entities/mcp-audit-log.entity.js.map +1 -0
- package/dist/entities/user.entity.js +1 -0
- package/dist/entities/user.entity.js.map +1 -1
- package/dist/factories/whatsapp.factory.d.ts.map +1 -1
- package/dist/factories/whatsapp.factory.js +13 -11
- package/dist/factories/whatsapp.factory.js.map +1 -1
- package/dist/helpers/bootstrap.helper.d.ts +1 -0
- package/dist/helpers/bootstrap.helper.d.ts.map +1 -1
- package/dist/helpers/bootstrap.helper.js +8 -3
- package/dist/helpers/bootstrap.helper.js.map +1 -1
- package/dist/helpers/command.service.d.ts +1 -0
- package/dist/helpers/command.service.d.ts.map +1 -1
- package/dist/helpers/command.service.js +1 -0
- package/dist/helpers/command.service.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/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/interfaces.d.ts +1 -2
- package/dist/interfaces.d.ts.map +1 -1
- package/dist/interfaces.js.map +1 -1
- package/dist/jobs/database/chatter-queue-subscriber-database.service.d.ts.map +1 -1
- package/dist/jobs/database/chatter-queue-subscriber-database.service.js +3 -3
- package/dist/jobs/database/chatter-queue-subscriber-database.service.js.map +1 -1
- package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js.map +1 -1
- package/dist/jobs/rabbitmq/chatter-queue-subscriber.service.d.ts.map +1 -1
- package/dist/jobs/rabbitmq/chatter-queue-subscriber.service.js +3 -3
- package/dist/jobs/rabbitmq/chatter-queue-subscriber.service.js.map +1 -1
- package/dist/jobs/redis/chatter-queue-subscriber-redis.service.d.ts.map +1 -1
- package/dist/jobs/redis/chatter-queue-subscriber-redis.service.js +3 -3
- package/dist/jobs/redis/chatter-queue-subscriber-redis.service.js.map +1 -1
- package/dist/listeners/user-registration.listener.d.ts +5 -2
- package/dist/listeners/user-registration.listener.d.ts.map +1 -1
- package/dist/listeners/user-registration.listener.js +37 -4
- package/dist/listeners/user-registration.listener.js.map +1 -1
- package/dist/repository/mcp-audit-log.repository.d.ts +12 -0
- package/dist/repository/mcp-audit-log.repository.d.ts.map +1 -0
- package/dist/repository/mcp-audit-log.repository.js +34 -0
- package/dist/repository/mcp-audit-log.repository.js.map +1 -0
- package/dist/repository/security-rule.repository.js.map +1 -1
- package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
- package/dist/seeders/module-test-data.service.d.ts +9 -0
- package/dist/seeders/module-test-data.service.d.ts.map +1 -1
- package/dist/seeders/module-test-data.service.js +155 -18
- package/dist/seeders/module-test-data.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 +381 -2
- package/dist/services/authentication.service.d.ts +6 -1
- package/dist/services/authentication.service.d.ts.map +1 -1
- package/dist/services/authentication.service.js +145 -15
- package/dist/services/authentication.service.js.map +1 -1
- package/dist/services/chatter-message.service.d.ts +13 -4
- package/dist/services/chatter-message.service.d.ts.map +1 -1
- package/dist/services/chatter-message.service.js +117 -37
- 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.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/mcp-audit-log.service.d.ts +12 -0
- package/dist/services/mcp-audit-log.service.d.ts.map +1 -0
- package/dist/services/mcp-audit-log.service.js +38 -0
- package/dist/services/mcp-audit-log.service.js.map +1 -0
- package/dist/services/mediaStorageProviders/file-s3-storage-provider.d.ts +1 -0
- package/dist/services/mediaStorageProviders/file-s3-storage-provider.d.ts.map +1 -1
- package/dist/services/mediaStorageProviders/file-s3-storage-provider.js +11 -0
- package/dist/services/mediaStorageProviders/file-s3-storage-provider.js.map +1 -1
- package/dist/services/mediaStorageProviders/file-storage-provider.d.ts +1 -0
- package/dist/services/mediaStorageProviders/file-storage-provider.d.ts.map +1 -1
- package/dist/services/mediaStorageProviders/file-storage-provider.js +6 -0
- package/dist/services/mediaStorageProviders/file-storage-provider.js.map +1 -1
- package/dist/services/model-metadata.service.d.ts +4 -1
- package/dist/services/model-metadata.service.d.ts.map +1 -1
- package/dist/services/model-metadata.service.js +24 -24
- package/dist/services/model-metadata.service.js.map +1 -1
- package/dist/services/module-metadata.service.d.ts +4 -1
- package/dist/services/module-metadata.service.d.ts.map +1 -1
- package/dist/services/module-metadata.service.js +19 -2
- 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.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.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.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 +232 -8
- package/dist/services/settings/default-settings-provider.service.d.ts.map +1 -1
- package/dist/services/settings/default-settings-provider.service.js +119 -4
- 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.js +1 -1
- 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/services/whatsapp/GupshupOtpWhatsappService.d.ts +11 -0
- package/dist/services/whatsapp/GupshupOtpWhatsappService.d.ts.map +1 -0
- package/dist/services/whatsapp/GupshupOtpWhatsappService.js +127 -0
- package/dist/services/whatsapp/GupshupOtpWhatsappService.js.map +1 -0
- package/dist/services/whatsapp/MetaCloudWhatsappService.d.ts +17 -0
- package/dist/services/whatsapp/MetaCloudWhatsappService.d.ts.map +1 -0
- package/dist/services/whatsapp/MetaCloudWhatsappService.js +209 -0
- package/dist/services/whatsapp/MetaCloudWhatsappService.js.map +1 -0
- package/dist/solid-core.module.d.ts +2 -2
- package/dist/solid-core.module.d.ts.map +1 -1
- package/dist/solid-core.module.js +22 -6
- 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/console-reporter.d.ts +10 -0
- package/dist/testing/reporter/console-reporter.d.ts.map +1 -1
- package/dist/testing/reporter/console-reporter.js +21 -0
- package/dist/testing/reporter/console-reporter.js.map +1 -1
- package/dist/testing/reporter/reporter.types.d.ts +7 -0
- package/dist/testing/reporter/reporter.types.d.ts.map +1 -1
- package/dist/testing/reporter/reporter.types.js.map +1 -1
- package/dist/testing/reporter/webhook-reporter.js.map +1 -1
- package/dist/testing/runner/run-from-metadata.d.ts.map +1 -1
- package/dist/testing/runner/run-from-metadata.js +20 -1
- package/dist/testing/runner/run-from-metadata.js.map +1 -1
- package/dist/winston.logger.d.ts +5 -0
- package/dist/winston.logger.d.ts.map +1 -1
- package/dist/winston.logger.js +6 -4
- package/dist/winston.logger.js.map +1 -1
- package/dist-tests/api/authenticate.spec.js +119 -0
- package/dist-tests/api/authenticate.spec.js.map +1 -0
- package/dist-tests/api/crud-service.findOne.cityMaster.spec.js +97 -0
- package/dist-tests/api/crud-service.findOne.cityMaster.spec.js.map +1 -0
- package/dist-tests/api/ping.spec.js +21 -0
- package/dist-tests/api/ping.spec.js.map +1 -0
- package/dist-tests/helpers/auth.js +41 -0
- package/dist-tests/helpers/auth.js.map +1 -0
- package/dist-tests/helpers/env.js +11 -0
- package/dist-tests/helpers/env.js.map +1 -0
- package/docs/grouping-enhancements.md +89 -0
- package/docs/java-spring/README.md +3 -0
- package/docs/java-spring/solid-core-module-deep-dive-report.md +1317 -0
- package/docs/seed-changes.md +65 -0
- package/docs/test-data-workflow.md +200 -0
- package/docs/type-declaration-import-issue.md +24 -0
- package/package.json +8 -8
- package/src/commands/refresh-model.command.ts +6 -51
- package/src/commands/refresh-module.command.ts +3 -16
- package/src/commands/test-data.command.ts +29 -6
- package/src/controllers/action-metadata.controller.ts +1 -1
- package/src/controllers/chatter-message.controller.ts +12 -0
- package/src/controllers/facebook-authentication.controller.ts +1 -1
- package/src/controllers/google-authentication.controller.ts +1 -1
- package/src/controllers/gupshup-webhook.controller.ts +91 -0
- package/src/controllers/mcp-audit-log.controller.ts +70 -0
- package/src/controllers/menu-item-metadata.controller.ts +1 -1
- package/src/controllers/meta-cloud-whatsapp-webhook.controller.ts +155 -0
- package/src/controllers/microsoft-authentication.controller.ts +1 -1
- package/src/controllers/model-metadata.controller.ts +1 -1
- package/src/controllers/module-metadata.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/view-metadata.controller.ts +1 -1
- package/src/dtos/create-mcp-audit-log.dto.ts +84 -0
- package/src/dtos/update-chatter-note-message.dto.ts +14 -0
- package/src/dtos/update-mcp-audit-log.dto.ts +83 -0
- package/src/dtos/update-user.dto.ts +4 -0
- package/src/entities/chatter-message-details.entity.ts +1 -2
- package/src/entities/mcp-audit-log.entity.ts +55 -0
- package/src/entities/user.entity.ts +1 -1
- package/src/factories/whatsapp.factory.ts +33 -32
- package/src/helpers/bootstrap.helper.ts +16 -6
- package/src/helpers/command.service.ts +2 -0
- package/src/helpers/field-crud-managers/BigIntFieldCrudManager.ts +1 -1
- package/src/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.ts +1 -1
- package/src/helpers/field-crud-managers/field-quality-check-fixes.md +178 -0
- package/src/helpers/module-metadata-helper.service.ts +1 -1
- package/src/index.ts +6 -0
- package/src/interfaces.ts +1 -3
- package/src/jobs/database/chatter-queue-subscriber-database.service.ts +4 -2
- package/src/jobs/database/trigger-mcp-client-subscriber-database.service.ts +1 -1
- package/src/jobs/rabbitmq/chatter-queue-subscriber.service.ts +4 -2
- package/src/jobs/redis/chatter-queue-subscriber-redis.service.ts +10 -3
- package/src/listeners/user-registration.listener.ts +49 -6
- package/src/repository/mcp-audit-log.repository.ts +17 -0
- package/src/repository/security-rule.repository.ts +1 -1
- package/src/seeders/module-metadata-seeder.service.ts +4 -4
- package/src/seeders/module-test-data.service.ts +186 -17
- package/src/seeders/permission-metadata-seeder.service.ts +1 -1
- package/src/seeders/seed-data/solid-core-metadata.json +381 -2
- package/src/services/authentication.service.ts +267 -44
- package/src/services/chatter-message.service.ts +140 -40
- package/src/services/crud.service.ts +1 -1
- 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 +1 -1
- 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/mcp-audit-log.service.ts +19 -0
- package/src/services/mediaStorageProviders/file-s3-storage-provider.ts +12 -0
- package/src/services/mediaStorageProviders/file-storage-provider.ts +8 -1
- package/src/services/model-metadata.service.ts +36 -34
- package/src/services/module-metadata.service.ts +19 -7
- package/src/services/queues/database-publisher.service.ts +4 -4
- package/src/services/queues/database-subscriber.service.ts +1 -1
- package/src/services/queues/rabbitmq-publisher.service.ts +7 -7
- package/src/services/queues/rabbitmq-subscriber.service.ts +8 -8
- package/src/services/queues/redis-publisher.service.ts +7 -4
- package/src/services/queues/redis-subscriber.service.ts +4 -4
- 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 +119 -4
- 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 +1 -1
- package/src/services/view-metadata.service.ts +25 -8
- package/src/services/whatsapp/GupshupOtpWhatsappService.ts +174 -0
- package/src/services/whatsapp/MetaCloudWhatsappService.ts +253 -0
- package/src/solid-core.module.ts +213 -196
- 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/README.md +15 -0
- package/src/testing/core/testing-engine.ts +2 -2
- package/src/testing/reporter/console-reporter.ts +27 -0
- package/src/testing/reporter/reporter.types.ts +7 -0
- package/src/testing/reporter/webhook-reporter.ts +1 -1
- package/src/testing/runner/run-from-metadata.ts +19 -1
- package/src/winston.logger.ts +5 -7
- package/.claude/settings.local.json +0 -15
- package/src/services/1.js +0 -6
|
@@ -1,18 +1,20 @@
|
|
|
1
1
|
import { LocalDateTimeTransformer, serializeDate } from 'src/transformers/typeorm/local-date-time-transformer';
|
|
2
|
-
import { BadRequestException, forwardRef, Inject, Injectable, NotFoundException } from '@nestjs/common';
|
|
2
|
+
import { BadRequestException, ForbiddenException, forwardRef, Inject, Injectable, NotFoundException } from '@nestjs/common';
|
|
3
3
|
import { ModuleRef } from "@nestjs/core";
|
|
4
4
|
import { InjectEntityManager } from '@nestjs/typeorm';
|
|
5
|
-
import { Brackets, EntityManager, EntityMetadata } from 'typeorm';
|
|
5
|
+
import { Brackets, EntityManager, EntityMetadata, In } from 'typeorm';
|
|
6
6
|
|
|
7
7
|
import { classify } from '@angular-devkit/core/src/utils/strings';
|
|
8
8
|
import { CHATTER_MESSAGE_STATUS, CHATTER_MESSAGE_SUBTYPE, CHATTER_MESSAGE_TYPE } from 'src/constants/chatter-message.constants';
|
|
9
9
|
import { ERROR_MESSAGES } from 'src/constants/error-messages';
|
|
10
10
|
import { PostChatterMessageDto } from 'src/dtos/post-chatter-message.dto';
|
|
11
|
+
import { UpdateChatterNoteMessageDto } from 'src/dtos/update-chatter-note-message.dto';
|
|
11
12
|
import { ModelMetadataHelperService } from 'src/helpers/model-metadata-helper.service';
|
|
12
13
|
import { lowerFirst } from 'src/helpers/string.helper';
|
|
13
14
|
import { ChatterMessageDetailsRepository } from 'src/repository/chatter-message-details.repository';
|
|
14
15
|
import { ChatterMessageRepository } from 'src/repository/chatter-message.repository';
|
|
15
16
|
import { FieldMetadataRepository } from 'src/repository/field-metadata.repository';
|
|
17
|
+
import { MediaRepository } from 'src/repository/media.repository';
|
|
16
18
|
import { ModelMetadataRepository } from 'src/repository/model-metadata.repository';
|
|
17
19
|
import { CRUDService } from 'src/services/crud.service';
|
|
18
20
|
import { MediaStorageProviderType } from '../dtos/create-media-storage-provider-metadata.dto';
|
|
@@ -33,6 +35,7 @@ export class ChatterMessageService extends CRUDService<ChatterMessage> {
|
|
|
33
35
|
readonly repo: ChatterMessageRepository,
|
|
34
36
|
// @InjectRepository(ChatterMessageDetailsRepository, 'default')
|
|
35
37
|
readonly chatterMessageDetailsRepo: ChatterMessageDetailsRepository,
|
|
38
|
+
readonly mediaRepository: MediaRepository,
|
|
36
39
|
// @InjectRepository(FieldMetadata, 'default')
|
|
37
40
|
// readonly fieldMetadataRepo: Repository<FieldMetadata>,
|
|
38
41
|
readonly fieldMetadataRepo: FieldMetadataRepository,
|
|
@@ -47,6 +50,41 @@ export class ChatterMessageService extends CRUDService<ChatterMessage> {
|
|
|
47
50
|
super(entityManager, repo, 'chatterMessage', 'solid-core', moduleRef);
|
|
48
51
|
}
|
|
49
52
|
|
|
53
|
+
private resolveMessageUserId(userId?: number | null): number | null {
|
|
54
|
+
if (userId) {
|
|
55
|
+
return userId;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return this.requestContextService.getActiveUser()?.sub ?? null;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
private resolveMessageUser(userId?: number | null) {
|
|
62
|
+
const resolvedUserId = this.resolveMessageUserId(userId);
|
|
63
|
+
return resolvedUserId ? ({ id: resolvedUserId } as any) : null;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
private stampMessageAuditFields(chatterMessage: ChatterMessage, userId?: number | null) {
|
|
67
|
+
const resolvedUserId = this.resolveMessageUserId(userId);
|
|
68
|
+
chatterMessage.user = resolvedUserId ? ({ id: resolvedUserId } as any) : null;
|
|
69
|
+
chatterMessage.createdBy = resolvedUserId;
|
|
70
|
+
chatterMessage.updatedBy = resolvedUserId;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
private isEditableCustomNoteMessage(message: ChatterMessage): boolean {
|
|
74
|
+
if (message.messageType !== CHATTER_MESSAGE_TYPE.CUSTOM) {
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
return [CHATTER_MESSAGE_SUBTYPE.CUSTOM, CHATTER_MESSAGE_SUBTYPE.NOTE].includes(message.messageSubType as any);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
private parseAttachmentIds(value?: string): number[] {
|
|
81
|
+
if (!value || typeof value !== 'string') return [];
|
|
82
|
+
return value
|
|
83
|
+
.split(',')
|
|
84
|
+
.map(v => Number(v.trim()))
|
|
85
|
+
.filter(v => Number.isInteger(v) && v > 0);
|
|
86
|
+
}
|
|
87
|
+
|
|
50
88
|
async markCompleted(id: number) {
|
|
51
89
|
const activeUser = this.requestContextService.getActiveUser();
|
|
52
90
|
if (!activeUser) {
|
|
@@ -62,6 +100,98 @@ export class ChatterMessageService extends CRUDService<ChatterMessage> {
|
|
|
62
100
|
return this.repo.save(message);
|
|
63
101
|
}
|
|
64
102
|
|
|
103
|
+
async updateCustomNoteMessage(id: number, updateDto: UpdateChatterNoteMessageDto, files: Express.Multer.File[] = []) {
|
|
104
|
+
const activeUser = this.requestContextService.getActiveUser();
|
|
105
|
+
if (!activeUser) {
|
|
106
|
+
throw new ForbiddenException(ERROR_MESSAGES.FORBIDDEN);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const message = await this.repo.findOne({ where: { id }, relations: { user: true } });
|
|
110
|
+
if (!message) {
|
|
111
|
+
throw new NotFoundException(`Entity [solid-core.chatterMessage] with id ${id} not found`);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
if (!this.isEditableCustomNoteMessage(message)) {
|
|
115
|
+
throw new BadRequestException('Only custom note messages can be edited.');
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
if (!message.user?.id || message.user.id !== activeUser.sub) {
|
|
119
|
+
throw new ForbiddenException('You can only edit your own custom note messages.');
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const removeAttachmentIds = this.parseAttachmentIds(updateDto?.removeAttachmentIds);
|
|
123
|
+
const hasMessageBody = typeof updateDto?.messageBody === 'string';
|
|
124
|
+
const trimmedMessageBody = (updateDto?.messageBody ?? '').trim();
|
|
125
|
+
const hasNewFiles = Array.isArray(files) && files.length > 0;
|
|
126
|
+
|
|
127
|
+
if (!hasMessageBody && removeAttachmentIds.length === 0 && !hasNewFiles) {
|
|
128
|
+
throw new BadRequestException('No note changes submitted.');
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
if (hasMessageBody && trimmedMessageBody.length === 0) {
|
|
132
|
+
throw new BadRequestException('Message body cannot be empty.');
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
if (hasMessageBody) {
|
|
136
|
+
message.messageBody = trimmedMessageBody;
|
|
137
|
+
}
|
|
138
|
+
message.updatedBy = activeUser.sub;
|
|
139
|
+
// Ensure updatedAt changes even for attachment-only edits.
|
|
140
|
+
message.updatedAt = new Date();
|
|
141
|
+
const savedMessage = await this.repo.save(message);
|
|
142
|
+
|
|
143
|
+
if (removeAttachmentIds.length > 0 || hasNewFiles) {
|
|
144
|
+
const model = await this.modelMetadataService.findOneBySingularName('chatterMessage', {
|
|
145
|
+
fields: {
|
|
146
|
+
model: true,
|
|
147
|
+
mediaStorageProvider: true,
|
|
148
|
+
},
|
|
149
|
+
module: true,
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
const mediaFields = model.fields.filter(field => field.type === 'mediaSingle' || field.type === 'mediaMultiple');
|
|
153
|
+
const attachmentFieldIds = mediaFields.map(field => field.id);
|
|
154
|
+
|
|
155
|
+
if (removeAttachmentIds.length > 0 && attachmentFieldIds.length > 0) {
|
|
156
|
+
const mediaToRemove = await this.mediaRepository.find({
|
|
157
|
+
where: {
|
|
158
|
+
id: In(removeAttachmentIds),
|
|
159
|
+
entityId: savedMessage.id,
|
|
160
|
+
modelMetadata: { id: model.id },
|
|
161
|
+
fieldMetadata: { id: In(attachmentFieldIds) },
|
|
162
|
+
},
|
|
163
|
+
relations: {
|
|
164
|
+
mediaStorageProviderMetadata: true,
|
|
165
|
+
fieldMetadata: true,
|
|
166
|
+
},
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
for (const media of mediaToRemove) {
|
|
170
|
+
const storageType = media.mediaStorageProviderMetadata?.type as MediaStorageProviderType;
|
|
171
|
+
const storageProvider = await getMediaStorageProvider(this.moduleRef, storageType);
|
|
172
|
+
await storageProvider.deleteByMediaRecord(media);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
if (mediaToRemove.length > 0) {
|
|
176
|
+
await this.mediaRepository.remove(mediaToRemove);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
for (const mediaField of mediaFields) {
|
|
181
|
+
const storageProviderMetadata = mediaField.mediaStorageProvider;
|
|
182
|
+
const storageProviderType = storageProviderMetadata.type as MediaStorageProviderType;
|
|
183
|
+
const storageProvider = await getMediaStorageProvider(this.moduleRef, storageProviderType);
|
|
184
|
+
|
|
185
|
+
const media = files.filter(multerFile => multerFile.fieldname === mediaField.name);
|
|
186
|
+
if (media.length > 0) {
|
|
187
|
+
await storageProvider.store(media, savedMessage, mediaField);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
return savedMessage;
|
|
193
|
+
}
|
|
194
|
+
|
|
65
195
|
async postMessage(postDto: PostChatterMessageDto, files: Express.Multer.File[] = []) {
|
|
66
196
|
const chatterMessage = new ChatterMessage();
|
|
67
197
|
chatterMessage.messageType = CHATTER_MESSAGE_TYPE.CUSTOM;
|
|
@@ -78,14 +208,7 @@ export class ChatterMessageService extends CRUDService<ChatterMessage> {
|
|
|
78
208
|
});
|
|
79
209
|
chatterMessage.modelDisplayName = model?.displayName ?? null;
|
|
80
210
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
if (activeUser) {
|
|
84
|
-
const userId = activeUser?.sub;
|
|
85
|
-
chatterMessage.user = { id: userId } as any;
|
|
86
|
-
} else {
|
|
87
|
-
chatterMessage.user = null;
|
|
88
|
-
}
|
|
211
|
+
this.stampMessageAuditFields(chatterMessage);
|
|
89
212
|
|
|
90
213
|
const savedMessage = await this.repo.save(chatterMessage);
|
|
91
214
|
|
|
@@ -114,7 +237,7 @@ export class ChatterMessageService extends CRUDService<ChatterMessage> {
|
|
|
114
237
|
return savedMessage;
|
|
115
238
|
}
|
|
116
239
|
|
|
117
|
-
async postAuditMessageOnInsert(entity: any, modelName: string, messageQueue: boolean = false) {
|
|
240
|
+
async postAuditMessageOnInsert(entity: any, modelName: string, messageQueue: boolean = false, userId?: number | null) {
|
|
118
241
|
if (!entity) {
|
|
119
242
|
return;
|
|
120
243
|
}
|
|
@@ -139,8 +262,6 @@ export class ChatterMessageService extends CRUDService<ChatterMessage> {
|
|
|
139
262
|
!(field.type === 'relation' && field.relationType === 'one-to-many')
|
|
140
263
|
);
|
|
141
264
|
|
|
142
|
-
const activeUser = this.requestContextService.getActiveUser();
|
|
143
|
-
|
|
144
265
|
const chatterMessage = new ChatterMessage();
|
|
145
266
|
chatterMessage.messageType = CHATTER_MESSAGE_TYPE.AUDIT;
|
|
146
267
|
chatterMessage.messageSubType = CHATTER_MESSAGE_SUBTYPE.AUDIT_INSERT;
|
|
@@ -150,13 +271,7 @@ export class ChatterMessageService extends CRUDService<ChatterMessage> {
|
|
|
150
271
|
chatterMessage.modelDisplayName = model?.displayName;
|
|
151
272
|
chatterMessage.modelUserKey = entity[model?.userKeyField?.name];
|
|
152
273
|
chatterMessage.messageBody = `New ${model?.displayName} created`;
|
|
153
|
-
|
|
154
|
-
if (activeUser) {
|
|
155
|
-
const userId = activeUser?.sub;
|
|
156
|
-
chatterMessage.user = { id: userId } as any;
|
|
157
|
-
} else {
|
|
158
|
-
chatterMessage.user = null;
|
|
159
|
-
}
|
|
274
|
+
this.stampMessageAuditFields(chatterMessage, userId);
|
|
160
275
|
|
|
161
276
|
const savedMessage = await this.repo.save(chatterMessage);
|
|
162
277
|
|
|
@@ -177,7 +292,7 @@ export class ChatterMessageService extends CRUDService<ChatterMessage> {
|
|
|
177
292
|
}
|
|
178
293
|
}
|
|
179
294
|
|
|
180
|
-
async postAuditMessageOnUpdate(entity: any, modelName: string, databaseEntity: any, updatedColumns: any[] = [], messageQueue: boolean = false) {
|
|
295
|
+
async postAuditMessageOnUpdate(entity: any, modelName: string, databaseEntity: any, updatedColumns: any[] = [], messageQueue: boolean = false, userId?: number | null) {
|
|
181
296
|
if (!databaseEntity || !entity) {
|
|
182
297
|
return;
|
|
183
298
|
}
|
|
@@ -259,8 +374,6 @@ export class ChatterMessageService extends CRUDService<ChatterMessage> {
|
|
|
259
374
|
return;
|
|
260
375
|
}
|
|
261
376
|
|
|
262
|
-
const activeUser = this.requestContextService.getActiveUser();
|
|
263
|
-
|
|
264
377
|
const chatterMessage = new ChatterMessage();
|
|
265
378
|
chatterMessage.messageType = CHATTER_MESSAGE_TYPE.AUDIT;
|
|
266
379
|
chatterMessage.messageSubType = CHATTER_MESSAGE_SUBTYPE.AUDIT_UPDATE;
|
|
@@ -270,13 +383,7 @@ export class ChatterMessageService extends CRUDService<ChatterMessage> {
|
|
|
270
383
|
chatterMessage.modelDisplayName = model.displayName;
|
|
271
384
|
chatterMessage.modelUserKey = entity[model?.userKeyField?.name];
|
|
272
385
|
chatterMessage.messageBody = `${model?.displayName} updated`;
|
|
273
|
-
|
|
274
|
-
if (activeUser) {
|
|
275
|
-
const userId = activeUser?.sub;
|
|
276
|
-
chatterMessage.user = { id: userId } as any;
|
|
277
|
-
} else {
|
|
278
|
-
chatterMessage.user = null;
|
|
279
|
-
}
|
|
386
|
+
this.stampMessageAuditFields(chatterMessage, userId);
|
|
280
387
|
|
|
281
388
|
const savedMessage = await this.repo.save(chatterMessage);
|
|
282
389
|
|
|
@@ -294,7 +401,7 @@ export class ChatterMessageService extends CRUDService<ChatterMessage> {
|
|
|
294
401
|
}
|
|
295
402
|
}
|
|
296
403
|
|
|
297
|
-
async postAuditMessageOnDelete(modelName: string, databaseEntity: any, messageQueue: boolean = false) {
|
|
404
|
+
async postAuditMessageOnDelete(modelName: string, databaseEntity: any, messageQueue: boolean = false, userId?: number | null) {
|
|
298
405
|
const model = await this.modelMetadataRepo.findOne({
|
|
299
406
|
where: {
|
|
300
407
|
singularName: lowerFirst(modelName)
|
|
@@ -335,14 +442,7 @@ export class ChatterMessageService extends CRUDService<ChatterMessage> {
|
|
|
335
442
|
chatterMessage.modelUserKey = databaseEntity[model?.userKeyField?.name];
|
|
336
443
|
chatterMessage.messageBody = `${model?.displayName} deleted`;
|
|
337
444
|
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
if (activeUser) {
|
|
341
|
-
const userId = activeUser?.sub;
|
|
342
|
-
chatterMessage.user = { id: userId } as any;
|
|
343
|
-
} else {
|
|
344
|
-
chatterMessage.user = null;
|
|
345
|
-
}
|
|
445
|
+
this.stampMessageAuditFields(chatterMessage, userId);
|
|
346
446
|
|
|
347
447
|
const savedMessage = await this.repo.save(chatterMessage);
|
|
348
448
|
|
|
@@ -421,7 +521,7 @@ export class ChatterMessageService extends CRUDService<ChatterMessage> {
|
|
|
421
521
|
if (value.id) {
|
|
422
522
|
return value.id.toString();
|
|
423
523
|
}
|
|
424
|
-
} catch (error) {
|
|
524
|
+
} catch (error: any) {
|
|
425
525
|
console.error('Error fetching related model metadata:', error);
|
|
426
526
|
return value.id ? value.id.toString() : '';
|
|
427
527
|
}
|
|
@@ -129,7 +129,7 @@ export class CRUDService<T extends CommonEntity> { // Add two generic value i.e
|
|
|
129
129
|
await this.saveMedia(model, files, savedEntity);
|
|
130
130
|
}
|
|
131
131
|
return savedEntity;
|
|
132
|
-
} catch (error) {
|
|
132
|
+
} catch (error: any) {
|
|
133
133
|
if (error instanceof QueryFailedError && error.message.includes('duplicate key value violates unique constraint')) {
|
|
134
134
|
throw new BadRequestException(ERROR_MESSAGES.DUPLICATE_ENTRY);
|
|
135
135
|
}
|
|
@@ -68,7 +68,7 @@ export class CsvService {
|
|
|
68
68
|
}
|
|
69
69
|
|
|
70
70
|
csvStream.end(); // ✅ Ensure CSV stream is finalized
|
|
71
|
-
} catch (error) {
|
|
71
|
+
} catch (error: any) {
|
|
72
72
|
this.logger.error(`❌ Error writing CSV: ${error.message}`);
|
|
73
73
|
passThrough.destroy(error); // ✅ Properly destroy stream on error
|
|
74
74
|
throw error;
|
|
@@ -117,7 +117,7 @@ export class DashboardService extends CRUDService<Dashboard> {
|
|
|
117
117
|
const filePath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(moduleName);
|
|
118
118
|
try {
|
|
119
119
|
await fs.access(filePath);
|
|
120
|
-
} catch (error) {
|
|
120
|
+
} catch (error: any) {
|
|
121
121
|
throw new Error(`Configuration file not found for module: ${moduleName}`);
|
|
122
122
|
}
|
|
123
123
|
const metaData = await this.moduleMetadataHelperService.getModuleMetadataConfiguration(filePath);
|
|
@@ -80,7 +80,7 @@ export class DatabaseBootstrapService implements OnModuleInit {
|
|
|
80
80
|
await this.dataSource.query(sql);
|
|
81
81
|
|
|
82
82
|
this.logger.debug(`[${this.dataSource.name}] Applied ${fileName}`);
|
|
83
|
-
} catch (error) {
|
|
83
|
+
} catch (error: any) {
|
|
84
84
|
// DO NOT THROW — continue with next file
|
|
85
85
|
this.logger.error(
|
|
86
86
|
`[${this.dataSource.name}] Failed ${fileName}`,
|
|
@@ -93,7 +93,7 @@ export class ExcelService {
|
|
|
93
93
|
|
|
94
94
|
workbook.commit();
|
|
95
95
|
// passThrough.end(); // ✅ Properly close the stream
|
|
96
|
-
} catch (error) {
|
|
96
|
+
} catch (error: any) {
|
|
97
97
|
this.logger.error(`❌ Error writing Excel: ${error.message}`);
|
|
98
98
|
passThrough.destroy(error); // Destroy stream
|
|
99
99
|
throw error;
|
|
@@ -90,7 +90,7 @@ export class ExportTransactionService extends CRUDService<ExportTransaction> {
|
|
|
90
90
|
const fileName = this.getFileName(templateName, uuid, templateFormat);
|
|
91
91
|
const mimeType = this.getMimeType(templateFormat);
|
|
92
92
|
return { exportStream, fileName, mimeType, exportTransaction };
|
|
93
|
-
} catch (error) {
|
|
93
|
+
} catch (error: any) {
|
|
94
94
|
this.updateExportTransaction(id, ExportStatus.FAILED, error.message);
|
|
95
95
|
throw error;
|
|
96
96
|
}
|
|
@@ -114,7 +114,7 @@ export class ExportTransactionService extends CRUDService<ExportTransaction> {
|
|
|
114
114
|
// Store the file using the appropriate storage provider
|
|
115
115
|
await this.storeExportStream(exportStream, exportTransaction, this.getFileName(templateName, uuid, templateFormat));
|
|
116
116
|
this.updateExportTransaction(id, ExportStatus.COMPLETED);
|
|
117
|
-
} catch (error) {
|
|
117
|
+
} catch (error: any) {
|
|
118
118
|
this.updateExportTransaction(id, ExportStatus.FAILED, error.message);
|
|
119
119
|
throw error;
|
|
120
120
|
|
|
@@ -1256,7 +1256,7 @@ export class FieldMetadataService implements OnApplicationBootstrap {
|
|
|
1256
1256
|
// Write the updated object back to the file
|
|
1257
1257
|
const updatedContent = JSON.stringify(metaData, null, 2);
|
|
1258
1258
|
await fs.writeFile(filePath, updatedContent);
|
|
1259
|
-
} catch (error) {
|
|
1259
|
+
} catch (error: any) {
|
|
1260
1260
|
this.logger.error('File creation failed:', error);
|
|
1261
1261
|
throw new Error(ERROR_MESSAGES.FILE_WRITE_FAILED); // Trigger rollback
|
|
1262
1262
|
}
|
|
@@ -35,7 +35,7 @@ export class FixturesService {
|
|
|
35
35
|
// Create the model instance in the database
|
|
36
36
|
const createdInstance = await modelServiceInstance.create(modelFixture.data);
|
|
37
37
|
this.logger.log(`Successfully created fixture for model: ${modelFixture.singularName} with ID: ${createdInstance.id}`);
|
|
38
|
-
} catch (error) {
|
|
38
|
+
} catch (error: any) {
|
|
39
39
|
this.logger.error(`Error creating fixture for model: ${modelFixture.singularName} - ${error.message}`);
|
|
40
40
|
}
|
|
41
41
|
}
|
|
@@ -59,7 +59,7 @@ export class FixturesService {
|
|
|
59
59
|
const deleteCriteria = modelFixture.data; // This should be adjusted based on actual criteria
|
|
60
60
|
await modelServiceInstance.delete(deleteCriteria);
|
|
61
61
|
this.logger.log(`Successfully deleted fixture for model: ${modelFixture.singularName}`);
|
|
62
|
-
} catch (error) {
|
|
62
|
+
} catch (error: any) {
|
|
63
63
|
this.logger.error(`Error deleting fixture for model: ${modelFixture.singularName} - ${error.message}`);
|
|
64
64
|
}
|
|
65
65
|
}
|
|
@@ -25,7 +25,7 @@ import { SolidIntrospectService } from './solid-introspect.service';
|
|
|
25
25
|
import { ModelMetadataHelperService } from 'src/helpers/model-metadata-helper.service';
|
|
26
26
|
import { getUserExcludedFields } from 'src/helpers/user-helper';
|
|
27
27
|
import { ActiveUserData } from 'src/interfaces/active-user-data.interface';
|
|
28
|
-
import {upperFirst, camelCase} from 'lodash';
|
|
28
|
+
import { upperFirst, camelCase } from 'lodash';
|
|
29
29
|
import { classify } from '../helpers/string.helper';
|
|
30
30
|
|
|
31
31
|
interface ImportTemplateFileInfo {
|
|
@@ -557,7 +557,7 @@ export class ImportTransactionService extends CRUDService<ImportTransaction> {
|
|
|
557
557
|
const createdRecord = await this.insertRecord(record, JSON.parse(importTransaction.mapping) as ImportMapping[], importTransaction.modelMetadata, modelService);
|
|
558
558
|
ids.push(createdRecord.id); // Add the ID of the created record to the ids array
|
|
559
559
|
}
|
|
560
|
-
catch (error) {
|
|
560
|
+
catch (error: any) {
|
|
561
561
|
this.logger.debug(`Error inserting record: ${JSON.stringify(record)}. Error: ${error.message}`);
|
|
562
562
|
// Get the Import transaction error log repo
|
|
563
563
|
const errorLog = await this.createErrorLogEntry(importTransaction, record, error);
|
|
@@ -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);
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Injectable } from '@nestjs/common';
|
|
2
|
+
import { ModuleRef } from '@nestjs/core';
|
|
3
|
+
import { InjectEntityManager } from '@nestjs/typeorm';
|
|
4
|
+
import { McpAuditLog } from 'src/entities/mcp-audit-log.entity';
|
|
5
|
+
import { McpAuditLogRepository } from 'src/repository/mcp-audit-log.repository';
|
|
6
|
+
import { EntityManager } from 'typeorm';
|
|
7
|
+
import { CRUDService } from './crud.service';
|
|
8
|
+
|
|
9
|
+
@Injectable()
|
|
10
|
+
export class McpAuditLogService extends CRUDService<McpAuditLog> {
|
|
11
|
+
constructor(
|
|
12
|
+
@InjectEntityManager()
|
|
13
|
+
readonly entityManager: EntityManager,
|
|
14
|
+
readonly repo: McpAuditLogRepository,
|
|
15
|
+
readonly moduleRef: ModuleRef,
|
|
16
|
+
) {
|
|
17
|
+
super(entityManager, repo, 'mcpAuditLog', 'solid-core', moduleRef);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -120,6 +120,18 @@ export class FileS3StorageProvider<T> implements MediaStorageProvider<T> {
|
|
|
120
120
|
}
|
|
121
121
|
}
|
|
122
122
|
|
|
123
|
+
async deleteByMediaRecord(media: Media): Promise<void> {
|
|
124
|
+
const storageProvider = media?.mediaStorageProviderMetadata;
|
|
125
|
+
if (!storageProvider) {
|
|
126
|
+
throw new Error(`mediaStorageProviderMetadata is not populated for media id ${media?.id ?? 'unknown'}`);
|
|
127
|
+
}
|
|
128
|
+
if (!storageProvider?.bucketName || !media?.relativeUri) {
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
const region = this.getEffectiveRegion(storageProvider.region);
|
|
132
|
+
await this.s3FileService.delete(`${storageProvider.bucketName}:${media.relativeUri}`, { region });
|
|
133
|
+
}
|
|
134
|
+
|
|
123
135
|
/**
|
|
124
136
|
* Get the effective region to use for S3 operations.
|
|
125
137
|
* Uses the provider-specific region if configured, otherwise falls back to env variable.
|
|
@@ -110,6 +110,13 @@ export class FileStorageProvider<T> implements MediaStorageProvider<T> {
|
|
|
110
110
|
// });
|
|
111
111
|
}
|
|
112
112
|
|
|
113
|
+
async deleteByMediaRecord(media: Media): Promise<void> {
|
|
114
|
+
if (!media?.relativeUri) {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
await this.fileService.delete(this.getFullFilePath(media.relativeUri));
|
|
118
|
+
}
|
|
119
|
+
|
|
113
120
|
private getFullFilePath(fileName: string): string {
|
|
114
121
|
const base = this.settingService.getConfigValue<SolidCoreSetting>("fileStorageDir")
|
|
115
122
|
|| DEFAULT_MEDIA_FILE_STORAGE_DIR;
|
|
@@ -122,4 +129,4 @@ export class FileStorageProvider<T> implements MediaStorageProvider<T> {
|
|
|
122
129
|
private getFileName(file: Express.Multer.File): string {
|
|
123
130
|
return `${file.filename}-${file.originalname}`;
|
|
124
131
|
}
|
|
125
|
-
}
|
|
132
|
+
}
|
|
@@ -27,6 +27,7 @@ import {
|
|
|
27
27
|
REMOVE_FIELDS_COMMAND,
|
|
28
28
|
SchematicService
|
|
29
29
|
} from '../helpers/schematic.service';
|
|
30
|
+
import { CommandService } from '../helpers/command.service';
|
|
30
31
|
import { CodeGenerationOptions } from '../interfaces';
|
|
31
32
|
import { CrudHelperService } from './crud-helper.service';
|
|
32
33
|
import { FieldMetadataService } from './field-metadata.service';
|
|
@@ -49,6 +50,7 @@ export class ModelMetadataService {
|
|
|
49
50
|
private readonly modelMetadataRepo: ModelMetadataRepository,
|
|
50
51
|
private readonly fieldMetadataRepo: FieldMetadataRepository,
|
|
51
52
|
private readonly schematicService: SchematicService,
|
|
53
|
+
private readonly commandService: CommandService,
|
|
52
54
|
@InjectDataSource()
|
|
53
55
|
private readonly dataSource: DataSource,
|
|
54
56
|
private readonly crudHelperService: CrudHelperService,
|
|
@@ -154,7 +156,7 @@ export class ModelMetadataService {
|
|
|
154
156
|
|
|
155
157
|
return model
|
|
156
158
|
});
|
|
157
|
-
} catch (error) {
|
|
159
|
+
} catch (error: any) {
|
|
158
160
|
// console.error('Transaction failed:', error);
|
|
159
161
|
this.logger.error('Transaction failed:', error);
|
|
160
162
|
throw error;
|
|
@@ -189,7 +191,7 @@ export class ModelMetadataService {
|
|
|
189
191
|
|
|
190
192
|
// return model
|
|
191
193
|
});
|
|
192
|
-
} catch (error) {
|
|
194
|
+
} catch (error: any) {
|
|
193
195
|
// console.error('Transaction failed:', error);
|
|
194
196
|
this.logger.error('Transaction failed:', error);
|
|
195
197
|
throw error;
|
|
@@ -309,7 +311,7 @@ export class ModelMetadataService {
|
|
|
309
311
|
const updatedContent = JSON.stringify(metaData, null, 2);
|
|
310
312
|
await fs.writeFile(filePath, updatedContent);
|
|
311
313
|
|
|
312
|
-
} catch (error) {
|
|
314
|
+
} catch (error: any) {
|
|
313
315
|
// console.error('File creation failed:', error);
|
|
314
316
|
this.logger.error('File creation failed:', error);
|
|
315
317
|
throw new Error(ERROR_MESSAGES.FILE_WRITE_FAILED); // Trigger rollback
|
|
@@ -490,7 +492,7 @@ export class ModelMetadataService {
|
|
|
490
492
|
const updatedContent = JSON.stringify(metaData, null, 2);
|
|
491
493
|
await fs.writeFile(filePath, updatedContent);
|
|
492
494
|
|
|
493
|
-
} catch (error) {
|
|
495
|
+
} catch (error: any) {
|
|
494
496
|
// console.error('File creation failed:', error);
|
|
495
497
|
this.logger.error('File creation failed:', error);
|
|
496
498
|
throw new Error(ERROR_MESSAGES.FILE_WRITE_FAILED); // Trigger rollback
|
|
@@ -524,7 +526,7 @@ export class ModelMetadataService {
|
|
|
524
526
|
await this.cleanupOnDelete(entity.id);
|
|
525
527
|
const r = await this.modelMetadataRepo.remove(entity);
|
|
526
528
|
return r;
|
|
527
|
-
} catch (error) {
|
|
529
|
+
} catch (error: any) {
|
|
528
530
|
}
|
|
529
531
|
}
|
|
530
532
|
|
|
@@ -621,7 +623,7 @@ export class ModelMetadataService {
|
|
|
621
623
|
try {
|
|
622
624
|
await fs.unlink(fileToDelete);
|
|
623
625
|
this.logger.log(`Deleted file: ${fileToDelete}`);
|
|
624
|
-
} catch (error) {
|
|
626
|
+
} catch (error: any) {
|
|
625
627
|
this.logger.error(`Error deleting file: ${fileToDelete}`, error);
|
|
626
628
|
}
|
|
627
629
|
}
|
|
@@ -725,7 +727,7 @@ export class ModelMetadataService {
|
|
|
725
727
|
);
|
|
726
728
|
this.solidTsMorphService.removeModuleMembers(moduleFilePath, removedIdentifiers);
|
|
727
729
|
await this.solidTsMorphService.commit();
|
|
728
|
-
} catch (error) {
|
|
730
|
+
} catch (error: any) {
|
|
729
731
|
this.solidTsMorphService.rollback();
|
|
730
732
|
this.logger.error(`Failed to clean up module file for model '${modelEntity.singularName}':`, error);
|
|
731
733
|
}
|
|
@@ -735,6 +737,16 @@ export class ModelMetadataService {
|
|
|
735
737
|
|
|
736
738
|
}
|
|
737
739
|
|
|
740
|
+
@DisallowInProduction()
|
|
741
|
+
async generateCodeViaCtl(modelId: number): Promise<string> {
|
|
742
|
+
const model = await this.findOne(modelId);
|
|
743
|
+
return this.commandService.executeCommandWithArgs({
|
|
744
|
+
command: 'npx',
|
|
745
|
+
args: ['@solixai/solidctl@latest', 'generate', 'model', `--name=${model.singularName}`],
|
|
746
|
+
cwd: path.join(process.cwd(), '..'),
|
|
747
|
+
});
|
|
748
|
+
}
|
|
749
|
+
|
|
738
750
|
@DisallowInProduction()
|
|
739
751
|
async handleGenerateCode(options: CodeGenerationOptions): Promise<any> {
|
|
740
752
|
const affectedModelIds = [], refreshModelCodeOutputLines = [], removeFieldCodeOutputLines = [];
|
|
@@ -789,7 +801,7 @@ export class ModelMetadataService {
|
|
|
789
801
|
await this.populateVAMConfigInDb(model);
|
|
790
802
|
await this.populateVAMConfigInFile(model);
|
|
791
803
|
});
|
|
792
|
-
} catch (error) {
|
|
804
|
+
} catch (error: any) {
|
|
793
805
|
this.logger.error('generateVAMConfig Transaction failed:', error);
|
|
794
806
|
throw error;
|
|
795
807
|
}
|
|
@@ -816,7 +828,7 @@ export class ModelMetadataService {
|
|
|
816
828
|
const updatedContent = JSON.stringify(metaData, null, 2);
|
|
817
829
|
await fs.writeFile(filePath, updatedContent);
|
|
818
830
|
|
|
819
|
-
} catch (error) {
|
|
831
|
+
} catch (error: any) {
|
|
820
832
|
// console.error('File creation failed:', error);
|
|
821
833
|
this.logger.error('File updation failed for View, action, menus config:', error);
|
|
822
834
|
throw new Error('File updation failed for View, action, menus config'); // Trigger rollback
|
|
@@ -826,15 +838,15 @@ export class ModelMetadataService {
|
|
|
826
838
|
// Populate the View, Actions and Menus in the config file
|
|
827
839
|
private populateVAMConfigInFileInternal(formViewLayoutFields: any[], model: ModelMetadata, listViewLayoutFields: { type: string; attrs: { name: string; }; }[], treeViewLayoutFields: { type: string; attrs: { name: string; }; }[], metaData: any) {
|
|
828
840
|
const column1Fields = [];
|
|
829
|
-
const column2Fields = [];
|
|
841
|
+
// const column2Fields = [];
|
|
830
842
|
|
|
831
843
|
// Distribute fields between two columns
|
|
832
844
|
for (let i = 0; i < formViewLayoutFields.length; i++) {
|
|
833
|
-
if (i % 2 === 0) {
|
|
834
|
-
|
|
835
|
-
} else {
|
|
836
|
-
|
|
837
|
-
}
|
|
845
|
+
// if (i % 2 === 0) {
|
|
846
|
+
column1Fields.push(formViewLayoutFields[i]);
|
|
847
|
+
// } else {
|
|
848
|
+
// column2Fields.push(formViewLayoutFields[i]);
|
|
849
|
+
// }
|
|
838
850
|
}
|
|
839
851
|
const actionName = `${model.singularName}-list-action`;
|
|
840
852
|
const treeViewActionName = `${model.singularName}-tree-action`;
|
|
@@ -842,6 +854,7 @@ export class ModelMetadataService {
|
|
|
842
854
|
const treeViewName = `${model.singularName}-tree-view`;
|
|
843
855
|
const formViewName = `${model.singularName}-form-view`;
|
|
844
856
|
const menuName = `${model.singularName}-menu-item`;
|
|
857
|
+
const nextMenuSequenceNumber = (metaData.menus?.length ?? 0) + 1;
|
|
845
858
|
|
|
846
859
|
const action = {
|
|
847
860
|
displayName: `${model.displayName} List Action`,
|
|
@@ -874,7 +887,7 @@ export class ModelMetadataService {
|
|
|
874
887
|
const menu = {
|
|
875
888
|
displayName: `${model.displayName}`,
|
|
876
889
|
name: menuName,
|
|
877
|
-
sequenceNumber:
|
|
890
|
+
sequenceNumber: nextMenuSequenceNumber,
|
|
878
891
|
actionUserKey: actionName,
|
|
879
892
|
moduleUserKey: `${model.module.name}`,
|
|
880
893
|
parentMenuItemUserKey: "",
|
|
@@ -955,11 +968,11 @@ export class ModelMetadataService {
|
|
|
955
968
|
attrs: { name: "group-1", label: "", className: "col-12 sm:col-12 md:col-6 lg:col-6" },
|
|
956
969
|
children: column1Fields
|
|
957
970
|
},
|
|
958
|
-
{
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
}
|
|
971
|
+
// {
|
|
972
|
+
// type: "column",
|
|
973
|
+
// attrs: { name: "group-2", label: "", className: "col-12 sm:col-12 md:col-6 lg:col-6" },
|
|
974
|
+
// children: column2Fields
|
|
975
|
+
// }
|
|
963
976
|
]
|
|
964
977
|
},
|
|
965
978
|
]
|
|
@@ -1274,24 +1287,13 @@ export class ModelMetadataService {
|
|
|
1274
1287
|
};
|
|
1275
1288
|
const model = options.modelId ? await this.findOne(options.modelId, query) : await this.findOneByUserKey(options.modelUserKey, query.populate);
|
|
1276
1289
|
|
|
1277
|
-
let fieldsForRefresh = model.fields.filter((field) => !field.isMarkedForRemoval);
|
|
1278
|
-
|
|
1279
|
-
// If a list of field ids or field names is passed for refresh, use these fields only
|
|
1280
|
-
if (options.fieldIdsForRefresh && options.fieldIdsForRefresh.length > 0) {
|
|
1281
|
-
fieldsForRefresh = fieldsForRefresh.filter((field) => options.fieldIdsForRefresh.includes(+field.id));
|
|
1282
|
-
} else if (options.fieldNamesForRefresh && options.fieldNamesForRefresh.length > 0) {
|
|
1283
|
-
fieldsForRefresh = fieldsForRefresh.filter((field) => options.fieldNamesForRefresh.includes(field.name));
|
|
1284
|
-
}
|
|
1285
|
-
// const fieldsForRefresh = model.fields.filter((field) => !field.isMarkedForRemoval);
|
|
1286
|
-
|
|
1287
1290
|
//Execute the schematic command to refresh the model
|
|
1288
|
-
const refreshOuput = await this.executeRefreshModelCommand(model,
|
|
1291
|
+
const refreshOuput = await this.executeRefreshModelCommand(model, options.dryRun);
|
|
1289
1292
|
|
|
1290
1293
|
return `${refreshOuput}`;
|
|
1291
1294
|
}
|
|
1292
1295
|
|
|
1293
|
-
private async executeRefreshModelCommand(model: ModelMetadata,
|
|
1294
|
-
// const fieldsForRefresh = model.fields.filter((field) => !field.isMarkedForRemoval);
|
|
1296
|
+
private async executeRefreshModelCommand(model: ModelMetadata, dryRun: boolean = false): Promise<string> {
|
|
1295
1297
|
const output = await this.schematicService.executeSchematicCommand(
|
|
1296
1298
|
REFRESH_MODEL_COMMAND,
|
|
1297
1299
|
{
|