public AcceptPunchOutCommandValidator(IInvitationValidator invitationValidator, IRowVersionValidator rowVersionValidator) { CascadeMode = CascadeMode.Stop; RuleFor(command => command) .MustAsync((command, cancellationToken) => BeAnExistingInvitation(command.InvitationId, cancellationToken)) .WithMessage(command => $"Invitation with this ID does not exist! Id={command.InvitationId}") .MustAsync((command, cancellationToken) => BeAnInvitationInCompletedStage(command.InvitationId, cancellationToken)) .WithMessage(command => "Invitation is not in completed stage, and thus cannot be accepted!") .Must(command => HaveAValidRowVersion(command.InvitationRowVersion)) .WithMessage(command => $"Invitation row version is not valid! InvitationRowVersion={command.InvitationRowVersion}") .Must(command => HaveAValidRowVersion(command.ParticipantRowVersion)) .WithMessage(command => $"Participant row version is not valid! ParticipantRowVersion={command.ParticipantRowVersion}") .MustAsync((command, cancellationToken) => BeAnAccepterOnIpo(command.InvitationId, cancellationToken)) .WithMessage(command => "The IPO does not have a construction company assigned to accept the IPO!") .MustAsync((command, cancellationToken) => BeTheAssignedPersonIfPersonParticipant(command.InvitationId, cancellationToken)) .WithMessage(command => "Person signing is not the construction company assigned to accept this IPO, or there is not a valid construction company on the IPO!"); RuleForEach(command => command.Participants) .MustAsync((command, participant, _, cancellationToken) => BeAnExistingParticipant(participant.Id, command.InvitationId, cancellationToken)) .WithMessage((command, participant) => $"Participant with ID does not exist on invitation! Participant={participant.Id}") .Must((command, participant) => HaveAValidRowVersion(participant.RowVersion)) .WithMessage((command, participant) => $"Participant doesn't have valid rowVersion! Participant={participant.Id}"); async Task <bool> BeAnExistingInvitation(int invitationId, CancellationToken cancellationToken) => await invitationValidator.IpoExistsAsync(invitationId, cancellationToken); async Task <bool> BeAnInvitationInCompletedStage(int invitationId, CancellationToken cancellationToken) => await invitationValidator.IpoIsInStageAsync(invitationId, IpoStatus.Completed, cancellationToken); async Task <bool> BeAnAccepterOnIpo(int invitationId, CancellationToken cancellationToken) => await invitationValidator.IpoHasAccepterAsync(invitationId, cancellationToken); async Task <bool> BeTheAssignedPersonIfPersonParticipant(int invitationId, CancellationToken cancellationToken) => await invitationValidator.CurrentUserIsValidAccepterParticipantAsync(invitationId, cancellationToken); async Task <bool> BeAnExistingParticipant(int participantId, int invitationId, CancellationToken cancellationToken) => await invitationValidator.ParticipantExistsAsync(participantId, invitationId, cancellationToken); bool HaveAValidRowVersion(string rowVersion) => rowVersionValidator.IsValid(rowVersion); }
public SignPunchOutCommandValidator(IInvitationValidator invitationValidator, IRowVersionValidator rowVersionValidator) { CascadeMode = CascadeMode.Stop; RuleFor(command => command) .MustAsync((command, cancellationToken) => BeAnExistingInvitation(command.InvitationId, cancellationToken)) .WithMessage(command => $"Invitation with this ID does not exist! Id={command.InvitationId}") .MustAsync((command, cancellationToken) => BeAnExistingParticipant(command.ParticipantId, command.InvitationId, cancellationToken)) .WithMessage(command => $"Participant with ID does not exist on invitation! Id={command.ParticipantId}") .MustAsync((command, cancellationToken) => BeANonCanceledInvitation(command.InvitationId, cancellationToken)) .WithMessage(command => "Invitation is canceled, and thus cannot be signed!") .Must(command => HaveAValidRowVersion(command.ParticipantRowVersion)) .WithMessage(command => $"Participant row version is not valid! ParticipantRowVersion={command.ParticipantRowVersion}") .MustAsync((command, cancellationToken) => BeASigningParticipantOnIpo(command.InvitationId, command.ParticipantId, cancellationToken)) .WithMessage(command => $"Participant is not assigned to sign this IPO! ParticipantId={command.ParticipantId}") .MustAsync((command, cancellationToken) => BeTheAssignedPersonIfPersonParticipant(command.InvitationId, command.ParticipantId, cancellationToken)) .WithMessage(command => "Person signing is not assigned to sign IPO, or there is not a valid functional role on the IPO!") .MustAsync((command, cancellationToken) => BeUnsignedParticipant(command.ParticipantId, command.InvitationId, cancellationToken)) .WithMessage(command => "Participant is already signed!"); async Task <bool> BeAnExistingInvitation(int invitationId, CancellationToken cancellationToken) => await invitationValidator.IpoExistsAsync(invitationId, cancellationToken); async Task <bool> BeANonCanceledInvitation(int invitationId, CancellationToken cancellationToken) => !await invitationValidator.IpoIsInStageAsync(invitationId, IpoStatus.Canceled, cancellationToken); async Task <bool> BeASigningParticipantOnIpo(int invitationId, int participantId, CancellationToken cancellationToken) => await invitationValidator.SignerExistsAsync(invitationId, participantId, cancellationToken); async Task <bool> BeTheAssignedPersonIfPersonParticipant(int invitationId, int participantId, CancellationToken cancellationToken) => await invitationValidator.CurrentUserIsValidSigningParticipantAsync(invitationId, participantId, cancellationToken); async Task <bool> BeAnExistingParticipant(int participantId, int invitationId, CancellationToken cancellationToken) => await invitationValidator.ParticipantExistsAsync(participantId, invitationId, cancellationToken); async Task <bool> BeUnsignedParticipant(int participantId, int invitationId, CancellationToken cancellationToken) => !await invitationValidator.ParticipantIsSignedAsync(participantId, invitationId, cancellationToken); bool HaveAValidRowVersion(string rowVersion) => rowVersionValidator.IsValid(rowVersion); }
public UpdateAttendedStatusOnParticipantCommandValidator(IInvitationValidator invitationValidator, IRowVersionValidator rowVersionValidator) { CascadeMode = CascadeMode.Stop; RuleFor(command => command) .MustAsync((command, cancellationToken) => BeAnExistingInvitation(command.InvitationId, cancellationToken)) .WithMessage(command => $"Invitation with this ID does not exist! Id={command.InvitationId}") .MustAsync((command, cancellationToken) => NotBeCancelledInvitation(command.InvitationId, cancellationToken)) .WithMessage(command => $"Cannot perform updates on cancelled invitation! Id={command.InvitationId}") .MustAsync((command, cancellationToken) => BeAnExistingParticipant(command.ParticipantId, command.InvitationId, cancellationToken)) .WithMessage(command => $"Participant with ID does not exist on invitation! ParticipantId={command.ParticipantId}") .Must(command => HaveAValidRowVersion(command.RowVersion)) .WithMessage(command => $"Participant doesn't have valid rowVersion! ParticipantRowVersion={command.RowVersion}") .MustAsync((command, cancellationToken) => HavePermissionToEdit(command.ParticipantId, command.InvitationId, cancellationToken)) .WithMessage("The current user does not have sufficient privileges to edit this participant.") .MustAsync((command, cancellationToken) => HaveOppositeAttendedStatusIfTouched(command.ParticipantId, command.InvitationId, command.Attended, cancellationToken)) .WithMessage("Cannot update participant to its current attendedStatus."); async Task <bool> BeAnExistingInvitation(int invitationId, CancellationToken cancellationToken) => await invitationValidator.IpoExistsAsync(invitationId, cancellationToken); async Task <bool> NotBeCancelledInvitation(int invitationId, CancellationToken cancellationToken) => !await invitationValidator.IpoIsInStageAsync(invitationId, IpoStatus.Canceled, cancellationToken); async Task <bool> BeAnExistingParticipant(int participantId, int invitationId, CancellationToken cancellationToken) => await invitationValidator.ParticipantExistsAsync(participantId, invitationId, cancellationToken); async Task <bool> HavePermissionToEdit(int participantId, int invitationId, CancellationToken cancellationToken) => await invitationValidator.HasPermissionToEditParticipantAsync(participantId, invitationId, cancellationToken); async Task <bool> HaveOppositeAttendedStatusIfTouched(int participantId, int invitationId, bool attended, CancellationToken cancellationToken) => await invitationValidator.HasOppositeAttendedStatusIfTouchedAsync(participantId, invitationId, attended, cancellationToken); bool HaveAValidRowVersion(string rowVersion) => rowVersionValidator.IsValid(rowVersion); }
public UpdateAttendedStatusAndNotesOnParticipantsCommandValidator(IInvitationValidator invitationValidator, IRowVersionValidator rowVersionValidator) { CascadeMode = CascadeMode.Stop; RuleFor(command => command) .MustAsync((command, cancellationToken) => BeAnExistingInvitation(command.InvitationId, cancellationToken)) .WithMessage(command => $"Invitation with this ID does not exist! Id={command.InvitationId}") .MustAsync((command, cancellationToken) => BeAnInvitationInCompletedStage(command.InvitationId, cancellationToken)) .WithMessage(command => "Invitation is not in completed stage, and thus cannot change attended statuses or notes!") .MustAsync((command, cancellationToken) => BeAContractorOnIpo(command.InvitationId, cancellationToken)) .WithMessage(command => "The IPO does not have a contractor assigned to the IPO!") .MustAsync((command, cancellationToken) => BeTheAssignedContractorIfPersonParticipant(command.InvitationId, cancellationToken)) .WithMessage(command => "User is not the contractor assigned to complete this IPO, or there is not a valid contractor on the IPO!"); RuleForEach(command => command.Participants) .MustAsync((command, participant, _, cancellationToken) => BeAnExistingParticipant(participant.Id, command.InvitationId, cancellationToken)) .WithMessage((command, participant) => $"Participant with ID does not exist on invitation! ParticipantId={participant.Id}") .Must((command, participant) => HaveAValidRowVersion(participant.RowVersion)) .WithMessage((command, participant) => $"Participant doesn't have valid rowVersion! ParticipantRowVersion={participant.RowVersion}"); async Task <bool> BeAnExistingInvitation(int invitationId, CancellationToken cancellationToken) => await invitationValidator.IpoExistsAsync(invitationId, cancellationToken); async Task <bool> BeAnInvitationInCompletedStage(int invitationId, CancellationToken cancellationToken) => await invitationValidator.IpoIsInStageAsync(invitationId, IpoStatus.Completed, cancellationToken); async Task <bool> BeAnExistingParticipant(int participantId, int invitationId, CancellationToken cancellationToken) => await invitationValidator.ParticipantExistsAsync(participantId, invitationId, cancellationToken); async Task <bool> BeTheAssignedContractorIfPersonParticipant(int invitationId, CancellationToken cancellationToken) => await invitationValidator.CurrentUserIsValidCompleterParticipantAsync(invitationId, cancellationToken); async Task <bool> BeAContractorOnIpo(int invitationId, CancellationToken cancellationToken) => await invitationValidator.IpoHasCompleterAsync(invitationId, cancellationToken); bool HaveAValidRowVersion(string rowVersion) => rowVersionValidator.IsValid(rowVersion); }