Skip to content

Commit 438c508

Browse files
committed
fix: run endpoint and submissions model
1 parent 6b43987 commit 438c508

19 files changed

+289
-344
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
"start": "scripts/wait-for-it.sh ${AMQP_HOST}:${AMQP_PORT} -- node dist/run.js",
4747
"test": "node_modules/.bin/mocha --timeout 12000 --exit --require ts-node/register test/utils/setup*.ts test/*.ts",
4848
"cover": "nyc npm test",
49-
"seedlangs": "node dist/db/scripts/seed-defaultlangs.js",
49+
"seedlangs": "node dist/scripts/seed-defaultlangs.js",
5050
"precodecov": "npm run cover",
5151
"codecov": "codecov"
5252
},

src/db/models.ts

Lines changed: 0 additions & 92 deletions
This file was deleted.

src/models/ApiKeys.ts

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import Sequelize from "sequelize";
2+
3+
export type ApiKeyAttrs = {
4+
id: number,
5+
key: string,
6+
whitelist_domains: string[] | undefined
7+
whitelist_ips: string[] | undefined
8+
}
9+
10+
export type ApiKeyInstance = Sequelize.Instance<ApiKeyAttrs> & ApiKeyAttrs
11+
12+
export const define = (
13+
db: Sequelize.Sequelize
14+
): Sequelize.Model<ApiKeyInstance, ApiKeyAttrs> => {
15+
return db.define('apikeys', {
16+
id: {
17+
type: Sequelize.INTEGER,
18+
autoIncrement: true,
19+
primaryKey: true
20+
},
21+
key: {
22+
type: Sequelize.STRING(32),
23+
unique: true,
24+
allowNull: false
25+
},
26+
whitelist_domains: {
27+
type: Sequelize.ARRAY(Sequelize.STRING)
28+
},
29+
whitelist_ips: {
30+
type: Sequelize.ARRAY(Sequelize.STRING)
31+
}
32+
})
33+
}
34+
35+
export const associate = ({ langs, submissions }) => {
36+
submissions.belongsTo(langs, {
37+
foreignKey: 'lang',
38+
otherKey: 'lang_slug'
39+
})
40+
};

src/models/Lang.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import Sequelize from "sequelize";
2+
3+
export type LangsAttributes = {
4+
lang_slug: string,
5+
lang_name:string,
6+
lang_version: string
7+
}
8+
9+
export type LangInstance = Sequelize.Instance<LangsAttributes> & LangsAttributes
10+
11+
export const define = (
12+
db: Sequelize.Sequelize
13+
): Sequelize.Model<LangInstance, LangsAttributes> => {
14+
return db.define('langs', {
15+
lang_slug: {
16+
type: Sequelize.STRING(10),
17+
primaryKey: true
18+
},
19+
lang_name: Sequelize.STRING(10),
20+
lang_version: Sequelize.STRING(5)
21+
}, {
22+
timestamps: false
23+
})
24+
}
25+
26+
export const associate = () => {};

src/models/Submission.ts

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import Sequelize from "sequelize";
2+
3+
export type Testcase = {
4+
id: number,
5+
score: number,
6+
time: string,
7+
result: string
8+
}
9+
10+
export type SubmissionAttributes = {
11+
id?: number
12+
lang: string
13+
start_time: Date
14+
end_time?: Date
15+
mode: string
16+
results?: Array<Testcase>
17+
outputs?: Array<string>
18+
callback?: string
19+
}
20+
21+
export type SubmissionInstance = Sequelize.Instance<SubmissionAttributes> & SubmissionAttributes
22+
23+
export const define = (
24+
db: Sequelize.Sequelize
25+
): Sequelize.Model<SubmissionInstance, SubmissionAttributes> => {
26+
return db.define('submissions', {
27+
id: {
28+
type: Sequelize.INTEGER,
29+
autoIncrement: true,
30+
primaryKey: true
31+
},
32+
lang: {
33+
type: Sequelize.STRING(10)
34+
},
35+
start_time: Sequelize.DATE,
36+
end_time: Sequelize.DATE,
37+
mode: {
38+
type: Sequelize.STRING,
39+
allowNull: false
40+
},
41+
results: Sequelize.JSON,
42+
outputs: Sequelize.ARRAY(Sequelize.STRING),
43+
callback: Sequelize.STRING
44+
}, {
45+
paranoid: true, // We do not want to lose any submission data
46+
timestamps: false // Start and end times are already logged
47+
})
48+
}
49+
50+
export const associate = ({ langs, submissions }) => {
51+
submissions.belongsTo(langs, {
52+
foreignKey: 'lang',
53+
otherKey: 'lang_slug'
54+
})
55+
};

src/models/index.ts

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import * as Sequelize from 'sequelize'
2+
import * as path from 'path'
3+
import * as fs from 'fs'
4+
import config = require('../../config')
5+
import dbg = require('debug')
6+
7+
const basename = path.basename(module.filename);
8+
const db: any = {}
9+
const dbModel = {}
10+
const debug = dbg('judge:models')
11+
12+
const sequelize = new Sequelize(config.DB.DATABASE, config.DB.USERNAME, config.DB.PASSWORD, {
13+
dialect: 'postgres',
14+
host: config.DB.HOST,
15+
logging: debug,
16+
pool: {
17+
max: 10,
18+
idle: 10000
19+
}
20+
})
21+
22+
fs
23+
.readdirSync(__dirname)
24+
.filter(function(file) {
25+
return (file.indexOf('.') !== 0) && (file !== basename) && (['.ts'].includes(file.slice(-3)));
26+
})
27+
.forEach(function(file) {
28+
var model = require(path.join(__dirname, file)).define(sequelize);
29+
dbModel[model.name] = require(path.join(__dirname, file))
30+
db[model.name] = model;
31+
});
32+
33+
Object.keys(dbModel).forEach(function(modelName) {
34+
if(dbModel[modelName].associate){
35+
dbModel[modelName].associate(db)
36+
}
37+
});
38+
39+
db.sequelize = sequelize;
40+
db.Sequelize = Sequelize;
41+
42+
export default db

src/rabbitmq/jobqueue.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,11 @@ amqp.connect(`amqp://${config.AMQP.USER}:${config.AMQP.PASS}@${config.AMQP.HOST}
4444
jobChannel = channel
4545
jobChannel.consume(successQ, (msg) => {
4646
debug(`SUCCESS:CONSUME: msg.content = ${msg.content.toString()}`)
47-
successListener.emit('success', JSON.parse(msg.content.toString()))
47+
48+
const payload = JSON.parse(msg.content.toString())
49+
const eventName = payload.testcases ? 'submit_result' : 'run_result'
50+
51+
successListener.emit(eventName, payload)
4852
jobChannel.ack(msg)
4953
})
5054
})

src/routes/api/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import {NextFunction, Request, Response, Router} from 'express'
2-
import {route as run} from './run'
2+
import run from './run'
33
import {route as submissions} from './submissions'
44
import {route as langs} from './langs'
55
import {checkValidApiKey} from '../../validators/ApiKeyValidators'

src/routes/api/langs.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import {Router} from 'express'
2-
import {Langs} from '../../db/models'
2+
import DB from 'models'
33

44
const route: Router = Router()
55

0 commit comments

Comments
 (0)