feat add questions module and admin routes

This commit is contained in:
2026-06-15 07:34:41 +03:30
parent d1fecf62ad
commit 0eea63fec1
28 changed files with 636 additions and 23 deletions
@@ -0,0 +1,60 @@
import {
IsBoolean,
IsEnum,
IsNotEmpty,
IsOptional,
IsPositive,
IsString,
Validate,
} from 'class-validator';
import { QuestionType } from '../enums/question-type.enum';
import { MultiChoiceMetadataDTO } from './multi-choice-metadata.dto';
import { NumericMetadataDTO } from './numeric-metadata.dto';
import { QuestionMetadataValidator } from '../validators/question-metadata.validator';
import { i18nValidationMessage as t } from 'nestjs-i18n';
export class CreateQuestionDTO {
@IsPositive({
message: t('validation.wrongField', {
field: '$t(questions.fields.test)',
}),
})
@IsNotEmpty({
message: t('validation.requiredField', {
field: '$t(questions.fields.test)',
}),
})
test!: number;
@IsEnum(QuestionType)
@IsOptional()
type?: QuestionType;
@IsString()
@IsNotEmpty({
message: t('validation.requiredField', {
field: '$t(questions.fields.content)',
}),
})
content!: string;
@IsPositive({
message: t('validation.wrongField', {
field: '$t(questions.fields.order)',
}),
})
@IsNotEmpty({
message: t('validation.requiredField', {
field: '$t(questions.fields.order)',
}),
})
order!: number;
@IsBoolean()
@IsOptional()
required?: boolean;
@Validate(QuestionMetadataValidator)
@IsOptional()
metadata?: MultiChoiceMetadataDTO | NumericMetadataDTO;
}
@@ -0,0 +1,41 @@
import { PartialType } from '@nestjs/swagger';
import { QuestionType } from '../enums/question-type.enum';
import { PaginationQueryDTO } from '@/common/dtos/pagination-query.dto';
import {
IsBoolean,
IsEnum,
IsNumber,
IsOptional,
IsString,
} from 'class-validator';
import { QuestionSortField } from '../enums/question-sort-field.enum';
export class FindQuestionsDTO extends PartialType(PaginationQueryDTO) {
@IsNumber()
@IsOptional()
id?: number;
@IsNumber()
@IsOptional()
test?: number;
@IsEnum(QuestionType)
@IsOptional()
type?: QuestionType;
@IsString()
@IsOptional()
content?: string;
@IsNumber()
@IsOptional()
questionOrder?: number;
@IsBoolean()
@IsOptional()
required?: boolean;
@IsEnum(QuestionSortField)
@IsOptional()
sortBy?: QuestionSortField;
}
@@ -0,0 +1,7 @@
import { IsBoolean, IsOptional } from 'class-validator';
export class MultiChoiceMetadataDTO {
@IsBoolean()
@IsOptional()
allowOther?: boolean;
}
@@ -0,0 +1,13 @@
import { IsNumber, IsOptional } from 'class-validator';
export class NumericMetadataDTO {
@IsNumber()
min!: number;
@IsNumber()
max!: number;
@IsNumber()
@IsOptional()
step?: number;
}
@@ -0,0 +1,44 @@
import {
IsBoolean,
IsEnum,
IsOptional,
IsPositive,
IsString,
} from 'class-validator';
import { i18nValidationMessage as t } from 'nestjs-i18n';
import { QuestionType } from '../enums/question-type.enum';
import { MultiChoiceMetadataDTO } from './multi-choice-metadata.dto';
import { NumericMetadataDTO } from './numeric-metadata.dto';
export class UpdateQuestionDTO {
@IsPositive({
message: t('validation.wrongField', {
field: '$t(questions.fields.test)',
}),
})
@IsOptional()
test?: number;
@IsEnum(QuestionType)
@IsOptional()
type?: QuestionType;
@IsString()
@IsOptional()
content?: string;
@IsPositive({
message: t('validation.wrongField', {
field: '$t(questions.fields.order)',
}),
})
@IsOptional()
order?: number;
@IsBoolean()
@IsOptional()
required?: boolean;
@IsOptional()
metadata?: MultiChoiceMetadataDTO | NumericMetadataDTO;
}