Rebuild CCS case workflow
This commit is contained in:
@@ -4,8 +4,7 @@ namespace QuestionsApi.Services;
|
||||
|
||||
public static class CcsCaseValidator
|
||||
{
|
||||
private static readonly HashSet<string> Modes = [CcsAttemptModes.Practice, CcsAttemptModes.Timed];
|
||||
private static readonly HashSet<string> CommandTypes = ["exam", "order", "cancel_order", "location", "advance", "interval_history", "end_case", "exit_case"];
|
||||
private static readonly HashSet<string> CommandTypes = ["exam", "order", "cancel_order", "location", "advance", "interval_history", "acknowledge_opening", "end_case", "exit_case"];
|
||||
|
||||
public static List<string> ValidateImport(CcsImportRequest request, IReadOnlySet<string> existingOrderCodes)
|
||||
{
|
||||
@@ -18,6 +17,8 @@ public static class CcsCaseValidator
|
||||
if (string.IsNullOrWhiteSpace(order.CanonicalName)) errors.Add(prefix + "canonicalName required");
|
||||
if (string.IsNullOrWhiteSpace(order.Category)) errors.Add(prefix + "category required");
|
||||
if (order.DefaultTurnaroundMinutes < 0) errors.Add(prefix + "defaultTurnaroundMinutes cannot be negative");
|
||||
if (!string.IsNullOrWhiteSpace(order.ResultSection) && !CcsChartCategories.ResultSections.Contains(order.ResultSection))
|
||||
errors.Add(prefix + "resultSection is invalid");
|
||||
}
|
||||
if (request.Orders.Select(order => order.Code).Distinct(StringComparer.OrdinalIgnoreCase).Count() != request.Orders.Count)
|
||||
errors.Add("order codes must be unique within an import");
|
||||
@@ -50,7 +51,11 @@ public static class CcsCaseValidator
|
||||
if (eventIds.Any(string.IsNullOrWhiteSpace) || eventIds.Distinct(StringComparer.OrdinalIgnoreCase).Count() != eventIds.Count)
|
||||
errors.Add(prefix + "event ids must be present and unique");
|
||||
foreach (var response in item.OrderResponses)
|
||||
{
|
||||
if (!orderCodes.Contains(response.OrderCode)) errors.Add(prefix + $"unknown order code {response.OrderCode}");
|
||||
if (!string.IsNullOrWhiteSpace(response.ResultSection) && !CcsChartCategories.ResultSections.Contains(response.ResultSection))
|
||||
errors.Add(prefix + $"order response {response.OrderCode} resultSection is invalid");
|
||||
}
|
||||
foreach (var code in item.InitialChart.InitialOrderCodes.Concat(item.Events.SelectMany(value => value.RequiresOrderCodes.Concat(value.RequiresAnyOrderCodes))))
|
||||
if (!orderCodes.Contains(code)) errors.Add(prefix + $"unknown order code {code}");
|
||||
var criteriaIds = item.ScoringCriteria.Select(value => value.Id).ToList();
|
||||
@@ -75,7 +80,8 @@ public static class CcsCaseValidator
|
||||
|
||||
public static string? ValidateCreate(CreateCcsAttemptRequest request)
|
||||
{
|
||||
if (!Modes.Contains(request.Mode)) return "mode must be practice or timed";
|
||||
if (!request.Mode.Equals(CcsAttemptModes.Timed, StringComparison.OrdinalIgnoreCase))
|
||||
return "new CCS attempts must be timed";
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -88,4 +94,29 @@ public static class CcsCaseValidator
|
||||
if (request.Type == "advance" && request.Minutes is < 1 or > 525600) return "advance minutes must be between 1 and 525600";
|
||||
return null;
|
||||
}
|
||||
|
||||
public static string? ValidateBatch(CcsBatchCommandRequest request)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(request.CommandId)) return "commandId required";
|
||||
if (request.ExpectedRevision < 0) return "expectedRevision cannot be negative";
|
||||
if (request.Commands.Count is < 1 or > 50) return "commands must contain between 1 and 50 items";
|
||||
foreach (var item in request.Commands)
|
||||
{
|
||||
var error = ValidateCommand(new CcsCommandRequest
|
||||
{
|
||||
CommandId = request.CommandId,
|
||||
ExpectedRevision = request.ExpectedRevision,
|
||||
Type = item.Type,
|
||||
Code = item.Code,
|
||||
Minutes = item.Minutes
|
||||
});
|
||||
if (error is not null) return error;
|
||||
if (item.Type is not ("exam" or "interval_history" or "order" or "cancel_order"))
|
||||
return "batch commands support history/exams, orders, and order cancellations only";
|
||||
}
|
||||
var hasClinicalAssessment = request.Commands.Any(value => value.Type is "exam" or "interval_history");
|
||||
if (hasClinicalAssessment && request.Commands.Any(value => value.Type is not ("exam" or "interval_history")))
|
||||
return "history and examinations cannot be mixed with order changes in one batch";
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user