public async Task GraduateMembersIfNeeded(AppendOnlyStringList messages) { var members = await _repository.ListAsync(); var membersToGraduate = await CheckIfAnyMemberGraduating(members); // add message indicating how many members should be graduated by the end of this flow if (membersToGraduate.Any()) { string?membersToGraduateMessage; if (membersToGraduate.Count == 1) { membersToGraduateMessage = $"There is 1 member to graduate: {membersToGraduate[0].UserFullName()}."; } else { membersToGraduateMessage = $"There are {membersToGraduate.Count} members to graduate: "; foreach (var member in membersToGraduate) { membersToGraduateMessage += member.UserFullName() + ","; } membersToGraduateMessage = membersToGraduateMessage.Substring(0, membersToGraduateMessage.Length - 1); membersToGraduateMessage += "."; } messages.Append(membersToGraduateMessage); // graduate members var newMessages = await GraduateMembers(membersToGraduate); foreach (var message in newMessages) { messages.Append(message); } } }
public async Task DeactiveInvitesForExistingMembers(AppendOnlyStringList messages) { var spec = new ActiveInvitationsSpec(); var activeInvitations = await _inviteRepository.ListAsync(spec); foreach (var invitation in activeInvitations) { var user = await _userManager.FindByEmailAsync(invitation.Email); if (user == null) { continue; } var member = await _memberRepository.GetBySpecAsync(new MemberByUserIdSpec(user.Id)); if (member == null) { continue; } invitation.Deactivate(); await _inviteRepository.UpdateAsync(invitation); messages.Append($"Disabled invitation for email {invitation.Email}"); } }
public async Task PingAdminsAboutAlmostAlumsIfNeeded(AppendOnlyStringList messages) { var members = await _memberRepository.ListAsync(); var membersToPingAdminsAbout = new List <Member>(); foreach (var member in members) { if (member.TotalSubscribedDays() == DAYS_IN_TWO_YEARS - DAYS_BEFORE_GRADUATION_TO_PING) { membersToPingAdminsAbout.Add(member); } } if (membersToPingAdminsAbout.Any()) { string listOfMembersToPingAdminsAbout = ""; foreach (var member in membersToPingAdminsAbout) { listOfMembersToPingAdminsAbout = $"{member.UserFullName()}\n"; } messages.Append($"Admins need to be reminded not to renew the subscriptions of the following members about to graduate: {listOfMembersToPingAdminsAbout}"); var usersInAdminRole = await _userManager.GetUsersInRoleAsync(AuthConstants.Roles.ADMINISTRATORS); foreach (var user in usersInAdminRole) { await _emailService.SendEmailAsync(user.Email, "Upcoming DevBetter Graduation", $"Ensure that the following member(s)'s subscriptions are not renewed, as they will graduate to alumni status in {DAYS_BEFORE_GRADUATION_TO_PING} days:\n {listOfMembersToPingAdminsAbout}"); } messages.Append($"Admins have been reminded not to renew the subscriptions of the following members about to graduate: {listOfMembersToPingAdminsAbout}"); } }
private async Task SendMessagesToDiscord(AppendOnlyStringList messages) { foreach (var message in messages) { _webhook.Content = message; await _webhook.Send(); } }
public void AppendsStringsToList() { var list = new AppendOnlyStringList(); var testString = "I am a test"; var anotherTestString = "Look! Another test string!"; list.Append(testString); list.Append(anotherTestString); Assert.Contains(testString, list); Assert.Contains(anotherTestString, list); }
public async Task WarnIfNumberOfMemberSubscriptionPlansDifferentThanExpected(AppendOnlyStringList messages) { // TODO: replace with just CountAsync() once it supports parameterless overload var subscriptionPlans = await _repository.ListAsync(); int numberOfSubscriptionPlans = subscriptionPlans.Count(); var numberOfPaymentProviderSubscriptionPlans = await _paymentHandlerPrice.GetPriceCount(); if (numberOfSubscriptionPlans != numberOfPaymentProviderSubscriptionPlans + _expectedNumberOfSubscriptionPlansNotInPaymentProvider) { messages.Append($"THE NUMBER OF MEMBERSUBSCRIPTIONPLANS ON DevBetter ({numberOfSubscriptionPlans} DOES NOT MATCH THE EXPECTED VALUE IN STRIPE ({numberOfPaymentProviderSubscriptionPlans}) PLUS CONFIGURED VALUE OF PLANS NOT IN STRIPE ({_expectedNumberOfSubscriptionPlansNotInPaymentProvider})!"); } }
private async Task StoreMessagesInTasksCompleted(AppendOnlyStringList messages) { var spec = new DailyCheckByDateSpec(DateTime.Today); var todaysDailyCheck = await _repository.GetBySpecAsync(spec); if (todaysDailyCheck != null) { foreach (var message in messages) { if (!message.Equals(DAILY_CHECK_COMPLETED_MESSAGE)) { if (todaysDailyCheck.TasksCompleted == null) { todaysDailyCheck.TasksCompleted = ""; } todaysDailyCheck.TasksCompleted += message; } } await _repository.UpdateAsync(todaysDailyCheck); } }
public async Task SendPingIfNeeded(AppendOnlyStringList messages) { var spec = new ActiveInvitationsSpec(); var activeInvitations = await _inviteRepository.ListAsync(spec); var invitationsForUserPing = CheckIfAnyActiveInvitationsRequireUserPing(activeInvitations); if (invitationsForUserPing.Any()) { foreach (var invitation in invitationsForUserPing) { messages.Append($"User at email {invitation.Email} should be reminded to finish setting up their account."); } var userPingMessages = await SendUserPing(invitationsForUserPing); foreach (var message in userPingMessages) { messages.Append(message); } } var invitationsForAdminPing = CheckIfAnyActiveInvitationsRequireAdminPing(activeInvitations); if (invitationsForAdminPing.Any()) { var listOfEmailsToRemindAdminsAbout = ""; foreach (var invitation in invitationsForAdminPing) { listOfEmailsToRemindAdminsAbout += $"{invitation.Email}\n"; } messages.Append($"Admins should be reminded to remind these users to finish setting up their DevBetter accounts: {listOfEmailsToRemindAdminsAbout}"); var adminPingMessage = await SendAdminPing(invitationsForAdminPing); messages.Append(adminPingMessage); } }