pdo = $pdo; } public function findBySessionId(int $sessionId): array { $stmt = $this->pdo->prepare( 'SELECT * FROM chat_messages WHERE session_id = ? ORDER BY created_at ASC' ); $stmt->execute([$sessionId]); $messages = []; foreach ($stmt->fetchAll(\PDO::FETCH_ASSOC) as $row) { $messages[] = ChatMessageFactory::fromArray($row); } return $messages; } public function saveEntity(ChatMessage $message): int { $data = $message->toArray(); unset($data['id']); $stmt = $this->pdo->prepare( 'INSERT INTO chat_messages (session_id, role, content, model, tokens_input, tokens_output, sources, start_microtime, end_microtime, author_profile_id, system_prompt_id, collections, context_limit) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)' ); $stmt->execute([ $message->getSessionId(), $message->getRole()->value, $message->getContent(), $message->getModel(), $message->getTokensInput(), $message->getTokensOutput(), $message->getSources() !== null ? json_encode($message->getSources()) : null, $message->getStartMicrotime(), $message->getEndMicrotime(), $message->getAuthorProfileId(), $message->getSystemPromptId(), $message->getCollections() !== null ? json_encode($message->getCollections()) : null, $message->getContextLimit(), ]); // Update session timestamp $this->pdo->prepare('UPDATE chat_sessions SET updated_at = NOW() WHERE id = ?') ->execute([$message->getSessionId()]); return (int) $this->pdo->lastInsertId(); } public function save( int $sessionId, string $role, string $content, string $model, ?int $tokensInput = null, ?int $tokensOutput = null, ?array $sources = null, ?float $startMicrotime = null, ?float $endMicrotime = null, ?int $authorProfileId = null, ?int $systemPromptId = null, ?string $collectionsJson = null, ?int $contextLimit = null ): int { $stmt = $this->pdo->prepare( 'INSERT INTO chat_messages (session_id, role, content, model, tokens_input, tokens_output, sources, start_microtime, end_microtime, author_profile_id, system_prompt_id, collections, context_limit) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)' ); $stmt->execute([ $sessionId, $role, $content, $model, $tokensInput, $tokensOutput, $sources !== null ? json_encode($sources) : null, $startMicrotime, $endMicrotime, $authorProfileId, $systemPromptId, $collectionsJson, $contextLimit, ]); // Update session timestamp $this->pdo->prepare('UPDATE chat_sessions SET updated_at = NOW() WHERE id = ?') ->execute([$sessionId]); return (int) $this->pdo->lastInsertId(); } public function delete(int $id): void { $stmt = $this->pdo->prepare('DELETE FROM chat_messages WHERE id = ?'); $stmt->execute([$id]); } public function deleteBySessionId(int $sessionId): void { $stmt = $this->pdo->prepare('DELETE FROM chat_messages WHERE session_id = ?'); $stmt->execute([$sessionId]); } public function getSessionStats(int $sessionId): array { $stmt = $this->pdo->prepare( 'SELECT COUNT(*) as message_count, COALESCE(SUM(tokens_input), 0) as total_input_tokens, COALESCE(SUM(tokens_output), 0) as total_output_tokens, COALESCE(SUM(end_microtime - start_microtime), 0) as total_duration FROM chat_messages WHERE session_id = ?' ); $stmt->execute([$sessionId]); return $stmt->fetch(\PDO::FETCH_ASSOC); } }