Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 109
0.00% covered (danger)
0.00%
0 / 8
CRAP
0.00% covered (danger)
0.00%
0 / 1
UserController
0.00% covered (danger)
0.00%
0 / 109
0.00% covered (danger)
0.00%
0 / 8
552
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 users
0.00% covered (danger)
0.00%
0 / 36
0.00% covered (danger)
0.00%
0 / 1
56
 user_exists
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
2
 userDetails
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
6
 add_by_email
0.00% covered (danger)
0.00%
0 / 12
0.00% covered (danger)
0.00%
0 / 1
2
 reactivateIndividualUsers
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
 pushItToHubspot
0.00% covered (danger)
0.00%
0 / 13
0.00% covered (danger)
0.00%
0 / 1
20
 recalculateUserInfo
0.00% covered (danger)
0.00%
0 / 33
0.00% covered (danger)
0.00%
0 / 1
42
1<?php
2
3namespace App\Http\Controllers\v2\Company;
4
5use App\Enums\HttpStatusCode;
6use App\Http\Controllers\Controller;
7use App\Http\Models\Auth\User;
8use App\Http\Models\FlyCutUsage;
9use App\Http\Models\FlyMsgUserDailyUsage;
10use App\Http\Models\Subscription;
11use App\Http\Models\UserInfo;
12use App\Http\Requests\CompanyUserExistsFormRequest;
13use App\Http\Requests\CreateCompanyUserByEmailRequest;
14use App\Http\Requests\ReactivateIndividualUsersRequest;
15use App\Http\Resources\ClientManagementUserV2Resource;
16use App\Http\Resources\UserDetailsResource;
17use App\Http\Services\Admin\Companies\CompanyUsersService;
18use App\Http\Services\Admin\Users\AdminUsersService;
19use App\Http\Services\Admin\Users\IndividualUsersService;
20use App\Services\UserInfo\FlyMsgUserDailyUsageService;
21use App\Services\UserInfo\UserInfoService;
22use Illuminate\Http\JsonResponse;
23use Illuminate\Http\Request;
24
25class UserController extends Controller
26{
27    public function __construct(
28        private CompanyUsersService $companyUsersService,
29        private IndividualUsersService $individualUsersService,
30        private readonly UserInfoService $userInfoService,
31        private readonly FlyMsgUserDailyUsageService $flyMsgUserDailyUsageService,
32        private readonly AdminUsersService $adminUsersService,
33    ) {}
34
35    public function users(Request $request): JsonResponse
36    {
37        $deactivated = $request->has('deactivated') && $request->deactivated == 'true';
38        $perPage = intval(request('perPage', 0));
39        $page = intval(request('page', 1));
40        $filter = request('filter', '');
41        $categories = request('categories', '');
42        $license_types = request('selectedSubscriptionTypes', '');
43        $account_status_list = request('selectedAccountStatus', '');
44        $extension_list = request('selectedExtensions', '');
45        $sortBy = request('sort_by', '');
46        $sortOrder = request('sort_order', '');
47
48        if ($categories) {
49            $categories = explode(',', urldecode($categories));
50        } else {
51            $categories = [];
52        }
53
54        if ($license_types) {
55            $license_types = explode(',', urldecode($license_types));
56        } else {
57            $license_types = [];
58        }
59
60        $account_status = [$account_status_list];
61
62        if (strpos($account_status_list, ',') !== false) {
63            $account_status = explode(',', $account_status_list);
64        }
65
66        if ($extension_list === '' || $extension_list === null) {
67            $extensions = []; // Set empty array if no value is provided
68        } else {
69            // Convert to an array if it's a comma-separated string
70            $extensions = explode(',', $extension_list);
71
72            // Convert values to integers
73            $extensions = array_map('intval', $extensions);
74        }
75
76        $userData = $this->adminUsersService->getUsersPaginated($filter, $deactivated, $perPage, $page, $categories, $sortBy, $sortOrder, $license_types, $account_status, $extensions);
77
78        return response()->json(
79            data: [
80                'success' => true,
81                'data' => [
82                    'items' => ClientManagementUserV2Resource::collection($userData['users']),
83                    'total' => $userData['total'],
84                    'total_pages' => $userData['total_pages'],
85                    'current_page' => $userData['current_page'],
86                ],
87            ],
88            status: HttpStatusCode::OK->value
89        );
90    }
91
92    public function user_exists(CompanyUserExistsFormRequest $request)
93    {
94        $company_id = $request->company_id;
95        $data = $request->validated();
96        $emails = $data['emails'];
97
98        $exists = $this->companyUsersService->userEmailsExists($company_id, $emails);
99
100        return response()->json($exists, 200);
101    }
102
103    public function userDetails(User $user)
104    {
105        $userInfo = UserInfo::where('email', $user->email)->first();
106
107        $data = [
108            'user' => filled($userInfo) ? new UserDetailsResource($userInfo) : [],
109        ];
110
111        return response()->json($data);
112    }
113
114    public function add_by_email(CreateCompanyUserByEmailRequest $request)
115    {
116        $validated_data = $request->validated();
117
118        $admin = auth()->user();
119        $companyId = $request->company_id;
120
121        $result = $this->companyUsersService->addByEmail($validated_data, $companyId, $admin);
122
123        return response()->json(
124            data: [
125                'success' => true,
126                'message' => "{$result['invitation_sent_count']} users invited successfully",
127                'users' => $result['users'],
128            ],
129            status: 200
130        );
131    }
132
133    public function reactivateIndividualUsers(ReactivateIndividualUsersRequest $request): JsonResponse
134    {
135        $validatedData = $request->validated();
136        $userIds = array_column($validatedData['users'], 'id');
137
138        $result = $this->individualUsersService->reactivateUsers($userIds, auth()->user());
139
140        return response()->json($result, 200);
141    }
142
143    public function pushItToHubspot(User $user)
144    {
145        $userInfoDispatcher = UserInfo::getEventDispatcher();
146        UserInfo::unsetEventDispatcher();
147        $userDispatcher = User::getEventDispatcher();
148        User::unsetEventDispatcher();
149        $dailyDispatcher = FlyMsgUserDailyUsage::getEventDispatcher();
150        FlyMsgUserDailyUsage::unsetEventDispatcher();
151
152        $this->userInfoService->pushItToHubspot($user->id, false);
153
154        if ($userInfoDispatcher) {
155            UserInfo::setEventDispatcher($userInfoDispatcher);
156        }
157        if ($userDispatcher) {
158            User::setEventDispatcher($userDispatcher);
159        }
160        if ($dailyDispatcher) {
161            FlyMsgUserDailyUsage::setEventDispatcher($dailyDispatcher);
162        }
163    }
164
165    public function recalculateUserInfo(User $user)
166    {
167        ini_set('memory_limit', '-1');
168        ini_set('max_execution_time', '1800');
169        $userInfoDispatcher = UserInfo::getEventDispatcher();
170        UserInfo::unsetEventDispatcher();
171        $userDispatcher = User::getEventDispatcher();
172        User::unsetEventDispatcher();
173        $subscriptionDispatcher = Subscription::getEventDispatcher();
174        Subscription::unsetEventDispatcher();
175        $dailyDispatcher = FlyMsgUserDailyUsage::getEventDispatcher();
176        FlyMsgUserDailyUsage::unsetEventDispatcher();
177        $flyCutDispatcher = FlyCutUsage::getEventDispatcher();
178        FlyCutUsage::unsetEventDispatcher();
179
180        $this->userInfoService->recalculateFlyCutUsage($user->id);
181
182        $userInfo = $this->userInfoService->processUser($user);
183        $this->flyMsgUserDailyUsageService->processUserUsage($user);
184        $this->flyMsgUserDailyUsageService->processUserSummaryUsage($user);
185        $user->user_info_id = $userInfo->id;
186        $user->save();
187        $this->userInfoService->pushItToHubspot($user->id, false);
188
189        if ($userInfoDispatcher) {
190            UserInfo::setEventDispatcher($userInfoDispatcher);
191        }
192        if ($subscriptionDispatcher) {
193            Subscription::setEventDispatcher($subscriptionDispatcher);
194        }
195        if ($userDispatcher) {
196            User::setEventDispatcher($userDispatcher);
197        }
198        if ($dailyDispatcher) {
199            FlyMsgUserDailyUsage::setEventDispatcher($dailyDispatcher);
200        }
201        if ($flyCutDispatcher) {
202            FlyCutUsage::setEventDispatcher($flyCutDispatcher);
203        }
204
205        return response()->json([
206            'success' => true,
207            'data' => UserInfo::where('user_id', $user->id)->first(),
208        ], 200);
209    }
210}