using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using MQTTnet; using MQTTnet.Client; using MQTTnet.Server; using MyCore.Interfaces.Models; using MyCore.Service.Services; using MyCore.Services; using MyCore.Interfaces.DTO; namespace MyCore.Controllers { [Authorize] // TODO Add ROLES (Roles = "Admin") [Route("api/user")] [ApiController] public class UserController : ControllerBase { private UserDatabaseService _userService; private TokensService _tokenService; public UserController(UserDatabaseService userService, TokensService tokenService) { _userService = userService; _tokenService = tokenService; } // GET api/user /// /// Get a list of user /// [ProducesResponseType(typeof(List), 200)] [HttpGet] public ObjectResult Get() { try { List users = _userService.GetAll(); return new OkObjectResult(users); } catch (Exception ex) { return new ObjectResult(ex.Message) { StatusCode = 500 }; } } // GET api/user/5 /// /// Get a specific user /// /// id user [ProducesResponseType(typeof(UserInfoDetailDTO), 200)] [HttpGet("{id}")] public ObjectResult Get(string id) { try { // TODO ! Add object id verification UserInfo user = _userService.GetById(id); if (user == null) { return Conflict("This user was not found"); } return new OkObjectResult(user.ToDTO()); } catch (Exception ex) { return new ObjectResult(ex.Message) { StatusCode = 500 }; } } // POST: User/Create /// /// /// [AllowAnonymous] [ProducesResponseType(typeof(UserInfoDetailDTO), 200)] [HttpPost] public ObjectResult CreateUser([FromBody] UserInfo newUser) { try { if (newUser != null) { newUser.Token = _tokenService.GenerateToken(newUser.Email).ToString(); newUser.DateCreation = DateTime.Now; List users = _userService.GetAll(); if (users.Select(u => u.Email).Contains(newUser.Email)) { return Conflict("This Email is already used"); } UserInfo userCreated = _userService.Create(newUser); return new OkObjectResult(userCreated.ToDTO()); } else { // TODO return new ObjectResult("An error has occurred") { StatusCode = 500 }; } } catch (Exception ex) { return new ObjectResult(ex.Message) { StatusCode = 500 }; } } // PUT: User/Update /// /// /// [ProducesResponseType(typeof(UserInfoDetailDTO), 200)] [HttpPut] public ObjectResult UpdateUser([FromBody] UserInfo updatedUser) { try { // TODO ! Add object id verification if (updatedUser != null) { UserInfo user = _userService.GetById(updatedUser.Id); if (user != null) { return NotFound("The user was not found"); } UserInfo userModified = _userService.Update(updatedUser.Id, updatedUser); return new OkObjectResult(userModified.ToDTO()); } else { // TODO return new ObjectResult("An error has occurred") { StatusCode = 500 }; } } catch (Exception ex) { return new ObjectResult(ex.Message) { StatusCode = 500 }; } } // DELETE: User/Delete [HttpDelete("{id}")] public ObjectResult DeleteUser(string id) { try { // TODO ! Add object id verification if (id != null) { UserInfo user = _userService.GetById(id); if (user != null) { return NotFound("The user was not found"); } _userService.Remove(id); return Accepted("The user has been deleted"); } else { // TODO return new ObjectResult("An error has occurred") { StatusCode = 500 }; } } catch (Exception ex) { return new ObjectResult(ex.Message) { StatusCode = 500 }; } } } }