public async Task ProcessContact()

in src/Services/Infection/Infection.FnApp/Services/ExposedContactService.cs [72:152]


        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);
        }