public async Task<string> SendCompletion(Completion completion) { try { string slug = completion.Slug; string id = ""; var url = "https://api.freeletics.com/v2/coach/workouts/{0}/trainings.json"; var client = GetRequest(string.Format(url, slug), "POST"); client.ContentType = "application/json;charset=UTF-8"; using (var writer = new StreamWriter(await client.GetRequestStreamAsync())) { var json = JsonConvert.SerializeObject(completion); writer.WriteLine(json); } using (var response = await client.GetResponseAsync()) { using (var reader = new StreamReader(response.GetResponseStream())) { var content = reader.ReadToEnd(); dynamic data = JObject.Parse(content); id = data.training.id; } } // App Insight var props = new Dictionary<string, string> { { "slug", slug }, { "star", completion.Star.ToString() } }; telemetry.TrackEvent("Workout", props); return id; } catch (WebException ex) { if (ex.Status == WebExceptionStatus.ConnectFailure || ex.Status == WebExceptionStatus.SendFailure || ((HttpWebResponse)ex.Response).StatusCode == HttpStatusCode.NotFound) { // TODO : save data to retry later var storage = Windows.Storage.ApplicationData.Current.LocalSettings.Values; List<Completion> sendcache = new List<Completion>(); if (storage.ContainsKey("sendcache")) { sendcache = JsonConvert.DeserializeObject<List<Completion>>((string)storage["sendcache"]); } sendcache.Add(completion); storage["sendcache"] = JsonConvert.SerializeObject(sendcache); throw new SendLaterException(); } else { throw ex; } } }
public async void SendData() { ErrorMessage = ""; try { var elapsed = ParseTimeSpan(Duration); var fulldate = new DateTime(Date.Year, Date.Month, Date.Day, Time.Hours, Time.Minutes, Time.Seconds); var completion = new Completion() { Slug = Slug, Star = false, Seconds = (int)elapsed.TotalSeconds, Description = Description, PerformedAt = fulldate.ToUniversalTime() }; try { await dataservice.SendCompletion(completion); navigationService.NavigateToViewModel<MyWeekViewModel>(); } catch(SendLaterException ex) { ShowError(ex); navigationService.NavigateToViewModel<MyWeekViewModel>(); } catch (Exception ex) { ShowError(ex); dataservice.LogException(ex, completion); } } catch (FormatException) { ErrorMessage = "Wrong input format. Please use hh:mm:ss"; } }
public async Task<Completion> GetBestData(string slug) { Completion completion = null; var url = @"https://api.freeletics.com/v2/coach/users/{0}/trainings/best.json?workout_slugs%5B%5D={1}"; url = string.Format(url, UserId, slug); var request = GetRequest(url); using (var response = await request.GetResponseAsync()) { using (var reader = new StreamReader(response.GetResponseStream())) { var content = reader.ReadToEnd(); dynamic data = JObject.Parse(content); var training = data.trainings.First; if (training != null) { completion = new Completion(); completion.Seconds = training.seconds; if (training.exercises_seconds != null) { var list = new List<List<int>>(); foreach (var exercice in training.exercises_seconds) { var workouts = new List<int>(); foreach (var w in exercice) { int sec = w; workouts.Add(sec); } list.Add(workouts); } completion.ExercisesSeconds = list.Select(l => l.ToArray()).ToArray(); } } } } return completion; }