示例#1
0
        public async Task <IHttpActionResult> UpdateProduct(long id, [FromBody] ProductForUpdateModel model)
        {
            if (model == null)
            {
                return(BadRequest(ExceptionMessageModelFactory.BadRequestBody()));
            }

            ValidateModel(new ProductForUpdateModelValidator(), model);
            if (!ModelState.IsValid)
            {
                return(BadRequest(ExceptionMessageModelFactory
                                  .BadRequestModelStateInvalid(ModelState.Values.SelectMany(x => x.Errors))));
            }

            var product = await _productRepository.GetProduct(id);

            if (product == null)
            {
                return(Content(HttpStatusCode.BadRequest, ExceptionMessageModelFactory.ResourceNotFound()));
            }

            _mapper.Map(model, product);
            await _productRepository.UpdateProduct(product);

            return(NoContent());
        }
示例#2
0
        public async Task <HttpResponseMessage> GetProducts([FromUri] ResourceParameters resourceParameters,
                                                            [FromUri] ProductFilterParameters filterParameters)
        {
            filterParameters   = filterParameters ?? new ProductFilterParameters();
            resourceParameters = resourceParameters ?? new ResourceParameters();
            if (
                !_propertyMappingService.ValidMappingExistsFor <ProductEntity, Data.Sqlite.Models.ProductModel>(
                    resourceParameters.OrderBy))
            {
                return(Request.CreateResponse(HttpStatusCode.BadRequest,
                                              ExceptionMessageModelFactory.BadRequstOrderByParameters()));
            }

            if (!_typeHelper.TypeHasProperties <ProductForGetModel>(resourceParameters.Fields))
            {
                return(Request.CreateResponse(HttpStatusCode.BadRequest,
                                              ExceptionMessageModelFactory.BadRequstFieldsParameters()));
            }

            var products = await _productRepository.GetProducts(resourceParameters, filterParameters);

            // UrlHelper requires the Request to get
            var pagedListHelper = new PagedListHelper(new UrlHelper(Request));

            var modelResults = _mapper.Map <IEnumerable <ProductForGetModel> >(products);
            var response     = Request.CreateResponse(HttpStatusCode.OK, modelResults.ShapeData(resourceParameters.Fields));

            response.Headers.Add("X-Pagination",
                                 pagedListHelper.AddPaginationMetadataToResponseHeader(products, resourceParameters, filterParameters,
                                                                                       "GetProducts"));
            return(response);
        }
示例#3
0
        public async Task <IActionResult> GetProducts(ResourceParameters resourceParameters,
                                                      ProductFilterParameters filterParameters)
        {
            if (!_propertyMappingService.ValidMappingExistsFor <ProductEntity, Data.Sqlite.Models.ProductModel>(resourceParameters.OrderBy))
            {
                return(BadRequest(ExceptionMessageModelFactory.BadRequstOrderByParameters()));
            }

            if (!_typeHelper.TypeHasProperties <ProductForGetModel>(resourceParameters.Fields))
            {
                return(BadRequest(ExceptionMessageModelFactory.BadRequstFieldsParameters()));
            }

            var products = await _productRepository.GetProducts(resourceParameters, filterParameters);

            AddHeaders();
            var modelResults = _mapper.Map <IEnumerable <ProductForGetModel> >(products);

            return(Ok(modelResults.ShapeData(resourceParameters.Fields)));

            // Local method to get create headers. Is this overkill? Probably.
            void AddHeaders() => Response.Headers.Add("X-Pagination",
                                                      _pagedListHelper.AddPaginationMetadataToResponseHeader(products, resourceParameters, filterParameters,
                                                                                                             "GetProducts"));
        }
示例#4
0
        public async Task <IActionResult> PartiallyUpdateProduct(long id,
                                                                 [FromBody] JsonPatchDocument <ProductForUpdateModel> patchDoc)
        {
            if (patchDoc == null)
            {
                return(BadRequest(ExceptionMessageModelFactory.BadRequestBody()));
            }

            var product = await _productRepository.GetProduct(id);

            if (product == null)
            {
                return(BadRequest(ExceptionMessageModelFactory.ResourceNotFound()));
            }

            var productToPatch = _mapper.Map <ProductForUpdateModel>(product);

            patchDoc.ApplyTo(productToPatch, ModelState);

            TryValidateModel(productToPatch);
            if (!ModelState.IsValid)
            {
                return(BadRequest(ExceptionMessageModelFactory
                                  .BadRequestModelStateInvalid(new SerializableError(ModelState))));
            }

            var updatedProduct = _mapper.Map <ProductEntity>(product);

            _mapper.Map(productToPatch, updatedProduct);
            await _productRepository.UpdateProduct(updatedProduct);

            return(NoContent());
        }
示例#5
0
        public async Task <IActionResult> UpdateProduct(long id, [FromBody] ProductForUpdateModel model)
        {
            if (model == null)
            {
                return(BadRequest(ExceptionMessageModelFactory.BadRequestBody()));
            }

            if (!ModelState.IsValid)
            {
                return(BadRequest(ExceptionMessageModelFactory
                                  .BadRequestModelStateInvalid(new SerializableError(ModelState))));
            }

            var product = await _productRepository.GetProduct(id);

            if (product == null)
            {
                return(BadRequest(ExceptionMessageModelFactory.ResourceNotFound()));
            }

            _mapper.Map(model, product);
            await _productRepository.UpdateProduct(product);

            return(NoContent());
        }
示例#6
0
        public async Task <IActionResult> CreateSellerForProduct(long productId,
                                                                 [FromBody] SellerForCreationModel model)
        {
            if (model == null)
            {
                return(BadRequest(ExceptionMessageModelFactory.BadRequestBody()));
            }

            if (!ModelState.IsValid)
            {
                return(BadRequest(ExceptionMessageModelFactory
                                  .BadRequestModelStateInvalid(new SerializableError(ModelState))));
            }

            if (!await _productRepository.DoesProductExist(productId))
            {
                return(NotFound(ExceptionMessageModelFactory.ParentToResourceNotFound()));
            }

            var seller = _mapper.Map <SellerEntity>(model);
            await _sellerRepository.CreateSeller(productId, seller);

            var modelResult = _mapper.Map <SellerForGetModel>(seller);

            return(CreatedAtRoute("GetSellerForProduct", new { productId, id = modelResult.Id }, modelResult));
        }
        public async Task <IHttpActionResult> CreateProductCollections([FromBody] IEnumerable <ProductForCreationModel> models)
        {
            if (models == null)
            {
                return(BadRequest(ExceptionMessageModelFactory.BadRequestBody()));
            }

            var validator = new ProductForCreationModelValidator();

            foreach (var model in models)
            {
                ValidateModel(validator, model);
            }
            //todo: error message does not sure exactly which model caused the error.
            if (!ModelState.IsValid)
            {
                return(BadRequest(ExceptionMessageModelFactory
                                  .BadRequestModelStateInvalid(ModelState.Values.SelectMany(x => x.Errors))));
            }

            var products = _mapper.Map <IEnumerable <ProductEntity> >(models);
            var tasks    = products.Select(product => _productRepository.CreateProduct(product));
            await Task.WhenAll(tasks);

            var modelResults = _mapper.Map <IEnumerable <ProductForGetModel> >(products).ToList();
            var ids          = string.Join(",", modelResults.Select(model => model.Id));

            return(CreatedAtRoute("GetProductCollection", new { ids }, modelResults));
        }
示例#8
0
        public async Task <IActionResult> PartiallyUpdateSeller(long productId, long id,
                                                                [FromBody] JsonPatchDocument <SellerForUpdateModel> patchDoc)
        {
            if (patchDoc == null)
            {
                return(BadRequest(ExceptionMessageModelFactory.BadRequestBody()));
            }

            if (!await _productRepository.DoesProductExist(productId))
            {
                return(NotFound(ExceptionMessageModelFactory.ParentToResourceNotFound()));
            }

            var sellerFromRepo = await _sellerRepository.GetSellerForProduct(productId, id);

            if (sellerFromRepo == null) // New Seller
            {
                var sellerForUpdate = new SellerForUpdateModel();
                patchDoc.ApplyTo(sellerForUpdate, ModelState);

                TryValidateModel(sellerForUpdate);
                if (!ModelState.IsValid)
                {
                    return(BadRequest(ExceptionMessageModelFactory
                                      .BadRequestModelStateInvalid(new SerializableError(ModelState))));
                }

                var sellerToAdd = _mapper.Map <SellerEntity>(sellerForUpdate);
                sellerToAdd.Id = id;
                await _sellerRepository.CreateSeller(productId, sellerToAdd);

                var modelResult = _mapper.Map <SellerForGetModel>(sellerToAdd);
                return(CreatedAtRoute("GetSellerForProduct", new { productId, id = modelResult.Id }, modelResult));
            }

            var sellerToPatch = _mapper.Map <SellerForUpdateModel>(sellerFromRepo);

            patchDoc.ApplyTo(sellerToPatch, ModelState);

            TryValidateModel(sellerToPatch);
            if (!ModelState.IsValid)
            {
                return(BadRequest(ExceptionMessageModelFactory
                                  .BadRequestModelStateInvalid(new SerializableError(ModelState))));
            }

            var updatedSeller = _mapper.Map <SellerEntity>(sellerFromRepo);

            _mapper.Map(sellerToPatch, updatedSeller);
            await _sellerRepository.UpdateSeller(updatedSeller);

            return(NoContent());
        }
示例#9
0
        public async Task <IActionResult> RemoveSeller(long productId, long id)
        {
            var seller = await _sellerRepository.GetSellerForProduct(productId, id);

            if (seller == null)
            {
                return(BadRequest(ExceptionMessageModelFactory.ResourceNotFound()));
            }
            await _sellerRepository.RemoveSeller(seller);

            return(NoContent());
        }
示例#10
0
        public async Task <IHttpActionResult> DeleteProduct(long id)
        {
            var product = await _productRepository.GetProduct(id);

            if (product == null)
            {
                return(BadRequest(ExceptionMessageModelFactory.ResourceNotFound()));
            }
            await _productRepository.RemoveProduct(product);

            return(NoContent());
        }
示例#11
0
        public async Task <IActionResult> GetSellersForProduct(long productId)
        {
            if (!await _productRepository.DoesProductExist(productId))
            {
                return(NotFound(ExceptionMessageModelFactory.ParentToResourceNotFound()));
            }

            var sellers = await _sellerRepository.GetSellersForProduct(productId);

            var modelResults = _mapper.Map <IEnumerable <SellerForGetModel> >(sellers);

            return(Ok(modelResults));
        }
示例#12
0
        public async Task <IActionResult> AddScene([FromBody] SceneToAddModel model)
        {
            if (model == null)
            {
                return(BadRequest(ExceptionMessageModelFactory.BadRequestBody()));
            }

            if (!ModelState.IsValid)
            {
                return(BadRequest(ExceptionMessageModelFactory
                                  .BadRequestModelStateInvalid(new SerializableError(ModelState))));
            }

            var result = await _mediator.Send(model);

            return(Ok(result));
        }
示例#13
0
        public async Task <IActionResult> GetSellerForProduct(long productId, long id)
        {
            if (!await _productRepository.DoesProductExist(productId))
            {
                return(NotFound(ExceptionMessageModelFactory.ParentToResourceNotFound()));
            }

            var seller = await _sellerRepository.GetSellerForProduct(productId, id);

            if (seller == null)
            {
                return(NotFound(ExceptionMessageModelFactory.ResourceNotFound()));
            }

            var result = _mapper.Map <SellerForGetModel>(seller);

            return(Ok(result));
        }
示例#14
0
        public async Task <IHttpActionResult> GetProduct(long id, [FromUri] string fields = null)
        {
            if (!_typeHelper.TypeHasProperties <ProductForGetModel>(fields))
            {
                return(BadRequest(ExceptionMessageModelFactory.BadRequstFieldsParameters()));
            }

            var product = await _productRepository.GetProduct(id);

            if (product == null)
            {
                return(NotFound(ExceptionMessageModelFactory.ResourceNotFound()));
            }

            var model = _mapper.Map <ProductForGetModel>(product);

            return(Ok(model.ShapeData(fields)));
        }
示例#15
0
        public async Task <IHttpActionResult> UpsertSeller(long productId, long id,
                                                           [FromBody] SellerForUpdateModel model)
        {
            if (model == null)
            {
                return(BadRequest(ExceptionMessageModelFactory.BadRequestBody()));
            }

            ValidateModel(new SellerForUpdateModelValidator(), model);
            if (!ModelState.IsValid)
            {
                return(BadRequest(ExceptionMessageModelFactory
                                  .BadRequestModelStateInvalid(ModelState.Values.SelectMany(x => x.Errors))));
            }

            if (!await _productRepository.DoesProductExist(productId))
            {
                return(NotFound(ExceptionMessageModelFactory.ParentToResourceNotFound()));
            }

            var sellerFromRepo = await _sellerRepository.GetSellerForProduct(productId, id);

            if (sellerFromRepo == null) // New Seller
            {
                if (await _sellerRepository.DoesSellerExist(id))
                {
                    return
                        (BadRequest(
                             ExceptionMessageModelFactory.BadRequestParentMismatch("Seller id exist under another product")));
                }

                var sellerToAdd = _mapper.Map <SellerEntity>(model);
                sellerToAdd.Id = id;
                await _sellerRepository.CreateSeller(productId, sellerToAdd);

                var modelResult = _mapper.Map <SellerForGetModel>(sellerToAdd);
                return(CreatedAtRoute("GetSellerForProduct", new { productId, id = modelResult.Id }, modelResult));
            }

            _mapper.Map(model, sellerFromRepo);
            await _sellerRepository.UpdateSeller(sellerFromRepo);

            return(NoContent());
        }
示例#16
0
        public async Task <IActionResult> CreateProduct([FromBody] ProductForCreationModel model)
        {
            if (model == null)
            {
                return(BadRequest(ExceptionMessageModelFactory.BadRequestBody()));
            }

            if (!ModelState.IsValid)
            {
                return(BadRequest(ExceptionMessageModelFactory
                                  .BadRequestModelStateInvalid(new SerializableError(ModelState))));
            }

            var product = _mapper.Map <ProductEntity>(model);
            await _productRepository.CreateProduct(product);

            var modelResult = _mapper.Map <ProductForGetModel>(product);

            return(CreatedAtRoute("GetProduct", new { id = product.Id }, modelResult));
        }
示例#17
0
        public async Task <IHttpActionResult> PartiallyUpdateProduct(long id,
                                                                     [FromBody] JsonPatchDocument <ProductForUpdateModel> patchDoc)
        {
            if (patchDoc == null)
            {
                return(BadRequest(ExceptionMessageModelFactory.BadRequestBody()));
            }

            var product = await _productRepository.GetProduct(id);

            if (product == null)
            {
                return(BadRequest(ExceptionMessageModelFactory.ResourceNotFound()));
            }

            var productToPatch = _mapper.Map <ProductForUpdateModel>(product);

            try
            {
                patchDoc.ApplyTo(productToPatch);
            }
            catch (Exception ex)
            {
                ModelState.AddModelError("ApplyPatch", ex.Message);
            }

            ValidateModel(new ProductForUpdateModelValidator(), productToPatch);
            if (!ModelState.IsValid)
            {
                return(BadRequest(ExceptionMessageModelFactory
                                  .BadRequestModelStateInvalid(ModelState.Values.SelectMany(x => x.Errors))));
            }

            var updatedProduct = _mapper.Map <ProductEntity>(product);

            _mapper.Map(productToPatch, updatedProduct);
            await _productRepository.UpdateProduct(updatedProduct);

            return(NoContent());
        }
        public async Task <IActionResult> GetProductCollection(
            [ModelBinder(BinderType = typeof(ArrayModelBinder))] IEnumerable <long> ids)
        {
            if (ids == null)
            {
                return(BadRequest(ExceptionMessageModelFactory.BadRequestBody()));
            }

            ids = ids.ToList();
            var tasks    = ids.Select(id => _productRepository.GetProduct(id));
            var products = (await Task.WhenAll(tasks)).Where(x => x != null).ToList();

            if (ids.Count() != products.Count)
            {
                return(NotFound(ExceptionMessageModelFactory.ResourceNotFound(
                                    $"Expected to retrieve {ids.Count()} but only able to retrieve {products.Count}")));
            }

            var models = _mapper.Map <IEnumerable <ProductForGetModel> >(products);

            return(Ok(models));
        }
        public async Task <IActionResult> CreateProductCollections([FromBody] IEnumerable <ProductForCreationModel> models)
        {
            if (models == null)
            {
                return(BadRequest(ExceptionMessageModelFactory.BadRequestBody()));
            }

            if (!ModelState.IsValid)
            {
                return(BadRequest(ExceptionMessageModelFactory
                                  .BadRequestModelStateInvalid(new SerializableError(ModelState))));
            }

            var products = _mapper.Map <IEnumerable <ProductEntity> >(models);
            var tasks    = products.Select(product => _productRepository.CreateProduct(product));
            await Task.WhenAll(tasks);

            var modelResults = _mapper.Map <IEnumerable <ProductForGetModel> >(products);
            var ids          = string.Join(",", modelResults.Select(model => model.Id));

            return(CreatedAtRoute("GetProductCollection", new { ids }, modelResults));
        }
示例#20
0
        public async Task <IHttpActionResult> CreateProduct([FromBody] ProductForCreationModel model)
        {
            if (model == null)
            {
                return(BadRequest(ExceptionMessageModelFactory.BadRequestBody()));
            }


            ValidateModel(new ProductForCreationModelValidator(), model);
            if (!ModelState.IsValid)
            {
                return(BadRequest(ExceptionMessageModelFactory
                                  .BadRequestModelStateInvalid(ModelState.Values.SelectMany(x => x.Errors))));
            }

            var product = _mapper.Map <ProductEntity>(model);
            await _productRepository.CreateProduct(product);

            var modelResult = _mapper.Map <ProductForGetModel>(product);

            return(CreatedAtRoute("GetProduct", new { id = product.Id }, modelResult));
        }