using AddressBookApi.DataStore; using AddressBookApi.Models.Dto; using Microsoft.AspNetCore.JsonPatch; using Microsoft.AspNetCore.Mvc; namespace AddressBookApi.Controllers; [ApiController] [Route("api/AddressBookApi")] public class AddressBookApiController : ControllerBase { private readonly ILogger _addressBookLog; public AddressBookApiController(ILogger logger) { _addressBookLog = logger; } [HttpGet] public ActionResult> GetAddresses() { _addressBookLog.LogInformation("Retrieving all addresses..."); return Ok(AddressStore.addressList); } [HttpGet("{id:int}", Name = "GetAddressById")] [ProducesResponseType(200)] [ProducesResponseType(400)] [ProducesResponseType(404)] public ActionResult GetAddress(int id) { if (id == 0) { _addressBookLog.LogWarning("Address entry id 0 is not valid."); return BadRequest(); } var address = AddressStore.addressList.FirstOrDefault((u => u.Id == id)); if (address == null) { _addressBookLog.LogWarning("Address entry id {id} not found", id); return NotFound(); } return Ok(address); } [HttpGet("{name}", Name = "GetAddressByName")] [ProducesResponseType(200)] [ProducesResponseType(400)] [ProducesResponseType(404)] public ActionResult GetAddress(string name) { if (name == "") { return BadRequest(); } var address = AddressStore.addressList.FirstOrDefault(u => u.Name == name); if (address == null) { return NotFound(); } return Ok(address); } [HttpPost] [ProducesResponseType(201)] [ProducesResponseType(400)] public ActionResult AddAddress([FromBody] AddressDto newAddressDto) { if (AddressStore.addressList.FirstOrDefault(u=>String.Equals(u.Name, newAddressDto.Name, StringComparison.CurrentCultureIgnoreCase)) != null) { ModelState.AddModelError("Address Error 1", "Addressee Already Exists!"); return BadRequest(ModelState); } if (newAddressDto.Id > 0) { return StatusCode(StatusCodes.Status400BadRequest); } if (newAddressDto.Name == "") { return StatusCode(StatusCodes.Status400BadRequest); } if (newAddressDto.Street == "") { return StatusCode(StatusCodes.Status400BadRequest); } if (newAddressDto.City == "") { return StatusCode(StatusCodes.Status400BadRequest); } if (newAddressDto.PostCode == "") { return StatusCode(StatusCodes.Status400BadRequest); } newAddressDto.Id = AddressStore.addressList.MaxBy(u => u.Id)!.Id + 1; AddressStore.addressList.Add(newAddressDto); return CreatedAtRoute("GetAddressById", new { id = newAddressDto.Id }, newAddressDto); } [HttpDelete("{id:int}", Name = "DeleteAddress")] [ProducesResponseType(204)] [ProducesResponseType(400)] [ProducesResponseType(404)] public IActionResult DeleteAddress(int id) { if (id == 0) { return BadRequest(); } var address = AddressStore.addressList.FirstOrDefault(u => u.Id == id); if (address == null) { return NotFound(); } AddressStore.addressList.Remove(address); return NoContent(); } [HttpPut("{id:int}", Name = "UpdateAddress")] [ProducesResponseType(204)] [ProducesResponseType(400)] [ProducesResponseType(404)] public IActionResult UpdateAddress(int id, [FromBody] AddressDto addressDto) { if (id != addressDto.Id | id == 0) { return BadRequest(); } var address = AddressStore.addressList.FirstOrDefault(u => u.Id == id); if (address == null) { return NotFound(); } address.Name = addressDto.Name; address.Street = addressDto.Street; address.City = addressDto.City; address.PostCode = addressDto.PostCode; return NoContent(); } [HttpPatch("{id:int}", Name = "UpdateAddressItem")] [ProducesResponseType(204)] [ProducesResponseType(400)] [ProducesResponseType(404)] public IActionResult UpdateAddressItem(int id, JsonPatchDocument addressPatch) { if (id == 0) // Can't compare the ids yet, because its embedded in the Patch Doc { return BadRequest(); } var address = AddressStore.addressList.FirstOrDefault(u => u.Id == id); if (address == null) { return NotFound(); } if (address.Id != id) { return BadRequest(); } addressPatch.ApplyTo(address, ModelState); if (!ModelState.IsValid) { return BadRequest(ModelState); } return NoContent(); } }