using RelayCore.Endpoints; using RelayCore.Models; using SurrealDb.Net; using SurrealDb.Net.Models; namespace RelayCore.Services; public class APIAuthService(SurrealDbClient _db) { public async Task UserSigninAsync(AuthSignin request) { var hasher = new PasswordHasher(); var users = await _db.Select("auth_users"); var user = users.FirstOrDefault(x => (x.Username == request.UserName || x.Email == request.UserName) && hasher.VerifyPassword(request.Password, x.Password)); var tokens = await _db.Select("auth_sessions"); var token = tokens.Where(x => x.UserId == user.Id && !x.Revoked).OrderByDescending(x => x.ExpiresAt).FirstOrDefault(); if (token.ExpiresAt > DateTime.UtcNow) return token.TokenHash; //TODO: Generate TOKEN var newToken = hasher.HashPassword($"{user.Email}{user.Username}{user.Password}"); //TODO: Store TOKEN and Username for verification var sessionId = await _db.Create(new Sessions { UserId = user.Id, TokenHash = newToken, IssuedAt = DateTime.UtcNow, ExpiresAt = DateTime.UtcNow.AddDays(30), DeviceName = "", Revoked = false, IpAddress = "", UserAgent = "" }); //TODO: Add invalidation to TOKENs return newToken; } public async Task UserRegisterAsync(AuthRegister request) { throw new NotImplementedException(); } public async Task ServerVerifyUser(AuthUserVerify request) { throw new NotImplementedException(); } }