Passed
Push — master ( e5b3d1...49cab3 )
by John
03:29
created

GroupModel::isMember()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 4
nc 1
nop 2
dl 0
loc 6
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace App\Models;
4
5
use GrahamCampbell\Markdown\Facades\Markdown;
6
use Illuminate\Database\Eloquent\Model;
7
use Illuminate\Support\Facades\DB;
8
9
class GroupModel extends Model
10
{
11
    protected $tableName='group';
12
    public $role=[
13
        "-3"=>"None",
14
        "-1"=>"Invited",
15
        "0"=>"Pending",
16
        "1"=>"Member",
17
        "2"=>"Manager",
18
        "3"=>"Leader"
19
    ];
20
    public $role_color=[
21
        "-3"=>"wemd-black",
22
        "-1"=>"wemd-deep-purple",
23
        "0"=>"wemd-red",
24
        "1"=>"wemd-grey",
25
        "2"=>"wemd-light-blue",
26
        "3"=>"wemd-amber"
27
    ];
28
29
    public function tendingGroups()
30
    {
31
        $tending_groups=DB::table($this->tableName)->where(["public"=>1])->orderBy('create_time', 'desc')->select("gid", "gcode", "img", "name", "verified")->limit(12)->get()->all(); //Fake Tending
32
        foreach ($tending_groups as &$t) {
33
            $t["members"]=$this->countGroupMembers($t["gid"]);
34
        }
35
        return $tending_groups;
36
    }
37
38
    public function userGroups($uid)
39
    {
40
        $user_groups=DB::table("group_member")->join("group", "group_member.gid", "=", "group.gid")->where(["uid"=>$uid])->select("group.gid as gid", "gcode", "img", "name", "verified")->limit(12)->get()->all();
41
        foreach ($user_groups as &$m) {
42
            $m["members"]=$this->countGroupMembers($m["gid"]);
43
        }
44
        return $user_groups;
45
    }
46
47
    public function countGroupMembers($gid)
48
    {
49
        return DB::table("group_member")->where(["gid"=>$gid])->count();
50
    }
51
52
    public function getGroupTags($gid)
53
    {
54
        return DB::table("group_tag")->where(["gid"=>$gid])->select("tag")->get()->all();
55
    }
56
57
    public function countGroupContest($gid)
58
    {
59
        return [
60
            "contest_ahead" => DB::table("contest")->where(["gid"=>$gid])->where("begin_time", ">", DB::raw("now()"))->count(),
61
            "contest_going" => DB::table("contest")->where(["gid"=>$gid])->where("begin_time", "<=", DB::raw("now()"))->where("end_time", ">=", DB::raw("now()"))->count(),
62
            "contest_end" => DB::table("contest")->where(["gid"=>$gid])->where("end_time", "<", DB::raw("now()"))->count()
63
        ];
64
    }
65
66
    public function changeNickName($gid, $uid, $nickName)
67
    {
68
        return DB::table("group_member")->where(["gid"=>$gid, "uid"=>$uid])->update([
69
            "nick_name"=>$nickName
70
        ]);
71
    }
72
73
    public function details($gcode)
74
    {
75
        $basic_info=DB::table($this->tableName)->where(["gcode"=>$gcode])->first();
76
        $basic_info["members"]=$this->countGroupMembers($basic_info["gid"]);
77
        $basic_info["tags"]=$this->getGroupTags($basic_info["gid"]);
78
        $basic_info["create_time_foramt"]=date_format(date_create($basic_info["create_time"]), 'M jS, Y');
79
        $basic_info["contest_stat"]=$this->countGroupContest($basic_info["gid"]);
80
        return $basic_info;
81
    }
82
83
    public function joinPolicy($gid)
84
    {
85
        $ret=DB::table($this->tableName)->where(["gid"=>$gid])->first();
86
        return empty($ret) ? null : $ret["join_policy"];
87
    }
88
89
    public function userProfile($uid, $gid)
90
    {
91
        $info=DB::table("group_member")->where(["gid"=>$gid, "uid"=>$uid])->where("role", ">", 0)->first();
92
        if (!empty($info)) {
93
            $info["role_parsed"]=$this->role[$info["role"]];
94
        }
95
        return $info;
96
    }
97
98
    public function userList($gid)
99
    {
100
        $user_list=DB::table("group_member")->join(
101
            "users",
102
            "users.id",
103
            "=",
104
            "group_member.uid"
105
        )->where(["gid"=>$gid])->orderBy('role', 'desc')->select(
106
            "role",
107
            "uid",
108
            "name",
109
            "nick_name",
110
            "avatar"
111
        )->get()->all();
112
        foreach ($user_list as &$u) {
113
            $u["role_parsed"]=$this->role[$u["role"]];
114
            $u["role_color"]=$this->role_color[$u["role"]];
115
        }
116
        return $user_list;
117
    }
118
119
    public function groupNotice($gid)
120
    {
121
        $notice_item=DB::table("group_notice")->where(["gid"=>$gid])->first();
122
        if (empty($notice_item)) {
123
            return [];
124
        }
125
        $notice_author=DB::table("users")->where(["id"=>$notice_item["uid"]])->first();
126
        $notice_item["name"]=$notice_author["name"];
127
        $notice_item["avatar"]=$notice_author["avatar"];
128
        $notice_item["post_date_parsed"]=$this->formatPostTime($notice_item["post_date"]);
129
        $notice_item["content_parsed"]=clean(Markdown::convertToHtml($notice_item["content"]));
130
        return $notice_item;
131
    }
132
133
    public function judgeClearance($gid, $uid)
134
    {
135
        $ret=DB::table("group_member")->where(["gid"=>$gid, "uid"=>$uid])->first();
136
        return empty($ret) ? -3 : $ret["role"];
137
    }
138
139
    public function changeClearance($uid, $gid, $clearance)
140
    {
141
        return DB::table("group_member")->where([
142
            "uid"=>$uid,
143
            "gid"=>$gid
144
        ])->update([
145
            "role"=>$clearance
146
        ]);
147
    }
148
149
    public function addClearance($uid, $gid, $clearance)
150
    {
151
        return DB::table("group_member")->insert([
152
            "uid"=>$uid,
153
            "gid"=>$gid,
154
            "role"=>$clearance,
155
            "join_time"=>date("Y-m-d H:i:s")
156
        ]);
157
    }
158
159
    public function isMember($gid, $uid)
160
    {
161
        return DB::table("group_member")->where([
162
            "gid"=> $gid,
163
            "uid"=> $uid
164
        ])->where("role", ">", 0)->count();
165
    }
166
167
    public function formatPostTime($date)
168
    {
169
        $periods=["second", "minute", "hour", "day", "week", "month", "year", "decade"];
170
        $lengths=["60", "60", "24", "7", "4.35", "12", "10"];
171
172
        $now=time();
173
        $unix_date=strtotime($date);
174
175
        if (empty($unix_date)) {
176
            return "Bad date";
177
        }
178
179
        if ($now>$unix_date) {
180
            $difference=$now-$unix_date;
181
            $tense="ago";
182
        } else {
183
            $difference=$unix_date-$now;
184
            $tense="from now";
185
        }
186
187
        for ($j=0; $difference>=$lengths[$j] && $j<count($lengths)-1; $j++) {
188
            $difference/=$lengths[$j];
189
        }
190
191
        $difference=round($difference);
192
193
        if ($difference!=1) {
194
            $periods[$j].="s";
195
        }
196
197
        return "$difference $periods[$j] {$tense}";
198
    }
199
}
200