Don't seperately parse status, let the JSON decoder do this for now

This commit is contained in:
Stedoss
2026-07-28 00:28:45 +01:00
parent ad7c35e21b
commit b3e68069d2
2 changed files with 20 additions and 7 deletions
@@ -26,8 +26,7 @@ public class CreateMissionLaunch(MissionControlContext dbContext)
var missionLaunch = new MissionLaunch
{
ScheduledFor = req.ScheduledFor,
// Validated in `CreateMissionLaunchRequestValidator`
Status = Enum.Parse<MissionLaunchStatus>(req.Status, true),
Status = req.Status,
MissionId = req.MissionId,
};
@@ -43,9 +42,7 @@ public record CreateMissionLaunchRequest
public Guid MissionId { get; init; }
public required DateTimeOffset ScheduledFor { get; init; }
// Define as a string here so it can be safely deserialized into its enum type, with a validation message when unable to do so
// Otherwise, we return a serialization error that is not assigned to a specific field
public required string Status { get; init; }
public required MissionLaunchStatus Status { get; init; }
}
public class CreateMissionLaunchRequestValidator : Validator<CreateMissionLaunchRequest>
@@ -55,6 +52,5 @@ public class CreateMissionLaunchRequestValidator : Validator<CreateMissionLaunch
RuleFor(req => req.MissionId)
.NotEqual(Guid.Empty)
.WithMessage("Please provide a non-zero GUID.");
RuleFor(req => req.Status).IsEnumName(typeof(MissionLaunchStatus), false);
}
}
@@ -18,7 +18,7 @@ public class CreateMissionLaunchTests
{
MissionId = Guid.NewGuid(),
ScheduledFor = DateTimeOffset.UtcNow,
Status = "Pending",
Status = MissionLaunchStatus.Pending,
};
await endpoint.HandleAsync(request, CancellationToken.None);
@@ -27,4 +27,21 @@ public class CreateMissionLaunchTests
(await database.Context.MissionLaunches.AnyAsync()).ShouldBeFalse();
}
[Fact]
public void Rejects_empty_mission_id_guid()
{
var validator = new CreateMissionLaunchRequestValidator();
var result = validator.Validate(new CreateMissionLaunchRequest
{
MissionId = Guid.Empty,
ScheduledFor = default,
Status = MissionLaunchStatus.Pending,
});
result.IsValid.ShouldBeFalse();
result.Errors.ShouldContain(e => e.PropertyName == nameof(CreateMissionLaunchRequest.MissionId));
}
}