Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 83
0.00% covered (danger)
0.00%
0 / 1
CRAP
0.00% covered (danger)
0.00%
0 / 1
ReportingFlyPlatesAddedTopUsersRequest
0.00% covered (danger)
0.00%
0 / 83
0.00% covered (danger)
0.00%
0 / 1
110
0.00% covered (danger)
0.00%
0 / 1
 execute
0.00% covered (danger)
0.00%
0 / 83
0.00% covered (danger)
0.00%
0 / 1
110
1<?php
2
3namespace App\Actions;
4
5use App\DTO\ReportingTopUsersRequestDTO;
6use App\Http\Models\Auth\User;
7use App\Http\Models\Shortcut;
8use Illuminate\Support\Carbon;
9use MongoDB\BSON\UTCDateTime;
10
11class ReportingFlyPlatesAddedTopUsersRequest
12{
13    /**
14     * Execute the action.
15     *
16     * @return array
17     */
18    public function execute(ReportingTopUsersRequestDTO $filter)
19    {
20        $users = User::select([
21            '_id',
22            'first_name',
23            'last_name',
24            'company_group_id',
25            'company_id',
26            'created_at',
27            'avatar',
28        ]);
29
30        $start_date = $filter->fromDate;
31        $end_date = $filter->toDate;
32
33        if ($start_date && $end_date) {
34            $start_date = Carbon::parse($start_date);
35            $end_date = Carbon::parse($end_date);
36        } else {
37            $start_date = Carbon::now()->subMonths(12)->startOfMonth();
38            $end_date = Carbon::now()->endOfMonth();
39        }
40
41        $user_ids = explode(',', $filter->user_ids);
42        $user_ids = array_filter($user_ids, function ($value) {
43            return $value !== '';
44        });
45        if (count($user_ids) > 0) {
46            $users = $users->whereIn('_id', $user_ids);
47        }
48
49        $group_ids = explode(',', $filter->group_ids);
50        $group_ids = array_filter($group_ids, function ($value) {
51            return $value !== '';
52        });
53        if (count($group_ids) > 0) {
54            $users = $users->whereIn('company_group_id', $group_ids);
55        }
56
57        $subgroup_ids = explode(',', $filter->subgroup_ids);
58        $subgroup_ids = array_filter($subgroup_ids, function ($value) {
59            return $value !== '';
60        });
61        if (count($subgroup_ids) > 0) {
62            $users = $users->whereIn('company_group_id', $subgroup_ids);
63        }
64
65        $hasFilter = count($user_ids) || count($group_ids) || count($subgroup_ids);
66
67        $pipeline = [
68            [
69                '$match' => [
70                    'created_at' => [
71                        '$gte' => new UTCDateTime($start_date->getTimestamp() * 1000),
72                        '$lte' => new UTCDateTime($end_date->getTimestamp() * 1000),
73                    ],
74                    'user_defined' => ['$eq' => false],
75                ],
76            ],
77        ];
78
79        if ($hasFilter) {
80            $users = $users->get();
81
82            $ids = $users->pluck('id')->toArray();
83
84            $pipeline[] = [
85                '$match' => [
86                    'user_id' => ['$in' => $ids],
87                ],
88            ];
89        }
90
91        $pipeline[] = [
92            '$group' => [
93                '_id' => '$user_id',
94                'count' => ['$sum' => 1],
95            ],
96        ];
97
98        $pipeline[] = [
99            '$sort' => [
100                'count' => -1,
101            ],
102        ];
103
104        $pipeline[] = [
105            '$limit' => 5,
106        ];
107
108        $user_usage_counts = Shortcut::withoutGlobalScopes()->raw(function ($collection) use ($pipeline) {
109            return $collection->aggregate($pipeline);
110        });
111
112        if (! $hasFilter) {
113            $users = $users->whereIn('id', collect($user_usage_counts)->pluck('id'))->get();
114        }
115
116        $top_5_users = collect($user_usage_counts)->map(function ($item) use ($users) {
117            $user = $users->firstWhere('id', $item->_id);
118            $full_name = $user->first_name.' '.$user->last_name;
119
120            return [
121                'name' => $full_name,
122                'count' => $item->count,
123                'image' => $user->avatar,
124            ];
125        });
126
127        return $top_5_users->values();
128    }
129}