package dev.service; import dev.database.DatabaseConnection; import dev.model.User; import java.security.MessageDigest; import java.sql.*; import java.util.Base64; public class AuthService { private String hashPassword(String password) { try { MessageDigest digest = MessageDigest.getInstance("SHA-256"); byte[] hash = digest.digest(password.getBytes("UTF-8")); return Base64.getEncoder().encodeToString(hash); } catch (Exception e) { throw new RuntimeException("Hashing failed", e); } } public boolean register(String username, String password, String email) { if (username == null || username.trim().isEmpty() || password == null || password.isEmpty()) { System.out.println("Username and password cannot be empty."); return false; } String sql = "INSERT INTO users (username, password, email) VALUES (?, ?, ?)"; try (Connection conn = DatabaseConnection.getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setString(1, username); pstmt.setString(2, hashPassword(password)); if (email == null || email.trim().isEmpty()) { pstmt.setNull(3, Types.VARCHAR); } else { pstmt.setString(3, email); } pstmt.executeUpdate(); return true; } catch (SQLException e) { System.out.println("Registration failed (Username might already exist): " + e.getMessage()); return false; } } public User login(String username, String password) { String sql = "SELECT * FROM users WHERE username = ? AND password = ?"; try (Connection conn = DatabaseConnection.getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setString(1, username); pstmt.setString(2, hashPassword(password)); try (ResultSet rs = pstmt.executeQuery()) { if (rs.next()) { return new User( rs.getInt("id"), rs.getString("username"), rs.getString("password"), rs.getString("email") ); } } } catch (SQLException e) { System.out.println("Login error: " + e.getMessage()); } return null; } }