public async Task SetPlace(string userId, string itemId, SetPlaceRequest setPlaceRequest)
        {
            if (null != setPlaceRequest.RememberForLocation)
            {
                await _travelServiceClient.Users[userId].Locations[setPlaceRequest.RememberForLocation].Put(new TravelService.Models.Coordinate()
                {
                    Lat = setPlaceRequest.Place.Lat,
                    Lng = setPlaceRequest.Place.Lng
                });
            }
            else if (null != setPlaceRequest.RememberForSubject)
            {
                await _travelServiceClient.Users[userId].Locations[$"#event:{setPlaceRequest.RememberForLocation}"].Put(new TravelService.Models.Coordinate()
                {
                    Lat = setPlaceRequest.Place.Lat,
                    Lng = setPlaceRequest.Place.Lng
                });
            }
            await _focusStore.SetPlaceForItem(userId, itemId, setPlaceRequest.Place);

            if ((await _focusStore.GetActiveAsync(userId)).Any(v => v.Id == itemId))
            {
                await _focusService.PatchAsync(userId);
            }
        }
        public static async Task <FocusItem> GetActiveItem(this IFocusStore focusStore, string userId)
        {
            FocusItem[] items = await focusStore.GetActiveAsync(userId);

            var query = items.Where(v => v.IndicateTime - DateTimeOffset.Now < FocusConstants.ItemActiveBeforeIndicateAlone);

            if (query.Count() == 1)
            {
                return(query.Single());
            }
            return(items
                   .Where(v => v.IndicateTime - DateTimeOffset.Now < FocusConstants.ItemActiveBeforeIndicateMultiple)
                   .OrderByDescending(v => v.IndicateTime)
                   .FirstOrDefault());
        }
Exemple #3
0
        public async Task <SyncAction[]> GetPendingSyncActions(string userId, DateTimeOffset now)
        {
            var syncActions = (await pushSyncStore.GetPendingSyncActions(userId)).ToList();

            if ((await _focusStore.GetActiveAsync(userId)).Any(v => null != v.DirectionsMetadata &&
                                                               v.DirectionsMetadata.TravelStatus != Focus.Models.TravelStatus.Finished))
            {
                if (!syncActions.Any(s => s.Id == "locationSync"))
                {
                    syncActions.Add(new SyncAction()
                    {
                        Id       = "locationSync",
                        Deadline = now
                    });
                }
            }
            return(syncActions.ToArray());
        }
Exemple #4
0
        public async Task <FocusManageResult> Update(string userId, FocusUpdateRequest focusUpdateRequest)
        {
            if (null != focusUpdateRequest.Location)
            {
                await _focusGeofenceService.UpdateFocusItems(userId, focusUpdateRequest.Location);
            }
            var res         = new FocusManageResult();
            var activeItems = await focusStore.GetActiveAsync(userId);

            var updatedItemIds = new HashSet <string>(focusUpdateRequest.ItemSyncResult != null ?
                                                      focusUpdateRequest.ItemSyncResult.ChangedItems.Select(v => v.Id) :
                                                      new string[0]);

            foreach (var item in activeItems)
            {
                var evt = await calendarServiceClient.Users[userId].Feeds[item.CalendarEventFeedId].Events.Get(item.CalendarEventId);
                TransitDirections directions;
                if (null != focusUpdateRequest.ItemSyncResult && (
                        focusUpdateRequest.ItemSyncResult.AddedItems.Any(v => v.Id == item.Id) ||
                        focusUpdateRequest.ItemSyncResult.ChangedItems.Any(v => v.Id == item.Id)) ||
                    null == item.DirectionsMetadata?.Key)
                {
                    directions = await GetFreshDirections(userId, evt, item, focusUpdateRequest.Location);
                }
                else
                {
                    var directionsRes = await GetCachedDirectionsOrNew(userId, evt, item, focusUpdateRequest.Location);

                    directions = directionsRes.Directions;
                    if (directionsRes.IsNew)
                    {
                        updatedItemIds.Add(item.Id);
                    }
                    if (null != directions &&
                        null != focusUpdateRequest.ChangedDirections && focusUpdateRequest.ChangedDirections.Contains(
                            item.DirectionsMetadata.Key))
                    {
                        await logger.LogForFocusItem(userId, item.Id, $"Received direction updates for {evt.Subject}", DigitTraceAction.DirectionsUpdate);

                        updatedItemIds.Add(item.Id);
                    }
                }
                DateTimeOffset indicateTime;
                if (null == directions)
                {
                    await logger.LogForFocusItem(userId, item.Id, $"No departure time found, using {FocusConstants.DefaultTravelTime.TotalMinutes:0} minutes for {evt.Subject}");

                    indicateTime = evt.Start - FocusConstants.DefaultTravelTime;
                }
                else
                {
                    indicateTime = directions.Routes[item.DirectionsMetadata.PeferredRoute].DepatureTime;
                }
                item.IndicateTime = indicateTime;
                await focusStore.UpdateIndicateTime(item.Id, indicateTime);

                res.ActiveItems.Add(new FocusItemWithExternalData()
                {
                    Start              = item.Start,
                    IndicateTime       = item.IndicateTime,
                    CalendarEvent      = evt,
                    Directions         = directions,
                    DirectionsMetadata = item.DirectionsMetadata,
                    End = item.End,
                    Id  = item.Id
                });
            }
            await _focusGeofenceService.RefreshGeofencesForActiveNavigations(userId, res, DateTimeOffset.Now);

            var active = await focusStore.GetActiveItem(userId);

            var activeItemChanged = await focusStore.UpdateActiveItem(userId, active?.Id);

            if (activeItemChanged || (null != active && updatedItemIds.Contains(active.Id)))
            {
                if (null != active)
                {
                    await Task.WhenAll(focusSubscribers.Select(v => v.ActiveItemChanged(userId, res.ActiveItems.Where(d => d.Id == active.Id).Single())));
                }
                else
                {
                    await Task.WhenAll(focusSubscribers.Select(v => v.ActiveItemChanged(userId, null)));
                }
            }
            if (updatedItemIds.Count > 0)
            {
                await Task.WhenAll(focusSubscribers.Select(v => v.ActiveItemsChanged(userId, res)));
            }
            return(res);
        }
Exemple #5
0
        public async Task <IActionResult> Get()
        {
            var active = await focusStore.GetActiveAsync(User.GetId());

            return(Ok(active));
        }