diff --git a/api/src/cms/dto/contentType.dto.ts b/api/src/cms/dto/contentType.dto.ts index b4e6f036..81f09c98 100644 --- a/api/src/cms/dto/contentType.dto.ts +++ b/api/src/cms/dto/contentType.dto.ts @@ -9,16 +9,18 @@ import { ApiProperty, ApiPropertyOptional, PartialType } from '@nestjs/swagger'; import { Type } from 'class-transformer'; import { - IsString, IsArray, - ValidateNested, - IsOptional, IsEnum, - Matches, IsNotEmpty, + IsOptional, + IsString, + Matches, Validate, + ValidateNested, } from 'class-validator'; +import { DtoConfig } from '@/utils/types/dto.types'; + import { ValidateRequiredFields } from '../validators/validate-required-fields.validator'; export class FieldType { @@ -55,3 +57,7 @@ export class ContentTypeCreateDto { } export class ContentTypeUpdateDto extends PartialType(ContentTypeCreateDto) {} + +export type ContentTypeDtoMapActions = DtoConfig<{ + create: ContentTypeCreateDto; +}>; diff --git a/api/src/cms/repositories/content-type.repository.ts b/api/src/cms/repositories/content-type.repository.ts index 9548e925..6681c3e8 100644 --- a/api/src/cms/repositories/content-type.repository.ts +++ b/api/src/cms/repositories/content-type.repository.ts @@ -15,11 +15,17 @@ import { BlockService } from '@/chat/services/block.service'; import { BaseRepository, DeleteResult } from '@/utils/generics/base-repository'; import { TFilterQuery } from '@/utils/types/filter.types'; +import { ContentTypeDtoMapActions } from '../dto/contentType.dto'; import { ContentType } from '../schemas/content-type.schema'; import { Content } from '../schemas/content.schema'; @Injectable() -export class ContentTypeRepository extends BaseRepository { +export class ContentTypeRepository extends BaseRepository< + ContentType, + never, + never, + ContentTypeDtoMapActions +> { constructor( readonly eventEmitter: EventEmitter2, @InjectModel(ContentType.name) readonly model: Model, diff --git a/api/src/cms/schemas/content-type.schema.ts b/api/src/cms/schemas/content-type.schema.ts index d0fcb1fb..e1d95921 100644 --- a/api/src/cms/schemas/content-type.schema.ts +++ b/api/src/cms/schemas/content-type.schema.ts @@ -6,7 +6,7 @@ * 2. All derivative works must include clear attribution to the original creator and software, Hexastack and Hexabot, in a prominent location (e.g., in the software's "About" section, documentation, and README file). */ -import { Prop, Schema, SchemaFactory, ModelDefinition } from '@nestjs/mongoose'; +import { ModelDefinition, Prop, Schema, SchemaFactory } from '@nestjs/mongoose'; import mongoose from 'mongoose'; import { BaseSchema } from '@/utils/generics/base-schema'; @@ -39,7 +39,7 @@ export class ContentType extends BaseSchema { }, ], }) - fields?: { + fields: { name: string; label: string; type: string; diff --git a/api/src/cms/services/content-type.service.ts b/api/src/cms/services/content-type.service.ts index 907e7388..d654d875 100644 --- a/api/src/cms/services/content-type.service.ts +++ b/api/src/cms/services/content-type.service.ts @@ -10,11 +10,17 @@ import { Injectable } from '@nestjs/common'; import { BaseService } from '@/utils/generics/base-service'; +import { ContentTypeDtoMapActions } from '../dto/contentType.dto'; import { ContentTypeRepository } from '../repositories/content-type.repository'; import { ContentType } from '../schemas/content-type.schema'; @Injectable() -export class ContentTypeService extends BaseService { +export class ContentTypeService extends BaseService< + ContentType, + never, + never, + ContentTypeDtoMapActions +> { constructor(readonly repository: ContentTypeRepository) { super(repository); } diff --git a/api/src/utils/test/fixtures/contenttype.ts b/api/src/utils/test/fixtures/contenttype.ts index 764e554f..1c5eac74 100644 --- a/api/src/utils/test/fixtures/contenttype.ts +++ b/api/src/utils/test/fixtures/contenttype.ts @@ -8,16 +8,37 @@ import mongoose from 'mongoose'; -import { ContentTypeCreateDto } from '@/cms/dto/contentType.dto'; import { ContentType, ContentTypeModel, } from '@/cms/schemas/content-type.schema'; +import { BaseSchema } from '@/utils/generics/base-schema'; import { getFixturesWithDefaultValues } from '../defaultValues'; -import { TFixturesDefaultValues } from '../types'; -const contentTypes: ContentTypeCreateDto[] = [ +export const fieldsWithDefaultValues = { + fields: [ + { + name: 'title', + label: 'Title', + type: 'text', + }, + { + name: 'status', + label: 'Status', + type: 'checkbox', + }, + ], +} satisfies Partial; + +type TFieldWithDefaultValues = + | keyof typeof fieldsWithDefaultValues + | keyof BaseSchema; +type TTransformedField = Omit & + Partial>; +type TContentType = TTransformedField; + +const contentTypes: TContentType[] = [ { name: 'Product', fields: [ @@ -100,24 +121,9 @@ const contentTypes: ContentTypeCreateDto[] = [ }, ]; -export const contentTypeDefaultValues: TFixturesDefaultValues = { - fields: [ - { - name: 'title', - label: 'Title', - type: 'text', - }, - { - name: 'status', - label: 'Status', - type: 'checkbox', - }, - ], -}; - -export const contentTypeFixtures = getFixturesWithDefaultValues({ +export const contentTypeFixtures = getFixturesWithDefaultValues({ fixtures: contentTypes, - defaultValues: contentTypeDefaultValues, + defaultValues: fieldsWithDefaultValues, }); export const installContentTypeFixtures = async () => {