Add db message metadata

This commit is contained in:
dwrz
2026-10-09 15:12:58 +00:00
parent bee05be62d
commit cb84dbbac3
4 changed files with 184 additions and 16 deletions
+26 -7
View File
@@ -3,6 +3,7 @@ package db
import (
"context"
"database/sql"
"encoding/json/jsontext"
"fmt"
"time"
"uuid"
@@ -301,33 +302,46 @@ func (q *Queries) DeleteConversationId(ctx context.Context, id string) error {
}
const insertMessage = `
INSERT INTO messages (id, content, conversation_id, role, sequence)
VALUES (?, ?, ?, ?, ?)
RETURNING content, conversation_id, created_at, id, role, sequence, updated_at
INSERT INTO messages (id, content, conversation_id, metadata, role, sequence)
VALUES (?, ?, ?, jsonb(?), ?, ?)
RETURNING content, conversation_id, created_at, id, json(metadata), role, sequence, updated_at
`
// InsertMessageParams holds arguments for InsertMessage.
type InsertMessageParams struct {
Content string
// Content is the model-visible message JSON saved in the new row.
Content string
// ConversationId identifies the conversation that owns the new row.
ConversationId string
Role MessageRole
Sequence int
// Metadata is inference JSON converted to JSONB for storage.
// Nil stores SQL NULL; malformed JSON causes insertion to fail.
Metadata jsontext.Value
// Role is the message's role, saved separately for row queries.
Role MessageRole
// Sequence is the new row's ordering position within the conversation.
Sequence int
}
// InsertMessage creates a new message.
func (q *Queries) InsertMessage(ctx context.Context, arg InsertMessageParams) (*Message, error) {
var metadataArg any
if arg.Metadata != nil {
metadataArg = string(arg.Metadata)
}
row := q.db.QueryRowContext(
ctx,
insertMessage,
uuid.New().String(),
arg.Content,
arg.ConversationId,
metadataArg,
arg.Role,
arg.Sequence,
)
var (
m Message
metadata []byte
createdAt string
updatedAt string
err error
@@ -337,12 +351,14 @@ func (q *Queries) InsertMessage(ctx context.Context, arg InsertMessageParams) (*
&m.ConversationId,
&createdAt,
&m.Id,
&metadata,
&m.Role,
&m.Sequence,
&updatedAt,
); err != nil {
return nil, fmt.Errorf("InsertMessage: %w", err)
}
m.Metadata = jsontext.Value(metadata)
if m.CreatedAt, err = time.Parse(time.RFC3339, createdAt); err != nil {
return nil, fmt.Errorf("InsertMessage: parse created_at: %w", err)
}
@@ -353,7 +369,7 @@ func (q *Queries) InsertMessage(ctx context.Context, arg InsertMessageParams) (*
}
const selectMessagesConversationId = `
SELECT content, conversation_id, created_at, id, role, sequence, updated_at
SELECT content, conversation_id, created_at, id, json(metadata), role, sequence, updated_at
FROM messages
WHERE conversation_id = ?
ORDER BY sequence
@@ -372,6 +388,7 @@ func (q *Queries) SelectMessagesConversationId(ctx context.Context, conversation
for rows.Next() {
var (
m Message
metadata []byte
createdAt string
updatedAt string
)
@@ -380,12 +397,14 @@ func (q *Queries) SelectMessagesConversationId(ctx context.Context, conversation
&m.ConversationId,
&createdAt,
&m.Id,
&metadata,
&m.Role,
&m.Sequence,
&updatedAt,
); err != nil {
return nil, fmt.Errorf("SelectMessagesConversationId: %w", err)
}
m.Metadata = jsontext.Value(metadata)
if m.CreatedAt, err = time.Parse(time.RFC3339, createdAt); err != nil {
return nil, fmt.Errorf("SelectMessagesConversationId: parse created_at: %w", err)
}