public async Task <IActionResult> DownloadUpdates([FromQuery] decimal lat, [FromQuery] decimal lng, [FromQuery] DateTime lastUpdatedTime) { if (!ModelState.IsValid) { return(Json(new { WasSuccessful = false, Message = "Invalid model state for DownloadUpdates." })); } // Download all events where the event was updated after the last client's updated time GeoBox gb = CalculateBoundingGeoBox(lat, lng, Policy.SURROUNDING_GEOBOX_SIDE_LENGTH); var @events = await _context.Event.Where(e => ( e.Latitude <gb.MaxLatitude && e.Latitude> gb.MinLatitude && e.Longitude <gb.MaxLongitude && e.Longitude> gb.MinLongitude && e.TimeLastUpdated > lastUpdatedTime )).ToListAsync(); // Determine if any of these events need to be deleted... var eventsToDelete = @events.Where(Policy.ShouldMarkEventForDeletion); foreach (Event e in eventsToDelete) { e.Deleted = true; e.TimeLastUpdated = DateTime.UtcNow; } _context.UpdateRange(eventsToDelete); await _context.SaveChangesAsync(); return(Json(new { WasSuccessful = true, Events = @events, CurrentServerTime = DateTime.UtcNow })); }