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
FlyPostAiUsedTopUsersAction
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\FlyMsgAI\FlyMsgAITracking;
8use Carbon\Carbon;
9use MongoDB\BSON\UTCDateTime;
10
11class FlyPostAiUsedTopUsersAction 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
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
89    $flypost_ai = FlyMsgAITracking::whereIn("user_id", $ids)
90      ->whereBetween("created_at", [
91        new UTCDateTime($start_date->getTimestamp() * 1000),
92        new UTCDateTime($end_date->getTimestamp() * 1000),
93      ])
94      ->where("feature", "=", "flypost")
95      ->get();
96
97    // Aggregate and sort the data to find the top 5 users
98    $user_usage_counts = $flypost_ai->groupBy('user_id')->map(function ($userFlycuts) {
99      return $userFlycuts->count();
100    })->sortDesc();
101
102    // Get the top 5 users
103    $top_5_users = $this->getTopUsers($user_usage_counts, $users);
104
105    return $top_5_users;
106  }
107}