diff --git a/ApiDto/Requests/Configuration/ScheduleConfigurationRequest.cs b/ApiDto/Requests/Configuration/ScheduleConfigurationRequest.cs new file mode 100644 index 0000000..ca6e950 --- /dev/null +++ b/ApiDto/Requests/Configuration/ScheduleConfigurationRequest.cs @@ -0,0 +1,29 @@ +using Mirea.Api.Dto.Common; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; + +namespace Mirea.Api.Dto.Requests.Configuration; + +/// +/// Represents a request to configure the schedule settings. +/// +public class ScheduleConfigurationRequest +{ + /// + /// Gets or sets the cron expression for updating the schedule. + /// + public string? CronUpdateSchedule { get; set; } + + /// + /// Gets or sets the start date of the term. + /// + [Required] + public DateOnly StartTerm { get; set; } + + /// + /// Gets or sets the pair period times, keyed by pair number. + /// + [Required] + public required IDictionary PairPeriod { get; set; } +} \ No newline at end of file diff --git a/Endpoint/Controllers/Configuration/SetupController.cs b/Endpoint/Controllers/Configuration/SetupController.cs index d5eb17e..7abd5ee 100644 --- a/Endpoint/Controllers/Configuration/SetupController.cs +++ b/Endpoint/Controllers/Configuration/SetupController.cs @@ -1,5 +1,4 @@ -using System; -using System.Security.Cryptography; +using Cronos; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Data.Sqlite; @@ -17,6 +16,10 @@ using Npgsql; using StackExchange.Redis; using System; using System.Data; +using System.IO; +using System.Runtime.InteropServices; +using System.Security.Cryptography; +using System.Text.Json; namespace Mirea.Api.Endpoint.Controllers.Configuration; @@ -240,6 +243,27 @@ public class SetupController(ISetupToken setupToken, IMaintenanceModeNotConfigur return true; } + + [HttpPost("SetSchedule")] + [TokenAuthentication] + [BadRequestResponse] + public ActionResult SetSchedule([FromBody] ScheduleConfigurationRequest request) + { + var general = GeneralConfig; + general.ScheduleSettings = new ScheduleSettings + { + // every 6 hours + CronUpdateSchedule = request.CronUpdateSchedule ?? "0 */6 * * *", + StartTerm = request.StartTerm, + PairPeriod = request.PairPeriod.ConvertFromDto() + }; + + if (!CronExpression.TryParse(general.ScheduleSettings.CronUpdateSchedule, CronFormat.Standard, out _)) + throw new ControllerArgumentException("The Cron task could not be parsed. Check the format of the entered data."); + + GeneralConfig = general; + + return true; }