Skip to content

Commit a590bc9

Browse files
committed
feat: link submissions to benchmarks
1 parent c48cb9e commit a590bc9

File tree

7 files changed

+65
-1
lines changed

7 files changed

+65
-1
lines changed

src/benchmarks/benchmark.entity.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,12 @@ import {
55
CreateDateColumn,
66
Entity,
77
ManyToOne,
8+
OneToMany,
89
PrimaryGeneratedColumn,
910
} from 'typeorm';
1011
import { ApiProperty } from '@nestjs/swagger';
1112
import { User } from 'src/users/user.entity';
13+
import { Submission } from '../submissions/submission.entity';
1214

1315
@Entity('benchmarks')
1416
export class Benchmark extends BaseEntity {
@@ -41,6 +43,9 @@ export class Benchmark extends BaseEntity {
4143
@Column()
4244
difficulty: string;
4345

46+
@OneToMany((type) => Submission, (submission) => submission.benchmark)
47+
submissions: Submission[];
48+
4449
@ManyToOne((type) => User, (user) => user.benchmarks, { eager: true })
4550
@ApiProperty({ type: () => User })
4651
creator: User;
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import {MigrationInterface, QueryRunner} from "typeorm";
2+
3+
export class LinkSubmissionsToBenchmark1622922117706 implements MigrationInterface {
4+
name = 'LinkSubmissionsToBenchmark1622922117706'
5+
6+
public async up(queryRunner: QueryRunner): Promise<void> {
7+
await queryRunner.query(`ALTER TABLE "submissions" ADD "benchmarkId" uuid NOT NULL`);
8+
await queryRunner.query(`ALTER TABLE "submissions" ADD CONSTRAINT "FK_7955266ebab72540a466f5c2d65" FOREIGN KEY ("benchmarkId") REFERENCES "benchmarks"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`);
9+
}
10+
11+
public async down(queryRunner: QueryRunner): Promise<void> {
12+
await queryRunner.query(`ALTER TABLE "submissions" DROP CONSTRAINT "FK_7955266ebab72540a466f5c2d65"`);
13+
await queryRunner.query(`ALTER TABLE "submissions" DROP COLUMN "benchmarkId"`);
14+
}
15+
16+
}

src/submissions/dto/create-submission-dto.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,9 @@ export class CreateSubmissionDTO {
1111
@IsString()
1212
@ApiProperty()
1313
code: string;
14+
15+
@IsNotEmpty()
16+
@IsString()
17+
@ApiProperty()
18+
benchmarkId: string;
1419
}

src/submissions/dto/insert-submission-dto.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import { User } from 'src/users/user.entity';
22

33
export class InsertSubmissionDTO {
4+
benchmarkId: string;
5+
46
language: string;
57

68
code: string;

src/submissions/submission.entity.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
PrimaryGeneratedColumn,
1212
UpdateDateColumn,
1313
} from 'typeorm';
14+
import { Benchmark } from '../benchmarks/benchmark.entity';
1415

1516
@jsonObject
1617
@Entity('submissions')
@@ -64,4 +65,11 @@ export class Submission extends BaseEntity {
6465
@ApiProperty({ type: () => User })
6566
@jsonMember(() => User)
6667
user: User;
68+
69+
@ManyToOne(() => Benchmark, (benchmark) => benchmark.submissions, {
70+
nullable: false,
71+
eager: true,
72+
})
73+
@ApiProperty({ type: () => Benchmark })
74+
benchmark: Benchmark;
6775
}

src/submissions/submissions.module.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { RabbitMQModule } from '@golevelup/nestjs-rabbitmq';
22
import { CacheModule, forwardRef, Module } from '@nestjs/common';
33
import { TypeOrmModule } from '@nestjs/typeorm';
44
import { UsersModule } from 'src/users/users.module';
5+
import { BenchmarkModule } from '../benchmarks/benchmark.module';
56
import { Submission } from './submission.entity';
67
import { SubmissionsController } from './submissions.controller';
78
import { SubmissionsService } from './submissions.service';
@@ -20,6 +21,7 @@ import { SubmissionsService } from './submissions.service';
2021
],
2122
uri: process.env.RABBITMQ_URL || 'amqp://admin:admin@localhost:5672/',
2223
}),
24+
forwardRef(() => BenchmarkModule),
2325
],
2426
providers: [SubmissionsService],
2527
controllers: [SubmissionsController],

src/submissions/submissions.service.ts

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,17 @@
11
import { RabbitSubscribe } from '@golevelup/nestjs-rabbitmq';
2-
import { CACHE_MANAGER, Inject, Injectable } from '@nestjs/common';
2+
import {
3+
BadRequestException,
4+
CACHE_MANAGER,
5+
forwardRef,
6+
Inject,
7+
Injectable,
8+
} from '@nestjs/common';
39
import { InjectRepository } from '@nestjs/typeorm';
410
import { Cache } from 'cache-manager';
11+
import { isUUID } from 'class-validator';
512
import { TypedJSON } from 'typedjson';
613
import { Repository } from 'typeorm';
14+
import { BenchmarkService } from '../benchmarks/benchmark.service';
715
import { FindSubmissionDTO } from './dto/find-submission.dto';
816
import { InsertSubmissionDTO } from './dto/insert-submission-dto';
917
import { JobStatusDTO } from './dto/job-status.dto';
@@ -15,12 +23,30 @@ export class SubmissionsService {
1523
@InjectRepository(Submission)
1624
private submissionsRepository: Repository<Submission>,
1725
@Inject(CACHE_MANAGER) private cacheManager: Cache,
26+
@Inject(forwardRef(() => BenchmarkService))
27+
private benchmarkService: BenchmarkService,
1828
) {}
1929

2030
async create(insertSubmissionDTO: InsertSubmissionDTO): Promise<Submission> {
2131
const submission = new Submission(insertSubmissionDTO);
2232
submission.status = 'waiting';
2333

34+
if (!isUUID(insertSubmissionDTO.benchmarkId)) {
35+
throw new BadRequestException(
36+
`Invalid benchmark id: ${insertSubmissionDTO.benchmarkId}`,
37+
);
38+
}
39+
const benchmark = await this.benchmarkService.findOne({
40+
id: insertSubmissionDTO.benchmarkId,
41+
});
42+
43+
if (!benchmark) {
44+
throw new BadRequestException(
45+
`Could not find benchmark: ${insertSubmissionDTO.benchmarkId}`,
46+
);
47+
}
48+
submission.benchmark = benchmark;
49+
2450
return submission.save();
2551
}
2652

0 commit comments

Comments
 (0)