public async Task <ActionResult <Data.Models.Sale> > UpdateSale(int saleId, Data.Models.SaleForUpdate updatedSale)
        {
            try
            {
                Data.Entities.Sale dbSale = await _repository.GetSaleAsync(saleId);

                if (dbSale == null)
                {
                    return(NotFound());
                }

                _mapper.Map(updatedSale, dbSale);
                if (await _repository.SaveChangesAsync())
                {
                    Data.Models.Sale savedSale = _mapper.Map <Data.Models.Sale>(dbSale);
                    return(Ok(savedSale));
                }
                else
                {
                    return(BadRequest("Failed to update."));
                }
            }
            catch (Exception ex)
            {
                return(StatusCode(StatusCodes.Status500InternalServerError, "Database exception: " + ex.Message));
            }
        }
        public async Task <ActionResult <Data.Models.Sale> > PatchSale(int saleId, JsonPatchDocument <Data.Models.SaleForUpdate> patchDocument)
        {
            try
            {
                Data.Entities.Sale dbSale = await _repository.GetSaleAsync(saleId);

                if (dbSale == null)
                {
                    return(NotFound());
                }

                var updatedSale = _mapper.Map <Data.Models.SaleForUpdate>(dbSale);
                patchDocument.ApplyTo(updatedSale, ModelState);

                _mapper.Map(updatedSale, dbSale);

                if (await _repository.SaveChangesAsync())
                {
                    Data.Models.Sale savedSale = _mapper.Map <Data.Models.Sale>(await _repository.GetSaleAsync(saleId));
                    return(Ok(savedSale));
                }
                else
                {
                    return(StatusCode(StatusCodes.Status500InternalServerError, "Unable to save to database"));
                }
            }
            catch (Exception ex)
            {
                return(StatusCode(StatusCodes.Status500InternalServerError, "Unable to patch sale " + ex.Message));
            }
        }
        public async Task <ActionResult <Data.Models.Sale> > CreateNewSale(Data.Models.SaleForCreate newSale)
        {
            Data.Entities.Sale dbNewSale = null;
            try
            {
                dbNewSale = _mapper.Map <Data.Entities.Sale>(newSale);
            }
            catch (Exception ex)
            {
                return(BadRequest("Input is in invalid format: " + ex.Message));
            }

            if (dbNewSale == null)
            {
                return(BadRequest("Input is in invalid format"));
            }

            await _repository.AddAsync <Data.Entities.Sale>(dbNewSale);

            await _repository.SaveChangesAsync();

            Data.Models.Sale addedSale = _mapper.Map <Data.Models.Sale>(dbNewSale);

            var url = _linkgenerator.GetPathByAction(HttpContext, "GetSaleBySaleId", "Sales", addedSale);

            return(this.Created(url, addedSale));
        }
        public async Task <IActionResult> DeleteSale(int saleId)
        {
            try
            {
                Data.Entities.Sale dbSale = await _repository.GetSaleAsync(saleId);

                if (dbSale == null)
                {
                    return(NotFound());
                }

                _repository.Delete <Data.Entities.Sale>(dbSale);
                await _repository.SaveChangesAsync();

                return(NoContent());
            }
            catch (Exception ex)
            {
                return(StatusCode(StatusCodes.Status500InternalServerError, "Database exception: " + ex.Message));
            }
        }