private async Task <int> GetOrCreateStartPointAsync( string hikeStartPointName, int hikeStartPointAltitude, double hikeStartPointLatitude, double hikeStartPointLongitude) { var startPoint = this.hikeStartPointRepository .AllAsNoTracking() .FirstOrDefault(x => x.Name == hikeStartPointName); if (startPoint == null) { startPoint = new HikeStartPoint() { Name = hikeStartPointName, Altitude = hikeStartPointAltitude, Latitude = hikeStartPointLatitude, Longitute = hikeStartPointLongitude, }; await this.hikeStartPointRepository.AddAsync(startPoint); await this.hikeStartPointRepository.SaveChangesAsync(); } return(startPoint.Id); }
public async Task CreateAsync(CreateHikeInputModel input, string userId, string imagePath) { var startPoint = this.hikeStartPointsRepository.All() .FirstOrDefault(x => x.Name == input.HikeStartPoint.Name); if (startPoint == null) { startPoint = new HikeStartPoint { Name = input.HikeStartPoint.Name, Altitude = input.HikeStartPoint.Altitude, Latitude = input.HikeStartPoint.Longitute, Longitute = input.HikeStartPoint.Longitute, }; await this.hikeStartPointsRepository.AddAsync(startPoint); await this.hikeStartPointsRepository.SaveChangesAsync(); } var endPoint = this.hikeEndPointsRepository.All() .FirstOrDefault(x => x.Name == input.HikeEndPoint.Name); if (endPoint == null) { endPoint = new HikeEndPoint { Name = input.HikeEndPoint.Name, Altitude = input.HikeEndPoint.Altitude, Latitude = input.HikeEndPoint.Latitude, Longitute = input.HikeEndPoint.Longitute, }; await this.hikeEndPointsRepository.AddAsync(endPoint); await this.hikeEndPointsRepository.SaveChangesAsync(); } var hike = new Hike { Name = input.Name, Length = input.Length, Duration = TimeSpan.FromMinutes(input.Duration), Description = input.Description, Marking = input.Marking, Difficulty = input.Difficulty, CategoryId = input.CategoryId, RegionId = input.RegionId, MountainId = input.RegionId, HikeStartPointId = startPoint.Id, HikeEndPointId = endPoint.Id, Denivelation = startPoint.Altitude - endPoint.Altitude, UserId = userId, }; Directory.CreateDirectory($"{imagePath}/hikes/"); foreach (var image in input.HikeImages) { var extension = Path.GetExtension(image.FileName).TrimStart('.'); if (!this.allowedExtensions.Any(x => extension.EndsWith(x))) { throw new Exception($"Invalid image extension {extension}"); } var dbImage = new HikeImage { UserId = userId, Extension = extension, }; var physicalPath = $"{imagePath}/hikes/{dbImage.Id}.{extension}"; string localImgUrl = physicalPath.Split("wwwroot")[1]; dbImage.RemoteImageUrl = localImgUrl; hike.HikeImages.Add(dbImage); using Stream fileStream = new FileStream(physicalPath, FileMode.Create); await image.CopyToAsync(fileStream); } await this.hikesRepository.AddAsync(hike); await this.hikesRepository.SaveChangesAsync(); }