feat: add user submission history preparations
This commit is contained in:
@@ -5,7 +5,6 @@ Content-Type: application/json
|
||||
{
|
||||
"question": 13,
|
||||
"text": "Option 4",
|
||||
"value": 1,
|
||||
"order": 4,
|
||||
"score": 10
|
||||
}
|
||||
@@ -27,14 +27,6 @@ export class CreateChoiceDTO {
|
||||
})
|
||||
text!: string;
|
||||
|
||||
@IsNumber()
|
||||
@IsNotEmpty({
|
||||
message: t('validation.requiredField', {
|
||||
field: '$t(questions.fields.value)',
|
||||
}),
|
||||
})
|
||||
value!: number;
|
||||
|
||||
@IsNumber()
|
||||
@IsNotEmpty({
|
||||
message: t('validation.requiredField', {
|
||||
|
||||
@@ -16,10 +16,6 @@ export class FindChoicesDTO extends PartialType(PaginationQueryDTO) {
|
||||
@IsOptional()
|
||||
text?: string;
|
||||
|
||||
@IsNumber()
|
||||
@IsOptional()
|
||||
value?: number;
|
||||
|
||||
@IsNumber()
|
||||
@IsOptional()
|
||||
choiceOrder?: number;
|
||||
|
||||
@@ -26,9 +26,6 @@ export class Choice {
|
||||
})
|
||||
text!: string;
|
||||
|
||||
@Column({ type: 'int', nullable: false })
|
||||
value!: number;
|
||||
|
||||
@Column({ type: 'int', nullable: false })
|
||||
order!: number;
|
||||
|
||||
|
||||
@@ -3,6 +3,5 @@ export enum ChoiceSortField {
|
||||
QUESTION = 'question',
|
||||
TEXT = 'text',
|
||||
ORDER = 'order',
|
||||
VALUE = 'value',
|
||||
SCORE = 'score',
|
||||
}
|
||||
|
||||
@@ -17,10 +17,6 @@ export const filterChoices = (query: FindChoicesDTO) => {
|
||||
where.order = query.choiceOrder;
|
||||
}
|
||||
|
||||
if (query.value !== undefined) {
|
||||
where.value = query.value;
|
||||
}
|
||||
|
||||
if (query.score !== undefined) {
|
||||
where.score = query.score;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import {
|
||||
Column,
|
||||
CreateDateColumn,
|
||||
Entity,
|
||||
Index,
|
||||
JoinTable,
|
||||
@@ -44,4 +45,7 @@ export class SubmissionAnswer {
|
||||
nullable: true,
|
||||
})
|
||||
textValue?: string;
|
||||
|
||||
@CreateDateColumn()
|
||||
createdAt!: Date;
|
||||
}
|
||||
|
||||
@@ -19,6 +19,9 @@ export class Submission {
|
||||
@PrimaryGeneratedColumn()
|
||||
id!: number;
|
||||
|
||||
@Column({ type: 'varchar', nullable: true })
|
||||
code!: string;
|
||||
|
||||
@ManyToOne(() => User, { onDelete: 'CASCADE' })
|
||||
user!: User;
|
||||
|
||||
@@ -43,4 +46,7 @@ export class Submission {
|
||||
|
||||
@CreateDateColumn()
|
||||
createdAt!: Date;
|
||||
|
||||
@Column({ type: 'timestamptz', nullable: true })
|
||||
completedAt?: Date;
|
||||
}
|
||||
|
||||
@@ -183,7 +183,11 @@ export class AnswerAuthenticatedProvider {
|
||||
await manager.update(
|
||||
Submission,
|
||||
{ id: submission.id },
|
||||
{ currentQuestion: null, status: SubmissionStatus.COMPLETED },
|
||||
{
|
||||
currentQuestion: null,
|
||||
status: SubmissionStatus.COMPLETED,
|
||||
completedAt: new Date(),
|
||||
},
|
||||
);
|
||||
|
||||
const result =
|
||||
|
||||
@@ -2,7 +2,6 @@ import { AccessType } from '@/modules/tests/enums/access-types.enum';
|
||||
import { TestsService } from '@/modules/tests/providers/tests.service';
|
||||
import { User } from '@/modules/users/entities/user.entity';
|
||||
import {
|
||||
BadRequestException,
|
||||
ForbiddenException,
|
||||
Injectable,
|
||||
NotFoundException,
|
||||
@@ -12,7 +11,6 @@ import { Submission } from '../../entities/submission.entity';
|
||||
import { InjectRepository } from '@nestjs/typeorm';
|
||||
import { AppTimeoutException } from '@/common/exceptions/app-timeout.exception';
|
||||
import { AppResponse } from '@/common/responses';
|
||||
import { SubmissionStatus } from '../../enums/submission-status.enum';
|
||||
import { Test } from '@/modules/tests/entities/test.entity';
|
||||
import { randomUUID } from 'crypto';
|
||||
import { RedisService } from '@/common/modules/redis/providers/redis.service';
|
||||
@@ -20,6 +18,7 @@ import { GuestSubmissionSession } from '../../interfaces/guest-submission-sessio
|
||||
import { TestStatus } from '@/modules/tests/enums/test-status.enum';
|
||||
import { QuestionTransition } from '@/modules/questions/entities/question-transition.entity';
|
||||
import { QuestionTransitionType } from '@/modules/questions/enums/question-transition-type.enum';
|
||||
import Utils from '@/common/utils';
|
||||
|
||||
@Injectable()
|
||||
export class StartSubmissionProvider {
|
||||
@@ -113,41 +112,19 @@ export class StartSubmissionProvider {
|
||||
}
|
||||
|
||||
private async startAuthenticated(test: Test, user: User) {
|
||||
let submission: Submission | null = null;
|
||||
|
||||
try {
|
||||
submission = await this.submissionsRepository.findOne({
|
||||
where: {
|
||||
test: {
|
||||
id: test.id,
|
||||
},
|
||||
user: {
|
||||
id: user.id,
|
||||
},
|
||||
},
|
||||
});
|
||||
} catch (err) {
|
||||
throw new AppTimeoutException(err);
|
||||
}
|
||||
|
||||
if (submission && submission.status === SubmissionStatus.COMPLETED) {
|
||||
throw new BadRequestException('submissions.errors.alreadyTookTest');
|
||||
}
|
||||
|
||||
const firstQuestion = await this.getFirstQuestion(test.id);
|
||||
|
||||
if (!submission) {
|
||||
submission = this.submissionsRepository.create({
|
||||
test,
|
||||
user: user || undefined,
|
||||
currentQuestion: firstQuestion,
|
||||
});
|
||||
const submission = this.submissionsRepository.create({
|
||||
test,
|
||||
user: user || undefined,
|
||||
currentQuestion: firstQuestion,
|
||||
code: Utils.StringUtils.generateCode({ prefix: 's-' }),
|
||||
});
|
||||
|
||||
try {
|
||||
await this.submissionsRepository.save(submission);
|
||||
} catch (err) {
|
||||
throw new AppTimeoutException(err);
|
||||
}
|
||||
try {
|
||||
await this.submissionsRepository.save(submission);
|
||||
} catch (err) {
|
||||
throw new AppTimeoutException(err);
|
||||
}
|
||||
|
||||
return new AppResponse({
|
||||
|
||||
Reference in New Issue
Block a user