using Microsoft.AspNetCore.Mvc; using System.Collections; namespace zero.Api.Modules.Countries; public class CountriesController : ZeroApiController { protected ICountryStore Store { get; set; } protected IPickerProvider Picker { get; set; } public CountriesController(ICountryStore store, IPickerProvider picker) { Store = store; Picker = picker; } [HttpGet("empty")] [ZeroAuthorize(CountryPermissions.Create)] public virtual async Task> Empty() { Country model = await Store.Empty(); if (model == null) { return NotFound(); } return Mapper.Map(model); } [HttpGet("pick")] [ZeroAuthorize(CountryPermissions.Read)] public virtual async Task> Pick([FromQuery] ListQuery query) { query.OrderQuery = q => q.OrderByDescending(x => x.IsPreferred).ThenBy(x => x.Name); Paged result = await Store.Load(query.Page, query.PageSize, q => q.Filter(query)); return Mapper.Map(result); } [HttpGet("pickpreview")] [ZeroAuthorize(CountryPermissions.Read)] public virtual async Task> Pick([FromQuery] string[] ids) { Dictionary model = await Store.Load(ids); return Mapper.Map(model); } [HttpGet("{id}")] [ZeroAuthorize(CountryPermissions.Read)] public virtual async Task> Get(string id, string changeVector = null) { Country model = await Store.Load(id, changeVector); if (model == null) { return NotFound(); } return Mapper.Map(model); } [HttpGet("")] [ZeroAuthorize(CountryPermissions.Read)] public virtual async Task> Get([FromQuery] ListQuery query) { query.OrderQuery = q => q.OrderByDescending(x => x.IsPreferred).ThenBy(x => x.Name); Paged result = await Store.Load(query.Page, query.PageSize, q => q.Filter(query)); return Mapper.Map(result); } [HttpPost("")] [ZeroAuthorize(CountryPermissions.Create)] public virtual async Task> Create(CountrySave saveModel) { Country model = Mapper.Map(saveModel); Result result = await Store.Create(model); if (result.IsSuccess) { Result mappedResult = Mapper.Map(result); return CreatedAtAction(nameof(CountriesController.Get), new { id = model.Id }, mappedResult); } if (Hints.ResponsePreference == ApiResponsePreference.Minimal) { return result.WithoutModel(); } return Mapper.Map(result); } [HttpPut("{id}")] [ZeroAuthorize(CountryPermissions.Update)] public virtual async Task> Update(string id, CountrySave updateModel) { if (id != updateModel.Id) { return BadRequest(BackofficeConstants.HttpErrors.NoIdMatchOnUpdate); } Country model = await Store.Load(id); if (model == null) { return BadRequest(BackofficeConstants.HttpErrors.IdNotFound); } Mapper.Map(updateModel, model); Result result = await Store.Update(model); if (Hints.ResponsePreference == ApiResponsePreference.Minimal) { return result.WithoutModel(); } // TODO add Preference-Applied header, see https://github.com/microsoft/api-guidelines/blob/vNext/Guidelines.md#76-standard-response-headers return Mapper.Map(result); } [HttpDelete("{id}")] [ZeroAuthorize(CountryPermissions.Delete)] public virtual async Task> Delete(string id) { Country model = await Store.Load(id); if (model == null) { return NotFound(); } Result result = await Store.Delete(model); return result.WithoutModel(); } }