Beispiel #1
0
        public async Task <ActionResult <IList <RiskyVisitResponse> > > GetForVisit([FromQuery] int visitId)
        {
            var visit = await DataAccess.Get <Visit, int>(visitId);

            var visits = await RiskAccess.GetRiskyVisitsFor(visit);

            var response = new List <RiskyVisitResponse>();

            foreach (var item in visits)
            {
                var distance   = GPSExtensions.GetDistanceInMeters(visit.Longitude, visit.Latitude, item.Longitude, item.Latitude);
                var riskyVisit = new RiskyVisitResponse()
                {
                    VisitId      = item.VisitId,
                    Address      = item.Address,
                    CheckIn      = item.CheckIn,
                    CheckOut     = item.CheckOut.GetValueOrDefault(item.CheckIn),
                    Latitude     = item.Latitude,
                    Longitude    = item.Longitude,
                    DistanceInKm = Convert.ToInt32(distance)
                };
                response.Add(riskyVisit);
            }

            return(new OkObjectResult(response.OrderBy(r => r.DistanceInKm)));
        }
        public static async Task <IList <VisitResponse> > GetVisitResponseFor(int userId)
        {
            using (var conn = ContextProvider.Instance.Conn)
            {
                var visits = await conn.QueryAsync <Visit>(
                    @"SELECT * FROM Visits v WHERE v.UserId = @UserId",
                    new { UserId = userId });

                var response = new List <VisitResponse>();

                foreach (var visit in visits)
                {
                    var riskyInteractions = await RiskAccess.GetRiskyVisitsFor(visit);

                    response.Add(new VisitResponse()
                    {
                        Address           = visit.Address,
                        CheckIn           = visit.CheckIn,
                        CheckOut          = visit.CheckOut,
                        Latitude          = visit.Latitude,
                        Longitude         = visit.Longitude,
                        PlaceName         = visit.PlaceName,
                        VisitId           = visit.VisitId,
                        AtRisk            = visit.AtRisk,
                        RiskyInteractions = riskyInteractions == null ? 0 : riskyInteractions.Count()
                    });
                }

                return(response);
            }
        }
Beispiel #3
0
        public async Task <ActionResult <string> > Create([FromBody] VisitRequest request)
        {
            var user = await DataAccess.Get <User, int>(request.UserId);

            var entity = await request.ToPersistedData();

            entity.AtRisk = user.AtRisk;

            await entity.Insert();

            var riskyVisits = await RiskAccess.GetRiskyVisitsFor(entity);

            var response = JsonConvert.SerializeObject(riskyVisits);

            return(new OkObjectResult(response));
        }
Beispiel #4
0
        public async Task<ActionResult> MarkAsPositive([FromBody] UserAtRiskRequest request)
        {
            var userId = request.UserId;
            User user = null;

            // You can only mark yourself as having corona
            if (UserUtilities.GetUserId(httpContextAccessor.HttpContext.User) != userId)
            {
                return Unauthorized();
            }

            try
            {
                user = await DataAccess.Get<User, int>(userId);
                if (user.AtRisk)
                {
                    return new OkResult();
                }
            }
            catch
            {
                return Unauthorized();
            }

            request.ToPersistedData(user);

            var targetedDay = DateTime.Today.AddDays(-18);
            await VisitAccess.UpdateVisitStatus(userId, targetedDay);

            user.AtRisk = true;
            await user.UpdateAsync();

            try
            {
                var affectedUserIds = await RiskAccess.GetUsersAffectedBy(userId, targetedDay);
                await RiskAccess.PrepareUsersForNotification(affectedUserIds, DateTime.Now);
            }
            catch (Exception ex)
            {
                throw new Exception("Failed to notify user", ex);
            }

            return new OkResult();
        }