feat(backend): add problem/need submission module with workflow and events
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.
This commit is contained in:
@@ -0,0 +1,26 @@
|
||||
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;
|
||||
}
|
||||
Reference in New Issue
Block a user