using MyCore.Interfaces.DTO; using MyCore.Service.Services; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using Microsoft.Net.Http.Headers; using NSwag.Annotations; using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Threading.Tasks; using Mqtt.Client.AspNetCore.Services; using MyCore.Services.MyControlPanel; using MyCore.Services; using MyCore.Services.Devices; namespace MyCore.Service.Controllers { /// /// Authentication controller /// [ApiController, Route("api/[controller]")] [Authorize] [OpenApiTag("Authentication", Description = "Authentication management")] public class AuthenticationController : ControllerBase { private readonly ILogger _logger; private readonly TokensService _tokensService; private readonly DeviceDatabaseService _DeviceDatabaseService; private readonly GroupDatabaseService _GroupDatabaseService; private readonly ProviderDatabaseService _ProviderDatabaseService; private readonly LocationDatabaseService _LocationDatabaseService; private readonly UserDatabaseService _UserDatabaseService; private readonly ActionService _ActionService; private readonly AutomationDatabaseService _AutomationDatabaseService; private readonly IMqttClientService _mqttClientService; //private readonly IMqttOnlineClientService _mqttOnlineClientService; public AuthenticationController(ILogger logger, TokensService tokensService, DeviceDatabaseService DeviceDatabaseService, GroupDatabaseService GroupDatabaseService, ProviderDatabaseService ProviderDatabaseService, LocationDatabaseService LocationDatabaseService, UserDatabaseService UserDatabaseService, ActionService ActionService, AutomationDatabaseService AutomationDatabaseService, MqttClientServiceProvider provider)//, MqttClientOnlineServiceProvider onlineProvider) { _logger = logger; _tokensService = tokensService; _DeviceDatabaseService = DeviceDatabaseService; _GroupDatabaseService = GroupDatabaseService; _ProviderDatabaseService = ProviderDatabaseService; _LocationDatabaseService = LocationDatabaseService; _UserDatabaseService = UserDatabaseService; _ActionService = ActionService; _AutomationDatabaseService = AutomationDatabaseService; _mqttClientService = provider.MqttClientService; //_mqttOnlineClientService = onlineProvider.MqttOnlineClientService; } private ActionResult Authenticate(string email, string password) { try { // For TEST email = "test@email.be"; password = "kljqsdkljqsd"; var token = _tokensService.Authenticate(email.ToLower(), password); // Set user token ? var user = _UserDatabaseService.GetByEmail(email.ToLower()); if (user != null) { System.Console.WriteLine($"Init userId for MqqClientService ! {user.Email}"); MqttClientService.SetServices(_DeviceDatabaseService, _GroupDatabaseService, _ProviderDatabaseService, _LocationDatabaseService, _ActionService, _AutomationDatabaseService, user.Id); } return Ok(token); } /*catch (UnauthorizedAccessException ex) { _logger?.LogError(ex, $"Authentication error for user '{email}': unauthorized access"); return Unauthorized(ex); }*/ catch (Exception ex) { _logger?.LogError(ex, $"Authenticate error for user '{email}'"); return Problem($"Authenticate error for user '{email}': {ex.Message}"); } } /// /// Authenticate with form parameters (used by Swagger test client) /// /// Swagger token request /// Token descriptor [AllowAnonymous] [HttpPost("Token")] [Consumes("application/x-www-form-urlencoded")] [SwaggerResponse(HttpStatusCode.OK, typeof(LoginDTO), Description = "Success")] [SwaggerResponse(HttpStatusCode.Unauthorized, typeof(string), Description = "Invalid credentials")] [SwaggerResponse(HttpStatusCode.InternalServerError, typeof(string), Description = "Error")] public ActionResult AuthenticateWithForm([FromForm] SwaggerTokenRequest tokenRequest) { return Authenticate(tokenRequest.username, tokenRequest.password); } /// /// Authenticate with Json parameters (used by most clients) /// /// Login DTO /// Token descriptor [AllowAnonymous] [HttpPost("Authenticate")] [Consumes("application/json")] [SwaggerResponse(HttpStatusCode.OK, typeof(LoginDTO), Description = "Success")] [SwaggerResponse(HttpStatusCode.Unauthorized, typeof(string), Description = "Invalid credentials")] [SwaggerResponse(HttpStatusCode.InternalServerError, typeof(string), Description = "Error")] public ActionResult AuthenticateWithJson([FromBody] LoginDTO login) { return Authenticate(login.Email.ToLower(), login.Password); } } }