using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using MongoDB.Bson; using MyCore.Interfaces.DTO; using MyCore.Interfaces.Models; using MyCore.Services; using MyCore.Services.Devices; using MyCore.Services.MyControlPanel; namespace MyCore.Controllers { //[Authorize(Roles = "Admin")] [Authorize] [Route("api/provider")] [ApiController] public class ProviderController : ControllerBase { private DeviceDatabaseService _DeviceDatabaseService; private ProviderDatabaseService _ProviderDatabaseService; private RoomDatabaseService _RoomDatabaseService; private HomeDatabaseService _HomeDatabaseService; public ProviderController(DeviceDatabaseService DeviceDatabaseService, ProviderDatabaseService ProviderDatabaseService, RoomDatabaseService RoomDatabaseService, HomeDatabaseService HomeDatabaseService) { this._DeviceDatabaseService = DeviceDatabaseService; this._ProviderDatabaseService = ProviderDatabaseService; this._RoomDatabaseService = RoomDatabaseService; this._HomeDatabaseService = HomeDatabaseService; } /// /// Get all home providers /// /// Home Id [ProducesResponseType(typeof(List), 200)] [ProducesResponseType(typeof(string), 400)] [ProducesResponseType(typeof(string), 404)] [ProducesResponseType(typeof(string), 500)] [HttpGet("{homeId}")] public ObjectResult GetAll(string homeId) { try { if (homeId == null) throw new ArgumentNullException("Incorrect parameters"); if (!HomeService.IsExist(_HomeDatabaseService, homeId)) throw new KeyNotFoundException("Home not found"); List providers = ProviderService.GetAll(this._ProviderDatabaseService, homeId); List providersDTO = providers.Select(p => p.ToDTO()).ToList(); return new OkObjectResult(providersDTO); } catch (ArgumentNullException ex) { return new BadRequestObjectResult(ex.Message) {}; } catch (KeyNotFoundException ex) { return new NotFoundObjectResult(ex.Message) {}; } catch (Exception ex) { return new ObjectResult(ex.Message) { StatusCode = 500 }; } } /// /// Create a provider /// /// Provider to create [ProducesResponseType(typeof(ProviderDTO), 200)] [ProducesResponseType(typeof(string), 400)] [ProducesResponseType(typeof(string), 404)] [ProducesResponseType(typeof(string), 409)] [ProducesResponseType(typeof(string), 500)] [HttpPost] public ObjectResult Create([FromBody] ProviderDTO providerDTO) { try { if (providerDTO == null) throw new ArgumentNullException("Incorrect parameters"); if (providerDTO.HomeId == null) throw new ArgumentNullException("Home not found"); if (!HomeService.IsExist(_HomeDatabaseService, providerDTO.HomeId)) throw new KeyNotFoundException("Home not found"); if (_ProviderDatabaseService.AlreadyExistForHome(providerDTO.HomeId, providerDTO.Name)) throw new InvalidOperationException("Provider already exists"); ProviderDTO providerCreated = ProviderService.CreateOrUpdate(this._ProviderDatabaseService, providerDTO.HomeId, providerDTO, true); return new OkObjectResult(providerCreated); } catch (ArgumentNullException ex) { return new BadRequestObjectResult(ex.Message) {}; } catch (KeyNotFoundException ex) { return new NotFoundObjectResult(ex.Message) {}; } catch (InvalidOperationException ex) { return new ConflictObjectResult(ex.Message) {}; } catch (Exception ex) { return new ObjectResult(ex.Message) { StatusCode = 500 }; } } /// /// Update a provider /// /// Provider to update [ProducesResponseType(typeof(DeviceDetailDTO), 200)] [ProducesResponseType(typeof(string), 400)] [ProducesResponseType(typeof(string), 404)] [ProducesResponseType(typeof(string), 500)] [HttpPut] public ObjectResult Update([FromBody] ProviderDTO providerDTO) { try { if (providerDTO == null) throw new ArgumentNullException("Incorrect parameters"); if (providerDTO.HomeId == null) throw new ArgumentNullException("Home not found"); if (!HomeService.IsExist(_HomeDatabaseService, providerDTO.HomeId)) throw new KeyNotFoundException("Home not found"); if (!ProviderService.IsExist(this._ProviderDatabaseService, providerDTO.HomeId, providerDTO.Id)) throw new KeyNotFoundException("Provider does not exist"); ProviderDTO providerUpdated = ProviderService.CreateOrUpdate(this._ProviderDatabaseService, providerDTO.HomeId, providerDTO, false); return new OkObjectResult(providerUpdated); } catch (ArgumentNullException ex) { return new BadRequestObjectResult(ex.Message) {}; } catch (KeyNotFoundException ex) { return new NotFoundObjectResult(ex.Message) {}; } catch (Exception ex) { return new ObjectResult(ex.Message) { StatusCode = 500 }; } } /// /// Delete a provider /// /// Id of provider to delete [ProducesResponseType(typeof(string), 202)] [ProducesResponseType(typeof(string), 400)] [ProducesResponseType(typeof(string), 404)] [ProducesResponseType(typeof(string), 500)] [HttpDelete("{providerId}")] public ObjectResult Delete(string providerId) { try { // TODO DELETE ALL DEVICES linked if (providerId == null) throw new ArgumentNullException("Incorrect parameters"); if (!_ProviderDatabaseService.IsExist(providerId)) throw new KeyNotFoundException("Provider is null"); _ProviderDatabaseService.Remove(providerId); return new ObjectResult("The provider has been deleted") { StatusCode = 202 }; } catch (ArgumentNullException ex) { return new BadRequestObjectResult(ex.Message) {}; } catch (KeyNotFoundException ex) { return new NotFoundObjectResult(ex.Message) {}; } catch (Exception ex) { return new ObjectResult(ex.Message) { StatusCode = 500 }; } } } }