Add submission CRUD with pagination and role scoping, challenge/location binding, automatic keyword extraction, a validated status workflow, and domain events for matchmaking and notifications. Create a problem record together with each submission.
27 lines
1.1 KiB
C#
27 lines
1.1 KiB
C#
using TarninaHub.Domain.Enums;
|
|
|
|
namespace TarninaHub.Domain.Rules;
|
|
|
|
public static class SubmissionWorkflow
|
|
{
|
|
private static readonly IReadOnlyDictionary<SubmissionStatus, SubmissionStatus[]> Transitions =
|
|
new Dictionary<SubmissionStatus, SubmissionStatus[]>
|
|
{
|
|
[SubmissionStatus.New] = [SubmissionStatus.Triaged, SubmissionStatus.Rejected],
|
|
[SubmissionStatus.Triaged] = [SubmissionStatus.Matched, SubmissionStatus.Rejected, SubmissionStatus.Closed],
|
|
[SubmissionStatus.Matched] = [SubmissionStatus.InProgress, SubmissionStatus.Closed, SubmissionStatus.Rejected],
|
|
[SubmissionStatus.InProgress] = [SubmissionStatus.Closed, SubmissionStatus.Rejected],
|
|
[SubmissionStatus.Closed] = [],
|
|
[SubmissionStatus.Rejected] = [],
|
|
};
|
|
|
|
public static bool CanTransition(SubmissionStatus from, SubmissionStatus to) =>
|
|
from == to || Transitions[from].Contains(to);
|
|
|
|
public static IReadOnlyList<SubmissionStatus> NextStates(SubmissionStatus from) =>
|
|
Transitions[from];
|
|
|
|
public static bool IsTerminal(SubmissionStatus status) =>
|
|
Transitions[status].Length == 0;
|
|
}
|