device user list based on customer, login, create alarm

This commit is contained in:
sayliraut
2025-03-26 11:37:58 +05:30
parent 6cfc5cd0dd
commit 0d7103ebbe
10 changed files with 350 additions and 37 deletions

View File

@@ -1,6 +1,6 @@
<?php
namespace App\Http\Controllers\APIS\CustomerApi;
namespace App\Http\Controllers\APIS\AdminApi;
use App\Http\Controllers\Controller;
use App\Http\Requests\CreateCustomerRequest;

View File

@@ -1,6 +1,6 @@
<?php
namespace App\Http\Controllers\APIS\CustomerApi;
namespace App\Http\Controllers\APIS\AdminApi;
use App\Http\Controllers\Controller;
use App\Http\Requests\CreateDeviceRequest;
@@ -146,4 +146,25 @@ class DeviceController extends Controller
return jsonResponseWithErrorMessage($e->getMessage(), 500);
}
}
public function devicelistCustomer($customerId)
{
try {
$devices = Device::where('customer_id', $customerId)->get();
if ($devices->isEmpty()) {
return response()->json(['message' => 'No devices found for this customer ID'], 404);
}
return jsonResponseWithSuccessMessage('Devices fetched successfully', [
'Devices' => $devices
]);
} catch (Exception $e) {
Log::error("An error occurred in customer device listing: " . $e->getMessage());
return jsonResponseWithErrorMessage($e->getMessage(), 500);
}
}
}

View File

@@ -0,0 +1,56 @@
<?php
namespace App\Http\Controllers\APIS\AdminApi;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Cache;
use Illuminate\Http\Request;
use Exception;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Validator;
class LoginController extends Controller
{
public function adminLogin(Request $request)
{
$validator = Validator::make($request->all(), [
'username' => 'required|string',
'password' => 'required|string',
]);
if ($validator->fails()) {
return jsonResponseWithErrorMessage($validator->errors()->first(), 400);
}
$baseUrl = env('THINGSBOARD_URL', 'http://65.0.131.117:8080');
try {
$response = Http::withHeaders([
'accept' => 'application/json',
'Content-Type' => 'application/json',
])->post("{$baseUrl}/api/auth/login", [
'username' => $request->username,
'password' => $request->password,
]);
if ($response->successful()) {
$token = $response->json('token');
return jsonResponseWithSuccessMessage(__('Login successful'), $token, 200);
} else {
return response()->json([
'message' => __($response->json('message') ?? 'Invalid credentials')
], 401);
}
} catch (Exception $e) {
Log::error("Login Error: " . $e->getMessage());
return response()->json([
'message' => __('auth.something_went_wrong')
], 500);
}
}
}

View File

@@ -77,21 +77,21 @@ class UsersController extends Controller
$user->last_login_ts = $request->last_login_ts;
$user->save();
$randomToken = Str::random(64);
$randomToken = Str::random(64);
$activationLink = url("/apia/activate/{$user->id}?token={$randomToken}");
$activationLink = url("/apia/activate/{$user->id}?token={$randomToken}");
$mail = Mail::to($user->email)->send(new UserCreatedMail($user, $activationLink));
$mail = Mail::to($user->email)->send(new UserCreatedMail($user, $activationLink));
return response()->json([
'message' => __('auth.data_fetched_successfully'),
'user_id' => $user->id,
'activation_link' => $activationLink,
'token' => $randomToken,
'data' => $response
], 200);
} catch (QueryException $e) {
return response()->json([
'message' => __('auth.data_fetched_successfully'),
'user_id' => $user->id,
'activation_link' => $activationLink,
'token' => $randomToken,
'data' => $response
], 200);
} catch (QueryException $e) {
Log::error('Error in creating User ' . $e->getMessage());
return jsonResponseWithErrorMessageApi(__('auth.something went wrong'), 401);
}
@@ -146,7 +146,6 @@ class UsersController extends Controller
'message' => 'User deleted successfully from ThingsBoard and local database',
'response' => $response
], 200);
} catch (Exception $e) {
Log::error('Error in deleting User ' . $e->getMessage());
@@ -259,7 +258,6 @@ class UsersController extends Controller
'message' => 'User activated and password set successfully in Laravel!',
'user_id' => $user->id
], 200);
} catch (ValidationException $e) {
Log::error("Validation error for User ID: {$id}. Exception: " . $e->getMessage());
return response()->json([
@@ -267,7 +265,6 @@ class UsersController extends Controller
'message' => 'Validation error.',
'errors' => $e->errors()
], 422);
} catch (\Exception $e) {
Log::error("Error activating user ID: {$id}. Exception: " . $e->getMessage());
return response()->json([
@@ -416,8 +413,23 @@ class UsersController extends Controller
], 200);
}
public function userlistCustomer($customerId)
{
try {
$users = User::where('customer_id', $customerId)->get();
if ($users->isEmpty()) {
return response()->json(['message' => 'No users found for this customer ID'], 404);
}
return jsonResponseWithSuccessMessage('users fetched successfully', [
'users' => $users
]);
} catch (Exception $e) {
Log::error("An error occurred in customer user listing: " . $e->getMessage());
return jsonResponseWithErrorMessage($e->getMessage(), 500);
}
}
}

View File

@@ -44,22 +44,31 @@ class TelemetryController extends Controller
foreach ($devices as $device) {
$telemetry = [];
// ✅ Fetch key names from timeseries_key_master associated with the device profile
$keyNames = TimeseriesKeyMaster::where('device_profile_xid', $device->device_profile_id)
->pluck('key_name')
->toArray();
// ✅ Fetch key names along with additional columns from timeseries_key_master
$keysData = TimeseriesKeyMaster::where('device_profile_xid', $device->device_profile_id)
->where(function ($query) {
$query->where('display_on_dashboard', true)
->orWhere('display_on_popup', true);
})
->get(['key_name', 'display_name', 'display_on_dashboard', 'display_on_popup']);
$keyNames = $keysData->pluck('key_name')->toArray();
// ✅ Fetch telemetry data
$telemetryResponse = $this->customerInfoService->getTelemetryData($device, $keyNames, $startTs, $endTs);
foreach ($keysData as $keyData) {
$keyName = $keyData->key_name;
foreach ($keyNames as $keyName) {
if (isset($telemetryResponse[$keyName])) {
foreach ($telemetryResponse[$keyName] as $item) {
$telemetry[] = [
'key_name' => $keyName,
'timestamp' => $item['ts'] ?? null,
'value' => $item['value'] ?? null
'key_name' => $keyName,
'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
];
}
}
@@ -78,12 +87,4 @@ class TelemetryController extends Controller
return response()->json(['telemetry' => $response]);
}
}

View File

@@ -0,0 +1,65 @@
<?php
namespace App\Http\Controllers;
use App\Services\AlarmService;
use Carbon\Carbon;
use Illuminate\Support\Facades\Log;
use Exception;
use Illuminate\Http\Request;
class AlarmController extends Controller
{
protected $alarmService;
public function __construct(AlarmService $alarmService)
{
$this->alarmService = $alarmService;
}
public function createOrUpdateAlarm(Request $request)
{
try {
$alarmData = [
'type' => $request->type ?? null,
'severity' => $request->severity ?? null,
'acknowledged' => false ?? null,
'cleared' => $request->cleared ?? Carbon::now()->timestamp,
'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,
'originator' => $request->originator ?? 1,
'assigneeId' => $request->assigneeId ?? 1,
];
// Handle updating existing alarm
if (!empty($request->id)) {
$alarmData['id'] = $request->id;
}
// Call Service to create/update device
$apiResponse = $this->alarmService->createOrUpdateAlarm($alarmData);
return jsonResponseWithSuccessMessage(
!empty($request->id) ? 'Alarm updated successfully' : 'Alarm created successfully',
['api_response' => $apiResponse]
);
} catch (Exception $e) {
Log::error("Error: " . $e->getMessage());
$errorResponse = json_decode($e->getMessage(), true);
if (json_last_error() === JSON_ERROR_NONE) {
return jsonResponseWithErrorMessage($errorResponse['message'] ?? 'Something went wrong', 400, $errorResponse);
}
return jsonResponseWithErrorMessage($e->getMessage(), 500);
}
}
}

View File

@@ -52,4 +52,9 @@ class Device extends Model
{
return $this->hasMany(TimeseriesKeyMaster::class, 'device_profile_xid', 'device_profile_id');
}
public function customer()
{
return $this->belongsTo(Customer::class, 'customer_xid', 'id');
}
}

View File

@@ -20,7 +20,7 @@ class User extends Authenticatable implements JWTSubject
public function getJWTIdentifier()
{
// return $this->getKey();
return (string) $this->getKey();
return (string) $this->getKey();
}
public function getJWTCustomClaims()
@@ -67,4 +67,8 @@ class User extends Authenticatable implements JWTSubject
return $this->hasManyThrough(Asset::class, UserAssetLink::class, 'user_id', 'id', 'id', 'asset_id');
}
}
public function customer()
{
return $this->belongsTo(Customer::class, 'customer_id', 'id');
}
}

View File

@@ -0,0 +1,138 @@
<?php
namespace App\Services;
use Carbon\Carbon;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Cache;
use Exception;
use Illuminate\Support\Facades\Log;
class AlarmService
{
private $baseUrl;
private $username;
private $password;
public function __construct()
{
$this->baseUrl = env('THINGSBOARD_URL', 'http://65.0.131.117:8080');
$this->username = env('THINGSBOARD_USERNAME', 'tenant1@thingsboard.org');
$this->password = env('THINGSBOARD_PASSWORD', 'tenant1');
}
public function getToken()
{
if (Cache::has('thingsboard_token')) {
return Cache::get('thingsboard_token');
}
$response = Http::withHeaders([
'accept' => 'application/json',
'Content-Type' => 'application/json',
])
->post("{$this->baseUrl}/api/auth/login", [
'username' => $this->username,
'password' => $this->password,
]);
if ($response->successful()) {
$token = $response->json('token');
Cache::put('thingsboard_token', $token, now()->addMinutes(15));
return $token;
} else {
Log::error("ThingsBoard Authentication Failed: " . $response->body());
throw new Exception('Unable to authenticate with ThingsBoard: ' . $response->body());
}
}
public function createOrUpdateAlarm(array $data)
{
$token = $this->getToken();
$payload = [
'type' => $data['type'] ?? null,
'severity' => $data['severity'] ?? null,
'acknowledged' => $data['acknowledged'] ?? null,
'cleared' => $data['cleared'] ?? Carbon::now()->timestamp,
'startTs' => $data['startTs'] ?? Carbon::now()->timestamp,
'endTs' => $data['endTs'] ?? Carbon::now()->timestamp,
'originator' => [
'id' => $data['originator'] ?? null,
'entityType' => 'DEVICE'
],
'assigneeId' => [
'id' => $data['assigneeId'] ?? null,
'entityType' => 'USER'
],
'details' => $data['details'] ?? [],
'propagate' => $data['propagate'] ?? false,
'propagateToOwner' => $data['propagateToOwner'] ?? false,
];
// Optional fields
if (!empty($data['id'])) {
$payload['id'] = [
'id' => $data['id'],
'entityType' => 'ALARM'
];
}
$url = "{$this->baseUrl}/api/alarm";
$method = 'post';
$response = Http::withHeaders([
'Authorization' => "Bearer $token",
'Accept' => 'application/json',
'Content-Type' => 'application/json',
])->post($url, $payload);
if (!$response->successful()) {
Log::error("API Error Response:", ['body' => $response->body()]);
throw new Exception('API Error: ' . $response->body());
}
$apiResponse = $response->json();
return $apiResponse;
}
public function deleteDevice(array $data)
{
$token = $this->getToken();
$url = "{$this->baseUrl}/api/device/{$data['deviceId']}";
$response = Http::withHeaders([
'Authorization' => "Bearer $token",
'Accept' => 'application/json',
])->delete($url);
// If response body is empty, assume success
if ($response->status() === 200 && empty($response->body())) {
return ['message' => 'Device deleted successfully'];
}
if ($response->successful()) {
return $response->json();
} else {
throw new Exception('Failed to create Device: ' . $response->body());
Log::info('API Response:', ['response' => $response]);
}
throw new Exception('Failed to create user: ' . $response->body());
}
}

View File

@@ -1,20 +1,26 @@
<?php
// use App\Http\Controllers\AssetController;
use App\Http\Controllers\APIS\CustomerApi\CustomerController;
use App\Http\Controllers\AlarmController;
use App\Http\Controllers\APIS\AdminApi\CustomerController;
use App\Http\Controllers\APIS\AdminApi\UsersController;
use App\Http\Controllers\APIS\CustomerApi\DeviceController;
use App\Http\Controllers\APIS\AdminApi\DeviceController;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\APIS\AdminApi\AssetadmintController;
use App\Http\Controllers\APIS\AdminApi\TelemetryController;
use App\Http\Controllers\APIS\AdminApi\DeviceProfileMasterController;
use App\Http\Controllers\APIS\AdminApi\LoginController;
Route::get('/adminapi', function () {
return ('Welcome to admin api routes.');
});
//******************************************************* Admin Assest API ********************************************************
Route::post('/admin-login', [LoginController::class, 'adminLogin'])->name('admin.login');
Route::post('/asset', [AssetadmintController::class, 'storeAssest'])->name('assest.create');
Route::get('/assets-list', [AssetadmintController::class, 'listAssest'])->name('assest.list');
@@ -38,6 +44,8 @@ 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']);
Route::get('/users/{customer_id}', [UsersController::class, 'userlistCustomer'])->name('usertList.customer');
@@ -45,6 +53,7 @@ Route::post('/users-login', [UsersController::class, 'loginUser']);
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');
Route::get('/device/{customer_id}', [DeviceController::class, 'devicelistCustomer'])->name('devicetList.customer');
//******************************************************* Admin DeviceProfileMaster API ********************************************************
@@ -52,3 +61,5 @@ Route::get('/device-profile-master/list', [DeviceProfileMasterController::class,
Route::post('/update-device-profile-master/{deviceId}', [DeviceProfileMasterController::class, 'updateDevice'])->name('update.deviceMaster');
//******************************************************* Alarm API ********************************************************
Route::post('/alarm/create-or-update', [AlarmController::class, 'createOrUpdateAlarm'])->name('alarm.create-or-update');