Merge pull request 'sayliR' (#32) from sayliR into main
Reviewed-on: Nikhil.Kadam/vib360#32
This commit is contained in:
@@ -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"
|
||||
]);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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');
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user