Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 82
0.00% covered (danger)
0.00%
0 / 1
CRAP
0.00% covered (danger)
0.00%
0 / 1
ReportingFlyCutsCreatedTopUsersRequest
0.00% covered (danger)
0.00%
0 / 82
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 / 82
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 ReportingFlyCutsCreatedTopUsersRequest {
12    /**
13     * Execute the action.
14     *
15     * @param  ReportingTopUsersRequestDTO $filter
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                ]
75            ],
76        ];
77
78        if ($hasFilter) {
79            $users = $users->get();
80
81            $ids = $users->pluck("id")->toArray();
82
83            $pipeline[] = [
84                '$match' => [
85                    'user_id' => ['$in' => $ids],
86                ]
87            ];
88        }
89
90        $pipeline[] = [
91            '$group' => [
92                '_id' => '$user_id',
93                'count' => ['$sum' => 1],
94            ]
95        ];
96
97        $pipeline[] = [
98            '$sort' => [
99                'count' => -1,
100            ]
101        ];
102
103        $pipeline[] = [
104            '$limit' => 5,
105        ];
106
107        $user_usage_counts = Shortcut::withoutGlobalScopes()->raw(function ($collection) use ($pipeline) {
108            return $collection->aggregate($pipeline);
109        });
110
111        if (!$hasFilter) {
112            $users = $users->whereIn("id", collect($user_usage_counts)->pluck("id"))->get();
113        }
114
115        $top_5_users = collect($user_usage_counts)->map(function ($item) use ($users) {
116            $user = $users->firstWhere('id', $item->_id);
117            $full_name = $user->first_name . ' ' . $user->last_name;
118            return [
119                'name' => $full_name,
120                'count' => $item->count,
121                'image' => $user->avatar,
122            ];
123        });
124
125        return $top_5_users->values();
126    }
127}