diff --git a/src/modules/auth/http/login.post.endpoints.http b/src/modules/auth/http/login.post.endpoints.http index 889367b..e91fb4a 100644 --- a/src/modules/auth/http/login.post.endpoints.http +++ b/src/modules/auth/http/login.post.endpoints.http @@ -3,8 +3,8 @@ Content-Type: application/json lang: fa { - "phone": "09121212123" - // "password": "Password1@" + "phone": "09333026363", + "password": "Password1@" } {{ diff --git a/src/modules/submissions/dtos/responses/get-submission-detail.dto.ts b/src/modules/submissions/dtos/responses/get-submission-detail.dto.ts new file mode 100644 index 0000000..3c61a93 --- /dev/null +++ b/src/modules/submissions/dtos/responses/get-submission-detail.dto.ts @@ -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; +} diff --git a/src/modules/submissions/http/submissions.get.endpoints.http b/src/modules/submissions/http/submissions.get.endpoints.http index 14f567e..c8e41c6 100644 --- a/src/modules/submissions/http/submissions.get.endpoints.http +++ b/src/modules/submissions/http/submissions.get.endpoints.http @@ -1,2 +1,5 @@ GET {{baseUrl}}/submissions/6183e332-d28d-45ba-90a7-942f9d15100f/history +Authorization: Bearer {{$global.accessToken}} + +GET {{baseUrl}}/submissions Authorization: Bearer {{$global.accessToken}} \ No newline at end of file diff --git a/src/modules/submissions/providers/listing/user-submission-listing.provider.ts b/src/modules/submissions/providers/listing/user-submission-listing.provider.ts new file mode 100644 index 0000000..5493dcc --- /dev/null +++ b/src/modules/submissions/providers/listing/user-submission-listing.provider.ts @@ -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, + ) {} + + public async getSubmissionsList(user: User) { + let userSubmissions: Array; + + 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); + } +} diff --git a/src/modules/submissions/providers/submissions.service.ts b/src/modules/submissions/providers/submissions.service.ts index 99c8977..ade3131 100644 --- a/src/modules/submissions/providers/submissions.service.ts +++ b/src/modules/submissions/providers/submissions.service.ts @@ -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); + } } diff --git a/src/modules/submissions/submissions.controller.ts b/src/modules/submissions/submissions.controller.ts index d1b1e46..cb37c91 100644 --- a/src/modules/submissions/submissions.controller.ts +++ b/src/modules/submissions/submissions.controller.ts @@ -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); + } } diff --git a/src/modules/submissions/submissions.module.ts b/src/modules/submissions/submissions.module.ts index 2758714..2dd0e32 100644 --- a/src/modules/submissions/submissions.module.ts +++ b/src/modules/submissions/submissions.module.ts @@ -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, ], })