@solidstarters/solid-core 1.2.149 → 1.2.151
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/dtos/create-scheduled-job.dto.d.ts +1 -0
- package/dist/dtos/create-scheduled-job.dto.d.ts.map +1 -1
- package/dist/dtos/create-scheduled-job.dto.js +5 -1
- package/dist/dtos/create-scheduled-job.dto.js.map +1 -1
- package/dist/dtos/create-user.dto.js +3 -3
- package/dist/dtos/create-user.dto.js.map +1 -1
- package/dist/dtos/update-scheduled-job.dto.d.ts +1 -0
- package/dist/dtos/update-scheduled-job.dto.d.ts.map +1 -1
- package/dist/dtos/update-scheduled-job.dto.js +5 -1
- package/dist/dtos/update-scheduled-job.dto.js.map +1 -1
- package/dist/entities/scheduled-job.entity.d.ts +2 -0
- package/dist/entities/scheduled-job.entity.d.ts.map +1 -1
- package/dist/entities/scheduled-job.entity.js +8 -1
- package/dist/entities/scheduled-job.entity.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.d.ts.map +1 -1
- package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js +4 -1
- package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js.map +1 -1
- package/dist/repository/scheduled-job.repository.d.ts +29 -0
- package/dist/repository/scheduled-job.repository.d.ts.map +1 -0
- package/dist/repository/scheduled-job.repository.js +85 -0
- package/dist/repository/scheduled-job.repository.js.map +1 -0
- package/dist/seeders/module-metadata-seeder.service.d.ts +4 -1
- package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
- package/dist/seeders/module-metadata-seeder.service.js +20 -2
- package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
- package/dist/seeders/seed-data/solid-core-metadata.json +156 -78
- package/dist/services/ai-interaction.service.d.ts +1 -1
- package/dist/services/ai-interaction.service.d.ts.map +1 -1
- package/dist/services/ai-interaction.service.js +4 -3
- package/dist/services/ai-interaction.service.js.map +1 -1
- package/dist/services/computed-fields/entity/concat-entity-computed-field-provider.service.d.ts.map +1 -1
- package/dist/services/computed-fields/entity/concat-entity-computed-field-provider.service.js +16 -12
- package/dist/services/computed-fields/entity/concat-entity-computed-field-provider.service.js.map +1 -1
- package/dist/services/media.service.d.ts.map +1 -1
- package/dist/services/media.service.js +2 -2
- package/dist/services/media.service.js.map +1 -1
- package/dist/services/mediaStorageProviders/file-s3-storage-provider.js +3 -2
- package/dist/services/mediaStorageProviders/file-s3-storage-provider.js.map +1 -1
- package/dist/services/mediaStorageProviders/file-storage-provider.js +6 -4
- package/dist/services/mediaStorageProviders/file-storage-provider.js.map +1 -1
- package/dist/services/scheduled-jobs/scheduler.service.d.ts.map +1 -1
- package/dist/services/scheduled-jobs/scheduler.service.js +1 -1
- package/dist/services/scheduled-jobs/scheduler.service.js.map +1 -1
- package/dist/services/textract.service.d.ts +20 -0
- package/dist/services/textract.service.d.ts.map +1 -0
- package/dist/services/textract.service.js +199 -0
- package/dist/services/textract.service.js.map +1 -0
- package/dist/solid-core.module.d.ts.map +1 -1
- package/dist/solid-core.module.js +7 -0
- package/dist/solid-core.module.js.map +1 -1
- package/dist/subscribers/scheduled-job.subscriber.d.ts +19 -0
- package/dist/subscribers/scheduled-job.subscriber.d.ts.map +1 -0
- package/dist/subscribers/scheduled-job.subscriber.js +175 -0
- package/dist/subscribers/scheduled-job.subscriber.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -1
- package/src/dtos/create-scheduled-job.dto.ts +3 -0
- package/src/dtos/create-user.dto.ts +2 -2
- package/src/dtos/update-scheduled-job.dto.ts +3 -0
- package/src/entities/scheduled-job.entity.ts +7 -2
- package/src/index.ts +1 -0
- package/src/jobs/database/trigger-mcp-client-subscriber-database.service.ts +8 -1
- package/src/repository/scheduled-job.repository.ts +94 -0
- package/src/seeders/module-metadata-seeder.service.ts +20 -1
- package/src/seeders/seed-data/solid-core-metadata.json +156 -78
- package/src/services/ai-interaction.service.ts +4 -3
- package/src/services/computed-fields/entity/concat-entity-computed-field-provider.service.ts +28 -18
- package/src/services/media.service.ts +2 -3
- package/src/services/mediaStorageProviders/file-s3-storage-provider.ts +2 -2
- package/src/services/mediaStorageProviders/file-storage-provider.ts +4 -4
- package/src/services/scheduled-jobs/scheduler.service.ts +2 -2
- package/src/services/textract.service.ts +189 -0
- package/src/solid-core.module.ts +7 -0
- package/src/subscribers/scheduled-job.subscriber.ts +176 -0
- package/src/# computed field pending issues.md +0 -3
- package/src/services/pending_import_issues +0 -3
- package/src/services/question-data-providers/test.sql +0 -1
- package/test.json +0 -1
|
@@ -2548,7 +2548,7 @@
|
|
|
2548
2548
|
"userKeyFieldUserKey": "scheduleName",
|
|
2549
2549
|
"isChild": false,
|
|
2550
2550
|
"enableAuditTracking": true,
|
|
2551
|
-
"enableSoftDelete":
|
|
2551
|
+
"enableSoftDelete": false,
|
|
2552
2552
|
"draftPublishWorkflow": false,
|
|
2553
2553
|
"internationalisation": false,
|
|
2554
2554
|
"fields": [
|
|
@@ -2797,6 +2797,22 @@
|
|
|
2797
2797
|
"selectionValueType": "string",
|
|
2798
2798
|
"selectionDynamicProvider": "ListOfScheduledJobsSelectionProvider",
|
|
2799
2799
|
"selectionDynamicProviderCtxt": "{}"
|
|
2800
|
+
},
|
|
2801
|
+
{
|
|
2802
|
+
"name": "module",
|
|
2803
|
+
"displayName": "Module",
|
|
2804
|
+
"type": "relation",
|
|
2805
|
+
"required": true,
|
|
2806
|
+
"unique": false,
|
|
2807
|
+
"index": true,
|
|
2808
|
+
"private": false,
|
|
2809
|
+
"encrypt": false,
|
|
2810
|
+
"relationType": "many-to-one",
|
|
2811
|
+
"relationCoModelSingularName": "moduleMetadata",
|
|
2812
|
+
"relationCreateInverse": false,
|
|
2813
|
+
"relationCascade": "cascade",
|
|
2814
|
+
"relationModelModuleName": "solid-core",
|
|
2815
|
+
"isSystem": true
|
|
2800
2816
|
}
|
|
2801
2817
|
]
|
|
2802
2818
|
},
|
|
@@ -10219,6 +10235,13 @@
|
|
|
10219
10235
|
"isSearchable": true
|
|
10220
10236
|
}
|
|
10221
10237
|
},
|
|
10238
|
+
{
|
|
10239
|
+
"type": "field",
|
|
10240
|
+
"attrs": {
|
|
10241
|
+
"name": "module",
|
|
10242
|
+
"isSearchable": true
|
|
10243
|
+
}
|
|
10244
|
+
},
|
|
10222
10245
|
{
|
|
10223
10246
|
"type": "field",
|
|
10224
10247
|
"attrs": {
|
|
@@ -10313,100 +10336,154 @@
|
|
|
10313
10336
|
},
|
|
10314
10337
|
"children": [
|
|
10315
10338
|
{
|
|
10316
|
-
"type": "
|
|
10339
|
+
"type": "notebook",
|
|
10317
10340
|
"attrs": {
|
|
10318
|
-
"name": "
|
|
10341
|
+
"name": "notebook-1"
|
|
10319
10342
|
},
|
|
10320
10343
|
"children": [
|
|
10321
10344
|
{
|
|
10322
|
-
"type": "
|
|
10345
|
+
"type": "page",
|
|
10323
10346
|
"attrs": {
|
|
10324
|
-
"name": "
|
|
10325
|
-
"label": "
|
|
10326
|
-
"className": "col-6"
|
|
10347
|
+
"name": "page-general",
|
|
10348
|
+
"label": "General"
|
|
10327
10349
|
},
|
|
10328
10350
|
"children": [
|
|
10329
10351
|
{
|
|
10330
|
-
"type": "
|
|
10331
|
-
"attrs": {
|
|
10332
|
-
"name": "scheduleName"
|
|
10333
|
-
}
|
|
10334
|
-
},
|
|
10335
|
-
{
|
|
10336
|
-
"type": "field",
|
|
10352
|
+
"type": "row",
|
|
10337
10353
|
"attrs": {
|
|
10338
|
-
"name": "
|
|
10339
|
-
}
|
|
10354
|
+
"name": "row-general"
|
|
10355
|
+
},
|
|
10356
|
+
"children": [
|
|
10357
|
+
{
|
|
10358
|
+
"type": "column",
|
|
10359
|
+
"attrs": {
|
|
10360
|
+
"name": "group-basic",
|
|
10361
|
+
"label": "Basic",
|
|
10362
|
+
"className": "col-6"
|
|
10363
|
+
},
|
|
10364
|
+
"children": [
|
|
10365
|
+
{
|
|
10366
|
+
"type": "field",
|
|
10367
|
+
"attrs": {
|
|
10368
|
+
"name": "scheduleName"
|
|
10369
|
+
}
|
|
10370
|
+
},
|
|
10371
|
+
{
|
|
10372
|
+
"type": "field",
|
|
10373
|
+
"attrs": {
|
|
10374
|
+
"name": "job"
|
|
10375
|
+
}
|
|
10376
|
+
},
|
|
10377
|
+
{
|
|
10378
|
+
"type": "field",
|
|
10379
|
+
"attrs": {
|
|
10380
|
+
"name": "module"
|
|
10381
|
+
}
|
|
10382
|
+
},
|
|
10383
|
+
{
|
|
10384
|
+
"type": "field",
|
|
10385
|
+
"attrs": {
|
|
10386
|
+
"name": "isActive"
|
|
10387
|
+
}
|
|
10388
|
+
}
|
|
10389
|
+
]
|
|
10390
|
+
},
|
|
10391
|
+
{
|
|
10392
|
+
"type": "column",
|
|
10393
|
+
"attrs": {
|
|
10394
|
+
"name": "group-config",
|
|
10395
|
+
"label": "Configuration",
|
|
10396
|
+
"className": "col-6"
|
|
10397
|
+
},
|
|
10398
|
+
"children": [
|
|
10399
|
+
{
|
|
10400
|
+
"type": "field",
|
|
10401
|
+
"attrs": {
|
|
10402
|
+
"name": "frequency"
|
|
10403
|
+
}
|
|
10404
|
+
},
|
|
10405
|
+
{
|
|
10406
|
+
"type": "field",
|
|
10407
|
+
"attrs": {
|
|
10408
|
+
"name": "startTime"
|
|
10409
|
+
}
|
|
10410
|
+
},
|
|
10411
|
+
{
|
|
10412
|
+
"type": "field",
|
|
10413
|
+
"attrs": {
|
|
10414
|
+
"name": "endTime"
|
|
10415
|
+
}
|
|
10416
|
+
},
|
|
10417
|
+
{
|
|
10418
|
+
"type": "field",
|
|
10419
|
+
"attrs": {
|
|
10420
|
+
"name": "startDate"
|
|
10421
|
+
}
|
|
10422
|
+
},
|
|
10423
|
+
{
|
|
10424
|
+
"type": "field",
|
|
10425
|
+
"attrs": {
|
|
10426
|
+
"name": "endDate"
|
|
10427
|
+
}
|
|
10428
|
+
},
|
|
10429
|
+
{
|
|
10430
|
+
"type": "field",
|
|
10431
|
+
"attrs": {
|
|
10432
|
+
"name": "dayOfWeek"
|
|
10433
|
+
}
|
|
10434
|
+
},
|
|
10435
|
+
{
|
|
10436
|
+
"type": "field",
|
|
10437
|
+
"attrs": {
|
|
10438
|
+
"name": "dayOfMonth"
|
|
10439
|
+
}
|
|
10440
|
+
}
|
|
10441
|
+
]
|
|
10442
|
+
}
|
|
10443
|
+
]
|
|
10340
10444
|
}
|
|
10341
10445
|
]
|
|
10342
10446
|
},
|
|
10343
10447
|
{
|
|
10344
|
-
"type": "
|
|
10448
|
+
"type": "page",
|
|
10345
10449
|
"attrs": {
|
|
10346
|
-
"name": "
|
|
10347
|
-
"label": "
|
|
10348
|
-
"className": "col-6"
|
|
10450
|
+
"name": "page-runtime",
|
|
10451
|
+
"label": "Runtime"
|
|
10349
10452
|
},
|
|
10350
10453
|
"children": [
|
|
10351
10454
|
{
|
|
10352
|
-
"type": "
|
|
10353
|
-
"attrs": {
|
|
10354
|
-
"name": "isActive"
|
|
10355
|
-
}
|
|
10356
|
-
},
|
|
10357
|
-
{
|
|
10358
|
-
"type": "field",
|
|
10359
|
-
"attrs": {
|
|
10360
|
-
"name": "frequency"
|
|
10361
|
-
}
|
|
10362
|
-
},
|
|
10363
|
-
{
|
|
10364
|
-
"type": "field",
|
|
10365
|
-
"attrs": {
|
|
10366
|
-
"name": "startTime"
|
|
10367
|
-
}
|
|
10368
|
-
},
|
|
10369
|
-
{
|
|
10370
|
-
"type": "field",
|
|
10371
|
-
"attrs": {
|
|
10372
|
-
"name": "endTime"
|
|
10373
|
-
}
|
|
10374
|
-
},
|
|
10375
|
-
{
|
|
10376
|
-
"type": "field",
|
|
10377
|
-
"attrs": {
|
|
10378
|
-
"name": "startDate"
|
|
10379
|
-
}
|
|
10380
|
-
},
|
|
10381
|
-
{
|
|
10382
|
-
"type": "field",
|
|
10383
|
-
"attrs": {
|
|
10384
|
-
"name": "endDate"
|
|
10385
|
-
}
|
|
10386
|
-
},
|
|
10387
|
-
{
|
|
10388
|
-
"type": "field",
|
|
10389
|
-
"attrs": {
|
|
10390
|
-
"name": "lastRunAt"
|
|
10391
|
-
}
|
|
10392
|
-
},
|
|
10393
|
-
{
|
|
10394
|
-
"type": "field",
|
|
10395
|
-
"attrs": {
|
|
10396
|
-
"name": "nextRunAt"
|
|
10397
|
-
}
|
|
10398
|
-
},
|
|
10399
|
-
{
|
|
10400
|
-
"type": "field",
|
|
10401
|
-
"attrs": {
|
|
10402
|
-
"name": "dayOfWeek"
|
|
10403
|
-
}
|
|
10404
|
-
},
|
|
10405
|
-
{
|
|
10406
|
-
"type": "field",
|
|
10455
|
+
"type": "row",
|
|
10407
10456
|
"attrs": {
|
|
10408
|
-
"name": "
|
|
10409
|
-
}
|
|
10457
|
+
"name": "row-runtime"
|
|
10458
|
+
},
|
|
10459
|
+
"children": [
|
|
10460
|
+
{
|
|
10461
|
+
"type": "column",
|
|
10462
|
+
"attrs": {
|
|
10463
|
+
"name": "group-runtime",
|
|
10464
|
+
"label": "Execution",
|
|
10465
|
+
"className": "col-12"
|
|
10466
|
+
},
|
|
10467
|
+
"children": [
|
|
10468
|
+
{
|
|
10469
|
+
"type": "field",
|
|
10470
|
+
"attrs": {
|
|
10471
|
+
"name": "lastRunAt",
|
|
10472
|
+
"disabled": true,
|
|
10473
|
+
"readOnly": true
|
|
10474
|
+
}
|
|
10475
|
+
},
|
|
10476
|
+
{
|
|
10477
|
+
"type": "field",
|
|
10478
|
+
"attrs": {
|
|
10479
|
+
"name": "nextRunAt",
|
|
10480
|
+
"disabled": true,
|
|
10481
|
+
"readOnly": true
|
|
10482
|
+
}
|
|
10483
|
+
}
|
|
10484
|
+
]
|
|
10485
|
+
}
|
|
10486
|
+
]
|
|
10410
10487
|
}
|
|
10411
10488
|
]
|
|
10412
10489
|
}
|
|
@@ -12279,5 +12356,6 @@
|
|
|
12279
12356
|
}
|
|
12280
12357
|
],
|
|
12281
12358
|
"checksums": [],
|
|
12282
|
-
"listOfValues": []
|
|
12359
|
+
"listOfValues": [],
|
|
12360
|
+
"scheduledJobs": []
|
|
12283
12361
|
}
|
|
@@ -26,7 +26,7 @@ export declare class AiInteractionService extends CRUDService<AiInteraction> {
|
|
|
26
26
|
readonly mcpToolResponseHandlerFactory: McpToolResponseHandlerFactory;
|
|
27
27
|
private readonly logger;
|
|
28
28
|
constructor(modelMetadataService: ModelMetadataService, moduleMetadataService: ModuleMetadataService, configService: ConfigService, fileService: FileService, discoveryService: DiscoveryService, crudHelperService: CrudHelperService, entityManager: EntityManager, repo: Repository<AiInteraction>, moduleRef: ModuleRef, publisherFactory: PublisherFactory<TriggerMcpClientOptions>, requestContextService: RequestContextService, mcpToolResponseHandlerFactory: McpToolResponseHandlerFactory);
|
|
29
|
-
triggerMcpClientJob(prompt: string): Promise<any>;
|
|
29
|
+
triggerMcpClientJob(prompt: string, isAutoApply?: boolean, threadId?: string): Promise<any>;
|
|
30
30
|
runMcpPrompt(prompt: string): Promise<McpResponse>;
|
|
31
31
|
cleanResponse(response: string): string;
|
|
32
32
|
applySolidAiInteraction(id: number): Promise<any>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-interaction.service.d.ts","sourceRoot":"","sources":["../../src/services/ai-interaction.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEpD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAErE,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAElE,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAElE,OAAO,EAAE,6BAA6B,EAAE,MAAM,wEAAwE,CAAC;AAGvH,qBACa,oBAAqB,SAAQ,WAAW,CAAC,aAAa,CAAC;IAIhE,QAAQ,CAAC,oBAAoB,EAAE,oBAAoB;IACnD,QAAQ,CAAC,qBAAqB,EAAE,qBAAqB;IACrD,QAAQ,CAAC,aAAa,EAAE,aAAa;IACrC,QAAQ,CAAC,WAAW,EAAE,WAAW;IACjC,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB;IAC3C,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB;IAE7C,QAAQ,CAAC,aAAa,EAAE,aAAa;IAErC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,aAAa,CAAC;IACxC,QAAQ,CAAC,SAAS,EAAE,SAAS;IAC7B,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,uBAAuB,CAAC;IACpE,QAAQ,CAAC,qBAAqB,EAAE,qBAAqB;IACrD,QAAQ,CAAC,6BAA6B,EAAE,6BAA6B;IAhBvE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyC;gBAGrD,oBAAoB,EAAE,oBAAoB,EAC1C,qBAAqB,EAAE,qBAAqB,EAC5C,aAAa,EAAE,aAAa,EAC5B,WAAW,EAAE,WAAW,EACxB,gBAAgB,EAAE,gBAAgB,EAClC,iBAAiB,EAAE,iBAAiB,EAEpC,aAAa,EAAE,aAAa,EAE5B,IAAI,EAAE,UAAU,CAAC,aAAa,CAAC,EAC/B,SAAS,EAAE,SAAS,EACpB,gBAAgB,EAAE,gBAAgB,CAAC,uBAAuB,CAAC,EAC3D,qBAAqB,EAAE,qBAAqB,EAC5C,6BAA6B,EAAE,6BAA6B;IAMjE,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"ai-interaction.service.d.ts","sourceRoot":"","sources":["../../src/services/ai-interaction.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEpD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAErE,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAElE,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAElE,OAAO,EAAE,6BAA6B,EAAE,MAAM,wEAAwE,CAAC;AAGvH,qBACa,oBAAqB,SAAQ,WAAW,CAAC,aAAa,CAAC;IAIhE,QAAQ,CAAC,oBAAoB,EAAE,oBAAoB;IACnD,QAAQ,CAAC,qBAAqB,EAAE,qBAAqB;IACrD,QAAQ,CAAC,aAAa,EAAE,aAAa;IACrC,QAAQ,CAAC,WAAW,EAAE,WAAW;IACjC,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB;IAC3C,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB;IAE7C,QAAQ,CAAC,aAAa,EAAE,aAAa;IAErC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,aAAa,CAAC;IACxC,QAAQ,CAAC,SAAS,EAAE,SAAS;IAC7B,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,uBAAuB,CAAC;IACpE,QAAQ,CAAC,qBAAqB,EAAE,qBAAqB;IACrD,QAAQ,CAAC,6BAA6B,EAAE,6BAA6B;IAhBvE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyC;gBAGrD,oBAAoB,EAAE,oBAAoB,EAC1C,qBAAqB,EAAE,qBAAqB,EAC5C,aAAa,EAAE,aAAa,EAC5B,WAAW,EAAE,WAAW,EACxB,gBAAgB,EAAE,gBAAgB,EAClC,iBAAiB,EAAE,iBAAiB,EAEpC,aAAa,EAAE,aAAa,EAE5B,IAAI,EAAE,UAAU,CAAC,aAAa,CAAC,EAC/B,SAAS,EAAE,SAAS,EACpB,gBAAgB,EAAE,gBAAgB,CAAC,uBAAuB,CAAC,EAC3D,qBAAqB,EAAE,qBAAqB,EAC5C,6BAA6B,EAAE,6BAA6B;IAMjE,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,GAAE,OAAe,EAAE,QAAQ,GAAE,MAAa,GAAG,OAAO,CAAC,GAAG,CAAC;IAoCxG,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IA2ExD,aAAa,CAAC,QAAQ,EAAE,MAAM;IAexB,uBAAuB,CAAC,EAAE,EAAE,MAAM;CAiDzC"}
|
|
@@ -81,18 +81,19 @@ let AiInteractionService = AiInteractionService_1 = class AiInteractionService e
|
|
|
81
81
|
this.mcpToolResponseHandlerFactory = mcpToolResponseHandlerFactory;
|
|
82
82
|
this.logger = new common_1.Logger(AiInteractionService_1.name);
|
|
83
83
|
}
|
|
84
|
-
async triggerMcpClientJob(prompt) {
|
|
84
|
+
async triggerMcpClientJob(prompt, isAutoApply = false, threadId = null) {
|
|
85
85
|
const activeUser = this.requestContextService.getActiveUser();
|
|
86
86
|
const aiInteraction = await this.create({
|
|
87
87
|
userId: activeUser.sub,
|
|
88
|
-
threadId: `thread-${activeUser.sub}`,
|
|
88
|
+
threadId: threadId ? threadId : `thread-${activeUser.sub}`,
|
|
89
89
|
role: 'human',
|
|
90
90
|
message: prompt,
|
|
91
91
|
contentType: '',
|
|
92
92
|
errorMessage: '',
|
|
93
93
|
modelUsed: '',
|
|
94
94
|
responseTimeMs: 0,
|
|
95
|
-
metadata: ''
|
|
95
|
+
metadata: '',
|
|
96
|
+
isAutoApply: isAutoApply
|
|
96
97
|
});
|
|
97
98
|
const m = {
|
|
98
99
|
payload: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-interaction.service.js","sourceRoot":"","sources":["../../src/services/ai-interaction.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { BadRequestException, Logger, Injectable } from '@nestjs/common';\nimport { InjectEntityManager, InjectRepository } from '@nestjs/typeorm';\nimport { DiscoveryService, ModuleRef } from \"@nestjs/core\";\nimport { EntityManager, Repository } from 'typeorm';\n\nimport { CRUDService } from 'src/services/crud.service';\nimport { ModelMetadataService } from 'src/services/model-metadata.service';\nimport { ModuleMetadataService } from 'src/services/module-metadata.service';\nimport { ConfigService } from '@nestjs/config';\nimport { FileService } from 'src/services/file.service';\nimport { CrudHelperService } from 'src/services/crud-helper.service';\nimport { spawn } from 'child_process';\nimport { AiInteraction } from '../entities/ai-interaction.entity';\nimport * as fs from 'fs/promises';\nimport { McpResponse, TriggerMcpClientOptions } from 'src/interfaces';\nimport { PublisherFactory } from './queues/publisher-factory.service';\nimport { RequestContextService } from './request-context.service';\nimport { ActiveUserData } from 'src/interfaces/active-user-data.interface';\nimport { McpToolResponseHandlerFactory } from './mcp-tool-response-handlers/mcp-tool-response-handler-factory.service';\nimport { ERROR_MESSAGES } from 'src/constants/error-messages';\n\n@Injectable()\nexport class AiInteractionService extends CRUDService<AiInteraction> {\n private readonly logger = new Logger(AiInteractionService.name);\n\n constructor(\n readonly modelMetadataService: ModelMetadataService,\n readonly moduleMetadataService: ModuleMetadataService,\n readonly configService: ConfigService,\n readonly fileService: FileService,\n readonly discoveryService: DiscoveryService,\n readonly crudHelperService: CrudHelperService,\n @InjectEntityManager()\n readonly entityManager: EntityManager,\n @InjectRepository(AiInteraction, 'default')\n readonly repo: Repository<AiInteraction>,\n readonly moduleRef: ModuleRef,\n readonly publisherFactory: PublisherFactory<TriggerMcpClientOptions>,\n readonly requestContextService: RequestContextService,\n readonly mcpToolResponseHandlerFactory: McpToolResponseHandlerFactory,\n\n ) {\n super(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService, entityManager, repo, 'aiInteraction', 'solid-core', moduleRef);\n }\n\n async triggerMcpClientJob(prompt: string): Promise<any> {\n const activeUser: ActiveUserData = this.requestContextService.getActiveUser();\n\n const aiInteraction = await this.create({\n userId: activeUser.sub,\n threadId: `thread-${activeUser.sub}`,\n role: 'human',\n message: prompt,\n contentType: '',\n errorMessage: '',\n modelUsed: '',\n responseTimeMs: 0,\n metadata: ''\n });\n const m = {\n payload: {\n aiInteractionId: aiInteraction.id,\n },\n parentEntity: 'aiInteraction',\n parentEntityId: aiInteraction.id,\n };\n\n const queueMessageId = await this.publisherFactory.publish(m, 'TriggerMcpClientPublisher');\n\n return {\n queueMessageId: queueMessageId,\n aiInteractionId: aiInteraction.id\n }\n }\n\n /**\n * Runs the Python MCP client with a prompt and returns the parsed JSON embedded in the 'response'.\n * @param prompt - The question or instruction to send to the MCP client.\n * @returns The parsed object inside the 'response' field of the JSON output.\n */\n async runMcpPrompt(prompt: string): Promise<McpResponse> {\n const pythonExecutable = process.env.MCP_PYTHON_EXECUTABLE;\n const mcpClient = process.env.MCP_CLIENT;\n\n // TODO: We can return an error if the above env variables are not properly setup...\n if (!pythonExecutable || !mcpClient) {\n throw new BadRequestException(ERROR_MESSAGES.PYTHON_EXECUTABLE_NOT_CONFIGURED);\n }\n\n // Check if both paths are valid and accessible\n try {\n const [pyStat, clientStat] = await Promise.all([\n fs.stat(pythonExecutable),\n fs.stat(mcpClient),\n ]);\n\n if (!pyStat.isFile()) {\n throw new BadRequestException(`MCP_PYTHON_EXECUTABLE path is not a file: ${pythonExecutable}`);\n }\n\n if (!clientStat.isFile()) {\n throw new BadRequestException(`MCP_CLIENT path is not a file: ${mcpClient}`);\n }\n\n } catch (err: any) {\n throw new BadRequestException(`Invalid MCP executable or client path: ${err.message}`);\n }\n\n // TODO: Refactor to use the command.service.ts instead...\n return new Promise((resolve, reject) => {\n this.logger.log(`Attempting to run command:`)\n this.logger.log(`${pythonExecutable} ${mcpClient} \"${prompt}\"`);\n\n const python = spawn(pythonExecutable, [mcpClient, `\"${prompt}\"`]);\n\n let stdout = '';\n let stderr = '';\n\n python.stdout.on('data', (data) => {\n stdout += data.toString();\n });\n\n python.stderr.on('data', (data) => {\n stderr += data.toString();\n });\n\n python.on('close', (code) => {\n this.logger.log(`Python script exited with code ${code}`);\n\n if (code !== 0) {\n this.logger.error(`Python script exited with a non-zero exit code: ${stderr}`);\n return reject(new Error(`Python script exited with a non-zero exit code: ${stderr}`));\n }\n\n try {\n this.logger.log(`Python script exited with zero exit code: ${stdout}`);\n const raw: McpResponse = JSON.parse(stdout);\n\n // if (!raw.success) {\n // return reject(new Error(`MCP error: ${raw.errors?.join(', ')}`));\n // }\n // let cleaned = raw.response.trim();\n\n // Don't need to re-parse this...\n // const parsed = JSON.parse(cleaned);\n // resolve(cleaned);\n\n resolve(raw);\n } catch (err: any) {\n reject(new Error(`Mcp Invocation Failed: ${err.message}`));\n }\n });\n });\n }\n\n cleanResponse(response: string) {\n this.logger.log(`mcp server response is: ${response}`);\n\n // Remove markdown-style code block wrapper\n if (response.startsWith('```json')) {\n response = response.replace(/^```json/, '').trim();\n }\n if (response.endsWith('```')) {\n response = response.replace(/```$/, '').trim();\n }\n this.logger.log(`mcp server response after removing doc tags is: ${response}`);\n\n return response;\n }\n\n async applySolidAiInteraction(id: number) {\n // Fetch the aiInteraction\n const aiInteraction = await this.findOne(id, {\n populate: ['user']\n });\n if (!aiInteraction) {\n const m = `Unable to identified the aiInteraction entry that triggered this job... using id: ${id}`\n\n // TODO: RESPONSE SHAPE ALERT Check if we want to control the shape of the response....\n throw new Error(m);\n }\n\n // TODO: Validation: Check if JSON.parse(metadata).tools_invoked starts with solid_\n let metadata = {};\n try {\n metadata = JSON.parse(aiInteraction.metadata);\n }\n catch (e) {\n // TODO: RESPONSE SHAPE ALERT Check if we want to control the shape of the response....\n throw new Error(e);\n }\n\n const toolsInvoked = metadata['tools_invoked'];\n if (!toolsInvoked) {\n // TODO: RESPONSE SHAPE ALERT Check if we want to control the shape of the response....\n throw new Error(ERROR_MESSAGES.UNABLE_TO_RESOLVE_SOLID_COMMAND);\n }\n\n // TODO: OPTIMISATION for chained tool invocation, for now we are assuming only 1 tool was used.\n const toolInvoked = toolsInvoked[0];\n\n // TODO: use the toolInvoked to identify a service using some convention.\n // TODO: Eg. if toolInvoked is solid_create_module <> SolidCreateModuleMcpToolHandler ... create a factory class to do this mapping and identify the relevant provider. \n const mcpToolHandler = this.mcpToolResponseHandlerFactory.getInstance(toolInvoked);\n if (!mcpToolHandler) {\n // TODO: RESPONSE SHAPE ALERT Check if we want to control the shape of the response....\n throw new Error(ERROR_MESSAGES.UNABLE_TO_RESOLVE_MCP_HANDLER);\n }\n\n const handlerApplicationResponse = await mcpToolHandler.apply(aiInteraction);\n\n // TODO: This provider to implement an interface - IMcpToolResponseHandler ... apply(aiInteraction: AiInteraction)\n // throw new Error('Method not implemented.');\n\n // Mark the interaction as applied\n await this.update(aiInteraction.id, { isApplied: true }, [], true);\n\n return handlerApplicationResponse;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ai-interaction.service.js","sourceRoot":"","sources":["../../src/services/ai-interaction.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { BadRequestException, Logger, Injectable } from '@nestjs/common';\nimport { InjectEntityManager, InjectRepository } from '@nestjs/typeorm';\nimport { DiscoveryService, ModuleRef } from \"@nestjs/core\";\nimport { EntityManager, Repository } from 'typeorm';\n\nimport { CRUDService } from 'src/services/crud.service';\nimport { ModelMetadataService } from 'src/services/model-metadata.service';\nimport { ModuleMetadataService } from 'src/services/module-metadata.service';\nimport { ConfigService } from '@nestjs/config';\nimport { FileService } from 'src/services/file.service';\nimport { CrudHelperService } from 'src/services/crud-helper.service';\nimport { spawn } from 'child_process';\nimport { AiInteraction } from '../entities/ai-interaction.entity';\nimport * as fs from 'fs/promises';\nimport { McpResponse, TriggerMcpClientOptions } from 'src/interfaces';\nimport { PublisherFactory } from './queues/publisher-factory.service';\nimport { RequestContextService } from './request-context.service';\nimport { ActiveUserData } from 'src/interfaces/active-user-data.interface';\nimport { McpToolResponseHandlerFactory } from './mcp-tool-response-handlers/mcp-tool-response-handler-factory.service';\nimport { ERROR_MESSAGES } from 'src/constants/error-messages';\n\n@Injectable()\nexport class AiInteractionService extends CRUDService<AiInteraction> {\n private readonly logger = new Logger(AiInteractionService.name);\n\n constructor(\n readonly modelMetadataService: ModelMetadataService,\n readonly moduleMetadataService: ModuleMetadataService,\n readonly configService: ConfigService,\n readonly fileService: FileService,\n readonly discoveryService: DiscoveryService,\n readonly crudHelperService: CrudHelperService,\n @InjectEntityManager()\n readonly entityManager: EntityManager,\n @InjectRepository(AiInteraction, 'default')\n readonly repo: Repository<AiInteraction>,\n readonly moduleRef: ModuleRef,\n readonly publisherFactory: PublisherFactory<TriggerMcpClientOptions>,\n readonly requestContextService: RequestContextService,\n readonly mcpToolResponseHandlerFactory: McpToolResponseHandlerFactory,\n\n ) {\n super(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService, entityManager, repo, 'aiInteraction', 'solid-core', moduleRef);\n }\n\n async triggerMcpClientJob(prompt: string, isAutoApply: boolean = false, threadId: string = null): Promise<any> {\n const activeUser: ActiveUserData = this.requestContextService.getActiveUser();\n\n const aiInteraction = await this.create({\n userId: activeUser.sub,\n threadId: threadId ? threadId : `thread-${activeUser.sub}`,\n role: 'human',\n message: prompt,\n contentType: '',\n errorMessage: '',\n modelUsed: '',\n responseTimeMs: 0,\n metadata: '',\n isAutoApply: isAutoApply\n });\n const m = {\n payload: {\n aiInteractionId: aiInteraction.id,\n },\n parentEntity: 'aiInteraction',\n parentEntityId: aiInteraction.id,\n };\n\n const queueMessageId = await this.publisherFactory.publish(m, 'TriggerMcpClientPublisher');\n\n return {\n queueMessageId: queueMessageId,\n aiInteractionId: aiInteraction.id\n }\n }\n\n /**\n * Runs the Python MCP client with a prompt and returns the parsed JSON embedded in the 'response'.\n * @param prompt - The question or instruction to send to the MCP client.\n * @returns The parsed object inside the 'response' field of the JSON output.\n */\n async runMcpPrompt(prompt: string): Promise<McpResponse> {\n const pythonExecutable = process.env.MCP_PYTHON_EXECUTABLE;\n const mcpClient = process.env.MCP_CLIENT;\n\n // TODO: We can return an error if the above env variables are not properly setup...\n if (!pythonExecutable || !mcpClient) {\n throw new BadRequestException(ERROR_MESSAGES.PYTHON_EXECUTABLE_NOT_CONFIGURED);\n }\n\n // Check if both paths are valid and accessible\n try {\n const [pyStat, clientStat] = await Promise.all([\n fs.stat(pythonExecutable),\n fs.stat(mcpClient),\n ]);\n\n if (!pyStat.isFile()) {\n throw new BadRequestException(`MCP_PYTHON_EXECUTABLE path is not a file: ${pythonExecutable}`);\n }\n\n if (!clientStat.isFile()) {\n throw new BadRequestException(`MCP_CLIENT path is not a file: ${mcpClient}`);\n }\n\n } catch (err: any) {\n throw new BadRequestException(`Invalid MCP executable or client path: ${err.message}`);\n }\n\n // TODO: Refactor to use the command.service.ts instead...\n return new Promise((resolve, reject) => {\n this.logger.log(`Attempting to run command:`)\n this.logger.log(`${pythonExecutable} ${mcpClient} \"${prompt}\"`);\n\n const python = spawn(pythonExecutable, [mcpClient, `\"${prompt}\"`]);\n\n let stdout = '';\n let stderr = '';\n\n python.stdout.on('data', (data) => {\n stdout += data.toString();\n });\n\n python.stderr.on('data', (data) => {\n stderr += data.toString();\n });\n\n python.on('close', (code) => {\n this.logger.log(`Python script exited with code ${code}`);\n\n if (code !== 0) {\n this.logger.error(`Python script exited with a non-zero exit code: ${stderr}`);\n return reject(new Error(`Python script exited with a non-zero exit code: ${stderr}`));\n }\n\n try {\n this.logger.log(`Python script exited with zero exit code: ${stdout}`);\n const raw: McpResponse = JSON.parse(stdout);\n\n // if (!raw.success) {\n // return reject(new Error(`MCP error: ${raw.errors?.join(', ')}`));\n // }\n // let cleaned = raw.response.trim();\n\n // Don't need to re-parse this...\n // const parsed = JSON.parse(cleaned);\n // resolve(cleaned);\n\n resolve(raw);\n } catch (err: any) {\n reject(new Error(`Mcp Invocation Failed: ${err.message}`));\n }\n });\n });\n }\n\n cleanResponse(response: string) {\n this.logger.log(`mcp server response is: ${response}`);\n\n // Remove markdown-style code block wrapper\n if (response.startsWith('```json')) {\n response = response.replace(/^```json/, '').trim();\n }\n if (response.endsWith('```')) {\n response = response.replace(/```$/, '').trim();\n }\n this.logger.log(`mcp server response after removing doc tags is: ${response}`);\n\n return response;\n }\n\n async applySolidAiInteraction(id: number) {\n // Fetch the aiInteraction\n const aiInteraction = await this.findOne(id, {\n populate: ['user']\n });\n if (!aiInteraction) {\n const m = `Unable to identified the aiInteraction entry that triggered this job... using id: ${id}`\n\n // TODO: RESPONSE SHAPE ALERT Check if we want to control the shape of the response....\n throw new Error(m);\n }\n\n // TODO: Validation: Check if JSON.parse(metadata).tools_invoked starts with solid_\n let metadata = {};\n try {\n metadata = JSON.parse(aiInteraction.metadata);\n }\n catch (e) {\n // TODO: RESPONSE SHAPE ALERT Check if we want to control the shape of the response....\n throw new Error(e);\n }\n\n const toolsInvoked = metadata['tools_invoked'];\n if (!toolsInvoked) {\n // TODO: RESPONSE SHAPE ALERT Check if we want to control the shape of the response....\n throw new Error(ERROR_MESSAGES.UNABLE_TO_RESOLVE_SOLID_COMMAND);\n }\n\n // TODO: OPTIMISATION for chained tool invocation, for now we are assuming only 1 tool was used.\n const toolInvoked = toolsInvoked[0];\n\n // TODO: use the toolInvoked to identify a service using some convention.\n // TODO: Eg. if toolInvoked is solid_create_module <> SolidCreateModuleMcpToolHandler ... create a factory class to do this mapping and identify the relevant provider. \n const mcpToolHandler = this.mcpToolResponseHandlerFactory.getInstance(toolInvoked);\n if (!mcpToolHandler) {\n // TODO: RESPONSE SHAPE ALERT Check if we want to control the shape of the response....\n throw new Error(ERROR_MESSAGES.UNABLE_TO_RESOLVE_MCP_HANDLER);\n }\n\n const handlerApplicationResponse = await mcpToolHandler.apply(aiInteraction);\n\n // TODO: This provider to implement an interface - IMcpToolResponseHandler ... apply(aiInteraction: AiInteraction)\n // throw new Error('Method not implemented.');\n\n // Mark the interaction as applied\n await this.update(aiInteraction.id, { isApplied: true }, [], true);\n\n return handlerApplicationResponse;\n }\n}\n"]}
|
package/dist/services/computed-fields/entity/concat-entity-computed-field-provider.service.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"concat-entity-computed-field-provider.service.d.ts","sourceRoot":"","sources":["../../../../src/services/computed-fields/entity/concat-entity-computed-field-provider.service.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,8BAA8B,EAAE,MAAM,gBAAgB,CAAC;AAGhE,MAAM,WAAW,0BAA0B;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,qBAEa,iCAAiC,CAAC,CAAC,SAAS,YAAY,CAAE,YAAW,8BAA8B,CAAC,CAAC,EAAE,0BAA0B,CAAC;IAE3I,IAAI,IAAI,MAAM;IAId,IAAI,IAAI,MAAM;IAIR,eAAe,CAAC,aAAa,EAAE,CAAC,EAAE,qBAAqB,EAAE,qBAAqB,CAAC,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"concat-entity-computed-field-provider.service.d.ts","sourceRoot":"","sources":["../../../../src/services/computed-fields/entity/concat-entity-computed-field-provider.service.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,8BAA8B,EAAE,MAAM,gBAAgB,CAAC;AAGhE,MAAM,WAAW,0BAA0B;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,qBAEa,iCAAiC,CAAC,CAAC,SAAS,YAAY,CAAE,YAAW,8BAA8B,CAAC,CAAC,EAAE,0BAA0B,CAAC;IAE3I,IAAI,IAAI,MAAM;IAId,IAAI,IAAI,MAAM;IAIR,eAAe,CAAC,aAAa,EAAE,CAAC,EAAE,qBAAqB,EAAE,qBAAqB,CAAC,0BAA0B,CAAC;CAkCnH"}
|
package/dist/services/computed-fields/entity/concat-entity-computed-field-provider.service.js
CHANGED
|
@@ -19,21 +19,25 @@ let ConcatEntityComputedFieldProvider = class ConcatEntityComputedFieldProvider
|
|
|
19
19
|
}
|
|
20
20
|
async preComputeValue(triggerEntity, computedFieldMetadata) {
|
|
21
21
|
const { computedFieldValueProviderCtxt } = computedFieldMetadata;
|
|
22
|
-
const separator = computedFieldValueProviderCtxt.separator
|
|
23
|
-
const fields = computedFieldValueProviderCtxt.fields
|
|
24
|
-
const slugify = computedFieldValueProviderCtxt.slugify
|
|
25
|
-
|
|
26
|
-
for (
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
22
|
+
const separator = computedFieldValueProviderCtxt.separator ?? ' ';
|
|
23
|
+
const fields = computedFieldValueProviderCtxt.fields ?? [];
|
|
24
|
+
const slugify = computedFieldValueProviderCtxt.slugify ?? false;
|
|
25
|
+
const parts = [];
|
|
26
|
+
for (const fieldExpr of fields) {
|
|
27
|
+
let val = (0, lodash_1.get)(triggerEntity, fieldExpr);
|
|
28
|
+
if (val == null)
|
|
29
|
+
continue;
|
|
30
|
+
if (typeof val !== 'string') {
|
|
31
|
+
val = String(val);
|
|
31
32
|
}
|
|
32
|
-
if (
|
|
33
|
-
|
|
33
|
+
if (slugify) {
|
|
34
|
+
val = (0, lodash_1.kebabCase)(val);
|
|
35
|
+
}
|
|
36
|
+
if (val.length > 0) {
|
|
37
|
+
parts.push(val);
|
|
34
38
|
}
|
|
35
|
-
concatenatedString += fieldVal;
|
|
36
39
|
}
|
|
40
|
+
const concatenatedString = parts.join(separator);
|
|
37
41
|
triggerEntity[computedFieldMetadata.fieldName] = concatenatedString;
|
|
38
42
|
}
|
|
39
43
|
};
|
package/dist/services/computed-fields/entity/concat-entity-computed-field-provider.service.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"concat-entity-computed-field-provider.service.js","sourceRoot":"","sources":["../../../../src/services/computed-fields/entity/concat-entity-computed-field-provider.service.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA4C;AAC5C,
|
|
1
|
+
{"version":3,"file":"concat-entity-computed-field-provider.service.js","sourceRoot":"","sources":["../../../../src/services/computed-fields/entity/concat-entity-computed-field-provider.service.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA4C;AAC5C,mCAAwC;AACxC,6GAAyF;AAclF,IAAM,iCAAiC,GAAvC,MAAM,iCAAiC;IAE1C,IAAI;QACA,OAAO,mCAAmC,CAAC;IAC/C,CAAC;IAED,IAAI;QACA,OAAO,iHAAiH,CAAC;IAC7H,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,aAAgB,EAAE,qBAAwE;QAC5G,MAAM,EAAE,8BAA8B,EAAE,GAAG,qBAAqB,CAAC;QACjE,MAAM,SAAS,GAAG,8BAA8B,CAAC,SAAS,IAAI,GAAG,CAAC;QAClE,MAAM,MAAM,GAAa,8BAA8B,CAAC,MAAM,IAAI,EAAE,CAAC;QACrE,MAAM,OAAO,GAAG,8BAA8B,CAAC,OAAO,IAAI,KAAK,CAAC;QAEhE,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,KAAK,MAAM,SAAS,IAAI,MAAM,EAAE,CAAC;YAC7B,IAAI,GAAG,GAAG,IAAA,YAAG,EAAC,aAAoB,EAAE,SAAS,CAAC,CAAC;YAG/C,IAAI,GAAG,IAAI,IAAI;gBAAE,SAAS;YAE1B,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;gBAC1B,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YACtB,CAAC;YAED,IAAI,OAAO,EAAE,CAAC;gBACV,GAAG,GAAG,IAAA,kBAAS,EAAC,GAAG,CAAC,CAAC;YACzB,CAAC;YAGD,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACjB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACpB,CAAC;QACL,CAAC;QAED,MAAM,kBAAkB,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAGhD,aAAqB,CAAC,qBAAqB,CAAC,SAAS,CAAC,GAAG,kBAAkB,CAAC;IACjF,CAAC;CAEJ,CAAA;AA5CY,8EAAiC;4CAAjC,iCAAiC;IAF7C,IAAA,yDAAqB,GAAE;IACvB,IAAA,mBAAU,GAAE;GACA,iCAAiC,CA4C7C","sourcesContent":["import { Injectable } from \"@nestjs/common\";\nimport { kebabCase, get } from \"lodash\";\nimport { ComputedFieldProvider } from \"src/decorators/computed-field-provider.decorator\";\nimport { CommonEntity } from \"src/entities/common.entity\";\nimport { ComputedFieldMetadata } from \"src/helpers/solid-registry\";\nimport { IEntityPreComputeFieldProvider } from \"src/interfaces\";\n\n\nexport interface ConcatComputedFieldContext {\n separator: string; // The separator to use between concatenated values\n fields: string[]; // The fields to concatenate\n slugify?: boolean; // Optional: if true, slugify each field value before concatenation\n}\n\n@ComputedFieldProvider()\n@Injectable()\nexport class ConcatEntityComputedFieldProvider<T extends CommonEntity> implements IEntityPreComputeFieldProvider<T, ConcatComputedFieldContext> {\n\n name(): string {\n return \"ConcatEntityComputedFieldProvider\";\n }\n\n help(): string {\n return \"Computed field provider used to create fields whose value is a concatenation of other fields in the same model.\";\n }\n\n async preComputeValue(triggerEntity: T, computedFieldMetadata: ComputedFieldMetadata<ConcatComputedFieldContext>) {\n const { computedFieldValueProviderCtxt } = computedFieldMetadata;\n const separator = computedFieldValueProviderCtxt.separator ?? ' ';\n const fields: string[] = computedFieldValueProviderCtxt.fields ?? [];\n const slugify = computedFieldValueProviderCtxt.slugify ?? false;\n\n const parts: string[] = [];\n\n for (const fieldExpr of fields) {\n let val = get(triggerEntity as any, fieldExpr);\n\n // normalize to string (skip null/undefined)\n if (val == null) continue;\n\n if (typeof val !== 'string') {\n val = String(val);\n }\n\n if (slugify) {\n val = kebabCase(val);\n }\n\n // ignore empty strings so you don't get stray separators\n if (val.length > 0) {\n parts.push(val);\n }\n }\n\n const concatenatedString = parts.join(separator);\n\n // set the computed field on the entity\n (triggerEntity as any)[computedFieldMetadata.fieldName] = concatenatedString;\n }\n\n}"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media.service.d.ts","sourceRoot":"","sources":["../../src/services/media.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE3D,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEpD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAI7E,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,4BAA4B,EAAE,MAAM,qDAAqD,CAAC;AACnG,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAEnE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAI5D,qBACa,YAAa,SAAQ,WAAW,CAAC,KAAK,CAAC;IAEhD,QAAQ,CAAC,oBAAoB,EAAE,oBAAoB;IACnD,QAAQ,CAAC,qBAAqB,EAAE,qBAAqB;IACrD,QAAQ,CAAC,aAAa,EAAE,aAAa;IACrC,QAAQ,CAAC,WAAW,EAAE,WAAW;IACjC,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB;IAC3C,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB;IAE7C,QAAQ,CAAC,aAAa,EAAE,aAAa;IAErC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC;IAEhC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAElC,OAAO,CAAC,QAAQ,CAAC,gCAAgC;IAEjD,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,QAAQ,CAAC,SAAS,EAAE,SAAS;gBAhBpB,oBAAoB,EAAE,oBAAoB,EAC1C,qBAAqB,EAAE,qBAAqB,EAC5C,aAAa,EAAE,aAAa,EAC5B,WAAW,EAAE,WAAW,EACxB,gBAAgB,EAAE,gBAAgB,EAClC,iBAAiB,EAAE,iBAAiB,EAEpC,aAAa,EAAE,aAAa,EAE5B,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,EAEf,iBAAiB,EAAE,UAAU,CAAC,aAAa,CAAC,EAE5C,gCAAgC,EAAE,UAAU,CAAC,4BAA4B,CAAC,EAE1E,iBAAiB,EAAE,UAAU,CAAC,aAAa,CAAC,EACpD,SAAS,EAAE,SAAS;IAKzB,IAAI,CAAC,cAAc,EAAE,cAAc,EAAE,mBAAmB,GAAE,GAAQ;;;;;;;;;;;;;;;;;;;;IA8BlE,MAAM,CAAC,SAAS,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"media.service.d.ts","sourceRoot":"","sources":["../../src/services/media.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE3D,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEpD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAI7E,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,4BAA4B,EAAE,MAAM,qDAAqD,CAAC;AACnG,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAEnE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAI5D,qBACa,YAAa,SAAQ,WAAW,CAAC,KAAK,CAAC;IAEhD,QAAQ,CAAC,oBAAoB,EAAE,oBAAoB;IACnD,QAAQ,CAAC,qBAAqB,EAAE,qBAAqB;IACrD,QAAQ,CAAC,aAAa,EAAE,aAAa;IACrC,QAAQ,CAAC,WAAW,EAAE,WAAW;IACjC,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB;IAC3C,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB;IAE7C,QAAQ,CAAC,aAAa,EAAE,aAAa;IAErC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC;IAEhC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAElC,OAAO,CAAC,QAAQ,CAAC,gCAAgC;IAEjD,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,QAAQ,CAAC,SAAS,EAAE,SAAS;gBAhBpB,oBAAoB,EAAE,oBAAoB,EAC1C,qBAAqB,EAAE,qBAAqB,EAC5C,aAAa,EAAE,aAAa,EAC5B,WAAW,EAAE,WAAW,EACxB,gBAAgB,EAAE,gBAAgB,EAClC,iBAAiB,EAAE,iBAAiB,EAEpC,aAAa,EAAE,aAAa,EAE5B,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,EAEf,iBAAiB,EAAE,UAAU,CAAC,aAAa,CAAC,EAE5C,gCAAgC,EAAE,UAAU,CAAC,4BAA4B,CAAC,EAE1E,iBAAiB,EAAE,UAAU,CAAC,aAAa,CAAC,EACpD,SAAS,EAAE,SAAS;IAKzB,IAAI,CAAC,cAAc,EAAE,cAAc,EAAE,mBAAmB,GAAE,GAAQ;;;;;;;;;;;;;;;;;;;;IA8BlE,MAAM,CAAC,SAAS,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;IAwDxD,MAAM,CAAC,EAAE,EAAE,MAAM;IAiCvB,OAAO,CAAC,0BAA0B;IAKlC,OAAO,CAAC,oBAAoB;IAK5B,OAAO,CAAC,WAAW;CAIpB"}
|
|
@@ -104,10 +104,10 @@ let MediaService = class MediaService extends crud_service_1.CRUDService {
|
|
|
104
104
|
const fileName = this.getFileName(file);
|
|
105
105
|
let awsFileUrl;
|
|
106
106
|
if (createDto.mediaStorageProviderMetadata.isPublic === true) {
|
|
107
|
-
awsFileUrl = await this.fileService.
|
|
107
|
+
awsFileUrl = await this.fileService.copyToS3WithPublic(file.path, file.mimetype, fileName, createDto.mediaStorageProviderMetadata.bucketName);
|
|
108
108
|
}
|
|
109
109
|
else {
|
|
110
|
-
awsFileUrl = await this.fileService.
|
|
110
|
+
awsFileUrl = await this.fileService.copyToS3(file.path, file.mimetype, fileName, createDto.mediaStorageProviderMetadata.bucketName);
|
|
111
111
|
}
|
|
112
112
|
createDto['relativeUri'] = awsFileUrl;
|
|
113
113
|
break;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media.service.js","sourceRoot":"","sources":["../../src/services/media.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable, NotFoundException } from '@nestjs/common';\nimport { DiscoveryService, ModuleRef } from \"@nestjs/core\";\nimport { InjectEntityManager, InjectRepository } from '@nestjs/typeorm';\nimport { EntityManager, Repository } from 'typeorm';\n\nimport { ConfigService } from '@nestjs/config';\nimport { CrudHelperService } from 'src/services/crud-helper.service';\nimport { CRUDService } from 'src/services/crud.service';\nimport { FileService } from 'src/services/file.service';\nimport { ModelMetadataService } from 'src/services/model-metadata.service';\nimport { ModuleMetadataService } from 'src/services/module-metadata.service';\n\n\nimport { MediaStorageProviderType } from 'src/dtos/create-media-storage-provider-metadata.dto';\nimport { FieldMetadata } from 'src/entities/field-metadata.entity';\nimport { MediaStorageProviderMetadata } from 'src/entities/media-storage-provider-metadata.entity';\nimport { Media } from 'src/entities/media.entity';\nimport { ModelMetadata } from 'src/entities/model-metadata.entity';\nimport { getMediaStorageProvider } from \"./mediaStorageProviders\";\nimport { BasicFilterDto } from 'src/dtos/basic-filters.dto';\nimport { ERROR_MESSAGES } from 'src/constants/error-messages';\n\n\n@Injectable()\nexport class MediaService extends CRUDService<Media> {\n constructor(\n readonly modelMetadataService: ModelMetadataService,\n readonly moduleMetadataService: ModuleMetadataService,\n readonly configService: ConfigService,\n readonly fileService: FileService,\n readonly discoveryService: DiscoveryService,\n readonly crudHelperService: CrudHelperService,\n @InjectEntityManager()\n readonly entityManager: EntityManager,\n @InjectRepository(Media, 'default')\n readonly repo: Repository<Media>,\n @InjectRepository(ModelMetadata)\n private readonly modelMetadataRepo: Repository<ModelMetadata>,\n @InjectRepository(MediaStorageProviderMetadata)\n private readonly mediaStorageProviderMetadataRepo: Repository<MediaStorageProviderMetadata>,\n @InjectRepository(FieldMetadata)\n private readonly fieldMetadataRepo: Repository<FieldMetadata>,\n readonly moduleRef: ModuleRef,\n ) {\n super(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService, entityManager, repo, 'media', 'solid-core', moduleRef);\n }\n\n async find(basicFilterDto: BasicFilterDto, solidRequestContext: any = {}) {\n const data = await super.find(basicFilterDto, solidRequestContext);\n if (data.records) {\n data.records.forEach((media: Media) => {\n if (media.mediaStorageProviderMetadata?.type === MediaStorageProviderType.Filesystem) {\n media.relativeUri = `${process.env.BASE_URL}/${this.getFileSysytemFullFilePath(media.relativeUri)}`;\n } else if (media.mediaStorageProviderMetadata?.type === MediaStorageProviderType.AwsS3) {\n media.relativeUri = this.getAwsS3FullFilePath(\n media.relativeUri,\n media.mediaStorageProviderMetadata.bucketName,\n media.mediaStorageProviderMetadata.region\n );\n }\n });\n }\n if (data.groupRecords) {\n data.groupRecords.forEach((group) => {\n group.groupData.records.forEach((media) => {\n if (media.mediaStorageProviderMetadata?.type === MediaStorageProviderType.Filesystem) {\n media.relativeUri = `${process.env.BASE_URL}/${this.getFileSysytemFullFilePath(media.relativeUri)}`;\n }\n else if (media.mediaStorageProviderMetadata?.type === MediaStorageProviderType.AwsS3) {\n media.relativeUri = this.getAwsS3FullFilePath(media.relativeUri, media.mediaStorageProviderMetadata.bucketName, media.mediaStorageProviderMetadata.region);\n }\n });\n });\n }\n return data\n }\n\n async upload(createDto: any, files: Array<Express.Multer.File>) {\n\n if (!files) {\n throw new NotFoundException(ERROR_MESSAGES.FILE_NOT_FOUND);\n\n }\n const savedMedias = [];\n for (let i = 0; i < files.length; i++) {\n\n\n createDto['fieldMetadata'] = await this.fieldMetadataRepo.findOne({\n where: {\n id: createDto['fieldMetadataId']\n },\n });\n createDto['modelMetadata'] = await this.modelMetadataRepo.findOne({\n where: {\n id: createDto['modelMetadataId']\n },\n });\n createDto['mediaStorageProviderMetadata'] = await this.mediaStorageProviderMetadataRepo.findOne({\n where: {\n id: createDto['mediaStorageProviderMetadataId']\n },\n });\n\n const file = files[i];\n\n switch (createDto.mediaStorageProviderMetadata.type) {\n case MediaStorageProviderType.Filesystem:\n const fileStoragePath = this.getFileSysytemFullFilePath(this.getFileName(file));\n await this.fileService.copyFile(file.path, fileStoragePath);\n createDto['relativeUri'] = this.getFileName(file);\n break;\n case MediaStorageProviderType.AwsS3:\n const fileName = this.getFileName(file);\n let awsFileUrl;\n if (createDto.mediaStorageProviderMetadata.isPublic === true) {\n awsFileUrl = await this.fileService.copyToS3(file.path, file.mimetype, fileName, createDto.mediaStorageProviderMetadata.bucketName,);\n } else {\n awsFileUrl = await this.fileService.copyToS3WithPublic(file.path, file.mimetype, fileName, createDto.mediaStorageProviderMetadata.bucketName,);\n }\n // createDto['relativeUri'] = this.getAwsS3FullFilePath(awsFileUrl, createDto.mediaStorageProviderMetadata.bucketName, createDto.mediaStorageProviderMetadata.region);\n createDto['relativeUri'] = awsFileUrl\n break;\n default:\n break;\n }\n await this.fileService.deleteFile(file.path);\n\n const media = this.repo.create(createDto);\n const savedMedia = await this.repo.save(media);\n savedMedias.push(savedMedia)\n }\n return savedMedias\n }\n\n async remove(id: number) {\n // const lov = await this.findOne(id);\n const media = await this.repo.findOne({\n where: {\n id: id,\n },\n relations: ['mediaStorageProviderMetadata', 'fieldMetadata', 'fieldMetadata.model', 'fieldMetadata.mediaStorageProvider'],\n });\n const modelEntity = await this.modelMetadataRepo.findOne({\n where: {\n id: media.entityId,\n }\n }\n );\n // if (media.mediaStorageProviderMetadata.type === 'filesystem') {\n // const fileStorageProvider = new FileStorageProvider(this.configService, this.fileService, this);\n\n // await fileStorageProvider.delete(media, media.fieldMetadata);\n\n // } else if (media.mediaStorageProviderMetadata.type === 'aws-s3') {\n // const fileStorageProvider = new FileS3StorageProvider(this.configService, this.fileService, this);\n // await fileStorageProvider.delete(media, media.fieldMetadata);\n\n // } else {\n // }\n const storageProviderType = media.mediaStorageProviderMetadata.type as MediaStorageProviderType;\n const storageProvider = await getMediaStorageProvider(this.moduleRef, storageProviderType);\n await storageProvider.delete(modelEntity, media.fieldMetadata);\n\n return this.repo.remove(media);\n }\n //TODO: Move this to a app builder config\n\n private getFileSysytemFullFilePath(fileName: string): string {\n return `${this.configService.get('app-builder.fileStorageDir')}/${fileName}`;\n }\n\n\n private getAwsS3FullFilePath(awsMediaurl: string, bucketName: string, regionName: string): string {\n // https://lunarismedia.s3.ap-south-1.amazonaws.com/LUNARIS_CP_REGISTRATION_CREATIVE.jpg\n return `https://${bucketName}.s3.${regionName}.amazonaws.com/${awsMediaurl}`;\n }\n\n private getFileName(file: Express.Multer.File): string {\n return `${file.filename}-${file.originalname}`;\n }\n\n}\n"]}
|
|
1
|
+
{"version":3,"file":"media.service.js","sourceRoot":"","sources":["../../src/services/media.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable, NotFoundException } from '@nestjs/common';\nimport { DiscoveryService, ModuleRef } from \"@nestjs/core\";\nimport { InjectEntityManager, InjectRepository } from '@nestjs/typeorm';\nimport { EntityManager, Repository } from 'typeorm';\n\nimport { ConfigService } from '@nestjs/config';\nimport { CrudHelperService } from 'src/services/crud-helper.service';\nimport { CRUDService } from 'src/services/crud.service';\nimport { FileService } from 'src/services/file.service';\nimport { ModelMetadataService } from 'src/services/model-metadata.service';\nimport { ModuleMetadataService } from 'src/services/module-metadata.service';\n\n\nimport { MediaStorageProviderType } from 'src/dtos/create-media-storage-provider-metadata.dto';\nimport { FieldMetadata } from 'src/entities/field-metadata.entity';\nimport { MediaStorageProviderMetadata } from 'src/entities/media-storage-provider-metadata.entity';\nimport { Media } from 'src/entities/media.entity';\nimport { ModelMetadata } from 'src/entities/model-metadata.entity';\nimport { getMediaStorageProvider } from \"./mediaStorageProviders\";\nimport { BasicFilterDto } from 'src/dtos/basic-filters.dto';\nimport { ERROR_MESSAGES } from 'src/constants/error-messages';\n\n\n@Injectable()\nexport class MediaService extends CRUDService<Media> {\n constructor(\n readonly modelMetadataService: ModelMetadataService,\n readonly moduleMetadataService: ModuleMetadataService,\n readonly configService: ConfigService,\n readonly fileService: FileService,\n readonly discoveryService: DiscoveryService,\n readonly crudHelperService: CrudHelperService,\n @InjectEntityManager()\n readonly entityManager: EntityManager,\n @InjectRepository(Media, 'default')\n readonly repo: Repository<Media>,\n @InjectRepository(ModelMetadata)\n private readonly modelMetadataRepo: Repository<ModelMetadata>,\n @InjectRepository(MediaStorageProviderMetadata)\n private readonly mediaStorageProviderMetadataRepo: Repository<MediaStorageProviderMetadata>,\n @InjectRepository(FieldMetadata)\n private readonly fieldMetadataRepo: Repository<FieldMetadata>,\n readonly moduleRef: ModuleRef,\n ) {\n super(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService, entityManager, repo, 'media', 'solid-core', moduleRef);\n }\n\n async find(basicFilterDto: BasicFilterDto, solidRequestContext: any = {}) {\n const data = await super.find(basicFilterDto, solidRequestContext);\n if (data.records) {\n data.records.forEach((media: Media) => {\n if (media.mediaStorageProviderMetadata?.type === MediaStorageProviderType.Filesystem) {\n media.relativeUri = `${process.env.BASE_URL}/${this.getFileSysytemFullFilePath(media.relativeUri)}`;\n } else if (media.mediaStorageProviderMetadata?.type === MediaStorageProviderType.AwsS3) {\n media.relativeUri = this.getAwsS3FullFilePath(\n media.relativeUri,\n media.mediaStorageProviderMetadata.bucketName,\n media.mediaStorageProviderMetadata.region\n );\n }\n });\n }\n if (data.groupRecords) {\n data.groupRecords.forEach((group) => {\n group.groupData.records.forEach((media) => {\n if (media.mediaStorageProviderMetadata?.type === MediaStorageProviderType.Filesystem) {\n media.relativeUri = `${process.env.BASE_URL}/${this.getFileSysytemFullFilePath(media.relativeUri)}`;\n }\n else if (media.mediaStorageProviderMetadata?.type === MediaStorageProviderType.AwsS3) {\n media.relativeUri = this.getAwsS3FullFilePath(media.relativeUri, media.mediaStorageProviderMetadata.bucketName, media.mediaStorageProviderMetadata.region);\n }\n });\n });\n }\n return data\n }\n\n async upload(createDto: any, files: Array<Express.Multer.File>) {\n\n if (!files) {\n throw new NotFoundException(ERROR_MESSAGES.FILE_NOT_FOUND);\n\n }\n const savedMedias = [];\n for (let i = 0; i < files.length; i++) {\n\n createDto['fieldMetadata'] = await this.fieldMetadataRepo.findOne({\n where: {\n id: createDto['fieldMetadataId']\n },\n });\n createDto['modelMetadata'] = await this.modelMetadataRepo.findOne({\n where: {\n id: createDto['modelMetadataId']\n },\n });\n createDto['mediaStorageProviderMetadata'] = await this.mediaStorageProviderMetadataRepo.findOne({\n where: {\n id: createDto['mediaStorageProviderMetadataId']\n },\n });\n\n const file = files[i];\n\n switch (createDto.mediaStorageProviderMetadata.type) {\n case MediaStorageProviderType.Filesystem:\n const fileStoragePath = this.getFileSysytemFullFilePath(this.getFileName(file));\n await this.fileService.copyFile(file.path, fileStoragePath);\n createDto['relativeUri'] = this.getFileName(file);\n break;\n case MediaStorageProviderType.AwsS3:\n const fileName = this.getFileName(file);\n let awsFileUrl;\n if (createDto.mediaStorageProviderMetadata.isPublic === true) {\n awsFileUrl = await this.fileService.copyToS3WithPublic(file.path, file.mimetype, fileName, createDto.mediaStorageProviderMetadata.bucketName,);\n } else {\n awsFileUrl = await this.fileService.copyToS3(file.path, file.mimetype, fileName, createDto.mediaStorageProviderMetadata.bucketName,);\n }\n // createDto['relativeUri'] = this.getAwsS3FullFilePath(awsFileUrl, createDto.mediaStorageProviderMetadata.bucketName, createDto.mediaStorageProviderMetadata.region);\n createDto['relativeUri'] = awsFileUrl\n break;\n default:\n break;\n }\n await this.fileService.deleteFile(file.path);\n\n const media = this.repo.create(createDto);\n const savedMedia = await this.repo.save(media);\n savedMedias.push(savedMedia)\n }\n return savedMedias\n }\n\n async remove(id: number) {\n // const lov = await this.findOne(id);\n const media = await this.repo.findOne({\n where: {\n id: id,\n },\n relations: ['mediaStorageProviderMetadata', 'fieldMetadata', 'fieldMetadata.model', 'fieldMetadata.mediaStorageProvider'],\n });\n const modelEntity = await this.modelMetadataRepo.findOne({\n where: {\n id: media.entityId,\n }\n }\n );\n // if (media.mediaStorageProviderMetadata.type === 'filesystem') {\n // const fileStorageProvider = new FileStorageProvider(this.configService, this.fileService, this);\n\n // await fileStorageProvider.delete(media, media.fieldMetadata);\n\n // } else if (media.mediaStorageProviderMetadata.type === 'aws-s3') {\n // const fileStorageProvider = new FileS3StorageProvider(this.configService, this.fileService, this);\n // await fileStorageProvider.delete(media, media.fieldMetadata);\n\n // } else {\n // }\n const storageProviderType = media.mediaStorageProviderMetadata.type as MediaStorageProviderType;\n const storageProvider = await getMediaStorageProvider(this.moduleRef, storageProviderType);\n await storageProvider.delete(modelEntity, media.fieldMetadata);\n\n return this.repo.remove(media);\n }\n //TODO: Move this to a app builder config\n\n private getFileSysytemFullFilePath(fileName: string): string {\n return `${this.configService.get('app-builder.fileStorageDir')}/${fileName}`;\n }\n\n\n private getAwsS3FullFilePath(awsMediaurl: string, bucketName: string, regionName: string): string {\n // https://lunarismedia.s3.ap-south-1.amazonaws.com/LUNARIS_CP_REGISTRATION_CREATIVE.jpg\n return `https://${bucketName}.s3.${regionName}.amazonaws.com/${awsMediaurl}`;\n }\n\n private getFileName(file: Express.Multer.File): string {\n return `${file.filename}-${file.originalname}`;\n }\n\n}\n"]}
|
|
@@ -56,7 +56,7 @@ let FileS3StorageProvider = FileS3StorageProvider_1 = class FileS3StorageProvide
|
|
|
56
56
|
throw new Error("Entity must be an instance of CommonEntity");
|
|
57
57
|
}
|
|
58
58
|
const result = [];
|
|
59
|
-
|
|
59
|
+
for (const file of files) {
|
|
60
60
|
const fileName = this.getFileName(file);
|
|
61
61
|
let awsFileUrl;
|
|
62
62
|
if (mediaFieldMetadata.mediaStorageProvider.isPublic === true) {
|
|
@@ -78,7 +78,8 @@ let FileS3StorageProvider = FileS3StorageProvider_1 = class FileS3StorageProvide
|
|
|
78
78
|
});
|
|
79
79
|
result.push(mediaEntity);
|
|
80
80
|
this.logger.debug(`Stored media with`, mediaEntity);
|
|
81
|
-
}
|
|
81
|
+
}
|
|
82
|
+
;
|
|
82
83
|
return result;
|
|
83
84
|
}
|
|
84
85
|
async delete(entity, mediaFieldMetadata) {
|