using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Threading; using System.Threading.Tasks; using Refit; using Uno.Extensions; using Uno.Extensions.Authentication; namespace Marechai.App.Services.Authentication; public sealed class AuthService (ApiClient client, ITokenService tokenService, IStringLocalizer stringLocalizer) : IAuthenticationService { /// public async ValueTask LoginAsync(IDispatcher? dispatcher, IDictionary? credentials = null, string? provider = null, CancellationToken? cancellationToken = null) { if(credentials is null) return false; string? email = (credentials.FirstOrDefault(x => x.Key.Equals("Email", StringComparison.OrdinalIgnoreCase)).Value ?? credentials.FirstOrDefault(x => x.Key.Equals("email", StringComparison.OrdinalIgnoreCase)).Value ?? credentials.FirstOrDefault(x => x.Key.Equals("Username", StringComparison.OrdinalIgnoreCase)).Value) ?.Trim(); string? password = (credentials.FirstOrDefault(x => x.Key.Equals("Password", StringComparison.OrdinalIgnoreCase)).Value ?? credentials.FirstOrDefault(x => x.Key.Equals("password", StringComparison.OrdinalIgnoreCase)).Value) ?.Trim(); if(email is null) { credentials["error"] = stringLocalizer["Auth.EmailIsRequired"]; return false; } var loginModel = new AuthRequest { Email = email, Password = password }; AuthResponse? authResponse; try { tokenService.RemoveToken(); authResponse = await client.Auth.Login.PostAsync(loginModel); } catch(ValidationApiException ex) { switch(ex.StatusCode) { case HttpStatusCode.BadRequest: if(ex.Content is {} problemDetails) { if(problemDetails.Errors.Count > 0) { credentials["error"] = problemDetails.Errors.FirstOrDefault().Value?.FirstOrDefault() ?? stringLocalizer["Http.BadRequest"]; return false; } credentials["error"] = stringLocalizer["Http.BadRequest"]; return false; } break; } credentials["error"] = stringLocalizer["Http.BadRequest"]; return false; } catch(ApiException ex) { switch(ex.StatusCode) { case HttpStatusCode.Unauthorized: credentials["error"] = stringLocalizer["Auth.InvalidCredentials"]; return false; } credentials["error"] = stringLocalizer["Http.BadRequest"]; return false; } catch(Exception ex) { #pragma warning disable EPC12 credentials["error"] = ex.Message; #pragma warning restore EPC12 return false; } if(string.IsNullOrWhiteSpace(authResponse?.Token)) return false; tokenService.SetToken(authResponse.Token); return true; } /// public ValueTask RefreshAsync(CancellationToken? cancellationToken = null) => IsAuthenticated(cancellationToken); /// public async ValueTask LogoutAsync(IDispatcher? dispatcher, CancellationToken? cancellationToken = null) { tokenService.RemoveToken(); LoggedOut?.Invoke(this, EventArgs.Empty); return true; } /// public async ValueTask IsAuthenticated(CancellationToken? cancellationToken = null) { string token = tokenService.GetToken(); // TODO: Check token validity return !string.IsNullOrWhiteSpace(token); } /// public string[] Providers { get; } = []; /// public event EventHandler? LoggedOut; }