db = DatabaseFactory::content(); } /** * {@inheritDoc} */ public function getStats(): array { $result = $this->db->query( 'SELECT COUNT(*) as total, SUM(CASE WHEN status = "done" THEN 1 ELSE 0 END) as processed, SUM(CASE WHEN status = "error" THEN 1 ELSE 0 END) as errors FROM documents' )->fetch(); return $result !== false ? $result : ['total' => 0, 'processed' => 0, 'errors' => 0]; } /** * {@inheritDoc} */ public function findAll(): array { return $this->db->query( 'SELECT d.id, d.filename, d.folder_path, d.mime_type, d.file_size, d.status, d.imported_at, d.processed_at, (SELECT COUNT(*) FROM chunks WHERE document_id = d.id) as chunk_count FROM documents d ORDER BY d.imported_at DESC' )->fetchAll(); } /** * {@inheritDoc} */ public function findFiltered(string $status = '', string $search = ''): array { $sql = 'SELECT d.id, d.filename, d.folder_path, d.source_path, d.mime_type, d.file_size, d.status, d.imported_at, d.processed_at, d.error_message, (SELECT COUNT(*) FROM chunks WHERE document_id = d.id) as chunk_count, (SELECT COALESCE(SUM(token_count), 0) FROM chunks WHERE document_id = d.id) as token_count FROM documents d WHERE 1=1'; $params = []; if ($status !== '') { $sql .= ' AND d.status = :status'; $params['status'] = $status; } if ($search !== '') { $sql .= ' AND (d.filename LIKE :search OR d.source_path LIKE :search2)'; $params['search'] = '%' . $search . '%'; $params['search2'] = '%' . $search . '%'; } $sql .= ' ORDER BY d.imported_at DESC'; $stmt = $this->db->prepare($sql); $stmt->execute($params); return $stmt->fetchAll(); } /** * {@inheritDoc} */ public function find(int $id): ?array { $stmt = $this->db->prepare('SELECT * FROM documents WHERE id = :id'); $stmt->execute(['id' => $id]); $result = $stmt->fetch(); return $result === false ? null : $result; } }