Completed
Push — master ( a4261d...fc5e52 )
by John
14s
created

GroupController::createGroup()   B

Complexity

Conditions 6
Paths 5

Size

Total Lines 31
Code Lines 22

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 6
eloc 22
nc 5
nop 1
dl 0
loc 31
rs 8.9457
c 1
b 0
f 0
1
<?php
2
3
namespace App\Http\Controllers\Ajax;
4
5
use App\Models\ContestModel;
6
use App\Models\GroupModel;
7
use App\Models\ResponseModel;
8
use App\Models\AccountModel;
9
use App\Http\Controllers\Controller;
10
use Illuminate\Http\Request;
11
use Illuminate\Http\Response;
12
use Illuminate\Support\Facades\Storage;
13
use Auth;
14
15
class GroupController extends Controller
16
{
17
    /**
18
     * The Ajax Contest Arrange.
19
     *
20
     * @param Request $request web request
21
     *
22
     * @return JsonResponse
0 ignored issues
show
Bug introduced by
The type App\Http\Controllers\Ajax\JsonResponse was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
23
     */
24
    public function arrangeContest(Request $request)
25
    {
26
        $request->validate([
27
            'name' => 'required|max:255',
28
            'problems' => 'required|max:2550',
29
            'begin_time' => 'required|date',
30
            'end_time' => 'required|date|after:begin_time',
31
            'gid' => 'required|integer',
32
            'description' => 'string'
33
        ]);
34
35
        $all_data=$request->all();
36
37
        $contestModel=new ContestModel();
38
        $groupModel=new GroupModel();
39
        $clearance=$groupModel->judgeClearance($all_data["gid"], Auth::user()->id);
40
        if ($clearance<2) {
41
            return ResponseModel::err(2001);
0 ignored issues
show
Bug Best Practice introduced by
The expression return App\Models\ResponseModel::err(2001) returns the type Illuminate\Http\JsonResponse which is incompatible with the documented return type App\Http\Controllers\Ajax\JsonResponse.
Loading history...
42
        }
43
        $problems=explode(",", $all_data["problems"]);
44
        if (count($problems)>26) {
45
            return ResponseModel::err(4002);
0 ignored issues
show
Bug Best Practice introduced by
The expression return App\Models\ResponseModel::err(4002) returns the type Illuminate\Http\JsonResponse which is incompatible with the documented return type App\Http\Controllers\Ajax\JsonResponse.
Loading history...
46
        }
47
        $i=0;
48
        $problemSet=[];
49
        foreach ($problems as $p) {
50
            if (!empty($p)) {
51
                $i++;
52
                $problemSet[]=[
53
                    "number"=>$i,
54
                    "pcode"=>$p,
55
                    "points"=>100
56
                ];
57
            }
58
        }
59
60
        if (empty($problemSet)) {
61
            return ResponseModel::err(1003);
0 ignored issues
show
Bug Best Practice introduced by
The expression return App\Models\ResponseModel::err(1003) returns the type Illuminate\Http\JsonResponse which is incompatible with the documented return type App\Http\Controllers\Ajax\JsonResponse.
Loading history...
62
        }
63
64
        $contestModel->arrangeContest($all_data["gid"], [
65
            "assign_uid"=>Auth::user()->id,
66
            "name"=>$all_data["name"],
67
            "description"=>$all_data["description"],
68
            "begin_time"=>$all_data["begin_time"],
69
            "end_time"=>$all_data["end_time"],
70
            "practice"=>$all_data["practice"] ?? 0,
71
        ], $problemSet);
72
73
        return ResponseModel::success(200);
0 ignored issues
show
Bug Best Practice introduced by
The expression return App\Models\ResponseModel::success(200) returns the type Illuminate\Http\JsonResponse which is incompatible with the documented return type App\Http\Controllers\Ajax\JsonResponse.
Loading history...
74
    }
75
76
    public function changeGroupName(Request $request)
77
    {
78
        $request->validate([
79
            'gid' => 'required|integer',
80
            'group_name' => 'max:50',
81
        ]);
82
83
        $all_data=$request->all();
84
85
        $groupModel=new GroupModel();
86
        $clearance=$groupModel->judgeClearance($all_data["gid"], Auth::user()->id);
87
        if ($clearance < 2){
88
            return ResponseModel::err(2001);
89
        }
90
91
        $groupModel->changeGroupName($all_data["gid"], $all_data["group_name"]);
92
        return ResponseModel::success(200);
93
    }
94
95
    public function changeJoinPolicy(Request $request)
96
    {
97
        $request->validate([
98
            'gid' => 'required|integer',
99
            'join_policy' => 'required|integer',
100
        ]);
101
102
        $all_data=$request->all();
103
104
        $groupModel=new GroupModel();
105
        $clearance=$groupModel->judgeClearance($all_data["gid"], Auth::user()->id);
106
        if ($clearance < 2){
107
            return ResponseModel::err(2001);
108
        }
109
110
        if ($all_data["join_policy"] < 1 || $all_data["join_policy"] > 3){
111
            return ResponseModel::err(1007);
112
        }
113
114
        $groupModel->changeJoinPolicy($all_data["gid"], $all_data["join_policy"]);
115
        return ResponseModel::success(200);
116
    }
117
118
    public function changeGroupImage(Request $request)
119
    {
120
        $request->validate([
121
            'gid' => 'required|integer',
122
        ]);
123
124
        $all_data = $request->all();
125
126
        if (!empty($request->file('img')) && $request->file('img')->isValid()) {
127
            $extension=$request->file('img')->extension();
128
        } else {
129
            return ResponseModel::err(1005);
130
        }
131
132
        $allow_extension=['jpg', 'png', 'jpeg', 'gif', 'bmp'];
133
134
        $groupModel=new GroupModel();
135
        $clearance=$groupModel->judgeClearance($all_data["gid"], Auth::user()->id);
136
        if ($clearance < 2){
137
            return ResponseModel::err(2001);
138
        }
139
140
        if (!in_array($extension, $allow_extension)) {
141
            return ResponseModel::err(1005);
142
        }
143
144
        $path=$request->file('img')->store('/static/img/group', 'NOJPublic');
145
146
        $group=GroupModel::find($all_data["gid"]);
147
        $old_path=$group->img;
148
        if ($old_path!='/static/img/group/default.png' && $old_path!='/static/img/group/noj.png' && $old_path!='/static/img/group/icpc.png') {
149
            Storage::disk('NOJPublic')->delete($old_path);
150
        }
151
152
        $group->img='/'.$path;
0 ignored issues
show
Bug introduced by
Are you sure $path of type false|string can be used in concatenation? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

152
        $group->img='/'./** @scrutinizer ignore-type */ $path;
Loading history...
153
        $group->save();
154
155
        return ResponseModel::success(200, null, '/'.$path);
156
157
    }
158
159
    public function changeMemberClearance(Request $request)
160
    {
161
        $request->validate([
162
            'gid' => 'required|integer',
163
            'uid' => 'required|integer',
164
            'permission' => 'required|integer|max:3|min:1',
165
        ]);
166
167
        $all_data=$request->all();
168
169
        $groupModel=new GroupModel();
170
171
        $clearance=$groupModel->judgeClearance($all_data["gid"], Auth::user()->id);
172
        $target_clearance=$groupModel->judgeClearance($all_data["gid"], $all_data['uid']);
173
174
        if($target_clearance == -3){
175
            return ResponseModel::err(7004);
176
        }
177
178
        if($target_clearance >= $clearance || $clearance < 2 || $all_data['permission'] >= $clearance){
179
            return ResponseModel::err(2001);
180
        }
181
182
        $groupModel->changeClearance($all_data['uid'], $all_data["gid"], $all_data['permission']);
183
184
        $result_info = $groupModel->userProfile($all_data['uid'],$all_data["gid"]);
185
        return ResponseModel::success(200,null,$result_info);
186
    }
187
188
    public function generateContestAccount(Request $request)
189
    {
190
        $request->validate([
191
            'cid' => 'required|integer',
192
            'ccode' => 'required|min:3|max:10',
193
            'num' => 'required|integer'
194
        ]);
195
196
        $all_data=$request->all();
197
198
        $groupModel=new GroupModel();
199
        $contestModel=new ContestModel();
200
        $gid=$contestModel->gid($all_data["cid"]);
201
        $clearance=$groupModel->judgeClearance($gid, Auth::user()->id);
202
        if ($clearance<3) {
203
            return ResponseModel::err(2001);
204
        }
205
        $accountModel=new AccountModel();
206
        $ret=$accountModel->generateContestAccount($all_data["cid"], $all_data["ccode"], $all_data["num"]);
207
        return ResponseModel::success(200, null, $ret);
208
    }
209
210
    public function changeNickName(Request $request)
211
    {
212
        $request->validate([
213
            'gid' => 'required|integer',
214
            'nick_name' => 'max:50',
215
        ]);
216
217
        $all_data=$request->all();
218
219
        $groupModel=new GroupModel();
220
        $clearance=$groupModel->judgeClearance($all_data["gid"], Auth::user()->id);
221
        if ($clearance<1) {
222
            return ResponseModel::err(2001);
223
        }
224
        $groupModel->changeNickName($all_data["gid"], Auth::user()->id, $all_data["nick_name"]);
225
        return ResponseModel::success(200);
226
    }
227
228
    public function joinGroup(Request $request)
229
    {
230
        $request->validate([
231
            'gid' => 'required|integer',
232
        ]);
233
234
        $all_data=$request->all();
235
236
        $groupModel=new GroupModel();
237
        $join_policy=$groupModel->joinPolicy($all_data["gid"]);
238
        if (is_null($join_policy)) {
239
            return ResponseModel::err(7001);
240
        }
241
        $clearance=$groupModel->judgeClearance($all_data["gid"], Auth::user()->id);
242
        if ($join_policy==3) {
243
            if ($clearance==-1) {
244
                $groupModel->changeClearance(Auth::user()->id, $all_data["gid"], 1);
245
            } elseif ($clearance==-3) {
246
                $groupModel->addClearance(Auth::user()->id, $all_data["gid"], 0);
247
            }
248
            return ResponseModel::success(200);
249
        }
250
    }
251
252
    public function approveMember(Request $request)
253
    {
254
        $request->validate([
255
            'gid' => 'required|integer',
256
            'uid' => 'required|integer',
257
        ]);
258
259
        $all_data=$request->all();
260
261
        $groupModel=new GroupModel();
262
        $clearance=$groupModel->judgeClearance($all_data["gid"], Auth::user()->id);
263
        $targetClearance=$groupModel->judgeClearance($all_data["gid"], $all_data["uid"]);
264
        if ($clearance>1) {
265
            if($targetClearance!=0) {
266
                return ResponseModel::err(7003);
267
            }
268
            $groupModel->changeClearance($all_data["uid"], $all_data["gid"], 1);
269
            return ResponseModel::success(200);
270
        }
271
        return ResponseModel::err(7002);
272
    }
273
274
    public function removeMember(Request $request)
275
    {
276
        $request->validate([
277
            'gid' => 'required|integer',
278
            'uid' => 'required|integer',
279
        ]);
280
281
        $all_data=$request->all();
282
283
        $groupModel=new GroupModel();
284
        $clearance=$groupModel->judgeClearance($all_data["gid"], Auth::user()->id);
285
        $targetClearance=$groupModel->judgeClearance($all_data["gid"], $all_data["uid"]);
286
        if ($clearance>1 && $clearance>$targetClearance) {
287
            $groupModel->removeClearance($all_data["uid"], $all_data["gid"]);
288
            return ResponseModel::success(200);
289
        }
290
        return ResponseModel::err(7002);
291
    }
292
293
    public function inviteMember(Request $request)
294
    {
295
        $request->validate([
296
            'gid' => 'required|integer',
297
            'email' => 'required|email',
298
        ]);
299
300
        $all_data=$request->all();
301
302
        $groupModel=new GroupModel();
303
        $is_user=$groupModel->isUser($all_data["email"]);
304
        if(!$is_user) return ResponseModel::err(2006);
305
        $clearance=$groupModel->judgeClearance($all_data["gid"], Auth::user()->id);
306
        if($clearance<2) return ResponseModel::err(7002);
307
        $targetClearance=$groupModel->judgeEmailClearance($all_data["gid"], $all_data["email"]);
308
        if($targetClearance!=-3) return ResponseModel::err(7003);
309
        $groupModel->inviteMember($all_data["gid"], $all_data["email"]);
310
        return ResponseModel::success(200);
311
    }
312
313
    public function createGroup(Request $request)
314
    {
315
        $request->validate([
316
            'gcode' => 'required|alpha_dash|min:3|max:50',
317
            'name' => 'required|min:3|max:50',
318
            'public' => 'required|integer|min:1|max:2',
319
            'description' => 'nullable|max:60000',
320
            'join_policy'  => 'required|integer|min:1|max:3'
321
        ]);
322
323
        $all_data=$request->all();
324
325
        $groupModel=new GroupModel();
326
        if($all_data["gcode"]=="create") return ResponseModel::err(7005);
327
        $is_group=$groupModel->isGroup($all_data["gcode"]);
328
        if($is_group) return ResponseModel::err(7006);
329
330
        $allow_extension=['jpg', 'png', 'jpeg', 'gif', 'bmp'];
331
        if (!empty($request->file('img')) && $request->file('img')->isValid()) {
332
            $extension=$request->file('img')->extension();
333
            if (!in_array($extension, $allow_extension)) {
334
                return ResponseModel::err(1005);
335
            }
336
            $path=$request->file('img')->store('/static/img/group', 'NOJPublic');
337
        } else {
338
            $path="static/img/group/default.png";
339
        }
340
        $img='/'.$path;
0 ignored issues
show
Bug introduced by
Are you sure $path of type false|string can be used in concatenation? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

340
        $img='/'./** @scrutinizer ignore-type */ $path;
Loading history...
341
342
        $groupModel->createGroup(Auth::user()->id, $all_data["gcode"], $img, $all_data["name"], $all_data["public"], $all_data["description"], $all_data["join_policy"]);
343
        return ResponseModel::success(200);
344
    }
345
346
    public function createNotice(Request $request)
347
    {
348
        $request->validate([
349
            'gid' => 'required|integer',
350
            'title' => 'required|min:3|max:50',
351
            'content' => 'required|min:3|max:60000',
352
        ]);
353
354
        $all_data=$request->all();
355
356
        $groupModel=new GroupModel();
357
        $clearance=$groupModel->judgeClearance($all_data["gid"], Auth::user()->id);
358
        if ($clearance < 2){
359
            return ResponseModel::err(2001);
360
        }
361
        $groupModel->createNotice($all_data["gid"], Auth::user()->id, $all_data["title"], $all_data["content"]);
362
        return ResponseModel::success(200);
363
    }
364
365
    public function addProblemTag(Request $request)
366
    {
367
        $request->validate([
368
            'gid' => 'required|integer',
369
            'pid' => 'required|integer',
370
            'tag' => 'required|string',
371
        ]);
372
373
        $all_data=$request->all();
374
375
        $groupModel=new GroupModel();
376
        $clearance=$groupModel->judgeClearance($all_data["gid"], Auth::user()->id);
377
        if ($clearance < 2) {
378
            return ResponseModel::err(7002);
379
        }
380
        $tags = $groupModel->problemTags($all_data['gid'],$all_data['pid']);
381
        if(in_array($all_data['tag'],$tags)){
382
            return ResponseModel::err(7007);
383
        }
384
385
        $groupModel->problemAddTag($all_data["gid"], $all_data["pid"], $all_data["tag"]);
386
        return ResponseModel::success(200);
387
    }
388
389
    public function removeProblemTag(Request $request)
390
    {
391
        $request->validate([
392
            'gid' => 'required|integer',
393
            'pid' => 'required|integer',
394
            'tag' => 'required|string',
395
        ]);
396
397
        $all_data=$request->all();
398
399
        $groupModel=new GroupModel();
400
        $clearance=$groupModel->judgeClearance($all_data["gid"], Auth::user()->id);
401
        if ($clearance>1) {
402
            $groupModel->problemRemoveTag($all_data["gid"], $all_data["pid"], $all_data["tag"]);
403
            return ResponseModel::success(200);
404
        }
405
        return ResponseModel::err(7002);
406
    }
407
408
    public function getPracticeStat(Request $request)
409
    {
410
        $request->validate([
411
            'gid' => 'required|string',
412
            'mode' => 'required'
413
        ]);
414
415
        $all_data=$request->all();
416
417
        $groupModel=new GroupModel();
418
        $clearance=$groupModel->judgeClearance($all_data["gid"], Auth::user()->id);
419
        if ($clearance>2) {
420
            switch($all_data['mode']){
421
                case 'contest':
422
                    $ret = $groupModel->groupMemberPracticeContestStat($all_data["gid"]);
423
                break;
424
                case 'tag':
425
                    $ret = $groupModel->groupMemberPracticeTagStat($all_data["gid"]);
426
                break;
427
                default:
428
                    return ResponseModel::err(1007);
429
                break;
0 ignored issues
show
Unused Code introduced by
break is not strictly necessary here and could be removed.

The break statement is not necessary if it is preceded for example by a return statement:

switch ($x) {
    case 1:
        return 'foo';
        break; // This break is not necessary and can be left off.
}

If you would like to keep this construct to be consistent with other case statements, you can safely mark this issue as a false-positive.

Loading history...
430
            }
431
432
            return ResponseModel::success(200,null,$ret);
433
        }
434
        return ResponseModel::err(7002);
435
    }
436
}
437