public IActionResult Add([FromBody] DogTrainingModel obj)
        {
            if (!IsCurrentUserAdmin() && !IsCurrentUserMember())
            {
                return(Forbid());
            }
            //dogs will be added to the training later
            var training = new DogTraining
            {
                Comments                 = null,
                DogId                    = obj.DogId,
                TrainingId               = obj.TrainingId,
                DogTrackBlobUrl          = obj.DogTrackBlobUrl,
                LostPerson               = obj.LostPerson,
                LostPersonTrackBlobUrl   = obj.LostPersonTrackBlobUrl,
                Notes                    = obj.Notes,
                Weather                  = obj.Weather,
                GroundType               = obj.GroundType,
                DelayTime                = obj.DelayTime,
                LostPersonTrackLength    = obj.LostPersonTrackLength,
                AdditionalPictureBlobUrl = obj.AdditionalPictureBlobUrl
            };

            unitOfWork.DogTrainingRepository.Insert(training);
            unitOfWork.Commit();
            //var accessToken = HttpContext.GetTokenAsync("access_token").Result;

            return(new ObjectResult(new { trainingId = training.TrainingId, dogId = training.DogId }));
        }
        public DogTrainingModel Get(int dogId, int trainingId)
        {
            if (!IsCurrentUserAdmin() && !IsCurrentUserMember())
            {
                return(null);
            }
            //return unitOfWork.GuideRepository.GetById(id);
            var t = unitOfWork.DogTrainingRepository.GetByIds(dogId, trainingId);

            if (String.IsNullOrWhiteSpace(t.Weather))
            {
                var training = unitOfWork.TrainingRepository.GetById(trainingId);
                t.Weather = training.Weather;
            }
            var dogTrainingModel = new DogTrainingModel()
            {
                DogId                    = t.DogId,
                TrainingId               = t.TrainingId,
                DogTrackBlobUrl          = t.DogTrackBlobUrl,
                LostPerson               = t.LostPerson,
                LostPersonTrackBlobUrl   = t.LostPersonTrackBlobUrl,
                Notes                    = t.Notes,
                Weather                  = t.Weather,
                GroundType               = t.GroundType,
                DelayTime                = t.DelayTime,
                LostPersonTrackLength    = t.LostPersonTrackLength,
                AdditionalPictureBlobUrl = t.AdditionalPictureBlobUrl,
                Comments                 = t.Comments.Select(c => new CommentModel
                {
                    AuthorId   = c.AuthorId,
                    AuthorName = c.Author.FirstName + " " + c.Author.LastName,
                    CommentId  = c.DogTrainingCommentId,
                    Content    = c.Content,
                    Date       = c.Date
                }).ToList()
            };

            return(dogTrainingModel);
        }
        public ActionResult Add(DogTrainingModel model, HttpPostedFileBase lostPersonTrackFile, HttpPostedFileBase dogTrackFile, HttpPostedFileBase imageFile)
        {
            if (!LoginHelper.IsAuthenticated())
            {
                return(RedirectToAction("Login", "Account"));
            }
            else if (!LoginHelper.IsCurrentUserAdmin() && !LoginHelper.IsCurrentUserMember())
            {
                return(RedirectToAction("Error", "Home", new { error = "Nie masz wystarczających uprawnień by zmieniać te dane" }));
            }

            MultipartFormDataContent additionalPhotoForm = new MultipartFormDataContent();

            if (imageFile != null)
            {
                var additionalPictureStream           = imageFile.InputStream;
                var additionalPictureStreamContent    = new StreamContent(additionalPictureStream);
                var additionalPictureByteArrayContent =
                    new ByteArrayContent(additionalPictureStreamContent.ReadAsByteArrayAsync().Result);
                additionalPictureByteArrayContent.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/form-data");
                var additionalPictureFileName = imageFile.FileName + Guid.NewGuid().ToString();
                additionalPhotoForm.Add(additionalPictureByteArrayContent, additionalPictureFileName, Path.GetFileName(additionalPictureFileName));

                client.DefaultRequestHeaders.Authorization =
                    new AuthenticationHeaderValue("Bearer", LoginHelper.GetToken());

                var additionalPhotoUploadResponse = client.PostAsync("DogTrainings/UploadImage", additionalPhotoForm).Result;

                if (!additionalPhotoUploadResponse.IsSuccessStatusCode)
                {
                    ViewBag.Message = "image upload failed. Reason: " + additionalPhotoUploadResponse.StatusCode;
                    return(View("Error"));
                }

                else
                {
                    model.AdditionalPictureBlobUrl = @"https://kgtstorage.blob.core.windows.net/images/" + additionalPictureFileName;
                }
            }

            var      originalLostPersonTrackStream = lostPersonTrackFile.InputStream;
            var      cleanedLostPersonTrackStream  = new MemoryStream();
            DateTime lostPersonStartTime           = new DateTime();
            double   lostPersonTrackLength         = 0.0;
            DateTime dogStartTime = new DateTime();

            using (var reader = new StreamReader(originalLostPersonTrackStream))
            {
                XDocument gpxDoc = XDocument.Load(reader);
                var       originalFileSerializer = new XmlSerializer(typeof(Gpx));
                var       gpx    = (Gpx)originalFileSerializer.Deserialize(gpxDoc.Root.CreateReader());
                var       trkSeg = gpx.Trk.Trkseg;

                //calculate lost person track length and time of lost person start
                lostPersonStartTime = DogTrainingHelper.CalculateGPSTrackStartTime(trkSeg);
                //lostPersonTrackLength = DogTrainingHelper.CalculateGPSTrackLength(trkSeg);

                var cleanedFileSerializer = new XmlSerializer(typeof(Trkseg));
                cleanedFileSerializer.Serialize(cleanedLostPersonTrackStream, trkSeg);
                cleanedLostPersonTrackStream.Position = 0;
            }

            var originalDogTrackStream = dogTrackFile.InputStream;
            var cleanedDogTrackStream  = new MemoryStream();

            using (var reader = new StreamReader(originalDogTrackStream))
            {
                XDocument gpxDoc = XDocument.Load(reader);
                var       originalFileSerializer = new XmlSerializer(typeof(Gpx));
                var       gpx    = (Gpx)originalFileSerializer.Deserialize(gpxDoc.Root.CreateReader());
                var       trkSeg = gpx.Trk.Trkseg;

                //calculate time of dog start
                dogStartTime = DogTrainingHelper.CalculateGPSTrackStartTime(trkSeg);

                var cleanedFileSerializer = new XmlSerializer(typeof(Trkseg));
                cleanedFileSerializer.Serialize(cleanedDogTrackStream, trkSeg);
                cleanedDogTrackStream.Position = 0;
            }


            MultipartFormDataContent form = new MultipartFormDataContent();
            var lostPersonStreamContent   = new StreamContent(cleanedLostPersonTrackStream);
            var lostPersonImageContent    = new ByteArrayContent(lostPersonStreamContent.ReadAsByteArrayAsync().Result);

            lostPersonImageContent.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/form-data");
            var lostPersonFileName = lostPersonTrackFile.FileName + Guid.NewGuid().ToString();

            form.Add(lostPersonImageContent, lostPersonFileName, Path.GetFileName(lostPersonFileName));

            var dogStreamContent = new StreamContent(cleanedDogTrackStream);
            var dogImageContent  = new ByteArrayContent(dogStreamContent.ReadAsByteArrayAsync().Result);

            dogImageContent.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/form-data");
            var dogFileName = dogTrackFile.FileName + Guid.NewGuid().ToString();

            form.Add(dogImageContent, dogFileName, Path.GetFileName(dogFileName));

            client.DefaultRequestHeaders.Authorization =
                new AuthenticationHeaderValue("Bearer", LoginHelper.GetToken());

            var response = client.PostAsync("DogTrainings/Upload", form).Result;

            if (response.IsSuccessStatusCode)
            {
                //get blob urls - is it that simple or it has to be returned?

                var lostPersonTrackBlobUrl = @"https://kgtstorage.blob.core.windows.net/tracks/" + lostPersonFileName;
                var dogTrackBlobUrl        = @"https://kgtstorage.blob.core.windows.net/tracks/" + dogFileName;

                //add blob urls to model
                model.LostPersonTrackBlobUrl = lostPersonTrackBlobUrl;
                model.DogTrackBlobUrl        = dogTrackBlobUrl;

                //add lost person track length and delay time to model
                model.DelayTime = dogStartTime - lostPersonStartTime;
                //model.LostPersonTrackLength = lostPersonTrackLength;

                //add dogtraining
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                client.DefaultRequestHeaders.Authorization =
                    new AuthenticationHeaderValue("Bearer", LoginHelper.GetToken());
                HttpRequestMessage message = new HttpRequestMessage(HttpMethod.Post, client.BaseAddress + "dogtrainings/");

                var dogTrainingSerialized = JsonConvert.SerializeObject(model);

                message.Content = new StringContent(dogTrainingSerialized, System.Text.Encoding.UTF8, "application/json");

                HttpResponseMessage responseMessage = client.SendAsync(message).Result; // await client.SendAsync(message)
                if (responseMessage.IsSuccessStatusCode)                                //200 OK
                {
                    //display info
                    message.Dispose();
                    var responseData = responseMessage.Content.ReadAsStringAsync().Result;
                    var definition   = new { DogId = "", TrainingId = "" };
                    var ids          = JsonConvert.DeserializeAnonymousType(responseData, definition);
                    return(RedirectToAction("Training", new { dogId = ids.DogId, trainingId = ids.TrainingId }));
                    //return View("Dog", responseMessage.Content);
                }
                else    // msg why not ok
                {
                    message.Dispose();
                    ViewBag.Message = responseMessage.StatusCode;
                    return(View("Error"));
                }
            }

            ViewBag.Message = "upload failed. Reason: " + response.StatusCode;
            return(View("Error"));
        }
        public ActionResult Update(DogTrainingViewModel model, HttpPostedFileBase imageFile)
        {
            if (!LoginHelper.IsAuthenticated())
            {
                return(RedirectToAction("Login", "Account"));
            }
            else if (!LoginHelper.IsCurrentUserAdmin() && !LoginHelper.IsCurrentUserMember())
            {
                return(RedirectToAction("Error", "Home", new { error = "Nie masz wystarczających uprawnień by zmieniać te dane" }));
            }


            if (imageFile != null)
            {
                MultipartFormDataContent form = new MultipartFormDataContent();
                var imageStreamContent        = new StreamContent(imageFile.InputStream);
                var byteArrayImageContent     = new ByteArrayContent(imageStreamContent.ReadAsByteArrayAsync().Result);
                byteArrayImageContent.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/form-data");
                var imageFileName = imageFile.FileName + Guid.NewGuid().ToString();
                form.Add(byteArrayImageContent, imageFileName, Path.GetFileName(imageFileName));
                client.DefaultRequestHeaders.Authorization =
                    new AuthenticationHeaderValue("Bearer", LoginHelper.GetToken());
                var response = client.PostAsync("DogTrainings/UploadImage", form).Result;

                if (response.IsSuccessStatusCode)
                {
                    model.AdditionalPictureBlobUrl = @"https://kgtstorage.blob.core.windows.net/images/" + imageFileName;
                }
                else
                {
                    ViewBag.Message = response.StatusCode;
                    return(View("Error"));
                }
            }

            var lostPersonTrackPoints = new Trkseg {
                Trkpt = model.LostPersonTrackPoints
            };
            var dogTrackPoints = new Trkseg {
                Trkpt = model.DogTrackPoints
            };

            UpdateTracks(model.DogId, model.TrainingId, model.LostPersonTrackFilename, model.DogTrackFilename, lostPersonTrackPoints, dogTrackPoints);

            var dogTrainingModel = new DogTrainingModel
            {
                LostPerson               = model.LostPerson,
                Notes                    = model.Notes,
                Weather                  = model.Weather,
                GroundType               = model.GroundType,
                Comments                 = model.Comments,
                DogId                    = model.DogId,
                TrainingId               = model.TrainingId,
                LostPersonTrackLength    = model.LostPersonTrackLength,
                DelayTime                = model.DelayTime,
                AdditionalPictureBlobUrl = model.AdditionalPictureBlobUrl
            };

            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            client.DefaultRequestHeaders.Authorization =
                new AuthenticationHeaderValue("Bearer", LoginHelper.GetToken());
            System.Net.ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

            HttpRequestMessage message = new HttpRequestMessage(HttpMethod.Put, client.BaseAddress + $"dogtrainings/training?dogId={model.DogId}&trainingId={model.TrainingId}");

            var dogTrainingSerialized = JsonConvert.SerializeObject(dogTrainingModel);


            message.Content = new StringContent(dogTrainingSerialized, System.Text.Encoding.UTF8, "application/json");
            HttpResponseMessage responseMessage = client.SendAsync(message).Result;

            if (responseMessage.IsSuccessStatusCode)    //200 OK
            {
                message.Dispose();
                var responseData = responseMessage.Content.ReadAsStringAsync().Result;
                var definition   = new { DogId = "", TrainingId = "" };
                var ids          = JsonConvert.DeserializeAnonymousType(responseData, definition);
                return(RedirectToAction("Training", new { dogId = ids.DogId, trainingId = ids.TrainingId }));
            }
            else    // msg why not ok
            {
                ViewBag.Message = "code: " + responseMessage.StatusCode;
                return(View("Error"));
            }
        }