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 a list of user
///
[ProducesResponseType(typeof(List), 200)]
[ProducesResponseType(typeof(string), 500)]
[HttpGet]
public ObjectResult Get()
{
try
{
List users = _userService.GetAll();
return new OkObjectResult(users);
}
catch (Exception ex)
{
return new ObjectResult(ex.Message) { StatusCode = 500 };
}
}
///
/// Get a specific user
///
/// id user
[ProducesResponseType(typeof(UserInfoDetailDTO), 200)]
[ProducesResponseType(typeof(string), 404)]
[ProducesResponseType(typeof(string), 500)]
[HttpGet("{id}")]
public ObjectResult Get(string id)
{
try
{
UserInfo user = _userService.GetById(id);
if (user == null)
throw new KeyNotFoundException("This user was not found");
return new OkObjectResult(user.ToDTO());
}
catch (KeyNotFoundException ex)
{
return new NotFoundObjectResult(ex.Message) {};
}
catch (Exception ex)
{
return new ObjectResult(ex.Message) { StatusCode = 500 };
}
}
///
/// Get a specific user by email
///
/// user email
[ProducesResponseType(typeof(UserInfoDetailDTO), 200)]
[ProducesResponseType(typeof(string), 404)]
[ProducesResponseType(typeof(string), 500)]
[HttpGet("email/{email}")]
public ObjectResult GetByEmail(string email)
{
try
{
UserInfo user = _userService.GetByEmail(email);
if (user == null)
throw new KeyNotFoundException("This user was not found");
return new OkObjectResult(user.ToDTO());
}
catch (KeyNotFoundException ex)
{
return new NotFoundObjectResult(ex.Message) { };
}
catch (Exception ex)
{
return new ObjectResult(ex.Message) { StatusCode = 500 };
}
}
///
/// Create an user
///
/// New user info
[AllowAnonymous]
[ProducesResponseType(typeof(UserInfoDetailDTO), 200)]
[ProducesResponseType(typeof(string), 400)]
[ProducesResponseType(typeof(string), 409)]
[ProducesResponseType(typeof(string), 500)]
[HttpPost]
public ObjectResult CreateUser([FromBody] UserInfo newUser)
{
try
{
// TODO Add check for password
if (newUser == null)
throw new ArgumentNullException("User param is null");
if (newUser.Password == null || newUser.Email == null)
throw new ArgumentNullException("You need to specified email and password at least");
newUser.Token = _tokenService.GenerateToken(newUser.Email).ToString();
newUser.DateCreation = DateTime.Now;
newUser.HomeIds = new List();
List users = _userService.GetAll();
if (users.Select(u => u.Email).Contains(newUser.Email))
throw new InvalidOperationException("This Email is already used");
UserInfo userCreated = _userService.Create(newUser);
return new OkObjectResult(userCreated.ToDTO());
}
catch (ArgumentNullException ex)
{
return new BadRequestObjectResult(ex.Message) {};
}
catch (InvalidOperationException ex)
{
return new ConflictObjectResult(ex.Message) {};
}
catch (Exception ex)
{
return new ObjectResult(ex.Message) { StatusCode = 500 };
}
}
///
/// Update an user
///
/// User to update
[ProducesResponseType(typeof(UserInfoDetailDTO), 200)]
[ProducesResponseType(typeof(string), 400)]
[ProducesResponseType(typeof(string), 404)]
[ProducesResponseType(typeof(string), 500)]
[HttpPut]
public ObjectResult UpdateUser([FromBody] UserInfo updatedUser)
{
try
{
if (updatedUser == null)
throw new ArgumentNullException("User param is null");
UserInfo user = _userService.GetById(updatedUser.Id);
if (user == null)
throw new KeyNotFoundException("User does not exist");
UserInfo userModified = _userService.Update(updatedUser);
return new OkObjectResult(userModified.ToDTO());
}
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 an user
///
/// Id of user to delete
[ProducesResponseType(typeof(string), 202)]
[ProducesResponseType(typeof(string), 400)]
[ProducesResponseType(typeof(string), 404)]
[ProducesResponseType(typeof(string), 500)]
[HttpDelete("{id}")]
public ObjectResult DeleteUser(string id)
{
try
{
if (id == null)
throw new ArgumentNullException("User param is null");
UserInfo user = _userService.GetById(id);
if (user == null)
throw new KeyNotFoundException("User does not exist");
_userService.Remove(id);
return new ObjectResult("The user 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 };
}
}
}
}