Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 59
0.00% covered (danger)
0.00%
0 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 1
FlyCutsCreatedTopUsersAction
0.00% covered (danger)
0.00%
0 / 59
0.00% covered (danger)
0.00%
0 / 4
90
0.00% covered (danger)
0.00%
0 / 1
 getTopUsers
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
 getUserById
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 formatUser
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
2
 execute
0.00% covered (danger)
0.00%
0 / 49
0.00% covered (danger)
0.00%
0 / 1
42
1<?php
2
3namespace App\Actions\AccountCenter\Reporting;
4
5use App\DTO\AccountCenter\Reporting\ReportingRequestDTO;
6use App\Http\Models\Auth\User;
7use App\Http\Models\Shortcut;
8use Carbon\Carbon;
9use MongoDB\BSON\UTCDateTime;
10
11class FlyCutsCreatedTopUsersAction extends AccountCenterReporting
12{
13    private function getTopUsers($user_usage_counts, $users)
14    {
15        return $user_usage_counts->take(5)->map(function ($count, $user_id) use ($users) {
16            $user = $this->getUserById($users, $user_id);
17
18            return $this->formatUser($user, $count);
19        });
20    }
21
22    private function getUserById($users, $user_id)
23    {
24        return $users->firstWhere('_id', $user_id);
25    }
26
27    private function formatUser($user, $count)
28    {
29        return [
30            'name' => $user->first_name.' '.$user->last_name,
31            'count' => $count,
32            'image' => $user->avatar,
33        ];
34    }
35
36    public function execute(ReportingRequestDTO $filter)
37    {
38        $users = User::select([
39            '_id',
40            'first_name',
41            'last_name',
42            'company_group_id',
43            'company_id',
44            'created_at',
45            'avatar',
46        ]);
47
48        $start_date = $filter->fromDate;
49        $end_date = $filter->toDate;
50
51        if ($start_date && $end_date) {
52            $start_date = Carbon::parse($start_date);
53            $end_date = Carbon::parse($end_date);
54        } else {
55            $start_date = Carbon::now()->subMonths(12);
56            $end_date = Carbon::now();
57        }
58
59        $user_ids = explode(',', $filter->userIds);
60        $user_ids = array_filter($user_ids, function ($value) {
61            return $value !== '';
62        });
63        if (count($user_ids) > 0) {
64            $users = $users->whereIn('_id', $user_ids);
65        }
66
67        $group_ids = explode(',', $filter->groupIds);
68        $group_ids = array_filter($group_ids, function ($value) {
69            return $value !== '';
70        });
71        if (count($group_ids) > 0) {
72            $users = $users->whereIn('company_group_id', $group_ids);
73        }
74
75        $subgroup_ids = explode(',', $filter->subgroupIds);
76        $subgroup_ids = array_filter($subgroup_ids, function ($value) {
77            return $value !== '';
78        });
79        if (count($subgroup_ids) > 0) {
80            $users = $users->whereIn('company_group_id', $subgroup_ids);
81        }
82
83        $users = $this->filterUsersByCompany($users, $filter->role, $group_ids, $filter->companyId, $filter->adminGroupIds);
84
85        $users = $users->get();
86        $ids = $users->pluck('id')->toArray();
87
88        $flycuts = Shortcut::withoutGlobalScopes()->whereIn('user_id', $ids)
89            ->where('user_defined', true)
90            ->whereBetween('created_at', [
91                new UTCDateTime($start_date->getTimestamp() * 1000),
92                new UTCDateTime($end_date->getTimestamp() * 1000),
93            ])
94            ->get();
95
96        // Aggregate and sort the data to find the top 5 users
97        $user_usage_counts = $flycuts->groupBy('user_id')->map(function ($userFlycuts) {
98            return $userFlycuts->count();
99        })->sortDesc();
100
101        // Get the top 5 users
102        $top_5_users = $this->getTopUsers($user_usage_counts, $users);
103
104        return $top_5_users;
105    }
106}