src/Modules/SimplCommerce.Module.Tax/Areas/Tax/Controllers/TaxRateApiController.cs (165 lines of code) (raw):
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using SimplCommerce.Infrastructure.Data;
using SimplCommerce.Infrastructure.Helpers;
using SimplCommerce.Module.Core.Models;
using SimplCommerce.Module.Tax.Areas.Tax.ViewModels;
using SimplCommerce.Module.Tax.Models;
namespace SimplCommerce.Module.Tax.Areas.Tax.Controllers
{
[Area("Tax")]
[Authorize(Roles = "admin")]
[Route("api/tax-rates")]
public class TaxRateApiController : Controller
{
private readonly IRepository<TaxRate> _taxRateRepository;
private readonly IRepository<StateOrProvince> _stateOrProvinceRepository;
public TaxRateApiController(IRepository<TaxRate> taxRateRepository, IRepository<StateOrProvince> stateOrProvinceRepository)
{
_taxRateRepository = taxRateRepository;
_stateOrProvinceRepository = stateOrProvinceRepository;
}
[HttpGet]
public async Task<IActionResult> Get()
{
var taxRates = await _taxRateRepository
.Query()
.Select(x => new
{
x.Id,
TagClassName = x.TaxClass.Name,
CountryName = x.Country.Name,
StateOrProvinceName = x.StateOrProvince.Name,
x.ZipCode,
x.Rate
})
.ToListAsync();
return Json(taxRates);
}
[HttpGet("export")]
public async Task<IActionResult> Export()
{
var taxRates = await _taxRateRepository
.Query()
.Select(x => new TaxRateImport
{
TaxClassId = x.TaxClassId,
CountryId = x.CountryId,
StateOrProvinceName = x.StateOrProvince.Name,
ZipCode = x.ZipCode,
Rate = x.Rate
})
.ToListAsync();
var csvString = CsvConverter.ExportCsv(taxRates);
var csvBytes = Encoding.UTF8.GetBytes(csvString);
// MS Excel need the BOM to display UTF8 Correctly
var csvBytesWithUTF8BOM = Encoding.UTF8.GetPreamble().Concat(csvBytes).ToArray();
return File(csvBytesWithUTF8BOM, "text/csv", "tax-rates.csv");
}
[HttpGet("{id}")]
public async Task<IActionResult> Get(long id)
{
var taxRate = await _taxRateRepository.Query().FirstOrDefaultAsync(x => x.Id == id);
if(taxRate == null)
{
return NotFound();
}
var model = new TaxRateForm
{
Id = taxRate.Id,
TaxClassId = taxRate.TaxClassId,
CountryId = taxRate.CountryId,
StateOrProvinceId = taxRate.StateOrProvinceId,
ZipCode = taxRate.ZipCode,
Rate = taxRate.Rate
};
return Json(model);
}
[HttpPost]
public async Task<IActionResult> Post([FromBody] TaxRateForm model)
{
if (ModelState.IsValid)
{
var tagRate = new TaxRate
{
TaxClassId = model.TaxClassId,
CountryId = model.CountryId,
StateOrProvinceId = model.StateOrProvinceId,
ZipCode = model.ZipCode,
Rate = model.Rate
};
_taxRateRepository.Add(tagRate);
await _taxRateRepository.SaveChangesAsync();
return CreatedAtAction(nameof(Get), new { id = tagRate.Id }, null);
}
return BadRequest(ModelState);
}
[HttpPut("{id}")]
public async Task<IActionResult> Put(long id, [FromBody] TaxRateForm model)
{
if (ModelState.IsValid)
{
var taxRate = await _taxRateRepository.Query().FirstOrDefaultAsync(x => x.Id == id);
if (taxRate == null)
{
return NotFound();
}
taxRate.TaxClassId = model.TaxClassId;
taxRate.CountryId = model.CountryId;
taxRate.StateOrProvinceId = model.StateOrProvinceId;
taxRate.ZipCode = model.ZipCode;
taxRate.Rate = model.Rate;
await _taxRateRepository.SaveChangesAsync();
return Accepted();
}
return BadRequest(ModelState);
}
[HttpDelete("{id}")]
public async Task<IActionResult> Delete(long id)
{
var taxRate = await _taxRateRepository.Query().FirstOrDefaultAsync(x => x.Id == id);
if (taxRate == null)
{
return NotFound();
}
try
{
_taxRateRepository.Remove(taxRate);
await _taxRateRepository.SaveChangesAsync();
}
catch (DbUpdateException)
{
return BadRequest(new { Error = $"The tax rate {taxRate.Id} can't not be deleted because it is referenced by other tables" });
}
return NoContent();
}
[HttpPost("import")]
public async Task<IActionResult> Import(TaxRateImportForm model)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
var inputStream = model.CsvFile.OpenReadStream();
var records = CsvConverter.ReadCsvStream<TaxRateImport>(model.CsvFile.OpenReadStream(), model.IncludeHeader, model.CsvDelimiter);
foreach(var record in records)
{
var stateOrProvince = _stateOrProvinceRepository.Query().FirstOrDefault(x => x.Name == record.StateOrProvinceName);
var taxRate = new TaxRate
{
TaxClassId = record.TaxClassId,
CountryId = record.CountryId,
StateOrProvince = stateOrProvince,
ZipCode = record.ZipCode,
Rate = record.Rate
};
_taxRateRepository.Add(taxRate);
}
await _taxRateRepository.SaveChangesAsync();
return NoContent();
}
}
}