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