Skip to content

Commit

Permalink
Add auto scheduling parameter to missions
Browse files Browse the repository at this point in the history
  • Loading branch information
Eddasol committed Feb 20, 2025
1 parent 6754929 commit 4db4ac8
Show file tree
Hide file tree
Showing 17 changed files with 1,710 additions and 8 deletions.
14 changes: 13 additions & 1 deletion backend/api/Controllers/MissionDefinitionController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -158,10 +158,22 @@ [FromBody] UpdateMissionDefinitionQuery missionDefinitionQuery
return BadRequest("Name cannot be null.");
}

if (missionDefinitionQuery.AutoScheduleFrequency != null)
{
try
{
missionDefinitionQuery.AutoScheduleFrequency.ValidateAutoScheduleFrequency();
}
catch (ArgumentException e)
{
return BadRequest(e.Message);
}
}

missionDefinition.Name = missionDefinitionQuery.Name;
missionDefinition.Comment = missionDefinitionQuery.Comment;
missionDefinition.InspectionFrequency = missionDefinitionQuery.InspectionFrequency;

missionDefinition.AutoScheduleFrequency = missionDefinitionQuery.AutoScheduleFrequency;
var newMissionDefinition = await missionDefinitionService.Update(missionDefinition);
return new MissionDefinitionResponse(newMissionDefinition);
}
Expand Down
7 changes: 7 additions & 0 deletions backend/api/Controllers/Models/MissionDefinitionResponse.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@ public class MissionDefinitionResponse
[JsonPropertyName("inspectionFrequency")]
public TimeSpan? InspectionFrequency { get; set; }

[JsonPropertyName("autoScheduleFrequency")]
public AutoScheduleFrequency? AutoScheduleFrequency { get; set; }

[JsonPropertyName("lastSuccessfulRun")]
public virtual MissionRun? LastSuccessfulRun { get; set; }

Expand All @@ -47,6 +50,7 @@ public MissionDefinitionResponse(MissionDefinition missionDefinition)
InstallationCode = missionDefinition.InstallationCode;
Comment = missionDefinition.Comment;
InspectionFrequency = missionDefinition.InspectionFrequency;
AutoScheduleFrequency = missionDefinition.AutoScheduleFrequency;
InspectionArea =
missionDefinition.InspectionArea != null
? new InspectionAreaResponse(missionDefinition.InspectionArea)
Expand Down Expand Up @@ -82,6 +86,9 @@ MissionDefinition missionDefinition
[JsonPropertyName("inspectionFrequency")]
public TimeSpan? InspectionFrequency { get; } = missionDefinition.InspectionFrequency;

[JsonPropertyName("autoScheduleFrequency")]
public AutoScheduleFrequency? AutoScheduleFrequency { get; set; }

[JsonPropertyName("lastSuccessfulRun")]
public virtual MissionRun? LastSuccessfulRun { get; } = missionDefinition.LastSuccessfulRun;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
namespace Api.Controllers.Models
using Api.Database.Models;

namespace Api.Controllers.Models
{
public struct UpdateMissionDefinitionQuery
{
Expand All @@ -16,5 +18,10 @@ public struct UpdateMissionDefinitionQuery
/// Change the inspection frequency
/// </summary>
public TimeSpan? InspectionFrequency { get; set; }

/// <summary>
/// Change the automated scheduling frequency
/// </summary>
public AutoScheduleFrequency? AutoScheduleFrequency { get; set; }
}
}
76 changes: 76 additions & 0 deletions backend/api/Database/Models/AutoScheduleFrequency.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
using System;
using System.ComponentModel.DataAnnotations;
using Microsoft.EntityFrameworkCore;

#pragma warning disable CS8618
namespace Api.Database.Models
{
[Owned]
public class AutoScheduleFrequency
{
[Required]
// In local time
public IList<TimeOnly> TimesOfDay { get; set; }

[Required]
public IList<DayOfWeek> DaysOfWeek { get; set; }

public void ValidateAutoScheduleFrequency()
{
if (TimesOfDay.Count == 0)
{
throw new ArgumentException(
"AutoScheduleFrequency must have at least one time of day"
);
}

if (DaysOfWeek.Count == 0)
{
throw new ArgumentException(
"AutoScheduleFrequency must have at least one day of week"
);
}
}

public IList<TimeSpan>? GetSchedulingTimesForNext24Hours()
{
// NCS is always in CET
TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById(
"Central European Standard Time"
);
DateTime nowLocal = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, tzi);
TimeOnly nowLocalTimeOnly = new TimeOnly(
nowLocal.Hour,
nowLocal.Minute,
nowLocal.Second
);

var autoScheduleNext24Hours = new List<TimeSpan>();
if (DaysOfWeek.Contains(nowLocal.DayOfWeek))
{
foreach (TimeOnly time in TimesOfDay)
{
if (time > nowLocalTimeOnly)
{
autoScheduleNext24Hours.Add(time - nowLocalTimeOnly);
}
}
}
if (DaysOfWeek.Contains(nowLocal.DayOfWeek + 1))
{
foreach (TimeOnly time in TimesOfDay)
{
if (time <= nowLocalTimeOnly)
{
autoScheduleNext24Hours.Add(time - nowLocalTimeOnly);
}
}
}
if (autoScheduleNext24Hours.Count > 0)
{
return autoScheduleNext24Hours;
}
return null;
}
}
}
2 changes: 2 additions & 0 deletions backend/api/Database/Models/MissionDefinition.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ public class MissionDefinition : SortableRecord
[Column(TypeName = "bigint")]
public TimeSpan? InspectionFrequency { get; set; }

public AutoScheduleFrequency? AutoScheduleFrequency { get; set; }

public virtual MissionRun? LastSuccessfulRun { get; set; }

public InspectionArea? InspectionArea { get; set; }
Expand Down
Loading

0 comments on commit 4db4ac8

Please sign in to comment.