using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Security.Authentication; using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using MongoDB.Bson; using Mqtt.Client.AspNetCore.Services; using MyCore.Interfaces.DTO; using MyCore.Interfaces.Models; using MyCore.Services; using MyCore.Services.Devices; using MyCore.Services.MyControlPanel; namespace MyCore.Service.Controllers { [Authorize] // TODO Add ROLES (Roles = "Admin") [Route("api/room")] [ApiController] public class RoomController : ControllerBase { private UserDatabaseService _UserDatabaseService; private RoomDatabaseService _RoomDatabaseService; private readonly IMqttClientService _mqttClientService; private readonly IMqttOnlineClientService _mqttOnlineClientService; public RoomController(UserDatabaseService userDatabaseService, RoomDatabaseService roomDatabaseService, MqttClientServiceProvider provider, MqttClientOnlineServiceProvider onlineProvider) { this._UserDatabaseService = userDatabaseService; this._RoomDatabaseService = roomDatabaseService; this._mqttClientService = provider.MqttClientService; this._mqttOnlineClientService = onlineProvider.MqttOnlineClientService; } /// /// Get all rooms for the specified user /// /// Id of user [ProducesResponseType(typeof(List), 200)] [HttpGet("{userId}")] public ObjectResult GetAll(string userId) { try { List Rooms = _RoomDatabaseService.GetAll(userId); List roomsSummaryDTO = Rooms.Select(d => d.ToSummaryDTO()).ToList(); return new OkObjectResult(roomsSummaryDTO); } catch (Exception ex) { return new ObjectResult(ex.Message) { StatusCode = 500 }; } } /// /// Get detail info of a specified room /// /// room id [ProducesResponseType(typeof(RoomDetailDTO), 200)] [HttpGet("detail/{roomId}")] public ObjectResult GetDetail(string roomId) { try { Room room = _RoomDatabaseService.GetById(roomId); return new OkObjectResult(room.ToDTO()); } catch (Exception ex) { return new ObjectResult(ex.Message) { StatusCode = 500 }; } } /// /// Create a room /// /// Room to create [ProducesResponseType(typeof(RoomDetailDTO), 200)] [HttpPost] public ObjectResult Create([FromBody] RoomCreateOrUpdateDetailDTO roomCreateOrUpdateDetail) { try { if (roomCreateOrUpdateDetail == null) throw new KeyNotFoundException("Room is null"); RoomDetailDTO roomCreated = RoomService.CreateOrUpdate(this._RoomDatabaseService, roomCreateOrUpdateDetail.UserId, roomCreateOrUpdateDetail, true); return new OkObjectResult(roomCreated); } catch (Exception ex) { return new ObjectResult(ex.Message) { StatusCode = 500 }; } } /// /// Update a room /// /// room to update [ProducesResponseType(typeof(RoomCreateOrUpdateDetailDTO), 200)] [HttpPut] public ObjectResult Update([FromBody] RoomCreateOrUpdateDetailDTO roomCreateOrUpdateDetail) { try { if (!_RoomDatabaseService.IsExist(roomCreateOrUpdateDetail.Id)) throw new KeyNotFoundException("Room does not exist"); RoomDetailDTO roomUpdated = RoomService.CreateOrUpdate(this._RoomDatabaseService, roomCreateOrUpdateDetail.UserId, roomCreateOrUpdateDetail, false); return new OkObjectResult(roomUpdated); } catch (KeyNotFoundException ex) { return new BadRequestObjectResult(ex.Message) { StatusCode = 404 }; } catch (Exception ex) { return new ObjectResult(ex.Message) { StatusCode = 500 }; } } /// /// Delete a room /// /// Id of room to delete [HttpDelete("{roomId}")] public ObjectResult Delete(string roomId) { try { if (roomId != null) { if (_RoomDatabaseService.IsExist(roomId)) { _RoomDatabaseService.Remove(roomId); } } return new OkObjectResult(201); } catch (Exception ex) { return new ObjectResult(ex.Message) { StatusCode = 500 }; } } /// /// Delete all room for a specified /// /// Id of user [HttpDelete("user/{userId}")] public ObjectResult DeleteAllForUser(string userId) { try { if (userId != null) { if (_UserDatabaseService.IsExist(userId)) { _RoomDatabaseService.RemoveForUser(userId); } } return new OkObjectResult(201); } catch (Exception ex) { return new ObjectResult(ex.Message) { StatusCode = 500 }; } } } }