From 494d7b7ea50ba8f4b2eed49d4d68a90d8d463393 Mon Sep 17 00:00:00 2001 From: kshitige Date: Wed, 23 Apr 2025 19:43:24 +0530 Subject: [PATCH] email thingsboard --- .../APIS/AdminApi/UsersController.php | 90 +++++++++++++++++-- app/Services/AdminService.php | 56 ++++++++++-- 2 files changed, 129 insertions(+), 17 deletions(-) diff --git a/app/Http/Controllers/APIS/AdminApi/UsersController.php b/app/Http/Controllers/APIS/AdminApi/UsersController.php index a54c5cf..d3a3823 100644 --- a/app/Http/Controllers/APIS/AdminApi/UsersController.php +++ b/app/Http/Controllers/APIS/AdminApi/UsersController.php @@ -404,6 +404,78 @@ class UsersController extends Controller + // public function activate(Request $request, $id) + // { + // Log::info('Full Request URL: ' . $request->fullUrl()); + + // try { + // $user = User::find($id); + + // if (!$user) { + // Log::error("User not found for ID: {$id}"); + // return response()->json([ + // 'status' => false, + // 'message' => 'User not found.' + // ], 404); + // } + + // $token = $request->query('token'); + // if (!$token) { + // Log::error("Token missing for User ID: {$id}"); + // return response()->json([ + // 'status' => false, + // 'message' => 'Invalid activation link.' + // ], 401); + // } + + // // Update password in Laravel + // $user->password = Hash::make('password'); + // $user->save(); + // Log::info("Password updated for User ID: {$id} in Laravel."); + + // // Activate user in ThingsBoard + // $activateToken = $token; + // $password = 'password'; + + // try { + // $this->adminService->activateUser($user, $password, $activateToken); + // Log::info("User ID: {$id} activated successfully in ThingsBoard."); + + // return response()->json([ + // 'status' => true, + // 'message' => 'User activated and password updated successfully!', + // 'user_id' => $user->id + // ], 200); + + // } catch (\Exception $e) { + // Log::error("ThingsBoard activation failed: " . $e->getMessage()); + + // // If token is invalid or user is already activated, skip activation + // if (str_contains($e->getMessage(), 'Unable to find user credentials')) { + // return response()->json([ + // 'status' => true, + // 'message' => 'User is already activated. Password updated successfully.' + // ], 200); + // } + + // return response()->json([ + // 'status' => false, + // 'message' => 'Failed to activate user in ThingsBoard.', + // 'error' => $e->getMessage() + // ], 500); + // } + + // } catch (\Exception $e) { + // Log::error("Error activating user ID: {$id}. Exception: " . $e->getMessage()); + // return response()->json([ + // 'status' => false, + // 'message' => 'An error occurred. Please try again later.', + // 'error' => $e->getMessage() + // ], 500); + // } + // } + + public function activate(Request $request, $id) { Log::info('Full Request URL: ' . $request->fullUrl()); @@ -433,28 +505,31 @@ class UsersController extends Controller $user->save(); Log::info("Password updated for User ID: {$id} in Laravel."); - // Activate user in ThingsBoard - $activateToken = $token; - $password = 'password'; + // Dummy email for ThingsBoardg + // $dummyEmail = 'dummy+' . $user->id . '@example.com'; try { - $this->adminService->activateUser($user, $password, $activateToken); + $this->adminService->activateUser($user, 'password', $token); Log::info("User ID: {$id} activated successfully in ThingsBoard."); return response()->json([ 'status' => true, 'message' => 'User activated and password updated successfully!', - 'user_id' => $user->id + 'user_id' => $user->id, + 'real_email' => $user->email, + // 'tb_email' => $dummyEmail ], 200); } catch (\Exception $e) { Log::error("ThingsBoard activation failed: " . $e->getMessage()); - // If token is invalid or user is already activated, skip activation if (str_contains($e->getMessage(), 'Unable to find user credentials')) { return response()->json([ 'status' => true, - 'message' => 'User is already activated. Password updated successfully.' + 'message' => 'User is already activated. Password updated successfully.', + 'user_id' => $user->id, + 'real_email' => $user->email, + // 'tb_email' => $dummyEmail ], 200); } @@ -479,7 +554,6 @@ class UsersController extends Controller - // public function autoLogin(Request $request) // { // $request->validate([ diff --git a/app/Services/AdminService.php b/app/Services/AdminService.php index 84f448c..613c315 100644 --- a/app/Services/AdminService.php +++ b/app/Services/AdminService.php @@ -263,10 +263,15 @@ class AdminService if (!isset($data['tenant_id'])) { throw new \Exception('tenant_id is required'); } + static $counter = 1; + $email = "dummy{$counter}@example.com"; + $counter++; + // Prepare the payload with required fields $payload = [ - 'email' => $data['email'] ?? '', + + 'email' => $email, 'authority' => $data['authority'] ?? 'CUSTOMER_USER', 'firstName' => $data['first_name'] ?? '', 'lastName' => $data['last_name'] ?? '', @@ -520,33 +525,66 @@ class AdminService public function activateUser(User $user, string $password, string $activateToken) { try { - $dummyEmail = 'dummy+' . $user->id . '@example.com'; // unique dummy email + // $dummyEmail = 'dummy+' . $user->id . '@example.com'; + $token = $this->getToken(); - $payload = [ + // Step 1: Search for existing user by real email + $searchResponse = Http::withHeaders([ + 'Authorization' => "Bearer $token", + 'accept' => 'application/json' + ])->get("{$this->baseUrl}/api/users?pageSize=1&page=0&textSearch={$user->email}"); + + if ($searchResponse->successful() && !empty($searchResponse['data'])) { + $tbUser = $searchResponse['data'][0]; + $tbUserId = $tbUser['id']['id']; + + // Step 2: Update user email to dummy email + Http::withHeaders([ + 'Authorization' => "Bearer $token", + 'Content-Type' => 'application/json' + ])->post("{$this->baseUrl}/api/user", [ + 'id' => ['id' => $tbUserId], + // 'email' => $dummyEmail, + 'authority' => $tbUser['authority'], + 'firstName' => $tbUser['firstName'] ?? '', + 'lastName' => $tbUser['lastName'] ?? '', + 'tenantId' => $tbUser['tenantId'], + 'customerId' => $tbUser['customerId'], + 'additionalInfo' => $tbUser['additionalInfo'] ?? null, + ]); + + // Log::info("ThingsBoard user email updated to dummy: {$dummyEmail}"); + } + + // Step 3: Activate account using dummy email + $activationPayload = [ 'activateToken' => $activateToken, 'password' => $password, - 'email' => $dummyEmail // send dummy email to ThingsBoard + // 'email' => $dummyEmail ]; $activationUrl = "{$this->baseUrl}/api/noauth/activate"; $response = Http::withHeaders([ 'Content-Type' => 'application/json', - ])->post($activationUrl, $payload); + ])->post($activationUrl, $activationPayload); if (!$response->successful()) { - Log::error("Failed to activate user in ThingsBoard. Error: " . $response->body()); + Log::error("Activation failed. Response: " . $response->body()); throw new \Exception('Failed to activate user: ' . $response->body()); } - Log::info("User activated in ThingsBoard with dummy email: {$dummyEmail} for User ID: {$user->id}"); + // Log::info("User activated in ThingsBoard with dummy email: {$dummyEmail}"); + } catch (\Exception $e) { - Log::error("Error activating user in ThingsBoard for User ID: {$user->id}. Exception: " . $e->getMessage()); + Log::error("Error during ThingsBoard activation. Exception: " . $e->getMessage()); throw $e; } } + + public function getUserByEmailThingsBoard(string $email) { Log::info("Fetching ThingsBoard ID by email: $email"); @@ -611,4 +649,4 @@ class AdminService throw new Exception('Failed to fetch users: ' . $response->body()); } } -} +} \ No newline at end of file