示例#1
0
        /// <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);
        }
示例#2
0
        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);
        }
示例#3
0
        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);
        }
示例#4
0
 private static Map CreateMap(SaveMapRequest request) => new Map
示例#5
0
 public async Task <Guid> SaveMap([FromBody] SaveMapRequest request)
 {
     return(await service.SaveAsync(request));
 }
示例#6
0
 /// <summary> Setter constructor. </summary>
 public SaveMap(SaveMapRequest request)
 {
     Request  = request;
     Response = new SaveMapResponse();
 }
示例#7
0
 /// <summary> Empty constructor. </summary>
 public SaveMap()
 {
     Request  = new SaveMapRequest();
     Response = new SaveMapResponse();
 }