/// <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);
        }
Exemple #4
0
        /// <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);
        }