138 lines
4.5 KiB
PHP
138 lines
4.5 KiB
PHP
<?php
|
|
require_once __DIR__ . '/../db/config.php';
|
|
|
|
class Pef {
|
|
private $db;
|
|
|
|
public function __construct() {
|
|
$this->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;
|
|
}
|
|
}
|
|
}
|