diff --git a/app/Http/Controllers/APIS/CustomerApi/UserAssetLinkController.php b/app/Http/Controllers/APIS/CustomerApi/UserAssetLinkController.php index 3b01f91..ae0f579 100644 --- a/app/Http/Controllers/APIS/CustomerApi/UserAssetLinkController.php +++ b/app/Http/Controllers/APIS/CustomerApi/UserAssetLinkController.php @@ -6,58 +6,107 @@ use App\Http\Controllers\Controller; use App\Models\Asset; 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(); - // $userAssetLinks = UserAssetLink::with(['user', 'asset.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(); + if (!$user) { + return response()->json(['error' => 'User not found'], 404); + } - // return response()->json($userAssetLinks); + $bearerToken = $this->adminService->getToken(); + $apiBaseUrl = env('THINGSBOARD_URL', 'http://65.0.131.117:8080'); -$token = readHeaderToken(); -$userAssetLinks = UserAssetLink::with(['user', 'asset.devices']) -->withCount([ - 'asset as active_devices_count' => function ($query) { - $query->whereHas('devices', function ($q) { - $q->where('active', 1); - }); - }, - 'asset as inactive_devices_count' => function ($query) { - $query->whereHas('devices', function ($q) { - $q->where('active', 0); - }); + + 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; + } + } + + return response()->json($user); + } catch (Exception $e) { + Log::error('Error fetching telemetry data: ' . $e->getMessage()); + return response()->json(['error' => 'Failed to fetch data'], 500); + } } -]) -->get(); - -return response()->json($userAssetLinks) -->withHeaders([ - 'Authorization' => "Bearer $token" -]); - -} } + diff --git a/routes/admin_api.php b/routes/admin_api.php index 8292c3a..581a400 100644 --- a/routes/admin_api.php +++ b/routes/admin_api.php @@ -38,3 +38,17 @@ Route::get('/users-list', [UsersController::class, 'list'])->name('user_list'); Route::delete('/users-delete/{userId}', [UsersController::class, 'delete']); Route::post('/activate/{id}', [UsersController::class, 'activate'])->name('activate.user'); 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::post('/device/delete/{deviceId}', [DeviceController::class, 'deleteDevice'])->name('device.delete'); + + +//******************************************************* Admin DeviceProfileMaster API ******************************************************** +Route::get('/device-profile-master/list', [DeviceProfileMasterController::class, 'deviceprofileMasterList'])->name('deviceMaster.list'); +Route::post('/update-device-profile-master/{deviceId}', [DeviceProfileMasterController::class, 'updateDevice'])->name('update.deviceMaster'); + +