Add db message metadata
This commit is contained in:
+26
-7
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user