feat: add user submission list logic

This commit is contained in:
2026-09-09 13:22:41 +03:30
parent f0bf186b6c
commit f3c86da09b
7 changed files with 99 additions and 2 deletions
@@ -3,8 +3,8 @@ Content-Type: application/json
lang: fa
{
"phone": "09121212123"
// "password": "Password1@"
"phone": "09333026363",
"password": "Password1@"
}
{{
@@ -0,0 +1,27 @@
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { SubmissionStatus } from '../../enums/submission-status.enum';
import { GetSubmissionResultDTO } from './get-submission-result.dto';
import { GetTestByIdDTO } from '@/modules/tests/dtos/responses/get-test-by-id.dto';
export class GetSubmissionDetailDTO {
@ApiProperty()
id!: number;
@ApiProperty()
code!: string;
@ApiProperty({ type: GetTestByIdDTO })
test!: GetTestByIdDTO;
@ApiProperty({ enum: SubmissionStatus, enumName: 'status' })
status!: SubmissionStatus;
@ApiPropertyOptional({ type: GetSubmissionResultDTO })
result?: GetSubmissionResultDTO;
@ApiProperty()
createdAt!: Date;
@ApiPropertyOptional()
completedAt?: Date;
}
@@ -1,2 +1,5 @@
GET {{baseUrl}}/submissions/6183e332-d28d-45ba-90a7-942f9d15100f/history
Authorization: Bearer {{$global.accessToken}}
GET {{baseUrl}}/submissions
Authorization: Bearer {{$global.accessToken}}
@@ -0,0 +1,38 @@
import { Injectable } from '@nestjs/common';
import { Repository } from 'typeorm';
import { Submission } from '../../entities/submission.entity';
import { InjectRepository } from '@nestjs/typeorm';
import { User } from '@/modules/users/entities/user.entity';
import { AppTimeoutException } from '@/common/exceptions/app-timeout.exception';
import { AppResponse } from '@/common/responses';
@Injectable()
export class UserSubmissionListingProvider {
constructor(
/**
* Inject Submission Repository
*/
@InjectRepository(Submission)
private readonly submissionsRepository: Repository<Submission>,
) {}
public async getSubmissionsList(user: User) {
let userSubmissions: Array<Submission>;
try {
userSubmissions = await this.submissionsRepository.find({
where: {
user: { id: user.id },
},
relations: {
result: true,
test: true,
},
});
} catch (err) {
throw new AppTimeoutException(err);
}
return new AppResponse(userSubmissions);
}
}
@@ -4,6 +4,7 @@ import { User } from '@/modules/users/entities/user.entity';
import { AnswerSubmissionProvider } from './answer/answer-submission.provider';
import { AnswerSubmissionDTO } from '../dtos/answer-submission.dto';
import { SubmissionHistoryProvider } from './history/submission-history.provider';
import { UserSubmissionListingProvider } from './listing/user-submission-listing.provider';
@Injectable()
export class SubmissionsService {
@@ -22,6 +23,11 @@ export class SubmissionsService {
* Inject Submission History Provider
*/
private readonly submissionHistoryProvider: SubmissionHistoryProvider,
/**
* Inject User Submission Listing Provider
*/
private readonly userSubmissionListingProvider: UserSubmissionListingProvider,
) {}
public async startSubmission(testId: number, user?: User) {
@@ -43,4 +49,8 @@ export class SubmissionsService {
public async getSubmissionHistory(id: string, user?: User) {
return await this.submissionHistoryProvider.getHistory(id, user);
}
public async getUserSubmissions(user: User) {
return await this.userSubmissionListingProvider.getSubmissionsList(user);
}
}
@@ -20,6 +20,7 @@ import { StartAuthenticatedDTO } from './dtos/responses/start-authenticated.dto'
import { StartGuestDTO } from './dtos/responses/start-guest.dto';
import { GetAnswerSubmissionDTO } from './dtos/responses/get-answer-submission.dto';
import { GetSubmissionHistoryDTO } from './dtos/responses/get-submission-history.dto';
import { GetSubmissionDetailDTO } from './dtos/responses/get-submission-detail.dto';
@Controller('submissions')
export class SubmissionsController {
@@ -143,4 +144,20 @@ export class SubmissionsController {
public async getHistory(@Param('id') id: string, @ActiveUser() user?: User) {
return await this.submissionsService.getSubmissionHistory(id, user);
}
@Get()
@ApiAppResponse([
{
status: HttpStatus.OK,
variants: [
{
model: GetSubmissionDetailDTO,
isArray: true,
},
],
},
])
public async getUserSubmissions(@ActiveUser() user: User) {
return await this.submissionsService.getUserSubmissions(user);
}
}
@@ -17,6 +17,7 @@ import { AnswerAuthenticatedProvider } from './providers/answer/answer-authentic
import { HistoryAuthenticatedProvider } from './providers/history/history-authenticated.provider';
import { HistoryGuestProvider } from './providers/history/history-guest.provider';
import { SubmissionHistoryProvider } from './providers/history/submission-history.provider';
import { UserSubmissionListingProvider } from './providers/listing/user-submission-listing.provider';
@Module({
imports: [
@@ -36,6 +37,7 @@ import { SubmissionHistoryProvider } from './providers/history/submission-histor
HistoryAuthenticatedProvider,
HistoryGuestProvider,
SubmissionHistoryProvider,
UserSubmissionListingProvider,
SubmissionsService,
],
})