diff --git a/backend/api/Controllers/Models/MissionDefinitionResponse.cs b/backend/api/Controllers/Models/MissionDefinitionResponse.cs index bebb5530f..da23ae422 100644 --- a/backend/api/Controllers/Models/MissionDefinitionResponse.cs +++ b/backend/api/Controllers/Models/MissionDefinitionResponse.cs @@ -50,7 +50,13 @@ public MissionDefinitionResponse(MissionDefinition missionDefinition) InstallationCode = missionDefinition.InstallationCode; Comment = missionDefinition.Comment; InspectionFrequency = missionDefinition.InspectionFrequency; - AutoScheduleFrequency = missionDefinition.AutoScheduleFrequency; + AutoScheduleFrequency = + ( + missionDefinition.AutoScheduleFrequency is not null + && missionDefinition.AutoScheduleFrequency.HasValidValue() + ) + ? missionDefinition.AutoScheduleFrequency + : null; InspectionArea = missionDefinition.InspectionArea != null ? new InspectionAreaResponse(missionDefinition.InspectionArea) @@ -87,7 +93,13 @@ MissionDefinition missionDefinition public TimeSpan? InspectionFrequency { get; } = missionDefinition.InspectionFrequency; [JsonPropertyName("autoScheduleFrequency")] - public AutoScheduleFrequency? AutoScheduleFrequency { get; set; } + public AutoScheduleFrequency? AutoScheduleFrequency { get; } = + ( + missionDefinition.AutoScheduleFrequency is not null + && missionDefinition.AutoScheduleFrequency.HasValidValue() + ) + ? missionDefinition.AutoScheduleFrequency + : null; [JsonPropertyName("lastSuccessfulRun")] public virtual MissionRun? LastSuccessfulRun { get; } = missionDefinition.LastSuccessfulRun; diff --git a/backend/api/Database/Context/FlotillaDbContext.cs b/backend/api/Database/Context/FlotillaDbContext.cs index 17da3fbe8..c9e1ed520 100644 --- a/backend/api/Database/Context/FlotillaDbContext.cs +++ b/backend/api/Database/Context/FlotillaDbContext.cs @@ -68,6 +68,7 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) .Property(m => m.InspectionFrequency) .HasConversion(new TimeSpanToTicksConverter()); + modelBuilder.Entity().OwnsOne(m => m.AutoScheduleFrequency); modelBuilder .Entity() .OwnsOne(m => m.Map) diff --git a/backend/api/Database/Models/AutoScheduleFrequency.cs b/backend/api/Database/Models/AutoScheduleFrequency.cs index 7b306336a..5b1ad81ca 100644 --- a/backend/api/Database/Models/AutoScheduleFrequency.cs +++ b/backend/api/Database/Models/AutoScheduleFrequency.cs @@ -10,10 +10,15 @@ public class AutoScheduleFrequency { [Required] // In local time - public IList TimesOfDay { get; set; } + public IList TimesOfDay { get; set; } = new List(); [Required] - public IList DaysOfWeek { get; set; } + public IList DaysOfWeek { get; set; } = new List(); + + public bool HasValidValue() + { + return TimesOfDay.Count != 0 && DaysOfWeek.Count != 0; + } public void ValidateAutoScheduleFrequency() { diff --git a/backend/api/Services/MissionDefinitionService.cs b/backend/api/Services/MissionDefinitionService.cs index 7775f994a..0d22386fe 100644 --- a/backend/api/Services/MissionDefinitionService.cs +++ b/backend/api/Services/MissionDefinitionService.cs @@ -185,6 +185,9 @@ public async Task Update(MissionDefinition missionDefinition) context.Entry(missionDefinition.InspectionArea).State = EntityState.Unchanged; } + // Owned optional properties are not nullable + missionDefinition.AutoScheduleFrequency ??= new AutoScheduleFrequency(); + var entry = context.Update(missionDefinition); await ApplyDatabaseUpdate(missionDefinition.InspectionArea?.Installation); _ = signalRService.SendMessageAsync( @@ -238,7 +241,10 @@ private IQueryable GetMissionDefinitionsWithSubModels( { var accessibleInstallationCodes = accessRoleService.GetAllowedInstallationCodes(); var query = context - .MissionDefinitions.Include(missionDefinition => missionDefinition.InspectionArea) + .MissionDefinitions.Include(missionDefinition => + missionDefinition.AutoScheduleFrequency + ) + .Include(missionDefinition => missionDefinition.InspectionArea) .ThenInclude(inspectionArea => inspectionArea!.Plant) .ThenInclude(plant => plant.Installation) .Include(missionDefinition => missionDefinition.InspectionArea)