public async Task LogSecretCodeAsync(int userIdToLog, string secretCode) { VerifyCanLog(); if (string.IsNullOrWhiteSpace(secretCode)) { throw new GraException("You must enter a code!"); } int activeUserId = GetActiveUserId(); int authUserId = GetClaimId(ClaimType.UserId); var userToLog = await _userRepository.GetByIdAsync(userIdToLog); bool loggingAsAdminUser = HasPermission(Permission.LogActivityForAny); if (activeUserId != userIdToLog && authUserId != userToLog.HouseholdHeadUserId && !loggingAsAdminUser) { string error = $"User id {activeUserId} cannot log a code for user id {userIdToLog}"; _logger.LogError(error); throw new GraException("You do not have permission to apply that code."); } var trigger = await _triggerRepository.GetByCodeAsync(GetCurrentSiteId(), secretCode); if (trigger == null) { throw new GraException($"<strong>{secretCode}</strong> is not a valid code."); } // check if this user's gotten this code var alreadyDone = await _triggerRepository.CheckTriggerActivationAsync(userIdToLog, trigger.Id); if (alreadyDone != null) { throw new GraException($"You already entered the code <strong>{secretCode}</strong> on <strong>{alreadyDone:d}</strong>!"); } // add that we've processed this trigger for this user await _triggerRepository.AddTriggerActivationAsync(userIdToLog, trigger.Id); // every trigger awards a badge var badge = await AwardBadgeAsync(userIdToLog, trigger.AwardBadgeId); // log the notification await _notificationRepository.AddSaveAsync(authUserId, new Notification { PointsEarned = trigger.AwardPoints, UserId = userIdToLog, Text = trigger.AwardMessage, BadgeId = trigger.AwardBadgeId, BadgeFilename = badge.Filename }); // add the award to the user's history var userLog = new UserLog { UserId = userIdToLog, PointsEarned = trigger.AwardPoints, IsDeleted = false, BadgeId = trigger.AwardBadgeId, Description = trigger.AwardMessage }; if (activeUserId != userToLog.Id) { userLog.AwardedBy = activeUserId; } await _userLogRepository.AddSaveAsync(authUserId, userLog); // award any vendor code that is necessary await AwardVendorCodeAsync(userIdToLog, trigger.AwardVendorCodeTypeId); // if there are points to be awarded, do that now, also check for other triggers if (trigger.AwardPoints > 0) { await AddPointsSaveAsync(authUserId, activeUserId, userIdToLog, trigger.AwardPoints); } else { await AwardTriggersAsync(userIdToLog); } }