diff --git a/app/Http/Controllers/APIS/AdminApi/AssetadmintController.php b/app/Http/Controllers/APIS/AdminApi/AssetadmintController.php index 42516e8..7f0ae8e 100644 --- a/app/Http/Controllers/APIS/AdminApi/AssetadmintController.php +++ b/app/Http/Controllers/APIS/AdminApi/AssetadmintController.php @@ -168,31 +168,41 @@ class AssetadmintController extends Controller return jsonResponseWithErrorMessage('Asset ID is required', 400); } - $response = $this->adminService->deleteAsset(['assetId' => $assetId]); - Log::info("Response: " . json_encode($response)); + try { + $response = $this->adminService->deleteAsset(['assetId' => $assetId]); + Log::info("Asset delete API response", ['response' => $response]); - if (!is_array($response)) { - Log::error("Unexpected API response format.", ['response' => $response]); - return jsonResponseWithErrorMessage('Unexpected API response format', 500); + if (!is_array($response)) { + Log::error("Unexpected API response format", ['response' => $response]); + return jsonResponseWithErrorMessage('Unexpected API response format', 500); + } + + if (isset($response['status']) && $response['status'] === 400) { + Log::error("API failed to delete asset", ['message' => $response['message']]); + return jsonResponseWithErrorMessage($response['message'], 400, $response); + } + + if (empty($response)) { + Log::error("API response is empty while deleting asset"); + return jsonResponseWithErrorMessage('Failed to delete asset', 400); + } + + // Delete from local database + $asset = Asset::find($assetId); + if ($asset) { + $asset->delete(); + } else { + Log::warning("Asset not found in DB", ['assetId' => $assetId]); + } + + return jsonResponseWithSuccessMessage('Asset deleted successfully', ['api_response' => $response]); + } catch (\Exception $e) { + Log::error("Exception while deleting asset", [ + 'message' => $e->getMessage(), + 'trace' => $e->getTraceAsString(), + ]); + return jsonResponseWithErrorMessage('An error occurred while deleting the asset', 500); } - - if (isset($response['status']) && $response['status'] === 400) { - Log::error("Failed to delete asset: " . $response['message']); - return jsonResponseWithErrorMessage($response['message'], 400, $response); - } - - if (empty($response)) { - Log::error("API Data is empty, cannot delete asset."); - return jsonResponseWithErrorMessage('Failed to delete asset', 400); - } - - // Delete from local database - $asset = Asset::where('id', $assetId)->first(); - if ($asset) { - $asset->delete(); - } - - return jsonResponseWithSuccessMessage('Asset deleted successfully', ['api_response' => $response]); } @@ -254,6 +264,7 @@ class AssetadmintController extends Controller // ], 500); // } // } + public function assignAssetToUser(Request $request) { try { @@ -332,7 +343,7 @@ class AssetadmintController extends Controller }); if ($assets->isEmpty()) { - return response()->json(['message' => 'No assets found for this customer ID'], 404); + return response()->json(['message' => 'No assets found for this customer ID'], 200); } return jsonResponseWithSuccessMessage('Assets fetched successfully', [ diff --git a/app/Http/Controllers/APIS/AdminApi/DeviceController.php b/app/Http/Controllers/APIS/AdminApi/DeviceController.php index c32f32e..678e176 100644 --- a/app/Http/Controllers/APIS/AdminApi/DeviceController.php +++ b/app/Http/Controllers/APIS/AdminApi/DeviceController.php @@ -47,6 +47,7 @@ class DeviceController extends Controller ] ], 'deviceProfileId' => $request->deviceProfileId ?? 1, + 'asset_id' => $request->asset_id ?? 'null', ]; @@ -79,7 +80,7 @@ class DeviceController extends Controller 'name' => $apiResponse['name'] ?? null, 'type' => $apiResponse['type'] ?? null, 'label' => $apiResponse['label'] ?? null, - 'asset_id' => $apiResponse['asset_id'] ?? 'a5daeb60-f36c-11ef-a9dc-45dd276e4cd5', + 'asset_id' => $request->asset_id ?? 'null', 'device_profile_id' => $apiResponse['deviceProfileId']['id'] ?? null, 'firmware_id' => $apiResponse['firmwareId']['id'] ?? null, 'software_id' => $apiResponse['softwareId']['id'] ?? null, @@ -197,7 +198,7 @@ class DeviceController extends Controller }); if ($devices->isEmpty()) { - return response()->json(['message' => 'No devices found for this customer ID'], 404); + return response()->json(['message' => 'No devices found for this customer ID'], 200); } return jsonResponseWithSuccessMessage('Devices fetched successfully', [ diff --git a/app/Http/Controllers/APIS/AdminApi/UsersController.php b/app/Http/Controllers/APIS/AdminApi/UsersController.php index e6c53e2..6d93973 100644 --- a/app/Http/Controllers/APIS/AdminApi/UsersController.php +++ b/app/Http/Controllers/APIS/AdminApi/UsersController.php @@ -9,6 +9,7 @@ use App\Mail\Admin\UserCreatedMail; use App\Models\User; use App\Services\AdminService; use Exception; +use Faker\Guesser\Name; use Illuminate\Database\QueryException; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Log; @@ -213,17 +214,17 @@ class UsersController extends Controller // Validation rules (include all fields) $validator = Validator::make($request->all(), [ 'email' => 'required|email|unique:users,email', - 'authority' => 'required|string|in:CUSTOMER_USER,TENANT_ADMIN,SYS_ADMIN', - 'tenant_id' => 'required|uuid', - 'customer_id' => 'nullable|uuid', + // 'authority' => 'required|string|in:CUSTOMER_USER,TENANT_ADMIN,SYS_ADMIN', + // 'tenant_id' => 'required|uuid', + // 'customer_id' => 'nullable|uuid', 'first_name' => 'required|string|max:255', 'last_name' => 'required|string|max:255', - 'phone' => 'nullable|string|max:20', - 'name' => 'nullable|string|max:255', - 'description' => 'nullable|string', - 'default_dashboard_id' => 'nullable', - 'home_dashboard_id' => 'nullable', - 'version' => 'nullable|integer', + // 'phone' => 'nullable|string|max:20', + // 'name' => 'nullable|string|max:255', + // 'description' => 'nullable|string', + // 'default_dashboard_id' => 'nullable', + // 'home_dashboard_id' => 'nullable', + // 'version' => 'nullable|integer', // Add validation for other fields as needed ]); @@ -243,17 +244,17 @@ class UsersController extends Controller $user = User::create([ 'id' => $userId, 'email' => $request->email, - 'authority' => $request->authority, - 'tenant_id' => $request->tenant_id, - 'customer_id' => $request->customer_id, - 'first_name' => $request->first_name, - 'last_name' => $request->last_name, - 'phone' => $request->phone, + 'authority' => $request->authority ?? 'CUSTOMER_USER', + 'tenant_id' => $request->tenant_id ?? null, + 'customer_id' => $request->customer_id ?? null, + 'first_name' => $request->first_name ?? '', + 'last_name' => $request->last_name ?? '', + 'phone' => $request->phone ?? null, 'name' => $request->name ?? "{$request->first_name} {$request->last_name}", - 'description' => $request->description, - 'default_dashboard_id' => $request->default_dashboard_id, + 'description' => $request->description ?? null, + 'default_dashboard_id' => $request->default_dashboard_id ?? null, 'default_dashboard_fullscreen' => $request->default_dashboard_fullscreen ?? false, - 'home_dashboard_id' => $request->home_dashboard_id, + 'home_dashboard_id' => $request->home_dashboard_id ?? null, 'home_dashboard_hide_toolbar' => $request->home_dashboard_hide_toolbar ?? false, 'user_credentials_enabled' => $request->user_credentials_enabled ?? false, 'failed_login_attempts' => $request->failed_login_attempts ?? 0, @@ -266,13 +267,13 @@ class UsersController extends Controller $serviceData = [ 'email' => $request->email, - 'authority' => $request->authority, + 'authority' => $request->authority ?? null, 'firstName' => $request->first_name, 'lastName' => $request->last_name, 'phone' => $request->phone, 'name' => $request->name ?? "{$request->first_name} {$request->last_name}", 'description' => $request->description, - 'tenant_id' => $request->tenant_id, + 'tenant_id' => 'bbab7c17-2f19-4eff-9ce7-63870e02b522', 'customer_id' => $request->customer_id ]; @@ -403,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()); @@ -432,28 +505,30 @@ 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); } @@ -463,7 +538,6 @@ class UsersController extends Controller 'error' => $e->getMessage() ], 500); } - } catch (\Exception $e) { Log::error("Error activating user ID: {$id}. Exception: " . $e->getMessage()); return response()->json([ @@ -478,7 +552,6 @@ class UsersController extends Controller - // public function autoLogin(Request $request) // { // $request->validate([ @@ -668,7 +741,7 @@ class UsersController extends Controller }); if ($users->isEmpty()) { - return response()->json(['message' => 'No users found for this customer ID'], 404); + return response()->json(['message' => 'No users found for this customer ID'], 200); } return jsonResponseWithSuccessMessage('Users fetched successfully', [ @@ -679,5 +752,4 @@ class UsersController extends Controller return jsonResponseWithErrorMessage($e->getMessage(), 500); } } - -} +} \ No newline at end of file diff --git a/app/Http/Controllers/AlarmControllerCommon.php b/app/Http/Controllers/AlarmControllerCommon.php index 7e69d9c..92864cd 100644 --- a/app/Http/Controllers/AlarmControllerCommon.php +++ b/app/Http/Controllers/AlarmControllerCommon.php @@ -30,16 +30,16 @@ class AlarmControllerCommon extends Controller $alarmData = [ 'type' => $request->type ?? null, 'severity' => $request->severity ?? null, - 'acknowledged' => false ?? null, - 'cleared' => $request->cleared ?? Carbon::now()->timestamp, + 'acknowledged' => false, + 'cleared' => false, 'startTs' => $request->startTs ?? Carbon::now()->timestamp, 'endTs' => $request->endTs ?? Carbon::now()->timestamp, 'details' => $request->details ?? [], - 'propagate' => $request->propagate ?? false, - 'propagateToOwner' => $request->propagateToOwner ?? false, - 'propagateToTenant' => $request->propagateToTenant ?? false, + 'propagate' => true, + 'propagateToOwner' => true, + 'propagateToTenant' => true, 'originator' => $request->originator ?? 1, - 'assigneeId' => $request->assigneeId ?? 1, + // 'assigneeId' => $request->assigneeId ?? 1, ]; @@ -215,8 +215,6 @@ class AlarmControllerCommon extends Controller public function filterAlarm(Request $request) { try { - $token = readHeaderToken(); - $useId = $token['sub']; $alarmData = $request->only([ 'severity', @@ -225,10 +223,11 @@ class AlarmControllerCommon extends Controller 'startTs', 'endTs', 'deviceId', - 'assetId' + 'assetId', + 'assignId', ]); - $apiResponse = $this->alarmService->filterAlarm($alarmData, $useId); + $apiResponse = $this->alarmService->filterAlarm($alarmData); return jsonResponseWithSuccessMessage('Alarm data retrieved successfully', ['api_response' => $apiResponse]); } catch (Exception $e) { diff --git a/app/Http/Requests/CreateDeviceRequest.php b/app/Http/Requests/CreateDeviceRequest.php index 751e989..04ae6b5 100644 --- a/app/Http/Requests/CreateDeviceRequest.php +++ b/app/Http/Requests/CreateDeviceRequest.php @@ -27,7 +27,7 @@ class CreateDeviceRequest extends FormRequest return [ 'name' => 'required|string', - 'type' => 'required|string|max:255', + // 'type' => 'required|string|max:255', 'label' => 'required|string|max:255', 'customerId' => 'required', diff --git a/app/Models/Device.php b/app/Models/Device.php index 45d600f..e8c485d 100644 --- a/app/Models/Device.php +++ b/app/Models/Device.php @@ -28,6 +28,7 @@ class Device extends Model 'active', 'additional_info', 'device_data', + 'created_time', ]; // Cast UUIDs and related IDs as strings @@ -57,4 +58,4 @@ class Device extends Model { return $this->belongsTo(Customer::class, 'customer_id', 'id'); } -} \ No newline at end of file +} diff --git a/app/Services/AdminService.php b/app/Services/AdminService.php index 08c9b76..68ea6b9 100644 --- a/app/Services/AdminService.php +++ b/app/Services/AdminService.php @@ -183,13 +183,11 @@ class AdminService 'phone' => $data['phone'] ?? '1234567890', 'version' => $data['version'] ?? '794665488', 'additionalInfo' => [ - 'description' => $data['description'] ?? 'User description' + 'description' => $data['additionalInfo'] ?? 'User description' ], ]; - - if (!empty($data['id']) && is_array($data['id']) && isset($data['id']['id'])) { $payload['id'] = [ 'id' => $data['id']['id'], @@ -235,9 +233,14 @@ 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'] ?? '', 'authority' => $data['authority'] ?? 'CUSTOMER_USER', 'firstName' => $data['first_name'] ?? '', @@ -245,7 +248,7 @@ class AdminService 'name' => $data['name'] ?? ($data['first_name'] . ' ' . $data['last_name'] ?? ''), 'phone' => $data['phone'] ?? '', 'tenantId' => [ - 'id' => $data['tenant_id'], + 'id' => 'bbab7c17-2f19-4eff-9ce7-63870e02b522', 'entityType' => 'TENANT' ], 'additionalInfo' => [ @@ -462,28 +465,89 @@ class AdminService } } + // public function activateUser(User $user, string $password, string $activateToken) + // { + // try { + // $payload = [ + // 'activateToken' => $activateToken, + // 'password' => $password + // ]; + + // $activationUrl = "{$this->baseUrl}/api/noauth/activate"; + + // $response = Http::withHeaders([ + // 'Content-Type' => 'application/json', + // ])->post($activationUrl, $payload); + + // if (!$response->successful()) { + // Log::error("Failed to activate user in ThingsBoard. Error: " . $response->body()); + // throw new \Exception('Failed to activate user: ' . $response->body()); + // } + + // Log::info("User activated successfully in ThingsBoard for User ID: {$user->id}"); + // } catch (\Exception $e) { + // Log::error("Error activating user in ThingsBoard for User ID: {$user->id}. Exception: " . $e->getMessage()); + // throw $e; + // } + // } + + public function activateUser(User $user, string $password, string $activateToken) { try { - $payload = [ + // $dummyEmail = 'dummy+' . $user->id . '@example.com'; + $token = $this->getToken(); + + // 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 + 'password' => $password, + // '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 successfully in ThingsBoard 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; } } diff --git a/app/Services/AlarmService.php b/app/Services/AlarmService.php index a7a1fe4..5b3f93e 100644 --- a/app/Services/AlarmService.php +++ b/app/Services/AlarmService.php @@ -313,10 +313,9 @@ class AlarmService } - public function filterAlarm(array $data, $useId) + public function filterAlarm(array $data) { $token = $this->getToken(); - $deviceId = null; if (!empty($data['deviceId'])) { @@ -337,12 +336,12 @@ class AlarmService $queryParams = array_filter([ 'severityList' => $data['severity'] ?? null, - 'assigneeId' => $useId, + 'assigneeId' => $data['assignId'] ?? null, 'pageSize' => $data['pageSize'] ?? 10, 'page' => $data['page'] ?? 0, 'startTime' => $data['startTs'] ?? null, 'endTime' => $data['endTs'] ?? null, - 'deviceId' => $deviceId, + 'deviceId' => $deviceId, ], function ($value) { return $value !== null; }); @@ -396,10 +395,10 @@ class AlarmService 'id' => $data['originator'] ?? null, 'entityType' => 'DEVICE' ], - 'assigneeId' => [ - 'id' => $data['assigneeId'] ?? null, - 'entityType' => 'USER' - ], + // 'assigneeId' => [ + // 'id' => $data['assigneeId'] ?? null, + // 'entityType' => 'USER' + // ], 'details' => $data['details'] ?? [], 'propagate' => $data['propagate'] ?? false, 'propagateToOwner' => $data['propagateToOwner'] ?? false,