diff --git a/backend/api/Services/AreaService.cs b/backend/api/Services/AreaService.cs index 05bd3c40..e132627b 100644 --- a/backend/api/Services/AreaService.cs +++ b/backend/api/Services/AreaService.cs @@ -76,7 +76,8 @@ public async Task> ReadAll( public async Task ReadById(string id, bool readOnly = true) { - return await GetAreas(readOnly: readOnly).FirstOrDefaultAsync(a => a.Id.Equals(id)); + return await GetAccessibleAreas(readOnly: readOnly) + .FirstOrDefaultAsync(a => a.Id.Equals(id)); } public async Task> ReadByInspectionAreaId( @@ -88,7 +89,7 @@ public async Task> ReadAll( { return []; } - return await GetAreas(readOnly: readOnly) + return await GetAccessibleAreas(readOnly: readOnly) .Where(a => a.InspectionArea != null && a.InspectionArea.Id.Equals(inspectionAreaId) ) @@ -110,7 +111,7 @@ public async Task> ReadAll( return null; } - return await GetAreas(readOnly: readOnly) + return await GetAccessibleAreas(readOnly: readOnly) .Where(a => a.Installation.Id.Equals(installation.Id) && a.Name.ToLower().Equals(areaName.ToLower()) @@ -129,7 +130,7 @@ public async Task> ReadByInstallation(string installationCode) return []; } - return await GetAreas() + return await GetAccessibleAreas() .Where(a => a.Installation.Id.Equals(installation.Id)) .ToListAsync(); } @@ -224,7 +225,7 @@ public async Task Update(Area area) public async Task Delete(string id) { - var area = await GetAreas().FirstOrDefaultAsync(ev => ev.Id.Equals(id)); + var area = await GetAccessibleAreas().FirstOrDefaultAsync(ev => ev.Id.Equals(id)); if (area is null) { return null; @@ -252,9 +253,21 @@ private async Task ApplyDatabaseUpdate(Installation? installation) ); } - private IQueryable GetAreas(bool readOnly = true) + private IQueryable GetAccessibleAreas(bool readOnly = true) { var accessibleInstallationCodes = accessRoleService.GetAllowedInstallationCodes(); + var query = GetAreasWithSubModels(readOnly: readOnly) + .Where( + (area) => + accessibleInstallationCodes.Result.Contains( + area.Installation.InstallationCode.ToUpper() + ) + ); + return query; + } + + private IQueryable GetAreasWithSubModels(bool readOnly = true) + { var query = context .Areas.Include(area => area.DefaultLocalizationPose) .Include(area => area.InspectionArea) @@ -268,35 +281,7 @@ private IQueryable GetAreas(bool readOnly = true) .ThenInclude(inspectionArea => inspectionArea.Installation) .Include(area => area.Plant) .ThenInclude(plant => plant.Installation) - .Include(area => area.Installation) - .Where( - (area) => - accessibleInstallationCodes.Result.Contains( - area.Installation.InstallationCode.ToUpper() - ) - ); - return readOnly ? query.AsNoTracking() : query.AsTracking(); - } - - private IQueryable GetAreasWithSubModels(bool readOnly = true) - { - var accessibleInstallationCodes = accessRoleService.GetAllowedInstallationCodes(); - - // Include related entities using the Include method - var query = context - .Areas.Include(a => a.InspectionArea) - .ThenInclude(inspectionArea => inspectionArea != null ? inspectionArea.Plant : null) - .ThenInclude(plant => plant != null ? plant.Installation : null) - .Include(a => a.Plant) - .ThenInclude(plant => plant != null ? plant.Installation : null) - .Include(a => a.Installation) - .Include(a => a.DefaultLocalizationPose) - .Where(a => - a.Installation != null - && accessibleInstallationCodes.Result.Contains( - a.Installation.InstallationCode.ToUpper() - ) - ); + .Include(area => area.Installation); return readOnly ? query.AsNoTracking() : query.AsTracking(); } @@ -308,7 +293,7 @@ private IQueryable GetAreasWithSubModels(bool readOnly = true) bool readOnly = true ) { - return await GetAreas(readOnly: readOnly) + return await GetAccessibleAreas(readOnly: readOnly) .Where(a => a.InspectionArea != null && a.InspectionArea.Id.Equals(inspectionArea.Id) diff --git a/backend/api/Services/InspectionAreaService.cs b/backend/api/Services/InspectionAreaService.cs index 408ee3f5..aa46a1d9 100644 --- a/backend/api/Services/InspectionAreaService.cs +++ b/backend/api/Services/InspectionAreaService.cs @@ -62,12 +62,12 @@ ISignalRService signalRService { public async Task> ReadAll(bool readOnly = true) { - return await GetInspectionAreas(readOnly: readOnly).ToListAsync(); + return await GetAccessibleInspectionAreas(readOnly: readOnly).ToListAsync(); } public async Task ReadById(string id, bool readOnly = true) { - return await GetInspectionAreas(readOnly: readOnly) + return await GetAccessibleInspectionAreas(readOnly: readOnly) .FirstOrDefaultAsync(a => a.Id.Equals(id)); } @@ -84,7 +84,7 @@ public async Task> ReadByInstallation( { return []; } - return await GetInspectionAreas(readOnly: readOnly) + return await GetAccessibleInspectionAreas(readOnly: readOnly) .Where(a => a.Installation != null && a.Installation.Id.Equals(installation.Id)) .ToListAsync(); } @@ -99,7 +99,7 @@ public async Task> ReadByInstallation( { return null; } - return await GetInspectionAreas(readOnly: readOnly) + return await GetAccessibleInspectionAreas(readOnly: readOnly) .Where(a => a.Installation != null && a.Installation.InstallationCode.ToLower().Equals(installationCode.ToLower()) @@ -115,7 +115,7 @@ public async Task> ReadByInstallation( bool readOnly = true ) { - return await GetInspectionAreas(readOnly: readOnly) + return await GetAccessibleInspectionAreas(readOnly: readOnly) .Where(a => a.Plant != null && a.Plant.Id.Equals(plant.Id) @@ -213,7 +213,7 @@ public async Task Update(InspectionArea inspectionArea) public async Task Delete(string id) { - var inspectionArea = await GetInspectionAreas() + var inspectionArea = await GetAccessibleInspectionAreas() .FirstOrDefaultAsync(ev => ev.Id.Equals(id)); if (inspectionArea is null) { @@ -231,20 +231,28 @@ public async Task Update(InspectionArea inspectionArea) return inspectionArea; } - private IQueryable GetInspectionAreas(bool readOnly = true) + private IQueryable GetAccessibleInspectionAreas(bool readOnly = true) { var accessibleInstallationCodes = accessRoleService.GetAllowedInstallationCodes(); - var query = context - .InspectionAreas.Include(p => p.Plant) - .ThenInclude(p => p.Installation) - .Include(i => i.Installation) - .Include(d => d.DefaultLocalizationPose) + var query = GetInspectionAreas(readOnly: readOnly) .Where( (d) => accessibleInstallationCodes.Result.Contains( d.Installation.InstallationCode.ToUpper() ) ); + return query; + } + + private IQueryable GetInspectionAreas(bool readOnly = true) + { + var accessibleInstallationCodes = accessRoleService.GetAllowedInstallationCodes(); + var query = context + .InspectionAreas.Include(p => p.Plant) + .ThenInclude(p => p.Installation) + .Include(i => i.Installation) + .Include(d => d.DefaultLocalizationPose); + return readOnly ? query.AsNoTracking() : query.AsTracking(); } diff --git a/backend/api/Services/MissionRunService.cs b/backend/api/Services/MissionRunService.cs index 0f610570..ec7236a0 100644 --- a/backend/api/Services/MissionRunService.cs +++ b/backend/api/Services/MissionRunService.cs @@ -164,7 +164,7 @@ public async Task> ReadAll( bool readOnly = true ) { - var query = GetMissionRunsWithSubModels(readOnly: readOnly); + var query = GetAccessibleMissionRuns(readOnly: readOnly); var filter = ConstructFilter(parameters); query = query.Where(filter); @@ -184,7 +184,7 @@ public async Task> ReadAll( public async Task ReadById(string id, bool readOnly = true) { - return await GetMissionRunsWithSubModels(readOnly: readOnly) + return await GetAccessibleMissionRuns(readOnly: readOnly) .FirstOrDefaultAsync(missionRun => missionRun.Id.Equals(id)); } @@ -194,7 +194,7 @@ public async Task> ReadMissionRunQueue( bool readOnly = true ) { - return await GetMissionRunsWithSubModels(readOnly: readOnly) + return await GetAccessibleMissionRuns(readOnly: readOnly) .Where(missionRun => missionRun.Robot.Id == robotId && missionRun.Status == MissionStatus.Pending @@ -210,7 +210,7 @@ public async Task> ReadMissionRunQueue( bool readOnly = true ) { - return await GetMissionRunsWithSubModels(readOnly: readOnly) + return await GetAccessibleMissionRuns(readOnly: readOnly) .OrderBy(missionRun => missionRun.DesiredStartTime) .FirstOrDefaultAsync(missionRun => missionRun.Robot.Id == robotId @@ -236,7 +236,7 @@ public async Task> ReadMissionRuns( } ); - return await GetMissionRunsWithSubModels(readOnly: readOnly) + return await GetAccessibleMissionRuns(readOnly: readOnly) .Where(missionFilter) .OrderBy(missionRun => missionRun.DesiredStartTime) .ToListAsync(); @@ -247,7 +247,7 @@ public async Task> ReadMissionRuns( bool readOnly = true ) { - return await GetMissionRunsWithSubModels(readOnly: readOnly) + return await GetAccessibleMissionRuns(readOnly: readOnly) .Where(m => m.MissionId == missionId && m.EndTime == null) .OrderBy(m => m.DesiredStartTime) .FirstOrDefaultAsync(); @@ -258,7 +258,7 @@ public async Task> ReadMissionRuns( bool readOnly = true ) { - return await GetMissionRunsWithSubModels(readOnly: readOnly) + return await GetAccessibleMissionRuns(readOnly: readOnly) .Where(m => m.Robot.Id == robotId) .Where(m => m.EndTime != null) .OrderByDescending(m => m.EndTime) @@ -267,7 +267,7 @@ public async Task> ReadMissionRuns( public async Task PendingOrOngoingReturnToHomeMissionRunExists(string robotId) { - var pendingAndOngoingMissionRuns = await GetMissionRunsWithSubModels(readOnly: true) + var pendingAndOngoingMissionRuns = await GetAccessibleMissionRuns(readOnly: true) .Where(missionRun => missionRun.Robot.Id == robotId && ( @@ -341,7 +341,7 @@ public async Task UpdateWithInspections(MissionRun missionRun) public async Task Delete(string id) { - var missionRun = await GetMissionRunsWithSubModels() + var missionRun = await GetAccessibleMissionRuns() .FirstOrDefaultAsync(ev => ev.Id.Equals(id)); if (missionRun is null) { @@ -358,9 +358,24 @@ public async Task UpdateWithInspections(MissionRun missionRun) return missionRun; } - private IQueryable GetMissionRunsWithSubModels(bool readOnly = true) + private IQueryable GetAccessibleMissionRuns(bool readOnly = true) { var accessibleInstallationCodes = accessRoleService.GetAllowedInstallationCodes(); + var query = GetMissionRunsWithSubModels(readOnly); + query = query + .Where( + (m) => + m.InspectionArea == null + || accessibleInstallationCodes.Result.Contains( + m.InspectionArea.Installation.InstallationCode.ToUpper() + ) + ) + .Where((m) => m.IsDeprecated == false); + return query; + } + + private IQueryable GetMissionRunsWithSubModels(bool readOnly = true) + { var query = context .MissionRuns.Include(missionRun => missionRun.InspectionArea) .ThenInclude(inspectionArea => inspectionArea != null ? inspectionArea.Plant : null) @@ -393,15 +408,7 @@ private IQueryable GetMissionRunsWithSubModels(bool readOnly = true) inspections != null ? inspections.InspectionFindings : null ) .Include(missionRun => missionRun.Robot) - .ThenInclude(robot => robot.CurrentInstallation) - .Where( - (m) => - m.InspectionArea == null - || accessibleInstallationCodes.Result.Contains( - m.InspectionArea.Installation.InstallationCode.ToUpper() - ) - ) - .Where((m) => m.IsDeprecated == false); + .ThenInclude(robot => robot.CurrentInstallation); return readOnly ? query.AsNoTracking() : query.AsTracking(); } @@ -642,7 +649,7 @@ is null bool readOnly = true ) { - return await GetMissionRunsWithSubModels(readOnly: readOnly) + return await GetAccessibleMissionRuns(readOnly: readOnly) .FirstOrDefaultAsync(missionRun => missionRun.IsarMissionId != null && missionRun.IsarMissionId.Equals(isarMissionId)