63 lines
1.6 KiB
Go
63 lines
1.6 KiB
Go
package db
|
|
|
|
import (
|
|
"time"
|
|
)
|
|
|
|
// Event represents an event row in the database.
|
|
type Event struct {
|
|
ID int64 `json:"id"`
|
|
SessionID string `json:"session_id"`
|
|
EventName string `json:"event_name"`
|
|
ToolName string `json:"tool_name,omitempty"`
|
|
Payload string `json:"payload"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
}
|
|
|
|
// InsertEvent inserts a new event.
|
|
func (db *DB) InsertEvent(sessionID, eventName, toolName, payload string) (int64, error) {
|
|
result, err := db.Exec(`
|
|
INSERT INTO events (session_id, event_name, tool_name, payload)
|
|
VALUES (?, ?, ?, ?)
|
|
`, sessionID, eventName, toolName, payload)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
return result.LastInsertId()
|
|
}
|
|
|
|
// ListEvents returns events for a session, with optional pagination.
|
|
func (db *DB) ListEvents(sessionID string, limit, offset int) ([]*Event, error) {
|
|
if limit <= 0 {
|
|
limit = 100
|
|
}
|
|
|
|
rows, err := db.Query(`
|
|
SELECT id, session_id, event_name, tool_name, payload, created_at
|
|
FROM events
|
|
WHERE session_id = ?
|
|
ORDER BY id DESC
|
|
LIMIT ? OFFSET ?
|
|
`, sessionID, limit, offset)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
|
|
var events []*Event
|
|
for rows.Next() {
|
|
e := &Event{}
|
|
if err := rows.Scan(&e.ID, &e.SessionID, &e.EventName, &e.ToolName, &e.Payload, &e.CreatedAt); err != nil {
|
|
return nil, err
|
|
}
|
|
events = append(events, e)
|
|
}
|
|
return events, nil
|
|
}
|
|
|
|
// CountEvents returns the total number of events for a session.
|
|
func (db *DB) CountEvents(sessionID string) (int, error) {
|
|
var count int
|
|
err := db.QueryRow("SELECT COUNT(*) FROM events WHERE session_id = ?", sessionID).Scan(&count)
|
|
return count, err
|
|
}
|