Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix various tracking issues #1970

Merged
merged 7 commits into from
Jan 21, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion backend/api.test/Services/RobotService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ public async Task CheckThatReadByIdReturnsCorrectRobot()
var installation = await DatabaseUtilities.NewInstallation();
var robot = await DatabaseUtilities.NewRobot(RobotStatus.Available, installation);

var robotById = await RobotService.ReadById(robot.Id, readOnly: false);
var robotById = await RobotService.ReadById(robot.Id, readOnly: true);

Assert.Equal(robot.Id, robotById!.Id);
}
Expand Down
2 changes: 1 addition & 1 deletion backend/api/Controllers/InspectionAreaController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -252,7 +252,7 @@ [FromBody] CreateDefaultLocalizationPose newDefaultLocalizationPose
{
var inspectionArea = await inspectionAreaService.ReadById(
inspectionAreaId,
readOnly: false
readOnly: true
);
if (inspectionArea is null)
{
Expand Down
4 changes: 2 additions & 2 deletions backend/api/Controllers/MissionDefinitionController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ [FromBody] UpdateMissionDefinitionQuery missionDefinitionQuery
return BadRequest("Invalid data.");
}

var missionDefinition = await missionDefinitionService.ReadById(id, readOnly: false);
var missionDefinition = await missionDefinitionService.ReadById(id, readOnly: true);
if (missionDefinition == null)
{
return NotFound($"Could not find mission definition with id '{id}'");
Expand Down Expand Up @@ -198,7 +198,7 @@ [FromBody] UpdateMissionDefinitionIsDeprecatedQuery missionDefinitionIsDeprecate
return BadRequest("Invalid data.");
}

var missionDefinition = await missionDefinitionService.ReadById(id, readOnly: false);
var missionDefinition = await missionDefinitionService.ReadById(id, readOnly: true);
if (missionDefinition == null)
{
return NotFound($"Could not find mission definition with id '{id}'");
Expand Down
8 changes: 8 additions & 0 deletions backend/api/EventHandlers/MissionEventHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,14 @@ private async void OnMissionRunCreated(object? sender, MissionRunCreatedEventArg

private async void OnRobotAvailable(object? sender, RobotAvailableEventArgs e)
{
if (e.Robot.Status != RobotStatus.Available)
{
_logger.LogWarning(
"OnRobotAvailable was triggered while robot was {robotStatus}",
e.Robot.Status
);
return;
}
_startMissionSemaphore.WaitOne();
try
{
Expand Down
2 changes: 1 addition & 1 deletion backend/api/EventHandlers/MqttEventHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -454,7 +454,7 @@ await MissionRunService.UpdateMissionRunStatusByIsarMissionId(
if (updatedFlotillaMissionRun.MissionId == null)
{
_logger.LogInformation(
"Mission run {missionRunId} does not have a mission definition assosiated with it",
"Mission run {missionRunId} does not have a mission definition associated with it",
updatedFlotillaMissionRun.Id
);
return;
Expand Down
6 changes: 3 additions & 3 deletions backend/api/Services/AccessRoleService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ RoleAccessLevel accessLevel
);
public Task<AccessRole?> ReadByInstallation(Installation installation);
public Task<List<AccessRole>> ReadAll();
public void DetachTracking(AccessRole accessRole);
public void DetachTracking(FlotillaDbContext context, AccessRole accessRole);
}

public class AccessRoleService(
Expand Down Expand Up @@ -101,7 +101,7 @@ RoleAccessLevel accessLevel

await context.AccessRoles.AddAsync(newAccessRole);
await context.SaveChangesAsync();
DetachTracking(newAccessRole);
DetachTracking(context, newAccessRole);
return newAccessRole!;
}

Expand Down Expand Up @@ -135,7 +135,7 @@ public bool IsAuthenticationAvailable()
return httpContextAccessor.HttpContext != null;
}

public void DetachTracking(AccessRole accessRole)
public void DetachTracking(FlotillaDbContext context, AccessRole accessRole)
{
context.Entry(accessRole).State = EntityState.Detached;
}
Expand Down
18 changes: 11 additions & 7 deletions backend/api/Services/AreaService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public Task<PagedList<Area>> ReadAll(

public Task<Area?> Delete(string id);

public void DetachTracking(Area area);
public void DetachTracking(FlotillaDbContext context, Area area);
}

[SuppressMessage(
Expand Down Expand Up @@ -210,14 +210,15 @@ await inspectionAreaService.ReadByInstallationAndPlantAndName(
await context.Areas.AddAsync(newArea);
await ApplyDatabaseUpdate(installation);

DetachTracking(newArea);
DetachTracking(context, newArea);
return newArea;
}

public async Task<Area> Update(Area area)
{
var entry = context.Update(area);
await ApplyDatabaseUpdate(area.Installation);
DetachTracking(context, area);
return entry.Entity;
}

Expand Down Expand Up @@ -352,16 +353,19 @@ AreaQueryStringParameters parameters
return Expression.Lambda<Func<Area, bool>>(body, area);
}

public void DetachTracking(Area area)
public void DetachTracking(FlotillaDbContext context, Area area)
{
if (area.Installation != null)
installationService.DetachTracking(area.Installation);
installationService.DetachTracking(context, area.Installation);
if (area.Plant != null)
plantService.DetachTracking(area.Plant);
plantService.DetachTracking(context, area.Plant);
if (area.InspectionArea != null)
inspectionAreaService.DetachTracking(area.InspectionArea);
inspectionAreaService.DetachTracking(context, area.InspectionArea);
if (area.DefaultLocalizationPose != null)
defaultLocalizationPoseService.DetachTracking(area.DefaultLocalizationPose);
defaultLocalizationPoseService.DetachTracking(
context,
area.DefaultLocalizationPose
);
context.Entry(area).State = EntityState.Detached;
}
}
Expand Down
13 changes: 10 additions & 3 deletions backend/api/Services/DefaultLocalizationPoseService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,10 @@ DefaultLocalizationPose defaultLocalizationPose

public abstract Task<DefaultLocalizationPose?> Delete(string id);

public void DetachTracking(DefaultLocalizationPose defaultLocalizationPose);
public void DetachTracking(
FlotillaDbContext context,
DefaultLocalizationPose defaultLocalizationPose
);
}

[System.Diagnostics.CodeAnalysis.SuppressMessage(
Expand Down Expand Up @@ -59,7 +62,7 @@ DefaultLocalizationPose defaultLocalizationPose
await context.DefaultLocalizationPoses.AddAsync(defaultLocalizationPose);
await context.SaveChangesAsync();

DetachTracking(defaultLocalizationPose);
DetachTracking(context, defaultLocalizationPose);
return defaultLocalizationPose;
}

Expand All @@ -69,6 +72,7 @@ DefaultLocalizationPose defaultLocalizationPose
{
var entry = context.Update(defaultLocalizationPose);
await context.SaveChangesAsync();
DetachTracking(context, defaultLocalizationPose);
return entry.Entity;
}

Expand All @@ -87,7 +91,10 @@ DefaultLocalizationPose defaultLocalizationPose
return defaultLocalizationPose;
}

public void DetachTracking(DefaultLocalizationPose defaultLocalizationPose)
public void DetachTracking(
FlotillaDbContext context,
DefaultLocalizationPose defaultLocalizationPose
)
{
context.Entry(defaultLocalizationPose).State = EntityState.Detached;
}
Expand Down
28 changes: 20 additions & 8 deletions backend/api/Services/InspectionAreaService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ public Task<IEnumerable<InspectionArea>> ReadByInstallation(

public Task<InspectionArea?> Delete(string id);

public void DetachTracking(InspectionArea inspectionArea);
public void DetachTracking(FlotillaDbContext context, InspectionArea inspectionArea);
}

[SuppressMessage(
Expand Down Expand Up @@ -194,7 +194,7 @@ await plantService.ReadByInstallationAndPlantCode(
inspectionArea.Installation,
new InspectionAreaResponse(inspectionArea)
);
DetachTracking(inspectionArea);
DetachTracking(context, inspectionArea);
return inspectionArea!;
}

Expand All @@ -207,6 +207,7 @@ public async Task<InspectionArea> Update(InspectionArea inspectionArea)
inspectionArea.Installation,
new InspectionAreaResponse(inspectionArea)
);
DetachTracking(context, inspectionArea);
return entry.Entity;
}

Expand Down Expand Up @@ -263,14 +264,25 @@ private async Task ApplyDatabaseUpdate(Installation? installation)
);
}

public void DetachTracking(InspectionArea inspectionArea)
public void DetachTracking(FlotillaDbContext context, InspectionArea inspectionArea)
{
if (inspectionArea.Installation != null)
installationService.DetachTracking(inspectionArea.Installation);
if (inspectionArea.Plant != null)
plantService.DetachTracking(inspectionArea.Plant);
if (inspectionArea.DefaultLocalizationPose != null)
if (
inspectionArea.Installation != null
&& context.Entry(inspectionArea.Installation).State != EntityState.Detached
)
installationService.DetachTracking(context, inspectionArea.Installation);
if (
inspectionArea.Plant != null
&& context.Entry(inspectionArea.Plant).State != EntityState.Detached
)
plantService.DetachTracking(context, inspectionArea.Plant);
if (
inspectionArea.DefaultLocalizationPose != null
&& context.Entry(inspectionArea.DefaultLocalizationPose).State
!= EntityState.Detached
)
defaultLocalizationPoseService.DetachTracking(
context,
inspectionArea.DefaultLocalizationPose
);
context.Entry(inspectionArea).State = EntityState.Detached;
Expand Down
22 changes: 15 additions & 7 deletions backend/api/Services/InspectionService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ public async Task<Inspection> UpdateInspectionStatus(
IsarTaskStatus isarTaskStatus
)
{
var inspection = await ReadByIsarTaskId(isarTaskId, readOnly: false);
var inspection = await ReadByIsarTaskId(isarTaskId, readOnly: true);
if (inspection is null)
{
string errorMessage = $"Inspection with task ID {isarTaskId} could not be found";
Expand All @@ -69,7 +69,7 @@ IsarTaskStatus isarTaskStatus
}

inspection.UpdateStatus(isarTaskStatus);
inspection = await Update(inspection);
await Update(inspection);
return inspection;
}

Expand All @@ -89,7 +89,7 @@ private async Task ApplyDatabaseUpdate(Installation? installation)
);
}

private async Task<Inspection> Update(Inspection inspection)
private async Task Update(Inspection inspection)
{
var entry = context.Update(inspection);

Expand All @@ -107,8 +107,7 @@ private async Task<Inspection> Update(Inspection inspection)
var installation = missionRun?.InspectionArea?.Installation;

await ApplyDatabaseUpdate(installation);

return entry.Entity;
DetachTracking(context, inspection);
}

public async Task<Inspection?> ReadByIsarTaskId(string id, bool readOnly = true)
Expand Down Expand Up @@ -136,7 +135,7 @@ private IQueryable<Inspection> GetInspections(bool readOnly = true)
string isarTaskId
)
{
var inspection = await ReadByIsarTaskId(isarTaskId, readOnly: false);
var inspection = await ReadByIsarTaskId(isarTaskId, readOnly: true);

if (inspection is null)
{
Expand All @@ -151,7 +150,7 @@ string isarTaskId
};

inspection.InspectionFindings.Add(inspectionFinding);
inspection = await Update(inspection);
await Update(inspection);
return inspection;
}

Expand Down Expand Up @@ -227,5 +226,14 @@ await response.Content.ReadFromJsonAsync<IDAInspectionDataResponse>()
);
return null;
}

public void DetachTracking(FlotillaDbContext context, Inspection inspection)
{
foreach (var inspectionFinding in inspection.InspectionFindings)
{
context.Entry(inspectionFinding).State = EntityState.Detached;
}
context.Entry(inspection).State = EntityState.Detached;
}
}
}
7 changes: 4 additions & 3 deletions backend/api/Services/InstallationService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public interface IInstallationService

public abstract Task<Installation?> Delete(string id);

public void DetachTracking(Installation installation);
public void DetachTracking(FlotillaDbContext context, Installation installation);
}

[System.Diagnostics.CodeAnalysis.SuppressMessage(
Expand Down Expand Up @@ -109,7 +109,7 @@ public async Task<Installation> Create(CreateInstallationQuery newInstallationQu
};
await context.Installations.AddAsync(installation);
await ApplyUnprotectedDatabaseUpdate();
DetachTracking(installation);
DetachTracking(context, installation);
}

return installation;
Expand All @@ -119,6 +119,7 @@ public async Task<Installation> Update(Installation installation)
{
var entry = context.Update(installation);
await ApplyDatabaseUpdate(installation);
DetachTracking(context, installation);
return entry.Entity;
}

Expand All @@ -136,7 +137,7 @@ public async Task<Installation> Update(Installation installation)
return installation;
}

public void DetachTracking(Installation installation)
public void DetachTracking(FlotillaDbContext context, Installation installation)
{
context.Entry(installation).State = EntityState.Detached;
}
Expand Down
11 changes: 6 additions & 5 deletions backend/api/Services/MissionDefinitionService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ string missionDefinitionId

public Task<MissionDefinition?> Delete(string id);

public void DetachTracking(MissionDefinition missionDefinition);
public void DetachTracking(FlotillaDbContext context, MissionDefinition missionDefinition);
}

[SuppressMessage(
Expand Down Expand Up @@ -84,7 +84,7 @@ public async Task<MissionDefinition> Create(MissionDefinition missionDefinition)
missionDefinition.InspectionArea?.Installation,
new MissionDefinitionResponse(missionDefinition)
);
DetachTracking(missionDefinition);
DetachTracking(context, missionDefinition);
return missionDefinition;
}

Expand Down Expand Up @@ -192,6 +192,7 @@ public async Task<MissionDefinition> Update(MissionDefinition missionDefinition)
missionDefinition?.InspectionArea?.Installation,
missionDefinition != null ? new MissionDefinitionResponse(missionDefinition) : null
);
DetachTracking(context, missionDefinition!);
return entry.Entity;
}

Expand Down Expand Up @@ -327,12 +328,12 @@ parameters.InstallationCode is null
);
}

public void DetachTracking(MissionDefinition missionDefinition)
public void DetachTracking(FlotillaDbContext context, MissionDefinition missionDefinition)
{
if (missionDefinition.LastSuccessfulRun != null)
missionRunService.DetachTracking(missionDefinition.LastSuccessfulRun);
missionRunService.DetachTracking(context, missionDefinition.LastSuccessfulRun);
if (missionDefinition.Source != null)
sourceService.DetachTracking(missionDefinition.Source);
sourceService.DetachTracking(context, missionDefinition.Source);
context.Entry(missionDefinition).State = EntityState.Detached;
}
}
Expand Down
Loading
Loading