using System.Threading.Tasks; using eprintServer.Entities; using eprintServer.Enums; using eprintServer.Models; using System.Text.Json; using System; namespace eprintServer.Services; public class FacebookOAuthService : BaseOAuthService { private readonly OAuthSettingsService _settingsService; private readonly IHttpClientFactory _httpClientFactory; public FacebookOAuthService(OAuthSettingsService settingsService, UserService userService, TokenService tokenService, IHttpClientFactory httpClientFactory) : base(userService, tokenService) { _settingsService = settingsService; _httpClientFactory = httpClientFactory; } public async Task<(User? user, string? token, string? error)> HandleLoginCallbackAsync(string code) { var settings = await _settingsService.GetOrCreateSettingsAsync(); var client = _httpClientFactory.CreateClient(); string redirectUri = "https://server.etbaaonline.com/api/v1/oauth/facebook/callback"; // 1. Exchange Code for Access Token // We use QueryHelpers or string interpolation to build the request var url = $"https://graph.facebook.com/v12.0/oauth/access_token?" + $"client_id={settings.FacebookAppId}" + $"&redirect_uri={Uri.EscapeDataString(redirectUri)}" + $"&client_secret={settings.FacebookAppSecret}" + $"&code={code}"; var tokenResponse = await client.GetAsync(url); if (!tokenResponse.IsSuccessStatusCode) { var errorContent = await tokenResponse.Content.ReadAsStringAsync(); return (null, null, $"Facebook auth failed: {errorContent}"); } var tokenData = await tokenResponse.Content.ReadFromJsonAsync(); var accessToken = tokenData.GetProperty("access_token").GetString(); // 2. Get User Profile using the token var userResponse = await client.GetAsync($"https://graph.facebook.com/me?fields=id,name,email&access_token={accessToken}"); var fbUser = await userResponse.Content.ReadFromJsonAsync(); var externalUser = new ExternalUserData { // Facebook might not return email if the user didn't provide it or used a phone number Email = fbUser.TryGetProperty("email", out var email) ? email.GetString()! : $"{fbUser.GetProperty("id").GetString()}@facebook.com", Name = fbUser.GetProperty("name").GetString()!, ProviderUserId = fbUser.GetProperty("id").GetString() }; return await SignInUserAsync(externalUser, Provider.FACEBOOK); } }