/// <summary>Accepts the status.</summary> /// <param name="ownerToken"></param> /// <param name="acceptRequest">The accept request.</param> /// <returns></returns> public async Task <OperationResult> AcceptStatusAsync(string ownerToken, AcceptRequest acceptRequest) { AcceptChangeResponse statusChangeResponse = statusChangeRepository.TryAcceptChangeRequest(acceptRequest.MedicalCode, expirationPeriodInHours); switch (statusChangeResponse.Result) { case AcceptChangeResult.MissingCode: case AcceptChangeResult.ReusedCode: return(OperationResult.CreateInstance(StatusCodes.Status404NotFound, "Medical code not found or already taken.")); case AcceptChangeResult.ExpiredCode: return(OperationResult.CreateInstance(StatusCodes.Status406NotAcceptable, "Medical code is expired.")); } // Try upload all meetings to blob await blobStorageService.UploadMeetingsToContainer(ownerToken, acceptRequest); // Mark the change request as accepted var userStatus = new UserStateStatus { UserToken = ownerToken, StatusId = statusChangeResponse.StatusId, StatusChangedOn = statusChangeResponse.StatusChangedOn }; // Update user status userRepository.SetUserStatus(userStatus); return(OperationResult.CreateInstance(StatusCodes.Status200OK)); }
public void TestUserStatus() { var repository = ServiceProvider.GetService <IUserRepository>(); var userInfo = new UserInfo ( userToken: "registrationToken1", userName: "******", statusId: 1, statusChangedOn: new DateTime(2020, 4, 1) ); repository.RegisterUser(userInfo); var userStatus = new UserStateStatus { UserToken = userInfo.UserToken, StatusId = 2, StatusChangedOn = new DateTime(2020, 4, 4) }; repository.SetUserStatus(userStatus); var newUserInfo = repository.GetUserInfo(userInfo.UserToken); Assert.That(newUserInfo, Is.Not.EqualTo(userInfo)); Assert.That(newUserInfo.StatusId, Is.EqualTo(userStatus.StatusId)); Assert.That(newUserInfo.StatusChangedOn, Is.EqualTo(userStatus.StatusChangedOn)); var userStateHistory = new Table <UserStateHistory>(CassandraSession.Session) .FirstOrDefault(row => row.UserToken == userStatus.UserToken && row.StatusChangedOn == userStatus.StatusChangedOn) .Execute(); Assert.That(userStateHistory, Is.Not.Null); Assert.That(userStateHistory.StatusId, Is.EqualTo(userStatus.StatusId)); Assert.That(userStateHistory.StatusChangedOn, Is.EqualTo(userStatus.StatusChangedOn)); }
public void SetUserStatus(UserStateStatus userStateStatus) { mapper.Insert(userStateStatus); var userStateHistory = new UserStateHistory { UserToken = userStateStatus.UserToken, StatusChangedOn = userStateStatus.StatusChangedOn, StatusId = userStateStatus.StatusId }; mapper.Insert(userStateHistory); }
/// <summary>Processes the contact.</summary> /// <param name="exposedContact">The exposed contact.</param> /// <exception cref="ApplicationException">User token not found /// or /// Invalid configuration: Statuses.OnExposure not found /// or /// User status not found</exception> public async Task ProcessContact(ExposedContact exposedContact) { // check user status UserState userState = userRepository.GetUserState(exposedContact.UserToken); if (userState == null) { throw new ApplicationException("User token not found"); } Statuses statuses = options.Value.Statuses; var exposureStatusId = statuses.OnExposure; Status exposureStatus = statuses.Values.FirstOrDefault(s => s.Id == exposureStatusId); Status userStatus = statuses.Values.FirstOrDefault(s => s.Id == userState.StatusId); if (exposureStatus == null) { throw new ApplicationException("Invalid configuration: Statuses.OnExposure not found"); } if (userStatus == null) { throw new ApplicationException("User status not found"); } if (userStatus.Severity >= exposureStatus.Severity) { logger.LogInformation( "ContactToken: {contactToken}: Status: {contactStatus}. No need change user status", exposedContact.UserToken, userStatus.Id); return; } // set status to AtRisk var userStateStatus = new UserStateStatus() { StatusChangedOn = DateTime.UtcNow, UserToken = userState.UserToken, StatusId = exposureStatusId }; userRepository.SetUserStatus(userStateStatus); logger.LogInformation( "ContactToken: {contactToken}: Status: {contactStatusId}. Status changed to {exposureStatusId}", exposedContact.UserToken, userStatus.Id, exposureStatusId); // send Notification to ASB if (string.IsNullOrEmpty(userState.NotificationToken) || string.IsNullOrEmpty(userState.NotificationTarget)) { logger.LogWarning( "ContactToken: {contactToken}. Push notification message not sent to ASB", exposedContact.UserToken); return; } var pushNotification = new PushNotification() { Handle = userState.NotificationToken, Platform = userState.NotificationTarget, Message = backendOptions.Value.Infection.ExposureNotification }; var messageProperties = new Dictionary <string, object> { { MessageHeaders.Subject, "StatusNotification" }, { MessageHeaders.From, "ExposedContactJob" }, { "UserToken", exposedContact.UserToken } }; Message pushMessage = MessageHelper.CreateMessageFromObject(pushNotification, messageProperties); await MessageSender.SendAsync(pushMessage); logger.LogInformation( "ContactToken: {contactToken}. Push notification message is sent to ASB", exposedContact.UserToken); }