From c3a9682bfcb10873c9f405eae733113462517117 Mon Sep 17 00:00:00 2001 From: sayliraut Date: Tue, 25 Mar 2025 11:40:43 +0530 Subject: [PATCH] append health_status and online --- .../CustomerApi/UserAssetLinkController.php | 105 +++++++++++++++--- routes/admin_api.php | 2 +- 2 files changed, 88 insertions(+), 19 deletions(-) diff --git a/app/Http/Controllers/APIS/CustomerApi/UserAssetLinkController.php b/app/Http/Controllers/APIS/CustomerApi/UserAssetLinkController.php index 3707d57..6d6266d 100644 --- a/app/Http/Controllers/APIS/CustomerApi/UserAssetLinkController.php +++ b/app/Http/Controllers/APIS/CustomerApi/UserAssetLinkController.php @@ -5,37 +5,106 @@ namespace App\Http\Controllers\APIS\CustomerApi; use App\Http\Controllers\Controller; use App\Models\User; use App\Models\UserAssetLink; +use App\Services\AdminService; use Illuminate\Http\Request; use Tymon\JWTAuth\Facades\JWTAuth; +use Illuminate\Support\Facades\Http; use Illuminate\Container\Attributes\Auth; use Illuminate\Database\QueryException; use Illuminate\Support\Facades\Log; +use Exception; + + class UserAssetLinkController extends Controller { + private $adminService; + + public function __construct(AdminService $adminService) + { + $this->adminService = $adminService; + } public function index() { + try { + $token = readHeaderToken(); - $token = readHeaderToken(); + // Fetch user with assets and device counts + $user = User::with(['assets.devices']) + ->withCount([ + 'assets as active_devices_count' => function ($query) { + $query->whereHas('devices', function ($q) { + $q->where('active', 1); + }); + }, + 'assets as inactive_devices_count' => function ($query) { + $query->whereHas('devices', function ($q) { + $q->where('active', 0); + }); + } + ]) + ->where('id', $token['sub']) + ->first(); - $user = User::with(['assets.devices']) - ->withCount([ - 'assets as active_devices_count' => function ($query) { - $query->whereHas('devices', function ($q) { - $q->where('active', 1); - }); - }, - 'assets as inactive_devices_count' => function ($query) { - $query->whereHas('devices', function ($q) { - $q->where('active', 0); - }); + if (!$user) { + return response()->json(['error' => 'User not found'], 404); + } + + $bearerToken = $this->adminService->getToken(); + $apiBaseUrl = env('THINGSBOARD_URL', 'http://65.0.131.117:8080'); + + + + foreach ($user->assets as $asset) { + foreach ($asset->devices as $device) { + $device->health_status = null; + + // Fetch device details from API using customer_id and device_id + $deviceResponse = Http::withHeaders([ + 'accept' => 'application/json', + 'Authorization' => 'Bearer ' . $bearerToken, + ])->get("$apiBaseUrl/api/customer/{$device->customer_id}/deviceInfos", [ + 'pageSize' => 100, // Fetch more devices in one request + 'page' => 0 + ]); + + if (!$deviceResponse->successful()) { + Log::error("Failed to fetch device info for Customer ID: {$device->customer_id}, Error: " . $deviceResponse->body()); + $device->online = null; // Set to false if API call fails + continue; + } + + $deviceData = $deviceResponse->json(); + $matchingDevice = collect($deviceData['data'] ?? []) + ->firstWhere('id.id', $device->id); + + // Explicitly set online status for all devices + $device->online = $matchingDevice['active'] ?? null; + + // Fetch telemetry data for the device + $telemetryResponse = Http::withHeaders([ + 'accept' => 'application/json', + 'Authorization' => 'Bearer ' . $bearerToken, + ])->get("$apiBaseUrl/api/plugins/telemetry/DEVICE/{$device->id}/values/timeseries", [ + 'useStrictDataTypes' => 'false' + ]); + + if (!$telemetryResponse->successful()) { + Log::error("Failed to fetch telemetry for Device ID: {$device->id}, Error: " . $telemetryResponse->body()); + $device->health_status = null; + continue; + } + $telemetryData = $telemetryResponse->json(); + $device->health_status = !empty($telemetryData['MechanicalHealth_valueInPercent']) + ? (float) $telemetryData['MechanicalHealth_valueInPercent'][0]['value'] + : null; } - ]) - ->where('id', $token['sub']) - ->first(); + } - return response()->json($user); + return response()->json($user); + } catch (Exception $e) { + Log::error('Error fetching telemetry data: ' . $e->getMessage()); + return response()->json(['error' => 'Failed to fetch data'], 500); + } } - - } diff --git a/routes/admin_api.php b/routes/admin_api.php index eefadfd..95311e2 100644 --- a/routes/admin_api.php +++ b/routes/admin_api.php @@ -42,7 +42,7 @@ Route::post('/users-login', [UsersController::class, 'loginUser']); //******************************************************* Device API******************************************************** Route::post('/device/create-or-update', [DeviceController::class, 'createOrUpdateDevice'])->name('device.create-or-update'); Route::get('/device/list', [DeviceController::class, 'listDevices'])->name('device.list'); -Route::delete('/device/delete/{deviceId}', [DeviceController::class, 'deleteDevice'])->name('device.delete'); +Route::post('/device/delete/{deviceId}', [DeviceController::class, 'deleteDevice'])->name('device.delete'); //******************************************************* Admin DeviceProfileMaster API ********************************************************