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()); }
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()); }
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); }
public async Task <IActionResult> Get() { var active = await focusStore.GetActiveAsync(User.GetId()); return(Ok(active)); }