private CommentExtraAction? PerformFinanceOperation(FinanceOperationAction financeAction, Comment parentComment, Claim claim) { var finance = parentComment?.Finance; if (finance == null) { throw new InvalidOperationException(); } if (!finance.RequireModeration) { throw new ValueAlreadySetException("Finance entry is already moderated."); } finance.RequestModerationAccess(CurrentUserId); finance.Changed = Now; switch (financeAction) { case FinanceOperationAction.Approve: finance.State = FinanceOperationState.Approved; if (finance.OperationType == FinanceOperationType.PreferentialFeeRequest) { claim.PreferentialFeeUser = true; } claim.UpdateClaimFeeIfRequired(finance.OperationDate); return CommentExtraAction.ApproveFinance; case FinanceOperationAction.Decline: finance.State = FinanceOperationState.Declined; return CommentExtraAction.RejectFinance; case FinanceOperationAction.None: default: throw new ArgumentOutOfRangeException(nameof(financeAction), financeAction, null); } }
public async Task AddComment(int projectId, int claimId, int?parentCommentId, bool isVisibleToPlayer, string commentText, FinanceOperationAction financeAction) { var claim = (await ClaimsRepository.GetClaim(projectId, claimId)).RequestAccess(CurrentUserId, ExtraAccessReason.Player); SetDiscussed(claim, isVisibleToPlayer); var parentComment = claim.CommentDiscussion.Comments.SingleOrDefault(c => c.CommentId == parentCommentId); Func <UserSubscription, bool> predicate = s => s.Comments; CommentExtraAction? extraAction = null; if (financeAction != FinanceOperationAction.None) { extraAction = PerformFinanceOperation(financeAction, parentComment, claim); predicate = s => s.Comments || s.MoneyOperation; } var email = await AddCommentWithEmail <AddCommentEmail>(commentText, claim, isVisibleToPlayer, predicate, parentComment, extraAction); await UnitOfWork.SaveChangesAsync(); await EmailService.Email(email); }
public async Task AddComment(int projectId, int claimId, int currentUserId, int?parentCommentId, bool isVisibleToPlayer, string commentText, FinanceOperationAction financeAction) { var claim = (await ClaimsRepository.GetClaim(projectId, claimId)).RequestAccess(currentUserId); var now = DateTime.UtcNow; if (claim.ClaimStatus == Claim.Status.AddedByMaster && currentUserId == claim.PlayerUserId) { claim.ClaimStatus = Claim.Status.Discussed; } if (claim.ClaimStatus == Claim.Status.AddedByUser && currentUserId != claim.PlayerUserId && isVisibleToPlayer) { claim.ClaimStatus = Claim.Status.Discussed; } var parentComment = claim.Comments.SingleOrDefault(c => c.CommentId == parentCommentId); Func <UserSubscription, bool> predicate = s => s.Comments; CommentExtraAction? extraAction = null; if (financeAction != FinanceOperationAction.None) { var finance = parentComment?.Finance; if (finance == null) { throw new InvalidOperationException(); } if (!finance.RequireModeration) { throw new ValueAlreadySetException("Finance entry is already moderated."); } finance.RequestModerationAccess(currentUserId); finance.Changed = now; switch (financeAction) { case FinanceOperationAction.Approve: finance.State = FinanceOperationState.Approved; extraAction = CommentExtraAction.ApproveFinance; claim.UpdateClaimFeeIfRequired(finance.OperationDate); break; case FinanceOperationAction.Decline: finance.State = FinanceOperationState.Declined; extraAction = CommentExtraAction.RejectFinance; break; default: throw new ArgumentOutOfRangeException(nameof(financeAction), financeAction, null); } predicate = s => s.Comments || s.MoneyOperation; } var email = await AddCommentWithEmail <AddCommentEmail>(currentUserId, commentText, claim, now, isVisibleToPlayer, predicate, parentComment, extraAction); await UnitOfWork.SaveChangesAsync(); await EmailService.Email(email); }