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 LocationDatabaseService _LocationDatabaseService; private UserDatabaseService _UserDatabaseService; public ProviderController(DeviceDatabaseService DeviceDatabaseService, ProviderDatabaseService ProviderDatabaseService, LocationDatabaseService LocationDatabaseService, UserDatabaseService UserDatabaseService) { this._DeviceDatabaseService = DeviceDatabaseService; this._ProviderDatabaseService = ProviderDatabaseService; this._LocationDatabaseService = LocationDatabaseService; this._UserDatabaseService = UserDatabaseService; } /// /// Get all user providers /// /// Id of user [ProducesResponseType(typeof(List), 200)] [ProducesResponseType(typeof(string), 400)] [ProducesResponseType(typeof(string), 404)] [ProducesResponseType(typeof(string), 500)] [HttpGet("{userId}")] public ObjectResult GetAll(string userId) { try { if (userId == null) throw new ArgumentNullException("Incorrect parameters"); if (!UserService.IsExist(_UserDatabaseService, userId)) throw new KeyNotFoundException("User not found"); List providers = ProviderService.GetAll(this._ProviderDatabaseService, userId); 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.UserId == null) throw new ArgumentNullException("User not found"); if (!UserService.IsExist(_UserDatabaseService, providerDTO.UserId)) throw new KeyNotFoundException("User not found"); if (_ProviderDatabaseService.AlreadyExistForUser(providerDTO.UserId, providerDTO.Name)) throw new InvalidOperationException("Provider already exists"); ProviderDTO providerCreated = ProviderService.CreateOrUpdate(this._ProviderDatabaseService, providerDTO.UserId, 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.UserId == null) throw new ArgumentNullException("User not found"); if (!UserService.IsExist(_UserDatabaseService, providerDTO.UserId)) throw new KeyNotFoundException("User not found"); if (!ProviderService.IsExist(this._ProviderDatabaseService, providerDTO.UserId, providerDTO.Id)) throw new KeyNotFoundException("Provider does not exist"); ProviderDTO providerUpdated = ProviderService.CreateOrUpdate(this._ProviderDatabaseService, providerDTO.UserId, 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 }; } } } }