diff --git a/backend/api/EventHandlers/MqttEventHandler.cs b/backend/api/EventHandlers/MqttEventHandler.cs index ca6219dfc..9563d1f01 100644 --- a/backend/api/EventHandlers/MqttEventHandler.cs +++ b/backend/api/EventHandlers/MqttEventHandler.cs @@ -8,6 +8,7 @@ using Api.Services.Events; using Api.Services.Models; using Api.Utilities; +using Microsoft.EntityFrameworkCore; using Microsoft.IdentityModel.Tokens; namespace Api.EventHandlers { @@ -112,86 +113,83 @@ private async void OnIsarRobotInfo(object? sender, MqttReceivedArgs mqttArgs) { var provider = GetServiceProvider(); var robotService = provider.GetRequiredService(); - var robotModelService = provider.GetRequiredService(); var isarRobotInfo = (IsarRobotInfoMessage)mqttArgs.Message; - var robot = await robotService.ReadByIsarId(isarRobotInfo.IsarId); - - if (robot == null) + try { - _logger.LogInformation( - "Received message from new ISAR instance '{id}' with robot name '{name}'. Adding new robot to database.", - isarRobotInfo.IsarId, - isarRobotInfo.RobotName - ); + var robot = await robotService.ReadByIsarId(isarRobotInfo.IsarId); - var robotQuery = new CreateRobotQuery - { - IsarId = isarRobotInfo.IsarId, - Name = isarRobotInfo.RobotName, - RobotType = isarRobotInfo.RobotType, - SerialNumber = isarRobotInfo.SerialNumber, - CurrentInstallation = isarRobotInfo.CurrentInstallation, - VideoStreams = isarRobotInfo.VideoStreamQueries, - Host = isarRobotInfo.Host, - Port = isarRobotInfo.Port, - Status = RobotStatus.Available, - Enabled = true - }; - - var robotModel = await robotModelService.ReadByRobotType(robotQuery.RobotType); - if (robotModel == null) + if (robot == null) { - _logger.LogError( - "Could not create new robot for ISAR instance '{id}' because the provided robot type '{robotType}' does not exist", + _logger.LogInformation( + "Received message from new ISAR instance '{id}' with robot name '{name}'. Adding new robot to database.", isarRobotInfo.IsarId, - isarRobotInfo.RobotType + isarRobotInfo.RobotName + ); + + var robotQuery = new CreateRobotQuery + { + IsarId = isarRobotInfo.IsarId, + Name = isarRobotInfo.RobotName, + RobotType = isarRobotInfo.RobotType, + SerialNumber = isarRobotInfo.SerialNumber, + CurrentInstallation = isarRobotInfo.CurrentInstallation, + VideoStreams = isarRobotInfo.VideoStreamQueries, + Host = isarRobotInfo.Host, + Port = isarRobotInfo.Port, + Status = RobotStatus.Available, + Enabled = true + }; + + var newRobot = new Robot(robotQuery); + newRobot = await robotService.Create(newRobot); + _logger.LogInformation( + "Added robot '{robotName}' with ISAR id '{isarId}' to database", + newRobot.Name, + newRobot.IsarId ); + return; } - var newRobot = new Robot(robotQuery) - { - Model = robotModel - }; - newRobot = await robotService.Create(newRobot); - _logger.LogInformation( - "Added robot '{robotName}' with ISAR id '{isarId}' to database", - newRobot.Name, - newRobot.IsarId - ); + List updatedFields = new(); - return; - } + if (isarRobotInfo.VideoStreamQueries is not null) + { + UpdateVideoStreamsIfChanged(isarRobotInfo.VideoStreamQueries, ref robot, ref updatedFields); + } - List updatedFields = new(); + if (isarRobotInfo.Host is not null) + { + UpdateHostIfChanged(isarRobotInfo.Host, ref robot, ref updatedFields); + } - if (isarRobotInfo.VideoStreamQueries is not null) - { - UpdateVideoStreamsIfChanged(isarRobotInfo.VideoStreamQueries, ref robot, ref updatedFields); - } + UpdatePortIfChanged(isarRobotInfo.Port, ref robot, ref updatedFields); - if (isarRobotInfo.Host is not null) - { - UpdateHostIfChanged(isarRobotInfo.Host, ref robot, ref updatedFields); - } + if (isarRobotInfo.CurrentInstallation is not null) + { + UpdateCurrentInstallationIfChanged(isarRobotInfo.CurrentInstallation, ref robot, ref updatedFields); + } - UpdatePortIfChanged(isarRobotInfo.Port, ref robot, ref updatedFields); + if (!updatedFields.IsNullOrEmpty()) + { + robot = await robotService.Update(robot); + _logger.LogInformation( + "Updated robot '{id}' ('{robotName}') in database: {updates}", + robot.Id, + robot.Name, + updatedFields + ); + } - if (isarRobotInfo.CurrentInstallation is not null) + } + catch (DbUpdateException e) { - UpdateCurrentInstallationIfChanged(isarRobotInfo.CurrentInstallation, ref robot, ref updatedFields); + _logger.LogError("Could not add robot to db", e); } - - if (!updatedFields.IsNullOrEmpty()) + catch (Exception e) { - robot = await robotService.Update(robot); - _logger.LogInformation( - "Updated robot '{id}' ('{robotName}') in database: {updates}", - robot.Id, - robot.Name, - updatedFields - ); + _logger.LogError("Could not update robot in db", e); } } diff --git a/backend/api/Services/RobotService.cs b/backend/api/Services/RobotService.cs index d19bc9259..04682725a 100644 --- a/backend/api/Services/RobotService.cs +++ b/backend/api/Services/RobotService.cs @@ -31,9 +31,15 @@ public RobotService(FlotillaDbContext context) public async Task Create(Robot newRobot) { - await _context.Robots.AddAsync(newRobot); - await _context.SaveChangesAsync(); - return newRobot; + var existingModel = _context.RobotModels.FirstOrDefault(r => r.Id.Equals(newRobot.Model.Id)); + if (existingModel != null) + { + newRobot.Model = existingModel; + await _context.Robots.AddAsync(newRobot); + await _context.SaveChangesAsync(); + return newRobot; + } + throw new DbUpdateException("Could not create new robot in database as robot model does not exist"); } public async Task> ReadAll()