Passed
Pull Request — master (#610)
by John
06:15
created

User::setExtra()   B

Complexity

Conditions 7
Paths 6

Size

Total Lines 28
Code Lines 23

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 1 Features 0
Metric Value
cc 7
eloc 23
nc 6
nop 3
dl 0
loc 28
rs 8.6186
c 1
b 1
f 0
1
<?php
2
3
namespace App\Models\Eloquent;
4
5
use Illuminate\Notifications\Notifiable;
6
use Illuminate\Contracts\Auth\MustVerifyEmail;
7
use Illuminate\Foundation\Auth\User as Authenticatable;
8
use Laravel\Passport\HasApiTokens;
9
use App\Models\Eloquent\UserExtra;
10
use PDO;
11
12
class User extends Authenticatable
13
{
14
    use HasApiTokens, Notifiable;
0 ignored issues
show
Bug introduced by
The trait Illuminate\Notifications\Notifiable requires the property $email which is not provided by App\Models\Eloquent\User.
Loading history...
15
16
    protected $table='users';
17
18
    /**
19
     * The attributes that are mass assignable.
20
     *
21
     * @var array
22
     */
23
    protected $fillable=[
24
        'name', 'email', 'password', 'avatar', 'contest_account'
25
    ];
26
27
    /**
28
     * The attributes that should be hidden for arrays.
29
     *
30
     * @var array
31
     */
32
    protected $hidden=[
33
        'password', 'remember_token', 'tokens'
34
    ];
35
36
    public function banneds() {
37
        return $this->hasMany('App\Models\Eloquent\UserBanned');
38
    }
39
40
    public function announcements() {
41
        return $this->hasMany('App\Models\Eloquent\Announcement');
42
    }
43
44
    public function permissions() {
45
        return $this->hasMany('App\Models\Eloquent\UserPermission');
46
    }
47
48
    public function imagehostings() {
49
        return $this->hasMany('App\Models\Eloquent\Tool\ImageHosting');
50
    }
51
52
    public function extras() {
53
        return $this->hasMany('App\Models\Eloquent\UserExtra', 'uid');
54
    }
55
56
    public function hasPermission($permissionID){
57
        return ($this->permissions()->where(['permission_id'=>$permissionID])->count())>0;
58
    }
59
60
    public function hasIndependentPassword(){
61
        return filled($this->password);
62
    }
63
64
    public function hasIndependentEmail(){
65
        return !in_array(explode('@', $this->email)[1], ['temporary.email']) && !$this->contest_account;
66
    }
67
68
    public function isIndependent(){
69
        return $this->hasIndependentPassword() && $this->hasIndependentEmail();
70
    }
71
72
    /**
73
     * To get some extra info of a user.
74
     *
75
     * @param string|array $need An array is returned when an array is passed in, Only one value is returned when a string is passed in.
76
     * @param int|null $secretLevel the secret level this query currently running on
77
     * @return string|array $result
78
     */
79
    public function getExtra($need, $secretLevel = 0){
80
        $ret = $this->extras()->orderBy('key')->get()->toArray();
81
        $result = [];
82
        if(!empty($ret)){
83
            if(is_string($need)){
84
                foreach ($ret as $value) {
85
                    if(empty($value['secret_level']) || $value['secret_level'] <= $secretLevel){
86
                        $keyName = UserExtra::$extraMapping[$value['key']] ?? 'unknown';
87
                        if($keyName == $need){
88
                            return $value['value'];
89
                        }
90
                    }
91
                }
92
                return null;
93
            }else{
94
                foreach ($ret as $value) {
95
                    if(empty($value['secret_level']) || $value['secret_level'] <= $secretLevel){
96
                        $keyName = UserExtra::$extraMapping[$value['key']] ?? 'unknown';
97
                        if(in_array($keyName, $need)){
98
                            $result[$keyName] = $value['value'];
99
                        }
100
                    }
101
                }
102
            }
103
        }
104
        return $result;
105
    }
106
107
    /**
108
     * To set some extra info of a user.
109
     *
110
     * @param string $keyName insert when key not found or update when key exists. Only values declared in UserExtra Model are accepted
111
     * @param string|null $value the extra info will be delete when value is null
112
     * @param int|null $secretLevel the secret level this query currently running on
113
     * @return mixed $result
114
     */
115
    public function setExtra($keyName, $value = null, $secretLevel = -1){
116
        $key = array_search($keyName, UserExtra::$extraMapping);
117
        if($key === false){
118
            return false;
119
        }
120
        $ret = $this->extras()->where('key', $key)->limit(1)->get()->toArray();
121
        if(!empty($ret)){
122
            $ret = $ret[0];
123
            unset($ret['id']);
124
            if(!is_null($value)){
125
                $ret['value'] = $value;
126
            }else{
127
                $this->extras()->where('key', $key)->delete();
128
                return true;
129
            }
130
            if($secretLevel != -1){
131
                $ret['secret_level'] = $secretLevel;
132
            }
133
            return $this->extras()->where('key', $key)->update($ret);
134
        }else{
135
            if($value === null){
136
                return true;
137
            }
138
            return $this->extras()->create([
139
                'key' => $key,
140
                'value' => $value,
141
                'secret_level' => $secretLevel == -1 ? 0 : $secretLevel,
142
            ])->id;
143
        }
144
    }
145
146
    public function getSocialiteInfo($secretLevel = -1)
0 ignored issues
show
Unused Code introduced by
The parameter $secretLevel is not used and could be removed. ( Ignorable by Annotation )

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

146
    public function getSocialiteInfo(/** @scrutinizer ignore-unused */ $secretLevel = -1)

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
147
    {
148
        $socialites = [];
149
        foreach (UserExtra::$socialite_support as $key => $value) {
150
            $id_keyname = $key.'_id';
151
            $id = $this->getExtra($id_keyname);
152
            if(!empty($id)){
153
                $info = [
154
                    'id' => $id,
155
                ];
156
                foreach ($value as $info_name) {
157
                    $info_temp = $this->getExtra($key.'_'.$info_name);
158
                    if($info_temp !== null){
159
                        $info[$info_name] = $info_temp;
160
                    }
161
                }
162
                $socialites[$key] = $info;
163
            }
164
        }
165
166
        return $socialites;
167
    }
168
}
169