Total Complexity | 51 |
Total Lines | 394 |
Duplicated Lines | 0 % |
Changes | 2 | ||
Bugs | 0 | Features | 1 |
Complex classes like ContestAdminController often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.
Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.
While breaking up the class, it is a good idea to analyze how other classes use ContestAdminController, and based on these observations, apply Extract Interface, too.
1 | <?php |
||
23 | class ContestAdminController extends Controller |
||
24 | { |
||
25 | public function assignMember(Request $request) |
||
26 | { |
||
27 | $request->validate([ |
||
28 | 'cid' => 'required|integer', |
||
29 | 'uid' => 'required|integer' |
||
30 | ]); |
||
31 | $cid=$request->input('cid'); |
||
32 | $uid=$request->input('uid'); |
||
33 | |||
34 | $groupModel=new GroupModel(); |
||
35 | $contestModel=new ContestModel(); |
||
36 | |||
37 | $contest_info=$contestModel->basic($cid); |
||
38 | if ($contestModel->judgeClearance($cid, Auth::user()->id)!=3) { |
||
|
|||
39 | return ResponseModel::err(2001); |
||
40 | } |
||
41 | |||
42 | if ($groupModel->judgeClearance($contest_info['gid'], $uid)<2) { |
||
43 | return ResponseModel::err(7004); |
||
44 | } |
||
45 | |||
46 | $contestModel->assignMember($cid, $uid); |
||
47 | return ResponseModel::success(200); |
||
48 | } |
||
49 | |||
50 | public function details(Request $request) |
||
51 | { |
||
52 | $request->validate([ |
||
53 | 'cid' => 'required|integer', |
||
54 | ]); |
||
55 | $cid=$request->input('cid'); |
||
56 | |||
57 | $contestModel=new ContestModel(); |
||
58 | $groupModel=new GroupModel(); |
||
59 | |||
60 | $contest_problems=$contestModel->problems($cid); |
||
61 | $contest_detail=$contestModel->basic($cid); |
||
62 | $contest_detail['problems']=$contest_problems; |
||
63 | $assign_uid=$contest_detail['assign_uid']; |
||
64 | $clearance=$contestModel->judgeClearance($cid, Auth::user()->id); |
||
65 | if ($clearance!=3) { |
||
66 | return ResponseModel::err(2001); |
||
67 | } |
||
68 | if ($assign_uid!=0) { |
||
69 | $assignee=$groupModel->userProfile($assign_uid, $contest_detail['gid']); |
||
70 | } else { |
||
71 | $assignee=null; |
||
72 | } |
||
73 | $ret=[ |
||
74 | 'contest_info' => $contest_detail, |
||
75 | 'assignee' => $assignee, |
||
76 | 'is_admin' => $clearance==3, |
||
77 | ]; |
||
78 | return ResponseModel::success(200, null, $ret); |
||
79 | } |
||
80 | |||
81 | public function rejudge(Request $request) |
||
82 | { |
||
83 | $request->validate([ |
||
84 | 'cid' => 'required|integer', |
||
85 | 'filter' => 'required', |
||
86 | ]); |
||
87 | |||
88 | $all_data=$request->all(); |
||
89 | $filter=$all_data['filter']; |
||
90 | $filter=Arr::where($filter, function ($value, $key) { |
||
91 | return in_array($value, [ |
||
92 | "Judge Error", |
||
93 | "System Error", |
||
94 | 'Submission Error', |
||
95 | "Runtime Error", |
||
96 | "Wrong Answer", |
||
97 | "Presentation Error", |
||
98 | "Compile Error", |
||
99 | "Time Limit Exceed", |
||
100 | "Real Time Limit Exceed", |
||
101 | "Memory Limit Exceed", |
||
102 | 'Output Limit Exceeded', |
||
103 | "Idleness Limit Exceed", |
||
104 | "Partially Accepted", |
||
105 | "Accepted", |
||
106 | ]); |
||
107 | }); |
||
108 | |||
109 | $contestModel=new ContestModel(); |
||
110 | if ($contestModel->judgeClearance($all_data['cid'], Auth::user()->id)<3) { |
||
111 | return ResponseModel::err(2001); |
||
112 | } |
||
113 | |||
114 | $rejudgeQueue=$contestModel->getRejudgeQueue($all_data["cid"], $filter); |
||
115 | |||
116 | foreach ($rejudgeQueue as $r) { |
||
117 | dispatch(new ProcessSubmission($r))->onQueue($r["oj"]); |
||
118 | } |
||
119 | |||
120 | return ResponseModel::success(200); |
||
121 | } |
||
122 | |||
123 | public function update(Request $request) |
||
124 | { |
||
125 | $request->validate([ |
||
126 | 'cid' => 'required|integer', |
||
127 | 'name' => 'required|max:255', |
||
128 | 'problems' => 'required|max:2550', |
||
129 | 'status_visibility' => 'required|integer', |
||
130 | 'begin_time' => 'required|date', |
||
131 | 'end_time' => 'required|date|after:begin_time', |
||
132 | 'description' => 'string' |
||
133 | ]); |
||
134 | $all_data=$request->all(); |
||
135 | $cid=$all_data['cid']; |
||
136 | |||
137 | $contestModel=new ContestModel(); |
||
138 | if ($contestModel->judgeClearance($all_data['cid'], Auth::user()->id)!=3) { |
||
139 | return ResponseModel::err(2001); |
||
140 | } |
||
141 | |||
142 | if ($contestModel->remainingTime($cid)>0) { |
||
143 | $problems=explode(",", $all_data["problems"]); |
||
144 | if (count($problems)>26) { |
||
145 | return ResponseModel::err(4002); |
||
146 | } |
||
147 | $i=0; |
||
148 | $problemSet=[]; |
||
149 | foreach ($problems as $p) { |
||
150 | if (!empty($p)) { |
||
151 | $i++; |
||
152 | $problemSet[]=[ |
||
153 | "number"=>$i, |
||
154 | "pcode"=>$p, |
||
155 | "points"=>100 |
||
156 | ]; |
||
157 | } |
||
158 | } |
||
159 | $allow_update=['name', 'description', 'begin_time', 'end_time', 'status_visibility']; |
||
160 | |||
161 | foreach ($all_data as $key => $value) { |
||
162 | if (!in_array($key, $allow_update)) { |
||
163 | unset($all_data[$key]); |
||
164 | } |
||
165 | } |
||
166 | $contestModel->contestUpdate($cid, $all_data, $problemSet); |
||
167 | return ResponseModel::success(200); |
||
168 | } else { |
||
169 | $allow_update=['name', 'description']; |
||
170 | |||
171 | foreach ($all_data as $key => $value) { |
||
172 | if (!in_array($key, $allow_update)) { |
||
173 | unset($all_data[$key]); |
||
174 | } |
||
175 | } |
||
176 | $contestModel->contestUpdate($cid, $all_data, false); |
||
177 | return ResponseModel::success(200, ' |
||
178 | Successful! However, only the name and description of the match can be changed for the match that has been finished. |
||
179 | '); |
||
180 | } |
||
181 | |||
182 | } |
||
183 | |||
184 | public function issueAnnouncement(Request $request) { |
||
185 | $request->validate([ |
||
186 | 'cid' => 'required|integer', |
||
187 | 'title' => 'required|string|max:250', |
||
188 | 'content' => 'required|string|max:65536', |
||
189 | ]); |
||
190 | |||
191 | $all_data=$request->all(); |
||
192 | |||
193 | $contestModel=new ContestModel(); |
||
194 | $clearance=$contestModel->judgeClearance($all_data["cid"], Auth::user()->id); |
||
195 | if ($clearance<3) { |
||
196 | return ResponseModel::err(2001); |
||
197 | } else { |
||
198 | return ResponseModel::success(200, null, [ |
||
199 | "ccid" => $contestModel->issueAnnouncement($all_data["cid"], $all_data["title"], $all_data["content"], Auth::user()->id) |
||
200 | ]); |
||
201 | } |
||
202 | } |
||
203 | |||
204 | public function replyClarification(Request $request) { |
||
205 | $request->validate([ |
||
206 | 'cid' => 'required|integer', |
||
207 | 'ccid' => 'required|integer', |
||
208 | 'content' => 'required|string|max:65536', |
||
209 | ]); |
||
210 | |||
211 | $all_data=$request->all(); |
||
212 | |||
213 | $contestModel=new ContestModel(); |
||
214 | $clearance=$contestModel->judgeClearance($all_data["cid"], Auth::user()->id); |
||
215 | if ($clearance<3) { |
||
216 | return ResponseModel::err(2001); |
||
217 | } else { |
||
218 | return ResponseModel::success(200, null, [ |
||
219 | "line" => $contestModel->replyClarification($all_data["ccid"], $all_data["content"]) |
||
220 | ]); |
||
221 | } |
||
222 | } |
||
223 | |||
224 | public function setClarificationPublic(Request $request) { |
||
225 | $request->validate([ |
||
226 | 'cid' => 'required|integer', |
||
227 | 'ccid' => 'required|integer', |
||
228 | 'public' => 'required', |
||
229 | ]); |
||
230 | |||
231 | $all_data=$request->all(); |
||
232 | |||
233 | $contestModel=new ContestModel(); |
||
234 | $clearance=$contestModel->judgeClearance($all_data["cid"], Auth::user()->id); |
||
235 | if ($clearance<3) { |
||
236 | return ResponseModel::err(2001); |
||
237 | } else { |
||
238 | return ResponseModel::success(200, null, [ |
||
239 | "line" => $contestModel->setClarificationPublic($all_data["ccid"], $all_data["public"]) |
||
240 | ]); |
||
241 | } |
||
242 | } |
||
243 | |||
244 | public function generateContestAccount(Request $request) |
||
245 | { |
||
246 | $request->validate([ |
||
247 | 'cid' => 'required|integer', |
||
248 | 'ccode' => 'required|min:3|max:10', |
||
249 | 'num' => 'required|integer|max:100' |
||
250 | ]); |
||
251 | |||
252 | $all_data=$request->all(); |
||
253 | |||
254 | $groupModel=new GroupModel(); |
||
255 | $contestModel=new ContestModel(); |
||
256 | $verified=$contestModel->isVerified($all_data["cid"]); |
||
257 | if (!$verified) { |
||
258 | return ResponseModel::err(2001); |
||
259 | } |
||
260 | $gid=$contestModel->gid($all_data["cid"]); |
||
261 | $clearance=$groupModel->judgeClearance($gid, Auth::user()->id); |
||
262 | if ($clearance<3) { |
||
263 | return ResponseModel::err(2001); |
||
264 | } |
||
265 | $accountModel=new AccountModel(); |
||
266 | $ret=$accountModel->generateContestAccount($all_data["cid"], $all_data["ccode"], $all_data["num"]); |
||
267 | $cache_data=Cache::tags(['contest', 'account'])->get($all_data["cid"]); |
||
268 | $cache_data[]=$ret; |
||
269 | Cache::tags(['contest', 'account'])->put($all_data["cid"], $cache_data); |
||
270 | return ResponseModel::success(200, null, $ret); |
||
271 | } |
||
272 | |||
273 | public function getScrollBoardData(Request $request) |
||
291 | } |
||
292 | |||
293 | public function downloadCode(Request $request) |
||
294 | { |
||
295 | $request->validate([ |
||
296 | "cid"=>"required|integer", |
||
297 | ]); |
||
298 | $cid=$request->input('cid'); |
||
299 | $groupModel=new GroupModel(); |
||
300 | $contestModel=new ContestModel(); |
||
301 | if ($contestModel->judgeClearance($cid, Auth::user()->id)!=3) { |
||
302 | return ResponseModel::err(2001); |
||
303 | } |
||
304 | |||
305 | $zip_name=$contestModel->zipName($cid); |
||
306 | if (!(Storage::disk("private")->exists("contestCodeZip/$cid/".$cid.".zip"))) { |
||
307 | $contestModel->GenerateZip("contestCodeZip/$cid/", $cid, "contestCode/$cid/", $zip_name); |
||
308 | } |
||
309 | |||
310 | $files=Storage::disk("private")->files("contestCodeZip/$cid/"); |
||
311 | response()->download(base_path("/storage/app/private/".$files[0]), $zip_name, [ |
||
312 | "Content-Transfer-Encoding" => "binary", |
||
313 | "Content-Type"=>"application/octet-stream", |
||
314 | "filename"=>$zip_name |
||
315 | ])->send(); |
||
316 | |||
317 | } |
||
318 | |||
319 | public function downloadPlagiarismReport(Request $request) |
||
333 | } |
||
334 | |||
335 | public function generatePDF(Request $request) |
||
336 | { |
||
337 | $request->validate([ |
||
338 | "cid"=>"required|integer", |
||
339 | "config.cover"=>"required", |
||
340 | "config.advice"=>"required", |
||
341 | "config.renderer"=>"required|string", |
||
342 | "config.formula"=>"required|string", |
||
343 | ]); |
||
344 | $cid=$request->input('cid'); |
||
345 | $renderer = $request->input('config.renderer'); |
||
346 | $formula = $request->input('config.formula'); |
||
347 | if($renderer == 'blink') { |
||
348 | if($formula != 'tex') { |
||
349 | return ResponseModel::err(4011, 'Illegal Formula Rendering Option.'); |
||
350 | } |
||
351 | } else if ($renderer == 'cpdf') { |
||
352 | if($formula != 'svg' && $formula != 'png') { |
||
353 | return ResponseModel::err(4011, 'Illegal Formula Rendering Option.'); |
||
354 | } |
||
355 | } else { |
||
356 | return ResponseModel::err(4011, 'Unknown Render Engine.'); |
||
357 | } |
||
358 | $config=[ |
||
359 | 'cover'=>$request->input('config.cover')=='true', |
||
360 | 'advice'=>$request->input('config.advice')=='true', |
||
361 | 'renderer'=>$renderer, |
||
362 | 'formula'=>$formula, |
||
363 | ]; |
||
364 | $contestModel=new ContestModel(); |
||
365 | if ($contestModel->judgeClearance($cid, Auth::user()->id)!=3) { |
||
366 | return ResponseModel::err(2001); |
||
367 | } |
||
368 | if (!is_null(Cache::tags(['contest', 'admin', 'PDFGenerate'])->get($cid))) { |
||
369 | return ResponseModel::err(8001); |
||
370 | } |
||
371 | $generateProcess=new GeneratePDF($cid, $config); |
||
372 | dispatch($generateProcess)->onQueue('normal'); |
||
373 | Cache::tags(['contest', 'admin', 'PDFGenerate'])->put($cid, $generateProcess->getJobStatusId()); |
||
374 | return ResponseModel::success(200, null, [ |
||
375 | 'JobStatusId'=>$generateProcess->getJobStatusId() |
||
376 | ]); |
||
377 | } |
||
378 | |||
379 | public function removePDF(Request $request) |
||
380 | { |
||
381 | $request->validate([ |
||
382 | "cid"=>"required|integer", |
||
383 | ]); |
||
384 | $cid=$request->input('cid'); |
||
385 | $contestModel=new ContestModel(); |
||
386 | if ($contestModel->judgeClearance($cid, Auth::user()->id)!=3) { |
||
387 | return ResponseModel::err(2001); |
||
388 | } |
||
389 | $contest=Contest::find($cid); |
||
390 | $contest->pdf=0; |
||
391 | $contest->save(); |
||
392 | return ResponseModel::success(200, null, []); |
||
393 | } |
||
394 | |||
395 | public function anticheat(Request $request) |
||
417 | } |
||
418 | } |
||
419 |