Skip to content

Commit 9fc0053

Browse files
authored
Add working Judge API
1 parent 7655447 commit 9fc0053

6 files changed

Lines changed: 101 additions & 48 deletions

File tree

judge/app.js

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
const express= require('express');
32
const morgan = require('morgan');
43
const passport = require('passport');
@@ -30,17 +29,6 @@ app.use(flash());
3029
const solutions = require('./routes/solution');
3130
app.use('/',solutions)
3231

33-
34-
/*app.post('/problem' , (req,res)=>{
35-
var body = _.pick(req.body,['code','name','description','input_format','output_format','constraints','input_example','output_example','explanation_example','date_added','timelimit','sourcelimit','author']);
36-
var problem = new Problem(body);
37-
problem.save().then((problem) => {
38-
res.send(problem)
39-
}, (e) => {
40-
res.status(400).send(e)
41-
})
42-
})*/
43-
4432
const port = process.env.PORT || 3002;
4533
app.listen(port);
4634
console.log('magic is started at ' + port)

judge/compileProblem.js

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ const util = require('util');
22
const exec = require('child_process').exec ;
33
const path = require('path');
44
const fs = require('fs')
5+
const buffer = require('buffer')
56

67
async function lsExample() {
78
const { stdout, stderr } = await exec('ls');
@@ -16,25 +17,27 @@ const compileProblem= async (lang , filename)=>{
1617
switch(lang){
1718
case "c":
1819
file = path.basename(filename ,path.extname(filename)) +".out "
19-
cmd="cd result && gcc -o " + file
20+
cmd="cd result && gcc -o " + file + " " + path.join(__dirname,"result/"+filename);
2021
break;
2122
case "c++":
2223
case "cpp":
2324
file = path.basename(filename ,path.extname(filename)) +".out "
24-
cmd = "cd result && g++ -o " + file;
25+
cmd = "cd result && g++ -o " + file + " " + path.join(__dirname,"result/"+filename);
2526
break;
2627
case "java":
2728
file = path.basename(filename ,path.extname(filename))
28-
cmd = "cd result && javac "
29+
cmd = "cd result && javac "+ path.join(__dirname,"result/"+filename)
2930
}
3031

31-
console.log( cmd + path.join(__dirname,filename))
32+
3233
return new Promise((resolve,reject)=>{
33-
exec(cmd + path.join(__dirname,filename), (error, stdout, stderr) => {
34+
exec(cmd, (error, stdout, stderr) => {
3435
if (error) {
3536
//console.error(`${error}`);
37+
3638
reject(error);
3739
}
40+
console.log( cmd)
3841
resolve(file)
3942
});
4043
})
@@ -56,17 +59,14 @@ async function runCompiled(lang,file){
5659
case "java":
5760
cmd = "cd result && java " + file ;
5861
}
62+
5963
return new Promise((resolve,reject)=>{
60-
exec(cmd, {timeout:1000,maxBuffer:1020},(error, stdout, stderr) => {
61-
if (error) {
62-
//console.log(error)
63-
//if(error.toString().search(/Command failed: test.out/)>0){
64-
// reject('TLE');
65-
//}else{
64+
exec(cmd, {timeout:100000,maxBuffer:2147483647,encoding:'utf8'},(error, stdout, stderr) => {
65+
if (error) {
6666
reject(error);
67-
// }
6867
}
69-
var res=stdout.toString();
68+
var res=stdout;
69+
7070
resolve(res);
7171
});
7272
})
@@ -75,19 +75,18 @@ async function runCompiled(lang,file){
7575
//Check Result of run program
7676

7777
const checkResult=async (UserResult,serverResult)=>{
78-
// console.log(UserResult + " " + serverResult)
78+
// UserResult = fs.readFileSync(UserResult,'utf16le')
7979
return new Promise((resolve,reject)=>{
8080
if(UserResult===serverResult){
8181
resolve('Correct answer')
8282
}else{
83-
reject('wrong answer')
83+
resolve('wrong answer')
8484
}
8585
})
8686
}
8787
const serverResult = async ()=>{
8888
return new Promise((resolve,reject)=>{
89-
var buf= fs.readFileSync(path.join(__dirname,'result/result.txt')).toString();
90-
// console.log(buf)
89+
var buf= fs.readFileSync(path.join(__dirname,'result/result.txt'),'utf8');
9190
resolve(buf)
9291
}).catch((e)=>{
9392
console.log(e)
@@ -103,7 +102,7 @@ const base64tofile = async (base64,lang)=>{
103102
filename+=lang;
104103
}
105104
return new Promise((resolve,reject)=>{
106-
fs.writeFile(path.join(__dirname,filename),fileout, function(err) {
105+
fs.writeFile(path.join(__dirname ,'result/'+filename),fileout, function(err) {
107106
if(err) {
108107
reject('Can not write file');
109108
}

judge/models/solution/solution.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
const mongoose = require('mongoose')
2+
const SolutionJson = require('./solution.json')
3+
4+
const SolutionSchema = new mongoose.Schema(SolutionJson);
5+
module.exports= mongoose.model('Solution',SolutionSchema)
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
{
2+
"id":{
3+
"type":"string",
4+
"unique":true
5+
},
6+
"code":{
7+
"type":"string"
8+
},
9+
"username":{
10+
"type":"string"
11+
},
12+
"submitted_on":{
13+
"type":"date"
14+
},
15+
"language":{
16+
"type":"string"
17+
},
18+
"result":{
19+
"type":"string"
20+
},
21+
"score":{
22+
"type":"number",
23+
"default":0
24+
},
25+
"status":{
26+
"type":"string",
27+
"default":""
28+
},
29+
"description":{
30+
"type":"string"
31+
}
32+
}

judge/routes/solution.js

Lines changed: 40 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,47 @@
11
const express = require('express');
22
const judge = require('./../compileProblem');
3+
const db = require('./../utils/database/mongodb');
4+
const Solution= require('./../models/solution/solution');
5+
const mongoose = require('mongoose')
36
const router = express.Router();
47

5-
router.get('/',(req,res)=>{
6-
var body = JSON.parse(req.body)
7-
console.log(body)
8-
var description=body.description;
9-
var language= body.language;
10-
judge.compileAndRunProblem(language,description).then((result)=>{
11-
console.log(result)
12-
res.send(result);
13-
}).catch((e)=>{
14-
//res.status(200).send(e);
15-
console.log(e)
16-
if(e.toString().indexOf("Error: Command failed:")!=-1){
17-
res.send(e)
18-
}else{
19-
res.send(e)
20-
}
21-
22-
})
8+
router.get('/:id',(req,res)=>{
9+
Solution.findOne({'id':req.params.id},function(err,solution){
10+
if(err){
11+
res.send(err)
12+
}else if(!solution){
13+
res.send('null')
14+
}else if(solution){
15+
var description=solution.description;
16+
var language= solution.language;
17+
judge.compileAndRunProblem(language,description).then((result)=>{
18+
res.send(result);
19+
}).catch((e)=>{
20+
/* var compileError = /(g[/++/]|gcc|javac)/;
21+
if(e.cmd.toString().match(compileError)){
22+
res.status(200).send('ce');
23+
}//else{
24+
res.status(200).send('TLE');
25+
26+
console.log(e.cmd)
27+
if(e.toString().indexOf("Error: Command failed:")!=-1){
28+
res.send(e)
29+
}else{
30+
res.send(e.cmd)
31+
}
32+
*/
33+
var compileError = /(g[/++/]|gcc|javac)/;
34+
if(e.cmd.toString().match(compileError)){
35+
res.status(200).send('ce');
36+
}else if(e.killed){
37+
res.status(200).send('TLE');
38+
}else{
39+
res.status(200).send('RE');
40+
}
41+
})
42+
}
43+
})
44+
2345
})
2446

2547
router.get('/a',(req,res)=>{

judge/utils/database/mongodb.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
const mongoose = require('mongoose')
2+
3+
mongoose.Promise = global.Promise
4+
mongoose.connect(process.env.MONGODB_URI || 'mongodb://localhost:27017/OnlineJudge',{useMongoClient:true})
5+
module.exports = {
6+
mongoose
7+
}

0 commit comments

Comments
 (0)