using System; using System.Security.Cryptography; using System.Text; using Dapper; using Microsoft.Data.Sqlite; namespace Gott.Services; public class AuthService { private readonly string _connectionString; public AuthService(string dbPath) { _connectionString = $"Data Source={dbPath}"; InitializeTable(); } private SqliteConnection CreateConnection() { var conn = new SqliteConnection(_connectionString); conn.Open(); return conn; } private void InitializeTable() { using var conn = CreateConnection(); conn.Execute(@" CREATE TABLE IF NOT EXISTS tokens ( token TEXT NOT NULL PRIMARY KEY, user_id TEXT NOT NULL, created_at TEXT NOT NULL ); CREATE INDEX IF NOT EXISTS idx_tokens_user ON tokens(user_id); "); } public string HashPassword(string password) { var bytes = SHA256.HashData(Encoding.UTF8.GetBytes(password)); return Convert.ToHexStringLower(bytes); } public bool VerifyPassword(string password, string hash) { return HashPassword(password) == hash; } public string CreateToken(string userId) { var token = Convert.ToHexStringLower(RandomNumberGenerator.GetBytes(32)); using var conn = CreateConnection(); conn.Execute( "INSERT INTO tokens (token, user_id, created_at) VALUES (@token, @userId, @now)", new { token, userId, now = DateTime.UtcNow.ToString("o") }); return token; } public string ValidateToken(string token) { if (string.IsNullOrEmpty(token)) return null; using var conn = CreateConnection(); return conn.QuerySingleOrDefault( "SELECT user_id FROM tokens WHERE token = @token", new { token }); } public void RevokeToken(string token) { if (string.IsNullOrEmpty(token)) return; using var conn = CreateConnection(); conn.Execute("DELETE FROM tokens WHERE token = @token", new { token }); } }