diff --git a/src/i18n/en/scoring.json b/src/i18n/en/scoring.json index e1932d1..1feb612 100644 --- a/src/i18n/en/scoring.json +++ b/src/i18n/en/scoring.json @@ -4,6 +4,6 @@ }, "errors": { "resultRangeOverlappingConstraint": "The specified score range has some overlaps with other records.", - "resultRangeMinMaxConstraint": "minProbability value should be less than maxProbability." + "resultRangeMinMaxConstraint": "minScore value should be less than maxScore." } } diff --git a/src/i18n/fa/scoring.json b/src/i18n/fa/scoring.json index 198d53f..45dabff 100644 --- a/src/i18n/fa/scoring.json +++ b/src/i18n/fa/scoring.json @@ -4,6 +4,6 @@ }, "errors": { "resultRangeOverlappingConstraint": "بازه امتیاز مشخص شده با بازه های دیگر تداخل دارد.", - "resultRangeMinMaxConstraint": "minProbability باید کمتر از maxProbability باشد." + "resultRangeMinMaxConstraint": "minScore باید کمتر از maxScore باشد." } } diff --git a/src/migrations/1788950646073-ChangeResultRangeFields.ts b/src/migrations/1788950646073-ChangeResultRangeFields.ts index 9ede261..37e3603 100644 --- a/src/migrations/1788950646073-ChangeResultRangeFields.ts +++ b/src/migrations/1788950646073-ChangeResultRangeFields.ts @@ -1,20 +1,35 @@ -import { MigrationInterface, QueryRunner } from "typeorm"; +import { MigrationInterface, QueryRunner } from 'typeorm'; export class ChangeResultRangeFields1788950646073 implements MigrationInterface { - name = 'ChangeResultRangeFields1788950646073' + name = 'ChangeResultRangeFields1788950646073'; - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.query(`ALTER TABLE "result_range" DROP COLUMN "minScore"`); - await queryRunner.query(`ALTER TABLE "result_range" DROP COLUMN "maxScore"`); - await queryRunner.query(`ALTER TABLE "result_range" ADD "minProbability" integer NOT NULL`); - await queryRunner.query(`ALTER TABLE "result_range" ADD "maxProbability" integer NOT NULL`); - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.query(`ALTER TABLE "result_range" DROP COLUMN "maxProbability"`); - await queryRunner.query(`ALTER TABLE "result_range" DROP COLUMN "minProbability"`); - await queryRunner.query(`ALTER TABLE "result_range" ADD "maxScore" integer NOT NULL`); - await queryRunner.query(`ALTER TABLE "result_range" ADD "minScore" integer NOT NULL`); - } + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "result_range" DROP COLUMN "minScore"`, + ); + await queryRunner.query( + `ALTER TABLE "result_range" DROP COLUMN "maxScore"`, + ); + await queryRunner.query( + `ALTER TABLE "result_range" ADD "minProbability" integer NOT NULL`, + ); + await queryRunner.query( + `ALTER TABLE "result_range" ADD "maxProbability" integer NOT NULL`, + ); + } + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "result_range" DROP COLUMN "maxProbability"`, + ); + await queryRunner.query( + `ALTER TABLE "result_range" DROP COLUMN "minProbability"`, + ); + await queryRunner.query( + `ALTER TABLE "result_range" ADD "maxScore" integer NOT NULL`, + ); + await queryRunner.query( + `ALTER TABLE "result_range" ADD "minScore" integer NOT NULL`, + ); + } } diff --git a/src/migrations/1789906979798-CalculateByScore.ts b/src/migrations/1789906979798-CalculateByScore.ts new file mode 100644 index 0000000..0dcd7c8 --- /dev/null +++ b/src/migrations/1789906979798-CalculateByScore.ts @@ -0,0 +1,35 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class CalculateByScore1789906979798 implements MigrationInterface { + name = 'CalculateByScore1789906979798'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "result_range" DROP COLUMN "minProbability"`, + ); + await queryRunner.query( + `ALTER TABLE "result_range" DROP COLUMN "maxProbability"`, + ); + await queryRunner.query( + `ALTER TABLE "result_range" ADD "minScore" integer NOT NULL`, + ); + await queryRunner.query( + `ALTER TABLE "result_range" ADD "maxScore" integer NOT NULL`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "result_range" DROP COLUMN "maxScore"`, + ); + await queryRunner.query( + `ALTER TABLE "result_range" DROP COLUMN "minScore"`, + ); + await queryRunner.query( + `ALTER TABLE "result_range" ADD "maxProbability" integer NOT NULL`, + ); + await queryRunner.query( + `ALTER TABLE "result_range" ADD "minProbability" integer NOT NULL`, + ); + } +} diff --git a/src/modules/admin/scoring/http/admin-scoring.post.endpoints.http b/src/modules/admin/scoring/http/admin-scoring.post.endpoints.http index 8cb3090..f31fceb 100644 --- a/src/modules/admin/scoring/http/admin-scoring.post.endpoints.http +++ b/src/modules/admin/scoring/http/admin-scoring.post.endpoints.http @@ -6,6 +6,6 @@ Content-Type: application/json "test": 4, "title": "احتمال خیلی بالا", "description": "احتمال ابتلا خیلی بالا است.", - "minProbability": 21, - "maxProbability": 40 + "minScore": 21, + "maxScore": 40 } \ No newline at end of file diff --git a/src/modules/scoring/dtos/create-result-range.dto.ts b/src/modules/scoring/dtos/create-result-range.dto.ts index 10e6845..34269dd 100644 --- a/src/modules/scoring/dtos/create-result-range.dto.ts +++ b/src/modules/scoring/dtos/create-result-range.dto.ts @@ -8,11 +8,11 @@ export class CreateResultRangeDTO { @IsNumber() @IsNotEmpty() - minProbability!: number; + minScore!: number; @IsNumber() @IsNotEmpty() - maxProbability!: number; + maxScore!: number; @IsString() @IsNotEmpty() diff --git a/src/modules/scoring/dtos/find-result-range.dto.ts b/src/modules/scoring/dtos/find-result-range.dto.ts index af7f718..f8953e1 100644 --- a/src/modules/scoring/dtos/find-result-range.dto.ts +++ b/src/modules/scoring/dtos/find-result-range.dto.ts @@ -14,11 +14,11 @@ export class FindResultRangeDTO extends PartialType(PaginationQueryDTO) { @IsNumber() @IsOptional() - minProbability?: number; + minScore?: number; @IsNumber() @IsOptional() - maxProbability?: number; + maxScore?: number; @IsString() @IsOptional() diff --git a/src/modules/scoring/entities/result-range.entity.ts b/src/modules/scoring/entities/result-range.entity.ts index 82e215b..2fedae1 100644 --- a/src/modules/scoring/entities/result-range.entity.ts +++ b/src/modules/scoring/entities/result-range.entity.ts @@ -15,13 +15,13 @@ export class ResultRange { type: 'int', nullable: false, }) - minProbability!: number; + minScore!: number; @Column({ type: 'int', nullable: false, }) - maxProbability!: number; + maxScore!: number; @Column({ type: 'varchar', diff --git a/src/modules/scoring/enums/result-range-sort-field.enum.ts b/src/modules/scoring/enums/result-range-sort-field.enum.ts index 95fadbb..446a6b9 100644 --- a/src/modules/scoring/enums/result-range-sort-field.enum.ts +++ b/src/modules/scoring/enums/result-range-sort-field.enum.ts @@ -1,8 +1,8 @@ export enum ResultRangeSortField { ID = 'id', TEST = 'test', - MIN_PROBABILITY = 'minProbability', - MAX_PROBABILITY = 'maxProbability', + MIN_SCORE = 'minScore', + MAX_SCORE = 'maxScore', TITLE = 'title', DESCRIPTION = 'description', } diff --git a/src/modules/scoring/helpers/filter-result-ranges.helper.ts b/src/modules/scoring/helpers/filter-result-ranges.helper.ts index 7867b3c..607ebf1 100644 --- a/src/modules/scoring/helpers/filter-result-ranges.helper.ts +++ b/src/modules/scoring/helpers/filter-result-ranges.helper.ts @@ -17,12 +17,12 @@ export const filterResultRanges = (query: FindResultRangeDTO) => { where.title = ILike(`%${query.title}%`); } - if (query.maxProbability !== undefined) { - where.maxProbability = query.maxProbability; + if (query.maxScore !== undefined) { + where.maxScore = query.maxScore; } - if (query.minProbability !== undefined) { - where.minProbability = query.minProbability; + if (query.minScore !== undefined) { + where.minScore = query.minScore; } return where; diff --git a/src/modules/scoring/providers/result-range-command.provider.ts b/src/modules/scoring/providers/result-range-command.provider.ts index 8591114..a84c386 100644 --- a/src/modules/scoring/providers/result-range-command.provider.ts +++ b/src/modules/scoring/providers/result-range-command.provider.ts @@ -32,16 +32,16 @@ export class ResultRangeCommandProvider { private async checkRangeOverlap( test: number, - minProbability: number, - maxProbability: number, + minScore: number, + maxScore: number, excludeSelf: boolean = false, ): Promise { const queryBuilder = this.resultRangeRepository .createQueryBuilder('resultRange') .where('resultRange.testId = :test', { test }) .andWhere( - '(resultRange.minProbability BETWEEN :minProbability AND :maxProbability) OR (resultRange.maxProbability BETWEEN :minProbability AND :maxProbability) OR (:minProbability BETWEEN resultRange.minProbability AND resultRange.maxProbability) OR (:maxProbability BETWEEN resultRange.minProbability AND resultRange.maxProbability)', - { minProbability, maxProbability }, + '(resultRange.minScore BETWEEN :minScore AND :maxScore) OR (resultRange.maxScore BETWEEN :minScore AND :maxScore) OR (:minScore BETWEEN resultRange.minScore AND resultRange.maxScore) OR (:maxScore BETWEEN resultRange.minScore AND resultRange.maxScore)', + { minScore, maxScore }, ); let overlappingRanges: Array; @@ -92,8 +92,8 @@ export class ResultRangeCommandProvider { await this.checkRangeOverlap( test.id, - createResultRangeDto.minProbability, - createResultRangeDto.maxProbability, + createResultRangeDto.minScore, + createResultRangeDto.maxScore, ); const newResultRange = this.resultRangeRepository.create({ @@ -129,23 +129,23 @@ export class ResultRangeCommandProvider { ? updateResultRangeDto.test : resultRange.test.id; - const minProbability = - updateResultRangeDto.minProbability !== undefined - ? updateResultRangeDto.minProbability - : resultRange.minProbability; + const minScore = + updateResultRangeDto.minScore !== undefined + ? updateResultRangeDto.minScore + : resultRange.minScore; - const maxProbability = - updateResultRangeDto.maxProbability !== undefined - ? updateResultRangeDto.maxProbability - : resultRange.maxProbability; + const maxScore = + updateResultRangeDto.maxScore !== undefined + ? updateResultRangeDto.maxScore + : resultRange.maxScore; - if (minProbability >= maxProbability) { + if (minScore >= maxScore) { throw new BadRequestException( 'scoring.errors.resultRangeMinMaxConstraint', ); } - await this.checkRangeOverlap(testId, minProbability, maxProbability, true); + await this.checkRangeOverlap(testId, minScore, maxScore, true); Object.assign(resultRange, updateResultRangeDto); diff --git a/src/modules/scoring/validators/result-range.validator.ts b/src/modules/scoring/validators/result-range.validator.ts index 2287086..e0e017e 100644 --- a/src/modules/scoring/validators/result-range.validator.ts +++ b/src/modules/scoring/validators/result-range.validator.ts @@ -14,15 +14,15 @@ export class ResultRangeValidator implements ValidatorConstraintInterface { // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment const obj = validationArguments?.object as any; // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment - const { minProbability, maxProbability } = obj; - return minProbability < maxProbability; + const { minScore, maxScore } = obj; + return minScore < maxScore; } defaultMessage?(): string { const i18n = I18nContext.current(); return ( i18n?.t('scoring.errors.resultRangeMinMaxConstraint') || - 'minProbability value should be less than maxProbability.' + 'minScore value should be less than maxScore.' ); } } diff --git a/src/modules/submissions/providers/answer/calculate-result.provider.ts b/src/modules/submissions/providers/answer/calculate-result.provider.ts index 75a6acb..99ce861 100644 --- a/src/modules/submissions/providers/answer/calculate-result.provider.ts +++ b/src/modules/submissions/providers/answer/calculate-result.provider.ts @@ -72,12 +72,12 @@ export class CalculateResultProvider { rangeRules: true, }, }), - async (probability) => + async (score) => manager.find(ResultRange, { where: { test: { id: submission.test.id }, - minProbability: LessThanOrEqual(probability), - maxProbability: MoreThanOrEqual(probability), + minScore: LessThanOrEqual(score), + maxScore: MoreThanOrEqual(score), }, }), ); @@ -119,12 +119,12 @@ export class CalculateResultProvider { rangeRules: true, }, }), - async (probability) => + async (score) => this.resultRangeRepository.find({ where: { test: { id: submission.testId }, - minProbability: LessThanOrEqual(probability), - maxProbability: MoreThanOrEqual(probability), + minScore: LessThanOrEqual(score), + maxScore: MoreThanOrEqual(score), }, }), ); @@ -150,7 +150,7 @@ export class CalculateResultProvider { numericValue?: number; }>, loadQuestions: (questionIds: number[]) => Promise, - loadResultRanges: (probability: number) => Promise, + loadResultRanges: (score: number) => Promise, ) { let score = 0; @@ -242,7 +242,7 @@ export class CalculateResultProvider { const probability = totalScores > 0 ? Math.ceil((score / totalScores) * 100) : 0; - const resultRanges = await loadResultRanges(probability); + const resultRanges = await loadResultRanges(score); return { score,