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:
Rafał Tyński
2026-10-04 02:22:00 +02:00
parent 58cc2e4096
commit cadc321d96
12 changed files with 633 additions and 0 deletions
@@ -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;
}