db = db(); } /** * Get all projects, optionally filtered by industry or status. */ public function getProjects(?string $industry = null, ?string $status = null): array { $sql = "SELECT * FROM projects WHERE 1=1"; $params = []; if ($industry) { $sql .= " AND industry = :industry"; $params['industry'] = $industry; } if ($status) { $sql .= " AND status = :status"; $params['status'] = $status; } $sql .= " ORDER BY updated_at DESC"; $stmt = $this->db->prepare($sql); $stmt->execute($params); return $stmt->fetchAll(); } /** * User authentication. */ public function login(string $username, string $password): ?array { $stmt = $this->db->prepare("SELECT * FROM users WHERE username = :username"); $stmt->execute(['username' => $username]); $user = $stmt->fetch(); if ($user && password_verify($password, $user['password'])) { unset($user['password']); return $user; } return null; } /** * Update project status or details. */ public function updateProject(int $id, array $data): bool { $fields = []; foreach ($data as $key => $value) { $fields[] = "$key = :$key"; } $sql = "UPDATE projects SET " . implode(', ', $fields) . " WHERE id = :id"; $data['id'] = $id; $stmt = $this->db->prepare($sql); return $stmt->execute($data); } /** * Delete project. */ public function deleteProject(int $id): bool { $stmt = $this->db->prepare("DELETE FROM projects WHERE id = :id"); return $stmt->execute(['id' => $id]); } /** * Dashboard stats. */ public function getStats(): array { $stats = []; $stats['total_projects'] = $this->db->query("SELECT COUNT(*) FROM projects")->fetchColumn(); $stats['active_projects'] = $this->db->query("SELECT COUNT(*) FROM projects WHERE status = 'active'")->fetchColumn(); $stats['latest_logs'] = $this->db->query("SELECT pl.*, p.name as project_name FROM project_logs pl JOIN projects p ON pl.project_id = p.id ORDER BY pl.created_at DESC LIMIT 5")->fetchAll(); return $stats; } /** * Get a single project by ID. */ public function getProject(int $id): ?array { $stmt = $this->db->prepare("SELECT * FROM projects WHERE id = :id"); $stmt->execute(['id' => $id]); return $stmt->fetch() ?: null; } /** * Get all logs for a specific project. */ public function getProjectLogs(int $projectId): array { $stmt = $this->db->prepare("SELECT * FROM project_logs WHERE project_id = :project_id ORDER BY created_at DESC"); $stmt->execute(['project_id' => $projectId]); return $stmt->fetchAll(); } /** * Create a new project. */ public function createProject(string $name, string $description, string $industry, string $version = '1.0.0'): int { $stmt = $this->db->prepare("INSERT INTO projects (name, description, industry, current_version) VALUES (:name, :description, :industry, :version)"); $stmt->execute([ 'name' => $name, 'description' => $description, 'industry' => $industry, 'version' => $version ]); return (int)$this->db->lastInsertId(); } /** * Add a log entry for a project and update its current version. */ public function addLog(int $projectId, string $version, string $logEntry, string $author = 'System'): bool { try { $this->db->beginTransaction(); $stmt = $this->db->prepare("INSERT INTO project_logs (project_id, version, log_entry, author) VALUES (:project_id, :version, :log_entry, :author)"); $stmt->execute([ 'project_id' => $projectId, 'version' => $version, 'log_entry' => $logEntry, 'author' => $author ]); $stmt = $this->db->prepare("UPDATE projects SET current_version = :version WHERE id = :id"); $stmt->execute(['version' => $version, 'id' => $projectId]); $this->db->commit(); return true; } catch (Exception $e) { $this->db->rollBack(); return false; } } }