conn = $db; } public function create() { $query = "INSERT INTO " . $this->table_name . " SET username=:username, email=:email, password_hash=:password_hash, first_name=:first_name, last_name=:last_name, role=:role, is_active=:is_active, created_at=:created_at, updated_at=:updated_at"; $stmt = $this->conn->prepare($query); $this->username = htmlspecialchars(strip_tags($this->username)); $this->email = htmlspecialchars(strip_tags($this->email)); $this->password_hash = password_hash($this->password_hash, PASSWORD_DEFAULT); $this->first_name = htmlspecialchars(strip_tags($this->first_name)); $this->last_name = htmlspecialchars(strip_tags($this->last_name)); $this->role = htmlspecialchars(strip_tags($this->role)); $this->is_active = $this->is_active ? 1 : 0; $this->created_at = date('Y-m-d H:i:s'); $this->updated_at = date('Y-m-d H:i:s'); $stmt->bindParam(":username", $this->username); $stmt->bindParam(":email", $this->email); $stmt->bindParam(":password_hash", $this->password_hash); $stmt->bindParam(":first_name", $this->first_name); $stmt->bindParam(":last_name", $this->last_name); $stmt->bindParam(":role", $this->role); $stmt->bindParam(":is_active", $this->is_active); $stmt->bindParam(":created_at", $this->created_at); $stmt->bindParam(":updated_at", $this->updated_at); if($stmt->execute()) { return true; } return false; } public function read() { $query = "SELECT id, username, email, first_name, last_name, role, is_active, last_login, created_at, updated_at FROM " . $this->table_name . " ORDER BY username"; $stmt = $this->conn->prepare($query); $stmt->execute(); return $stmt; } public function readOne() { $query = "SELECT * FROM " . $this->table_name . " WHERE id = ? LIMIT 0,1"; $stmt = $this->conn->prepare($query); $stmt->bindParam(1, $this->id); $stmt->execute(); $row = $stmt->fetch(PDO::FETCH_ASSOC); $this->username = $row['username']; $this->email = $row['email']; $this->password_hash = $row['password_hash']; $this->first_name = $row['first_name']; $this->last_name = $row['last_name']; $this->role = $row['role']; $this->is_active = $row['is_active']; $this->last_login = $row['last_login']; $this->created_at = $row['created_at']; $this->updated_at = $row['updated_at']; } public function update($update_password = false) { if($update_password) { $query = "UPDATE " . $this->table_name . " SET username=:username, email=:email, password_hash=:password_hash, first_name=:first_name, last_name=:last_name, role=:role, is_active=:is_active, updated_at=:updated_at WHERE id=:id"; } else { $query = "UPDATE " . $this->table_name . " SET username=:username, email=:email, first_name=:first_name, last_name=:last_name, role=:role, is_active=:is_active, updated_at=:updated_at WHERE id=:id"; } $stmt = $this->conn->prepare($query); $this->username = htmlspecialchars(strip_tags($this->username)); $this->email = htmlspecialchars(strip_tags($this->email)); $this->first_name = htmlspecialchars(strip_tags($this->first_name)); $this->last_name = htmlspecialchars(strip_tags($this->last_name)); $this->role = htmlspecialchars(strip_tags($this->role)); $this->is_active = $this->is_active ? 1 : 0; $this->updated_at = date('Y-m-d H:i:s'); $stmt->bindParam(":username", $this->username); $stmt->bindParam(":email", $this->email); $stmt->bindParam(":first_name", $this->first_name); $stmt->bindParam(":last_name", $this->last_name); $stmt->bindParam(":role", $this->role); $stmt->bindParam(":is_active", $this->is_active); $stmt->bindParam(":updated_at", $this->updated_at); $stmt->bindParam(":id", $this->id); if($update_password) { $this->password_hash = password_hash($this->password_hash, PASSWORD_DEFAULT); $stmt->bindParam(":password_hash", $this->password_hash); } if($stmt->execute()) { return true; } return false; } public function delete() { $query = "DELETE FROM " . $this->table_name . " WHERE id = ?"; $stmt = $this->conn->prepare($query); $stmt->bindParam(1, $this->id); if($stmt->execute()) { return true; } return false; } public function authenticate($username, $password) { $query = "SELECT * FROM " . $this->table_name . " WHERE username = ? AND is_active = TRUE LIMIT 0,1"; $stmt = $this->conn->prepare($query); $stmt->bindParam(1, $username); $stmt->execute(); $row = $stmt->fetch(PDO::FETCH_ASSOC); if($row && password_verify($password, $row['password_hash'])) { // Update last login $update_query = "UPDATE " . $this->table_name . " SET last_login = ? WHERE id = ?"; $update_stmt = $this->conn->prepare($update_query); $current_time = date('Y-m-d H:i:s'); $update_stmt->bindParam(1, $current_time); $update_stmt->bindParam(2, $row['id']); $update_stmt->execute(); // Remove password hash from response unset($row['password_hash']); return $row; } return false; } public function findByEmail($email) { $query = "SELECT * FROM " . $this->table_name . " WHERE email = ? LIMIT 0,1"; $stmt = $this->conn->prepare($query); $stmt->bindParam(1, $email); $stmt->execute(); return $stmt->fetch(PDO::FETCH_ASSOC); } public function updatePassword($user_id, $new_password) { $query = "UPDATE " . $this->table_name . " SET password_hash = ?, updated_at = ? WHERE id = ?"; $stmt = $this->conn->prepare($query); $password_hash = password_hash($new_password, PASSWORD_DEFAULT); $updated_at = date('Y-m-d H:i:s'); $stmt->bindParam(1, $password_hash); $stmt->bindParam(2, $updated_at); $stmt->bindParam(3, $user_id); return $stmt->execute(); } public function getRoleBadge() { $badges = [ 'admin' => 'Admin', 'manager' => 'Manager', 'user' => 'User' ]; return $badges[$this->role] ?? $this->role; } public function getFullName() { return trim($this->first_name . ' ' . $this->last_name); } public function isActive() { return $this->is_active; } public function getStatusBadge() { if($this->is_active) { return 'Active'; } else { return 'Inactive'; } } public function findByUsername($username) { $query = "SELECT id, username, email, first_name, last_name, role, is_active, last_login, created_at, updated_at FROM " . $this->table_name . " WHERE username = ? LIMIT 0,1"; $stmt = $this->conn->prepare($query); $stmt->bindParam(1, $username); $stmt->execute(); $row = $stmt->fetch(PDO::FETCH_ASSOC); if($row) { return $row; } return false; } } ?>