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      return $this->formatUser($user, $count);
18    });
19  }
20
21  private function getUserById($users, $user_id)
22  {
23    return $users->firstWhere('_id', $user_id);
24  }
25
26  private function formatUser($user, $count)
27  {
28    return [
29      'name' => $user->first_name . ' ' . $user->last_name,
30      'count' => $count,
31      'image' => $user->avatar
32    ];
33  }
34
35  public function execute(ReportingRequestDTO $filter)
36  {
37    $users = User::select([
38      "_id",
39      "first_name",
40      "last_name",
41      "company_group_id",
42      "company_id",
43      "created_at",
44      "avatar"
45    ]);
46
47    $start_date = $filter->fromDate;
48    $end_date = $filter->toDate;
49
50    if ($start_date && $end_date) {
51      $start_date = Carbon::parse($start_date);
52      $end_date = Carbon::parse($end_date);
53    } else {
54      $start_date = Carbon::now()->subMonths(12);
55      $end_date = Carbon::now();
56    }
57
58    $user_ids = explode(",", $filter->userIds);
59    $user_ids = array_filter($user_ids, function ($value) {
60      return $value !== "";
61    });
62    if (count($user_ids) > 0) {
63      $users = $users->whereIn("_id", $user_ids);
64    }
65
66    $group_ids = explode(",", $filter->groupIds);
67    $group_ids = array_filter($group_ids, function ($value) {
68      return $value !== "";
69    });
70    if (count($group_ids) > 0) {
71      $users = $users->whereIn("company_group_id", $group_ids);
72    }
73
74    $subgroup_ids = explode(",", $filter->subgroupIds);
75    $subgroup_ids = array_filter($subgroup_ids, function ($value) {
76      return $value !== "";
77    });
78    if (count($subgroup_ids) > 0) {
79      $users = $users->whereIn("company_group_id", $subgroup_ids);
80    }
81
82    $users = $this->filterUsersByCompany($users, $filter->role, $group_ids, $filter->companyId, $filter->adminGroupIds);
83
84    $users = $users->get();
85    $ids = $users->pluck("id")->toArray();
86
87    $flycuts = Shortcut::withoutGlobalScopes()->whereIn("user_id", $ids)
88      ->where('user_defined', true)
89      ->whereBetween("created_at", [
90        new UTCDateTime($start_date->getTimestamp() * 1000),
91        new UTCDateTime($end_date->getTimestamp() * 1000),
92      ])
93      ->get();
94
95    // Aggregate and sort the data to find the top 5 users
96    $user_usage_counts = $flycuts->groupBy('user_id')->map(function ($userFlycuts) {
97      return $userFlycuts->count();
98    })->sortDesc();
99
100    // Get the top 5 users
101    $top_5_users = $this->getTopUsers($user_usage_counts, $users);
102
103    return $top_5_users;
104  }
105}