예제 #1
0
        public async Task <IActionResult> SignIn([FromBody] ProfileSaveRequestModel model)
        {
            try
            {
                var user = await _context.Users.SingleOrDefaultAsync(a => a.UserId == UserId);

                if (user == null)
                {
                    user = new AppUser {
                        UserId = this.UserId
                    };
                    user.FirstName             = model.FirstName;
                    user.LastName              = model.LastName;
                    user.Email                 = model.Email;
                    user.Gender                = model.Gender;
                    user.City                  = model.City;
                    user.Region                = model.Region;
                    user.Country               = model.Country;
                    user.PhotoUrl              = model.PhotoUrl;
                    user.DefaultActivityTypeId = (byte)Enum.Parse <ActivityTypeEnum>(model.DefaultActivityType ?? "Ski", true);
                    _context.Users.Add(user);

                    await _context.SaveChangesAsync();
                }

                var response = Responses.Profile(user, Enumerable.Empty <Activity>());
                return(Ok(response));
            }
            catch (Exception e)
            {
                Console.WriteLine("Error signing in", e);
                _logger.LogError(e, "Error siging in");
                return(ErrorResponse.AsStatusCodeResult(HttpStatusCode.InternalServerError, "Error siging in"));
            }
        }
예제 #2
0
        public async Task <IActionResult> GetActivity(Guid activityId)
        {
            try
            {
                var activity = await _context
                               .Activities
                               .Include(a => a.Segments)
                               .Include(a => a.Locations)
                               .Where(a => a.ActivityId == activityId)
                               .FirstOrDefaultAsync();

                if (activity == null)
                {
                    return(NotFound());
                }

                var user = await _context.Users.FindAsync(activity.UserId);

                return(Ok(Responses.Activity(activity, user)));
            }
            catch (Exception e)
            {
                Console.WriteLine("Error retrieving activity", e);
                _logger.LogError(e, "Error retrieving activity");
                return(ErrorResponse.AsStatusCodeResult(HttpStatusCode.InternalServerError, "Error retrieving activity"));
            }
        }
예제 #3
0
        public async Task <IActionResult> GetProfile(string userId)
        {
            //todo: privacy?
            try
            {
                var user = await _context.Users.SingleAsync(a => a.UserId == userId);

                var activities = await _context.Activities.Where(a => a.UserId == userId).Include(a => a.Segments).ToListAsync();

                var response = Responses.Profile(user, activities);
                return(Ok(response));
            }
            catch (Exception e)
            {
                Console.WriteLine("Error fetching profile", e);
                _logger.LogError(e, "Error fetching profile");
                return(ErrorResponse.AsStatusCodeResult(HttpStatusCode.InternalServerError, "Error fetching profile"));
            }
        }
예제 #4
0
        public async Task <IActionResult> GetNearby([FromQuery] double latitude, [FromQuery] double longitude)
        {
            try
            {
                var rect  = Geometry.GetRect(latitude, longitude, 10000);
                var lifts = await _context
                            .Lifts
                            .Where(l => !l.IsHidden && l.Point1Latitude >= rect.StartLatitude && l.Point1Latitude <= rect.EndLatitude && l.Point1Longitude >= rect.StartLongitude && l.Point1Longitude <= rect.EndLongitude)
                            .Select(l => Responses.Lift(l))
                            .ToListAsync();

                return(Ok(lifts));
            }
            catch (Exception e)
            {
                Console.WriteLine("Error retrieving lifts", e);
                _logger.LogError(e, "Error retrieving lifts");
                return(ErrorResponse.AsStatusCodeResult(HttpStatusCode.InternalServerError, "Error retrieving lifts"));
            }
        }
예제 #5
0
        public async Task <IActionResult> DeleteActivity(Guid activityId)
        {
            try
            {
                var activity = await _context.Activities
                               .Include(a => a.Segments)
                               .Include(a => a.Locations)
                               .Include(a => a.Batches)
                               .SingleAsync(a => a.ActivityId == activityId);

                _context.Activities.Remove(activity);
                await _context.SaveChangesAsync();

                return(Ok(new SuccessResponse()));
            }
            catch (Exception e)
            {
                Console.WriteLine("Error deleting activity", e);
                _logger.LogError(e, "Error deleting activity");
                return(ErrorResponse.AsStatusCodeResult(HttpStatusCode.InternalServerError, "Error deleting activity"));
            }
        }
예제 #6
0
        public async Task <IActionResult> GetFeed()
        {
            try
            {
                var activities = await _context.Activities
                                 .Where(a => a.UserId == UserId)
                                 .OrderByDescending(a => a.Timestamp)
                                 .ToListAsync();

                var userIds = activities.Select(a => a.UserId).Distinct();
                var users   = await _context.Users.Where(u => userIds.Contains(u.UserId)).ToDictionaryAsync(u => u.UserId);

                var response = activities.Select(a => Responses.Activity(a, users[a.UserId]));

                return(Ok(response));
            }
            catch (Exception e)
            {
                Console.WriteLine("Error retrieving feed", e);
                _logger.LogError(e, "Error retrieving feed");
                return(ErrorResponse.AsStatusCodeResult(HttpStatusCode.InternalServerError, "Error retrieving feed"));
            }
        }
예제 #7
0
        public async Task <IActionResult> SaveActivity(Guid activityId, [FromBody] ActivitySaveRequestModel model)
        {
            try
            {
                var activity = await _context.Activities
                               .Include(a => a.Locations)
                               .SingleAsync(a => a.ActivityId == activityId);

                activity.Name                 = model.Name;
                activity.TypeId               = (byte)Enum.Parse <ActivityTypeEnum>(model.ActivityType, true);
                activity.StartDateTime        = model.StartDateTime;
                activity.EndDateTime          = model.EndDateTime;
                activity.TotalTimeSeconds     = Convert.ToInt32(model.TotalTimeSeconds);
                activity.TotalDistanceMeters  = Convert.ToSingle(model.TotalDistanceMeters);
                activity.SkiTimeSeconds       = Convert.ToInt32(model.SkiTimeSeconds);
                activity.SkiDistanceMeters    = Convert.ToSingle(model.SkiDistanceMeters);
                activity.SkiVerticalMeters    = Convert.ToInt32(model.SkiVerticalMeters);
                activity.AscentTimeSeconds    = Convert.ToInt32(model.AscentTimeSeconds);
                activity.AscentDistanceMeters = Convert.ToSingle(model.AscentDistanceMeters);
                activity.AscentVerticalMeters = Convert.ToInt32(model.AscentVerticalMeters);
                activity.MaxSpeedMps          = Convert.ToSingle(model.MaxSpeedMps);
                activity.AverageSpeedMps      = Convert.ToSingle(model.AverageSpeedMps);
                activity.MaxAltitudeMeters    = Convert.ToInt32(model.MaxAltitudeMeters);
                activity.MaxGradeDegrees      = Convert.ToSingle(model.MaxGradeDegrees);
                activity.RunsCount            = model.RunsCount ?? 0;
                activity.UserId               = this.UserId;
                activity.SourceTypeId         = (byte)Enum.Parse <ActivitySourceTypeEnum>(model.Source, true);
                activity.Timestamp            = model.Timestamp;

                activity.Segments = model.Segments?
                                    .Select(s => new ActivitySegment
                {
                    Name              = s.Name,
                    StartTimestamp    = s.StartTimestamp ?? 0,
                    EndTimestamp      = s.EndTimestamp ?? 0,
                    TotalTimeSeconds  = Convert.ToInt32(s.TotalTimeSeconds),
                    MovingTimeSeconds = Convert.ToInt32(s.MovingTimeSeconds),
                    VerticalMeters    = Convert.ToInt32(s.VerticalMeters),
                    StartAltitude     = Convert.ToSingle(s.StartAltitude),
                    EndAltitude       = Convert.ToSingle(s.EndAltitude),
                    DistanceMeters    = Convert.ToSingle(s.DistanceMeters),
                    MaxSpeedMps       = Convert.ToSingle(s.MaxSpeedMps),
                    AverageSpeedMps   = Convert.ToSingle(s.AverageSpeedMps),
                    MaxGradeDegrees   = Convert.ToSingle(s.MaxGradeDegrees),
                    IsRun             = s.IsRun ?? false
                })
                                    .ToList();

                var locations = TrackSimplifier.Simplify(activity.Locations.OrderBy(l => l.Timestamp).ToList(), 0.00005);
                var polyline  = WebUtility.UrlEncode(Geometry.Encode(locations));
                activity.Polyline = polyline;

                await _context.SaveChangesAsync();

                return(Ok(new SuccessResponse()));
            }
            catch (Exception e)
            {
                Console.WriteLine("Error saving activity", e);
                _logger.LogError(e, "Error saving activity");
                return(ErrorResponse.AsStatusCodeResult(HttpStatusCode.InternalServerError, "Error saving activity"));
            }
        }
예제 #8
0
        public async Task <IActionResult> SaveActivityData(Guid activityId, [FromBody] ActivitySaveDataRequestModel model)
        {
            try
            {
                var sourceTypeID = Enum.Parse <ActivitySourceTypeEnum>(model.Source, true);

                //get or create activity
                var activity = await _context.Activities.SingleOrDefaultAsync(a => a.ActivityId == activityId);

                if (activity == null)
                {
                    activity = new WaitTime.Entities.Activity
                    {
                        ActivityId   = activityId,
                        UserId       = this.UserId,
                        SourceTypeId = (byte)sourceTypeID,
                    };
                    _context.Activities.Add(activity);
                }

                var batch = await _context.ActivitySyncBatches.SingleOrDefaultAsync(b => b.ActivitySyncBatchId == model.ActivitySyncBatchId);

                if (batch != null)
                {
                    //batch already saved
                    return(Ok(new SuccessResponse()));
                }

                var array = model.LocationsArray;
                if (array.GetLength(1) != 10)
                {
                    var error = $"Activity {activityId}, Batch {model.BatchNbr} for User {UserId}: Locations array has the wrong number of columns. Expected 10 columns, found {array.GetLength(1)}.";
                    Console.WriteLine(error);
                    throw new ArgumentOutOfRangeException(nameof(model), error);
                }

                foreach (var location in Enumerable
                         .Range(0, array.GetLength(0))
                         .Select(row => new ActivityLocation
                {
                    Latitude = (double)(array[row, 0] ?? 0),
                    Longitude = (double)(array[row, 1] ?? 0),
                    Accuracy = (float)(array[row, 2] ?? 0),
                    Altitude = (float)(array[row, 3] ?? 0),
                    AltitudeAccuracy = (float)(array[row, 4]),
                    Bearing = (float)(array[row, 5] ?? 0),
                    BearingAccuracy = (float)(array[row, 6]),
                    Speed = (float)(array[row, 7] ?? 0),
                    SpeedAccuracy = (float)(array[row, 8] ?? 0),
                    Timestamp = (double)(array[row, 9] ?? 0),
                }))
                {
                    activity.Locations.Add(location);
                }

                batch = new ActivitySyncBatch
                {
                    ActivitySyncBatchId = model.ActivitySyncBatchId,
                    BatchNbr            = model.BatchNbr,
                };
                activity.Batches.Add(batch);

                await _context.SaveChangesAsync();

                return(Ok(new SuccessResponse()));
            }
            catch (Exception e)
            {
                Console.WriteLine("Error processing batch", e);
                _logger.LogError(e, "Error processing batch");
                return(ErrorResponse.AsStatusCodeResult(HttpStatusCode.InternalServerError, "Error processing batch"));
            }
        }