using eprintServer.Entities; using eprintServer.Enums; using eprintServer.Models; using eprintServer.Services; public abstract class BaseOAuthService { protected readonly UserService _userService; protected readonly TokenService _tokenService; protected BaseOAuthService(UserService userService, TokenService tokenService) { _userService = userService; _tokenService = tokenService; } protected async Task<(User? user, string? token, string? error)> SignInUserAsync(ExternalUserData externalUser, Provider provider) { var user = await _userService.FindByLoginIdentifierAsync(externalUser.Email); if (user == null) { var userCount = await _userService.GetUserCountAsync(); var username = _userService.GenerateUsername(externalUser.Name, userCount); var newUser = new User { Email = externalUser.Email, Name = externalUser.Name, Username = username, Role = RoleEnum.ROLE_USER, Provider = provider, Active = true, // Best practice: Set a random password for OAuth users so they can't login via password form Password = Guid.NewGuid().ToString() }; user = await _userService.SaveUserAsync(newUser); } else if (user.Provider != provider) { return (null, null, $"Email already registered via {user.Provider}."); } var token = _tokenService.CreateToken(user!); return (user, token, null); } }