Files
backend_vib360_laravel/app/Http/Controllers/APIS/CustomerApi/TelemetryController.php

364 lines
14 KiB
PHP
Raw Normal View History

2025-03-24 13:31:06 +05:30
<?php
namespace App\Http\Controllers\APIS\CustomerApi;
use App\Http\Controllers\Controller;
use App\Models\Asset;
use App\Models\Device;
2025-03-25 11:34:55 +05:30
use App\Models\TimeseriesKeyMaster;
2025-03-24 13:31:06 +05:30
use App\Services\CustomerInfoService;
2025-03-25 11:34:55 +05:30
use Illuminate\Container\Attributes\DB;
2025-03-24 13:31:06 +05:30
use Illuminate\Http\Request;
2025-03-25 11:34:55 +05:30
use Illuminate\Support\Facades\DB as FacadesDB;
2025-03-24 13:31:06 +05:30
use Illuminate\Support\Facades\Http;
2025-03-26 12:18:45 +05:30
use Illuminate\Support\Facades\Validator;
2025-03-24 13:31:06 +05:30
class TelemetryController extends Controller
{
protected $customerInfoService;
public function __construct(CustomerInfoService $customerInfoService)
{
$this->customerInfoService = $customerInfoService;
}
2025-03-25 11:34:55 +05:30
public function telemetryDataAsset(Request $request)
2025-03-24 13:31:06 +05:30
{
2025-03-27 18:54:06 +05:30
try {
// Read and validate token first
$token = readHeaderToken();
if (!$token) {
return response()->json([
'success' => false,
'error' => 'Authorization token required'
], 401);
}
2025-03-25 11:34:55 +05:30
2025-03-27 18:54:06 +05:30
$validator = Validator::make($request->all(), [
'asset_id' => 'required|string',
'startTs' => 'nullable|string',
'endTs' => 'nullable|string',
]);
2025-03-26 17:36:30 +05:30
2025-03-27 18:54:06 +05:30
if ($validator->fails()) {
return response()->json([
'success' => false,
'error' => $validator->errors()->first()
], 400);
}
2025-03-24 13:31:06 +05:30
2025-03-27 18:54:06 +05:30
$assetId = $request->input('asset_id');
$startTs = $request->input('startTs');
$endTs = $request->input('endTs');
2025-03-24 13:31:06 +05:30
2025-03-27 18:54:06 +05:30
// Get devices with their profiles and timeseries keys
$devices = Device::with(['deviceProfile', 'timeseriesKeys' => function($query) {
$query->where('display_on_dashboard', true)
->orWhere('display_on_popup', true)
->select(['key_name', 'display_name', 'display_on_dashboard', 'display_on_popup', 'device_profile_xid']);
}])
->where('asset_id', $assetId)
->get();
2025-03-24 13:31:06 +05:30
2025-03-27 18:54:06 +05:30
if ($devices->isEmpty()) {
return response()->json([
'success' => false,
'error' => 'No devices found for the asset'
], 404);
}
2025-03-25 11:34:55 +05:30
2025-03-27 18:54:06 +05:30
// Prepare data for bulk telemetry request
$deviceIds = $devices->pluck('id');
$allKeyNames = TimeseriesKeyMaster::whereIn('device_profile_xid', $devices->pluck('device_profile_id'))
->where(function($query) {
$query->where('display_on_dashboard', true)
2025-03-27 18:54:06 +05:30
->orWhere('display_on_popup', true);
})
2025-03-27 18:54:06 +05:30
->pluck('key_name')
->unique()
->toArray();
2025-03-25 11:34:55 +05:30
2025-03-27 18:54:06 +05:30
// Get telemetry data with token
$bulkTelemetry = $this->customerInfoService->getTelemetryData(
$deviceIds,
$allKeyNames,
$startTs,
$endTs,
$token // Pass the token to the service
);
if (!is_array($bulkTelemetry)) {
throw new \Exception("Invalid telemetry data format received from service");
}
2025-03-24 13:31:06 +05:30
2025-03-27 18:54:06 +05:30
// Format the response
$response = $devices->map(function($device) use ($bulkTelemetry) {
$telemetry = collect();
foreach ($device->timeseriesKeys as $keyData) {
$keyName = $keyData->key_name;
if (isset($bulkTelemetry[$device->id][$keyName])) {
$telemetry = $telemetry->merge(
collect($bulkTelemetry[$device->id][$keyName])->map(function($item) use ($keyData) {
return [
'key_name' => $keyData->key_name,
'display_name' => $keyData->display_name,
'display_on_dashboard' => $keyData->display_on_dashboard,
'display_on_popup' => $keyData->display_on_popup,
'timestamp' => $item['ts'] ?? null,
'value' => $item['value'] ?? null,
];
})
);
2025-03-25 11:34:55 +05:30
}
}
2025-03-25 12:19:43 +05:30
2025-03-27 18:54:06 +05:30
return [
'device_id' => (string) $device->id,
'device_profile_name' => (string) $device->deviceProfile->name,
'asset_id' => (string) $device->asset_id,
'device_profile_id' => (string) $device->device_profile_id,
'telemetry' => $telemetry->values()->all(),
];
});
2025-03-25 12:19:43 +05:30
2025-03-27 18:54:06 +05:30
return response()->json([
'success' => true,
'telemetry' => $response
]);
2025-03-25 12:19:43 +05:30
2025-03-27 18:54:06 +05:30
} catch (\Exception $e) {
return response()->json([
'success' => false,
'error' => 'Failed to fetch telemetry data',
'details' => config('app.debug') ? $e->getMessage() : null
], 500);
}
}
2025-03-27 11:43:12 +05:30
public function telemetryDataDevice(Request $request)
{
try {
2025-03-27 18:54:06 +05:30
// Read and validate token first
$token = readHeaderToken();
if (!$token) {
return response()->json([
'success' => false,
'error' => 'Authorization token required'
], 401);
}
2025-03-27 11:43:12 +05:30
$validator = Validator::make($request->all(), [
'device_id' => 'required|string',
2025-03-27 18:54:06 +05:30
'startTs' => 'nullable|string',
'endTs' => 'nullable|string',
2025-03-27 11:43:12 +05:30
]);
if ($validator->fails()) {
return response()->json([
2025-03-27 18:54:06 +05:30
'success' => false,
2025-03-27 11:43:12 +05:30
'error' => $validator->errors()->first()
2025-03-27 18:54:06 +05:30
], 400);
2025-03-25 12:19:43 +05:30
}
2025-03-25 11:34:55 +05:30
2025-03-27 11:43:12 +05:30
$deviceId = $request->input('device_id');
2025-03-27 18:54:06 +05:30
$startTs = $request->input('startTs');
$endTs = $request->input('endTs');
2025-03-27 11:43:12 +05:30
try {
$deviceWithTelemetry = Device::with(['deviceProfile',
'timeseriesKeys' => function($query) {
$query->select('key_name', 'display_name', 'device_profile_xid');
}])
->where('id', $deviceId)
2025-03-27 18:54:06 +05:30
->firstOrFail();
2025-03-27 11:43:12 +05:30
2025-03-27 18:54:06 +05:30
// Pass the token to the service method
2025-03-27 11:43:12 +05:30
$telemetryResponse = $this->customerInfoService->getTelemetryDataDevice(
$deviceWithTelemetry,
$deviceWithTelemetry->timeseriesKeys->pluck('key_name')->toArray(),
$startTs,
2025-03-27 18:54:06 +05:30
$endTs,
$token // Added token parameter
2025-03-27 11:43:12 +05:30
);
if (!is_array($telemetryResponse)) {
throw new \Exception("Invalid telemetry data format received from service");
}
$telemetry = collect($telemetryResponse)
->flatMap(function ($items, $keyName) use ($deviceWithTelemetry) {
$displayName = $deviceWithTelemetry->timeseriesKeys
->firstWhere('key_name', $keyName)?->display_name ?? $keyName;
return collect($items)->map(function ($item) use ($keyName, $displayName) {
return [
'key_name' => $keyName,
'timestamp' => $item['ts'] ?? null,
'value' => $item['value'] ?? null,
'display_name' => $displayName,
];
});
})
->values()
->all();
return response()->json([
2025-03-27 18:54:06 +05:30
'success' => true,
2025-03-27 11:43:12 +05:30
'telemetry' => [
'device_id' => (string) $deviceWithTelemetry->id,
'device_name' => $deviceWithTelemetry->name,
'device_profile_name' => $deviceWithTelemetry->deviceProfile->name,
'device_profile_id' => (string) $deviceWithTelemetry->device_profile_id,
'telemetry_data' => $telemetry,
]
2025-03-27 18:54:06 +05:30
], 200);
2025-03-27 11:43:12 +05:30
} catch (\Illuminate\Database\Eloquent\ModelNotFoundException $e) {
return response()->json([
2025-03-27 18:54:06 +05:30
'success' => false,
2025-03-27 11:43:12 +05:30
'error' => 'Device not found'
2025-03-27 18:54:06 +05:30
], 404);
2025-03-27 11:43:12 +05:30
} catch (\Exception $e) {
return response()->json([
2025-03-27 18:54:06 +05:30
'success' => false,
2025-03-27 11:43:12 +05:30
'error' => 'Failed to fetch telemetry data',
'details' => config('app.debug') ? $e->getMessage() : null
2025-03-27 18:54:06 +05:30
], 503);
2025-03-25 12:19:43 +05:30
}
2025-03-27 11:43:12 +05:30
} catch (\Exception $e) {
return response()->json([
2025-03-27 18:54:06 +05:30
'success' => false,
'error' => 'Internal server error',
'details' => config('app.debug') ? $e->getMessage() : null
], 500);
2025-03-27 11:43:12 +05:30
}
2025-03-25 12:19:43 +05:30
}
2025-03-26 11:21:24 +05:30
public function telemetryDataDeviceDiagnostic(Request $request, $deviceId)
{
$devices = Device::with('deviceProfile')
->where('id', $deviceId)
->get();
if ($devices->isEmpty()) {
return response()->json(['error' => 'No devices found'], 404);
}
$startTs = $request->has('start_date') ? strtotime($request->start_date) * 1000 : null;
$endTs = $request->has('end_date') ? strtotime($request->end_date) * 1000 : null;
$response = [];
foreach ($devices as $device) {
$telemetry = [];
$keyNames = TimeseriesKeyMaster::where('device_profile_xid', $device->device_profile_id)
->pluck('key_name', 'display_name')
->toArray();
$telemetryResponse = $this->customerInfoService->getTelemetryDataDeviceDiagonostic($device, $keyNames, $startTs, $endTs);
foreach ($keyNames as $keyName) {
if (isset($telemetryResponse[$keyName])) {
foreach ($telemetryResponse[$keyName] as $item) {
$timestamp = $item['ts'] ?? null;
// ✅ Filter telemetry by timestamp range
if ($timestamp && $timestamp >= $startTs && $timestamp <= $endTs) {
$telemetry[] = [
'key_name' => $keyName,
'timestamp' => $timestamp,
'start_date' => $startTs,
'end_date' => $endTs,
'value' => $item['value'] ?? null,
'display_name' => $keyName,
];
}
}
}
}
if (!empty($telemetry)) {
$response[] = [
'device_id' => (string) $device->id,
'device_name' => $device->name,
'device_profile_name' => (string) $device->deviceProfile->name,
'device_profile_id' => (string) $device->device_profile_id,
'telemetry' => $telemetry,
];
}
}
2025-03-25 11:34:55 +05:30
2025-03-26 11:21:24 +05:30
return response()->json(['telemetry' => $response]);
}
2025-03-25 11:34:55 +05:30
2025-03-26 17:36:30 +05:30
// public function telemetryDataDeviceDiagnostic(Request $request, $deviceId)
// {
// // Fetch devices
// $devices = Device::with('deviceProfile')
// ->where('id', $deviceId)
// ->get();
// if ($devices->isEmpty()) {
// return response()->json(['error' => 'No devices found'], 404);
// }
// // Get start and end timestamps from request parameters
// $startTs = $request->has('start_date') ? strtotime($request->start_date) * 1000 : null;
// $endTs = $request->has('end_date') ? strtotime($request->end_date) * 1000 : null;
// if (!$startTs || !$endTs) {
// return response()->json(['error' => 'Start date and end date are required'], 400);
// }
// $response = [];
// foreach ($devices as $device) {
// $telemetry = [];
// $keyNames = TimeseriesKeyMaster::where('device_profile_xid', $device->device_profile_id)
// ->pluck('key_name', 'display_name')
// ->toArray();
// $telemetryResponse = $this->customerInfoService->getTelemetryDataDeviceDiagonostic($device, $keyNames, $startTs, $endTs);
// foreach ($keyNames as $displayName => $keyName) {
// if (isset($telemetryResponse[$keyName])) {
// foreach ($telemetryResponse[$keyName] as $item) {
// $itemTs = $item['timestamp'] ?? null;
// // ✅ Filter only telemetry within the date range
// if ($itemTs >= $startTs && $itemTs <= $endTs) {
// $telemetry[] = [
// 'key_name' => $keyName,
// 'value' => $item['value'] ?? null,
// 'display_name' => $displayName,
// 'timestamp' => $itemTs,
// 'start_date' => $startTs,
// 'end_date' => $endTs
// ];
// }
// }
// }
// }
// if (!empty($telemetry)) {
// $response[] = [
// 'device_id' => (string) $device->id,
// 'device_name' => $device->name,
// 'device_profile_name' => (string) $device->deviceProfile->name,
// 'device_profile_id' => (string) $device->device_profile_id,
// 'telemetry' => $telemetry,
// ];
// }
// }
// return response()->json(['telemetry' => $response]);
// }
2025-03-25 11:34:55 +05:30
2025-03-27 18:54:06 +05:30
}