Passed
Branch dev (36fa10)
by John
04:08
created

GroupManageController::changeMemberClearance()   A

Complexity

Conditions 5
Paths 3

Size

Total Lines 27
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

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

159
        $group->img='/'./** @scrutinizer ignore-type */ $path;
Loading history...
160
        $group->save();
161
162
        return ResponseModel::success(200, null, '/'.$path);
163
164
    }
165
166
    public function changeMemberClearance(Request $request)
167
    {
168
        $request->validate([
169
            'gid' => 'required|integer',
170
            'uid' => 'required|integer',
171
            'permission' => 'required|integer|max:3|min:1',
172
        ]);
173
174
        $all_data=$request->all();
175
176
        $groupModel=new GroupModel();
177
178
        $clearance=$groupModel->judgeClearance($all_data["gid"], Auth::user()->id);
179
        $target_clearance=$groupModel->judgeClearance($all_data["gid"], $all_data['uid']);
180
181
        if($target_clearance == -3){
182
            return ResponseModel::err(7004);
183
        }
184
185
        if($target_clearance >= $clearance || $clearance < 2 || $all_data['permission'] >= $clearance){
186
            return ResponseModel::err(2001);
187
        }
188
189
        $groupModel->changeClearance($all_data['uid'], $all_data["gid"], $all_data['permission']);
190
191
        $result_info = $groupModel->userProfile($all_data['uid'],$all_data["gid"]);
192
        return ResponseModel::success(200,null,$result_info);
193
    }
194
195
    public function approveMember(Request $request)
196
    {
197
        $request->validate([
198
            'gid' => 'required|integer',
199
            'uid' => 'required|integer',
200
        ]);
201
202
        $all_data=$request->all();
203
204
        $groupModel=new GroupModel();
205
        $clearance=$groupModel->judgeClearance($all_data["gid"], Auth::user()->id);
206
        $targetClearance=$groupModel->judgeClearance($all_data["gid"], $all_data["uid"]);
207
        if ($clearance>1) {
208
            if($targetClearance!=0) {
209
                return ResponseModel::err(7003);
210
            }
211
            $groupModel->changeClearance($all_data["uid"], $all_data["gid"], 1);
212
            return ResponseModel::success(200);
213
        }
214
        return ResponseModel::err(7002);
215
    }
216
217
    public function removeMember(Request $request)
218
    {
219
        $request->validate([
220
            'gid' => 'required|integer',
221
            'uid' => 'required|integer',
222
        ]);
223
224
        $all_data=$request->all();
225
226
        $groupModel=new GroupModel();
227
        $clearance=$groupModel->judgeClearance($all_data["gid"], Auth::user()->id);
228
        $targetClearance=$groupModel->judgeClearance($all_data["gid"], $all_data["uid"]);
229
        if ($clearance>1 && $clearance>$targetClearance) {
230
            $groupModel->removeClearance($all_data["uid"], $all_data["gid"]);
231
            return ResponseModel::success(200);
232
        }
233
        return ResponseModel::err(7002);
234
    }
235
236
    public function inviteMember(Request $request)
237
    {
238
        $request->validate([
239
            'gid' => 'required|integer',
240
            'email' => 'required|email',
241
        ]);
242
243
        $all_data=$request->all();
244
245
        $groupModel=new GroupModel();
246
        $is_user=$groupModel->isUser($all_data["email"]);
247
        if(!$is_user) return ResponseModel::err(2006);
248
        $clearance=$groupModel->judgeClearance($all_data["gid"], Auth::user()->id);
249
        if($clearance<2) return ResponseModel::err(7002);
250
        $targetClearance=$groupModel->judgeEmailClearance($all_data["gid"], $all_data["email"]);
251
        if($targetClearance!=-3) return ResponseModel::err(7003);
252
        $groupModel->inviteMember($all_data["gid"], $all_data["email"]);
253
        return ResponseModel::success(200);
254
    }
255
256
    public function changeSubGroup(Request $request)
257
    {
258
        $request->validate([
259
            'gid'=>'required|integer',
260
            'uid'=>'required|integer',
261
            'sub'=>'nullable|max:60000'
262
        ]);
263
264
        $all_data=$request->all();
265
266
        $groupModel=new GroupModel();
267
        $clearance=$groupModel->judgeClearance($all_data["gid"], Auth::user()->id);
268
        $targetClearance=$groupModel->judgeClearance($all_data["gid"], $all_data["uid"]);
269
        if ($clearance>1 && $clearance>=$targetClearance) {
270
            $groupModel->changeGroup($all_data["uid"], $all_data["gid"], $all_data["sub"]);
271
            return ResponseModel::success(200);
272
        }
273
        return ResponseModel::err(7002);
274
    }
275
276
    public function createNotice(Request $request)
277
    {
278
        $request->validate([
279
            'gid' => 'required|integer',
280
            'title' => 'required|min:3|max:50',
281
            'content' => 'required|min:3|max:60000',
282
        ]);
283
284
        $all_data=$request->all();
285
286
        $groupModel=new GroupModel();
287
        $clearance=$groupModel->judgeClearance($all_data["gid"], Auth::user()->id);
288
        if ($clearance < 2){
289
            return ResponseModel::err(2001);
290
        }
291
        $groupModel->createNotice($all_data["gid"], Auth::user()->id, $all_data["title"], $all_data["content"]);
292
        return ResponseModel::success(200);
293
    }
294
}
295