in src/Services/Infection/Infection.FnApp/Services/ContactTracingService.cs [73:123]
public async Task ProcessContactList(string userToken, IList<Meeting> meetings)
{
// Push all to Meeting repository
// This functionality is commented out and not required in MVP.
// List<MeetingContact> meetingsDtoList = meetings
// .Select(meeting => mapper.Map<MeetingContact>(meeting))
// .ToList();
// meetingRepository.Save(userToken, meetingsDtoList);
// logger.LogInformation("UserToken: {userToken}. {meetingsCount} meetings are saved to DB", userToken, meetingsDtoList.Count);
UserInfo userInfo = userRepository.GetUserInfo(userToken);
DateTime infectedDate = userInfo.StatusChangedOn;
logger.LogInformation(
"UserToken: {userToken}. Status: {userStatusId}, StatusDate: {userStatusChangedOn}",
userToken,
userInfo.StatusId,
userInfo.StatusChangedOn);
// filter contacts
// uses the current user status as Infected!!!
// Example: If the doctor sets 2020.03.15 as infection date, we should query the contacts for 14 days both ways (2020.03.01 – 2020.03.29)
var lookupDays = backendOptions.Value.Infection.ContactLookupDays;
IEnumerable<Meeting> exposedMeetings = meetings
.Where(m => (m.Timestamp >= infectedDate.AddDays(lookupDays * -1) && m.Timestamp <= infectedDate.AddDays(lookupDays)));
IEnumerable<Meeting> distinctExposedMeetings = from x in exposedMeetings
group x by x.UserToken into g
select new Meeting { UserToken = g.Key, Timestamp = g.Max(a => a.Timestamp) };
// push exposed contact to service bus topic
var messageProperties = new Dictionary<string, object>
{
{ MessageHeaders.Subject, "ExposedContact" },
{ MessageHeaders.From, "ContactTracingJob" },
{ "UserToken", userToken }
};
List<ExposedContact> exposedContacts = distinctExposedMeetings
.Select(meeting => mapper.Map<ExposedContact>(meeting))
.ToList();
foreach (ExposedContact exposedContact in exposedContacts)
{
Message message = MessageHelper.CreateMessageFromObject(exposedContact, messageProperties);
await MessageSender.SendAsync(message);
}
logger.LogInformation(
"UserToken: {userToken}. {exposedContactsCount} exposed contacts are sent to ASB",
userToken,
exposedContacts.Count);
}