Completed
Push — master ( 3d3760...b0d42a )
by John
30s queued 13s
created

app/Http/Controllers/Ajax/ProblemController.php (1 issue)

1
<?php
2
3
namespace App\Http\Controllers\Ajax;
4
5
use App\Models\ProblemModel;
6
use App\Models\Submission\SubmissionModel;
7
use App\Models\ResponseModel;
8
use App\Models\CompilerModel;
9
use App\Babel\Babel;
10
use App\Http\Controllers\Controller;
11
use Illuminate\Http\Request;
12
use Illuminate\Http\Response;
13
use App\Jobs\ProcessSubmission;
14
use Illuminate\Support\Facades\Validator;
15
use Auth;
16
17
class ProblemController extends Controller
18
{
19
    /**
20
     * The Ajax Problem Solution Submit.
21
     *
22
     * @param Request $request web request
23
     *
24
     * @return Response
25
     */
26
    public function submitSolution(Request $request)
27
    {
28
        $problemModel=new ProblemModel();
29
        $submissionModel=new SubmissionModel();
30
        $compilerModel=new CompilerModel();
31
32
        $all_data=$request->all();
33
34
        $validator=Validator::make($all_data, [
35
            'solution' => 'required|string|max:65535',
36
        ]);
37
38
        if ($validator->fails()) {
39
            return ResponseModel::err(3002);
40
        }
41
        if (!$problemModel->ojdetail($problemModel->detail($problemModel->pcode($all_data['pid']))['OJ'])['status']) {
42
            return ResponseModel::err(6001);
43
        }
44
        if ($problemModel->isBlocked($all_data["pid"], isset($all_data["contest"]) ? $all_data["contest"] : null)) {
45
            return header("HTTP/1.1 403 Forbidden");
46
        }
47
48
        $lang=$compilerModel->detail($all_data["coid"]);
49
50
        $sid=$submissionModel->insert([
51
            'time'=>'0',
52
            'verdict'=>'Pending',
53
            'solution'=>$all_data["solution"],
54
            'language'=>$lang['display_name'],
55
            'submission_date'=>time(),
56
            'memory'=>'0',
57
            'uid'=>Auth::user()->id,
58
            'pid'=>$all_data["pid"],
59
            'remote_id'=>'',
60
            'coid'=>$all_data["coid"],
61
            'cid'=>isset($all_data["contest"]) ? $all_data["contest"] : null,
62
            'vcid'=>isset($all_data["vcid"]) ? $all_data["vcid"] : null,
63
            'jid'=>null,
64
            'score'=>0
65
        ]);
66
67
        $all_data["sid"]=$sid;
68
        $all_data["oj"]=$problemModel->ocode($all_data["pid"]);
69
        $all_data["lang"]=$lang['lcode'];
70
        dispatch(new ProcessSubmission($all_data))->onQueue($all_data["oj"]);
71
72
        return ResponseModel::success(200, null, [
73
            "sid"=>$sid
74
        ]);
75
    }
76
    /**
77
     * The Ajax Problem Status Check.
78
     *
79
     * @param Request $request web request
80
     *
81
     * @return Response
82
     */
83
    public function problemExists(Request $request)
84
    {
85
        $all_data=$request->all();
86
        $problemModel=new ProblemModel();
87
        $pcode=$problemModel->existPCode($all_data["pcode"]);
88
        if ($pcode) {
89
            return ResponseModel::success(200, null, [
0 ignored issues
show
Bug Best Practice introduced by
The expression return App\Models\Respon...ray('pcode' => $pcode)) returns the type Illuminate\Http\JsonResponse which is incompatible with the documented return type Illuminate\Http\Response.
Loading history...
90
                "pcode"=>$pcode
91
            ]);
92
        } else {
93
            return ResponseModel::err(3001);
94
        }
95
    }
96
    /**
97
     * The Ajax Problem Solution Discussion Submission.
98
     *
99
     * @param Request $request web request
100
     *
101
     * @return Response
102
     */
103
    public function submitSolutionDiscussion(Request $request)
104
    {
105
        $all_data=$request->all();
106
        $problemModel=new ProblemModel();
107
        $pid=$all_data["pid"];
108
        $content=$all_data["content"];
109
        $basic=$problemModel->basic($pid);
110
        if (empty($basic)) {
111
            return ResponseModel::err(3001);
112
        }
113
        $ret=$problemModel->addSolution($pid, Auth::user()->id, $content);
114
        return $ret ?ResponseModel::success(200) : ResponseModel::err(3003);
115
    }
116
    /**
117
     * The Ajax Problem Solution Discussion Update.
118
     *
119
     * @param Request $request web request
120
     *
121
     * @return Response
122
     */
123
    public function updateSolutionDiscussion(Request $request)
124
    {
125
        $all_data=$request->all();
126
        $problemModel=new ProblemModel();
127
        $psoid=$all_data["psoid"];
128
        $content=$all_data["content"];
129
        $ret=$problemModel->updateSolution($psoid, Auth::user()->id, $content);
130
        return $ret ?ResponseModel::success(200) : ResponseModel::err(3004);
131
    }
132
    /**
133
     * The Ajax Problem Solution Discussion Delete.
134
     *
135
     * @param Request $request web request
136
     *
137
     * @return Response
138
     */
139
    public function deleteSolutionDiscussion(Request $request)
140
    {
141
        $all_data=$request->all();
142
        $problemModel=new ProblemModel();
143
        $psoid=$all_data["psoid"];
144
        $ret=$problemModel->removeSolution($psoid, Auth::user()->id);
145
        return $ret ?ResponseModel::success(200) : ResponseModel::err(3004);
146
    }
147
    /**
148
     * The Ajax Problem Solution Discussion Vote.
149
     *
150
     * @param Request $request web request
151
     *
152
     * @return Response
153
     */
154
    public function voteSolutionDiscussion(Request $request)
155
    {
156
        $all_data=$request->all();
157
        $problemModel=new ProblemModel();
158
        $psoid=$all_data["psoid"];
159
        $type=$all_data["type"];
160
        $ret=$problemModel->voteSolution($psoid, Auth::user()->id, $type);
161
        return $ret["ret"] ?ResponseModel::success(200, null, ["votes"=>$ret["votes"], "select"=>$ret["select"]]) : ResponseModel::err(3004);
162
    }
163
    /**
164
     * The Ajax Problem Solution Submit.
165
     *
166
     * @param Request $request web request
167
     *
168
     * @return Response
169
     */
170
    public function downloadCode(Request $request)
171
    {
172
        $all_data=$request->all();
173
        $submissionModel=new SubmissionModel();
174
        $sid=$all_data["sid"];
175
        $downloadFile=$submissionModel->downloadCode($sid, Auth::user()->id);
176
        if (empty($downloadFile)) {
177
            return ResponseModel::err(2001);
178
        }
179
        return response()->streamDownload(function() use ($downloadFile) {
180
            echo $downloadFile["content"];
181
        }, $downloadFile["name"]);
182
    }
183
    /**
184
     * The Ajax Problem Judge.
185
     *
186
     * @param Request $request web request
187
     *
188
     * @return Response
189
     */
190
    public function judgeStatus(Request $request)
191
    {
192
        $all_data=$request->all();
193
        $submission=new SubmissionModel();
194
        $status=$submission->getJudgeStatus($all_data["sid"], Auth::user()->id);
195
        return ResponseModel::success(200, null, $status);
196
    }
197
198
    /**
199
     * The Ajax Problem Manual Judge.
200
     * [Notice] THIS FUNCTION IS FOR TEST ONLY
201
     * SHALL BE STRICTLY FORBIDDEN UNDER PRODUCTION ENVIRONMENT.
202
     *
203
     * @param Request $request web request
204
     *
205
     * @return Response
206
     */
207
    public function manualJudge(Request $request)
208
    {
209
        if (Auth::user()->id!=1) {
210
            return ResponseModel::err(2001);
211
        }
212
213
        $babel=new Babel();
214
        $vj_judge=$babel->judge();
215
216
        return ResponseModel::success(200, null, $vj_judge->ret);
217
    }
218
219
    /**
220
     * Get the Submit History.
221
     *
222
     * @param Request $request web request
223
     *
224
     * @return Response
225
     */
226
    public function submitHistory(Request $request)
227
    {
228
        $all_data=$request->all();
229
        $submission=new SubmissionModel();
230
        if (isset($all_data["cid"])) {
231
            $history=$submission->getProblemSubmission($all_data["pid"], Auth::user()->id, $all_data["cid"]);
232
        } else {
233
            $history=$submission->getProblemSubmission($all_data["pid"], Auth::user()->id);
234
        }
235
236
        return ResponseModel::success(200, null, ["history"=>$history]);
237
    }
238
239
    public function postDiscussion(Request $request)
240
    {
241
        $request->validate([
242
            'pid' => 'required|integer',
243
            'title' => 'required',
244
            'content' => 'required'
245
        ]);
246
        $all_data=$request->all();
247
        $problemModel=new ProblemModel();
248
        $pid=$all_data["pid"];
249
        $title=$all_data["title"];
250
        $content=$all_data["content"];
251
        $basic=$problemModel->basic($pid);
252
        if (empty($basic)) {
253
            return ResponseModel::err(3001);
254
        }
255
        $ret=$problemModel->addDiscussion(Auth::user()->id, $pid, $title, $content);
256
        return $ret ?ResponseModel::success(200, null, $ret) : ResponseModel::err(3003);
257
    }
258
259
    public function addComment(Request $request)
260
    {
261
        $request->validate([
262
            'pdid' => 'required|integer',
263
            'content' => 'required'
264
        ]);
265
        $all_data=$request->all();
266
        $problemModel=new ProblemModel();
267
        $pdid=$all_data['pdid'];
268
        $content=$all_data['content'];
269
        $reply_id=$all_data['reply_id'];
270
        $pid=$problemModel->pidByPdid($pdid);
271
        $basic=$problemModel->basic($pid);
272
        if (empty($basic)) {
273
            return ResponseModel::err(3001);
274
        }
275
        $ret=$problemModel->addComment(Auth::user()->id, $pdid, $content, $reply_id);
276
        return $ret ?ResponseModel::success(200, null, $ret) : ResponseModel::err(3003);
277
    }
278
  
279
    /**
280
     * Resubmit Submission Error Problems.
281
     *
282
     * @param Request $request web request
283
     *
284
     * @return Response
285
     */
286
    public function resubmitSolution(Request $request)
287
    {
288
        $all_data=$request->all();
289
        $submissionModel=new SubmissionModel();
290
        $problemModel=new ProblemModel();
291
        $compilerModel=new CompilerModel();
292
293
        $submissionData=$submissionModel->basic($all_data["sid"]);
294
295
        if ($submissionData["uid"]!=Auth::user()->id) {
296
            return ResponseModel::err(2001);
297
        }
298
299
        if ($submissionData["verdict"]!="Submission Error") {
300
            return ResponseModel::err(6003);
301
        }
302
303
        $submissionModel->updateSubmission($all_data["sid"], [
304
            "verdict"=>"Pending",
305
            "time"=>0,
306
            "memory"=>0
307
        ]);
308
309
        $problemDetails=$problemModel->basic($submissionData["pid"]);
310
        $lang=$compilerModel->detail($submissionData["coid"]);
311
312
        if (!$problemModel->ojdetail($problemDetails['OJ'])['status']) {
313
            return ResponseModel::err(6001);
314
        }
315
316
        $proceedData=[];
317
        $proceedData["lang"]=$lang["lcode"];
318
        $proceedData["pid"]=$problemDetails["pid"];
319
        $proceedData["pcode"]=$problemDetails["pcode"];
320
        $proceedData["cid"]=$problemDetails["contest_id"];
321
        $proceedData["contest"]=$submissionData["cid"];
322
        $proceedData["vcid"]=$submissionData["vcid"];
323
        $proceedData["iid"]=$problemDetails["index_id"];
324
        $proceedData["oj"]=$problemModel->ocode($problemDetails["pid"]);
325
        $proceedData["coid"]=$lang["coid"];
326
        $proceedData["solution"]=$submissionData["solution"];
327
        $proceedData["sid"]=$submissionData["sid"];
328
329
        dispatch(new ProcessSubmission($proceedData))->onQueue($proceedData["oj"]);
330
331
        return ResponseModel::success(200);
332
    }
333
}
334