@solidstarters/solid-core 1.2.68 → 1.2.70

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@solidstarters/solid-core",
3
- "version": "1.2.68",
3
+ "version": "1.2.70",
4
4
  "description": "This module is a NestJS module containing all the required core providers required by a Solid application",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -34,8 +34,7 @@ import { FileService } from "./file.service";
34
34
  import { getMediaStorageProvider } from "./mediaStorageProviders";
35
35
  import { ModelMetadataService } from "./model-metadata.service";
36
36
  import { ModuleMetadataService } from "./module-metadata.service";
37
- const DEFAULT_LIMIT = 10;
38
- const DEFAULT_OFFSET = 0;
37
+ import { isArray } from "class-validator";
39
38
  export class CRUDService<T> { // Add two generic value i.e Person,CreatePersonDto, so we get the proper types in our service
40
39
 
41
40
  constructor(
@@ -497,16 +496,15 @@ export class CRUDService<T> { // Add two generic value i.e Person,CreatePersonDt
497
496
 
498
497
  // Will iterate through every entity & all populateMedia & call getMediaDetails for each field
499
498
  for (const entity of entities) {
500
- const mediaObj: Record<string, any> = {};
501
499
  for (const mediaFieldPath of populateMedia) {
502
- mediaObj[mediaFieldPath] = await this.getMediaObject(mediaFieldPath, model, entity);
500
+ await this.populateMediaObject(mediaFieldPath, model, entity);
503
501
  }
504
- entity['_media'] = mediaObj;
505
502
  }
506
503
  return entities;
507
504
  }
508
505
 
509
- private async getMediaObject(mediaFieldPath: string, model: ModelMetadata, entity: T) {
506
+ // Adds the media with full URL to the entity / nested entity
507
+ private async populateMediaObject(mediaFieldPath: string, model: ModelMetadata, entity: T) {
510
508
  if (mediaFieldPath.includes('.')) { // mediaFieldPath is a nested field
511
509
  const pathParts = mediaFieldPath.split('.');
512
510
  const mediaFieldMetadata = await this.getFieldMetadataRecursively(pathParts, model.fields);
@@ -515,12 +513,16 @@ export class CRUDService<T> { // Add two generic value i.e Person,CreatePersonDt
515
513
  }
516
514
 
517
515
  // We can assume that the media field entity model is already populated as part of the entity data
518
- const mediaFieldEntity = this.getMediaFieldEntity(entity, pathParts);
519
- if (!mediaFieldEntity) {
516
+ const mediaFieldEntities = this.getMediaFieldEntities(entity, pathParts);
517
+ if (!mediaFieldEntities || mediaFieldEntities.length === 0) {
520
518
  throw new BadRequestException(`Media field path ${mediaFieldPath} is not populated in model ${this.modelName}`);
521
519
  }
522
- const mediaWithFullUrl = await this.getMediaWithFullUrl(mediaFieldEntity, mediaFieldMetadata);
523
- return mediaWithFullUrl;
520
+ // Populate the media field entities with the full URL
521
+ for (const mediaFieldEntity of mediaFieldEntities) {
522
+ const mediaWithFullUrl = await this.getMediaWithFullUrl(mediaFieldEntity, mediaFieldMetadata);
523
+ this.appendMediaKey(mediaWithFullUrl, mediaFieldEntity, mediaFieldPath);
524
+ // mediaFieldEntity['_media'][mediaFieldPath] = mediaWithFullUrl
525
+ }
524
526
  }
525
527
  else {
526
528
  // mediaFieldPath is a single field
@@ -529,29 +531,43 @@ export class CRUDService<T> { // Add two generic value i.e Person,CreatePersonDt
529
531
  throw new BadRequestException(`Media field ${mediaFieldPath} not found in model ${this.modelName}`);
530
532
  }
531
533
  const mediaWithFullUrl = await this.getMediaWithFullUrl(entity, mediaFieldMetadata);
532
- return mediaWithFullUrl;
534
+ this.appendMediaKey(mediaWithFullUrl, entity, mediaFieldPath);
535
+ // entity['_media'][mediaFieldPath] = mediaWithFullUrl;
533
536
  }
534
537
  }
535
538
 
536
- private getMediaFieldEntity(entity: T, mediaPathParts: string[]) {
537
- let mediaFieldEntity = entity;
539
+ // // Add the media with full URL to the entity
540
+ private appendMediaKey(mediaWithFullUrl: MediaWithFullUrl[], entity: T, mediaFieldPath: string) {
541
+ // if _media key already exists, append the new media to the existing array
542
+ if (entity['_media']) {
543
+ entity['_media'][mediaFieldPath] = mediaWithFullUrl;
544
+ }
545
+ else {
546
+ entity['_media'] = {
547
+ [mediaFieldPath]: mediaWithFullUrl
548
+ };
549
+ }
550
+ }
551
+
552
+ private getMediaFieldEntities(entity: T, mediaPathParts: string[]): T[] {
553
+ let entityPart = entity;
538
554
  for (let i = 0; i < mediaPathParts.length - 1; i++) {
539
555
  const pathPart = mediaPathParts[i];
540
- if (mediaFieldEntity[pathPart]) {
541
- mediaFieldEntity = mediaFieldEntity[pathPart];
556
+ if (entity[pathPart]) {
557
+ entityPart = entity[pathPart];
542
558
  } else {
543
559
  throw new BadRequestException(`Media field ${pathPart} not found in entity ${JSON.stringify(entity)}`);
544
560
  }
545
561
  }
546
- return mediaFieldEntity;
562
+ return isArray(entityPart) ? entityPart : [entityPart];
547
563
  }
548
564
 
549
- async getMediaWithFullUrl(mediaEntity: any, mediaFieldMetadata: FieldMetadata): Promise<MediaWithFullUrl>{
565
+ async getMediaWithFullUrl(mediaEntity: any, mediaFieldMetadata: FieldMetadata): Promise<MediaWithFullUrl[]>{
550
566
  const storageProviderMetadata = mediaFieldMetadata.mediaStorageProvider;
551
567
  const storageProviderType = storageProviderMetadata.type as MediaStorageProviderType;
552
568
  const storageProvider = await getMediaStorageProvider(this.moduleRef, storageProviderType);
553
569
  const mediaDetails = await storageProvider.retrieve(mediaEntity, mediaFieldMetadata);
554
- return mediaDetails as MediaWithFullUrl;
570
+ return mediaDetails as MediaWithFullUrl[];
555
571
  }
556
572
 
557
573
  async findOne(id: number, query: any, solidRequestContext: any = {}) {