public async Task ProcessContactList()

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