/// <summary> /// Сохранение карты и её слоев. /// </summary> /// <param name="request">Запрос на сохранение карты.</param> /// <returns>Идентификатор сохраненной карты.</returns> public async Task <Guid> SaveAsync(SaveMapRequest request) { await saveMapValidator.ValidateAsync(request).ThrowOnErrorsAsync(); await using var unitOfWork = await unitOfWorkFactory.CreateAsync(); var mapsRepository = unitOfWork.GetRepository <IMapsRepository>(); Map?existingMap = request.Id.HasValue ? await mapsRepository.GetAsync(request.Id.Value) : null; Guid mapId; if (existingMap == null || existingMap.UserId != request.UserId) { mapId = await AddMapAsync(request, unitOfWork); } else { mapId = await UpdateMapAsync(request, existingMap, unitOfWork); } await unitOfWork.CommitAsync(); logger.LogInformation("Map {MapId} saved", mapId); return(mapId); }
private async Task <Guid> AddMapAsync(SaveMapRequest request, IUnitOfWork unitOfWork) { var mapsRepository = unitOfWork.GetRepository <IMapsRepository>(); var layerRepository = unitOfWork.GetRepository <ILayersRepository>(); Map map = CreateMap(request); await mapsRepository.AddAsync(map); List <Layer> layers = request.Layers.ConvertAll(layer => CreateLayer(layer, map.Id)); await layerRepository.AddAsync(layers); logger.LogDebug("Map {MapId} added", map.Id); return(map.Id); }
private async Task <Guid> UpdateMapAsync(SaveMapRequest request, Map map, IUnitOfWork unitOfWork) { var layerRepository = unitOfWork.GetRepository <ILayersRepository>(); map.Name = request.Name ?? throw new ArgumentNullException(nameof(request.Name)); map.Description = request.Description; IEnumerable <Layer> newLayers = request.Layers .Where(layer => !layer.Id.HasValue) .Select(layer => CreateLayer(layer, map.Id)); HashSet <Guid> updateLayerIds = request.Layers .Where(layer => layer.Id.HasValue) .Select(layer => layer.Id !.Value) .ToHashSet(); await layerRepository.DeleteByMapIdAsync(map.Id, excludedLayerIds : updateLayerIds); await layerRepository.AddAsync(newLayers); List <Layer> updateLayers = await layerRepository.GetAsync(updateLayerIds); foreach (var layer in updateLayers) { var update = request.Layers.Single(l => l.Id.HasValue && l.Id.Value == layer.Id); layer.Name = update.Name ?? throw new ArgumentNullException(nameof(update.Name)); layer.Description = update.Description; layer.IsVisible = update.IsVisible; layer.Index = update.Index; layer.StyleOptions = update.StyleOptions ?? throw new ArgumentNullException(nameof(update.StyleOptions)); await layerRepository.UpdateAsync(layer); } logger.LogDebug("Map {MapId} updated", map.Id); return(map.Id); }
private static Map CreateMap(SaveMapRequest request) => new Map
public async Task <Guid> SaveMap([FromBody] SaveMapRequest request) { return(await service.SaveAsync(request)); }
/// <summary> Setter constructor. </summary> public SaveMap(SaveMapRequest request) { Request = request; Response = new SaveMapResponse(); }
/// <summary> Empty constructor. </summary> public SaveMap() { Request = new SaveMapRequest(); Response = new SaveMapResponse(); }