mirror of
https://github.com/memohai/Memoh.git
synced 2026-04-27 07:16:19 +09:00
refactor(core): restructure conversation, channel and message domains
- Rename chat module to conversation with flow-based architecture - Move channelidentities into channel/identities subpackage - Add channel/route for routing logic - Add message service with event hub - Add MCP providers: container, directory, schedule - Refactor Feishu/Telegram adapters with directory and stream support - Add platform management page and channel badges in web UI - Update database schema for conversations, messages and channel routes - Add @memoh/shared package for cross-package type definitions
This commit is contained in:
@@ -0,0 +1,409 @@
|
||||
// Code generated by sqlc. DO NOT EDIT.
|
||||
// versions:
|
||||
// sqlc v1.30.0
|
||||
// source: messages.sql
|
||||
|
||||
package sqlc
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/jackc/pgx/v5/pgtype"
|
||||
)
|
||||
|
||||
const createMessage = `-- name: CreateMessage :one
|
||||
INSERT INTO bot_history_messages (
|
||||
bot_id,
|
||||
route_id,
|
||||
sender_channel_identity_id,
|
||||
sender_account_user_id,
|
||||
channel_type,
|
||||
source_message_id,
|
||||
source_reply_to_message_id,
|
||||
role,
|
||||
content,
|
||||
metadata
|
||||
)
|
||||
VALUES (
|
||||
$1,
|
||||
$2::uuid,
|
||||
$3::uuid,
|
||||
$4::uuid,
|
||||
$5::text,
|
||||
$6::text,
|
||||
$7::text,
|
||||
$8,
|
||||
$9,
|
||||
$10
|
||||
)
|
||||
RETURNING
|
||||
id,
|
||||
bot_id,
|
||||
route_id,
|
||||
sender_channel_identity_id,
|
||||
sender_account_user_id AS sender_user_id,
|
||||
channel_type AS platform,
|
||||
source_message_id AS external_message_id,
|
||||
source_reply_to_message_id,
|
||||
role,
|
||||
content,
|
||||
metadata,
|
||||
created_at
|
||||
`
|
||||
|
||||
type CreateMessageParams struct {
|
||||
BotID pgtype.UUID `json:"bot_id"`
|
||||
RouteID pgtype.UUID `json:"route_id"`
|
||||
SenderChannelIdentityID pgtype.UUID `json:"sender_channel_identity_id"`
|
||||
SenderUserID pgtype.UUID `json:"sender_user_id"`
|
||||
Platform pgtype.Text `json:"platform"`
|
||||
ExternalMessageID pgtype.Text `json:"external_message_id"`
|
||||
SourceReplyToMessageID pgtype.Text `json:"source_reply_to_message_id"`
|
||||
Role string `json:"role"`
|
||||
Content []byte `json:"content"`
|
||||
Metadata []byte `json:"metadata"`
|
||||
}
|
||||
|
||||
type CreateMessageRow struct {
|
||||
ID pgtype.UUID `json:"id"`
|
||||
BotID pgtype.UUID `json:"bot_id"`
|
||||
RouteID pgtype.UUID `json:"route_id"`
|
||||
SenderChannelIdentityID pgtype.UUID `json:"sender_channel_identity_id"`
|
||||
SenderUserID pgtype.UUID `json:"sender_user_id"`
|
||||
Platform pgtype.Text `json:"platform"`
|
||||
ExternalMessageID pgtype.Text `json:"external_message_id"`
|
||||
SourceReplyToMessageID pgtype.Text `json:"source_reply_to_message_id"`
|
||||
Role string `json:"role"`
|
||||
Content []byte `json:"content"`
|
||||
Metadata []byte `json:"metadata"`
|
||||
CreatedAt pgtype.Timestamptz `json:"created_at"`
|
||||
}
|
||||
|
||||
func (q *Queries) CreateMessage(ctx context.Context, arg CreateMessageParams) (CreateMessageRow, error) {
|
||||
row := q.db.QueryRow(ctx, createMessage,
|
||||
arg.BotID,
|
||||
arg.RouteID,
|
||||
arg.SenderChannelIdentityID,
|
||||
arg.SenderUserID,
|
||||
arg.Platform,
|
||||
arg.ExternalMessageID,
|
||||
arg.SourceReplyToMessageID,
|
||||
arg.Role,
|
||||
arg.Content,
|
||||
arg.Metadata,
|
||||
)
|
||||
var i CreateMessageRow
|
||||
err := row.Scan(
|
||||
&i.ID,
|
||||
&i.BotID,
|
||||
&i.RouteID,
|
||||
&i.SenderChannelIdentityID,
|
||||
&i.SenderUserID,
|
||||
&i.Platform,
|
||||
&i.ExternalMessageID,
|
||||
&i.SourceReplyToMessageID,
|
||||
&i.Role,
|
||||
&i.Content,
|
||||
&i.Metadata,
|
||||
&i.CreatedAt,
|
||||
)
|
||||
return i, err
|
||||
}
|
||||
|
||||
const deleteMessagesByBot = `-- name: DeleteMessagesByBot :exec
|
||||
DELETE FROM bot_history_messages
|
||||
WHERE bot_id = $1
|
||||
`
|
||||
|
||||
func (q *Queries) DeleteMessagesByBot(ctx context.Context, botID pgtype.UUID) error {
|
||||
_, err := q.db.Exec(ctx, deleteMessagesByBot, botID)
|
||||
return err
|
||||
}
|
||||
|
||||
const listMessages = `-- name: ListMessages :many
|
||||
SELECT
|
||||
id,
|
||||
bot_id,
|
||||
route_id,
|
||||
sender_channel_identity_id,
|
||||
sender_account_user_id AS sender_user_id,
|
||||
channel_type AS platform,
|
||||
source_message_id AS external_message_id,
|
||||
source_reply_to_message_id,
|
||||
role,
|
||||
content,
|
||||
metadata,
|
||||
created_at
|
||||
FROM bot_history_messages
|
||||
WHERE bot_id = $1
|
||||
ORDER BY created_at ASC
|
||||
`
|
||||
|
||||
type ListMessagesRow struct {
|
||||
ID pgtype.UUID `json:"id"`
|
||||
BotID pgtype.UUID `json:"bot_id"`
|
||||
RouteID pgtype.UUID `json:"route_id"`
|
||||
SenderChannelIdentityID pgtype.UUID `json:"sender_channel_identity_id"`
|
||||
SenderUserID pgtype.UUID `json:"sender_user_id"`
|
||||
Platform pgtype.Text `json:"platform"`
|
||||
ExternalMessageID pgtype.Text `json:"external_message_id"`
|
||||
SourceReplyToMessageID pgtype.Text `json:"source_reply_to_message_id"`
|
||||
Role string `json:"role"`
|
||||
Content []byte `json:"content"`
|
||||
Metadata []byte `json:"metadata"`
|
||||
CreatedAt pgtype.Timestamptz `json:"created_at"`
|
||||
}
|
||||
|
||||
func (q *Queries) ListMessages(ctx context.Context, botID pgtype.UUID) ([]ListMessagesRow, error) {
|
||||
rows, err := q.db.Query(ctx, listMessages, botID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer rows.Close()
|
||||
var items []ListMessagesRow
|
||||
for rows.Next() {
|
||||
var i ListMessagesRow
|
||||
if err := rows.Scan(
|
||||
&i.ID,
|
||||
&i.BotID,
|
||||
&i.RouteID,
|
||||
&i.SenderChannelIdentityID,
|
||||
&i.SenderUserID,
|
||||
&i.Platform,
|
||||
&i.ExternalMessageID,
|
||||
&i.SourceReplyToMessageID,
|
||||
&i.Role,
|
||||
&i.Content,
|
||||
&i.Metadata,
|
||||
&i.CreatedAt,
|
||||
); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
items = append(items, i)
|
||||
}
|
||||
if err := rows.Err(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return items, nil
|
||||
}
|
||||
|
||||
const listMessagesBefore = `-- name: ListMessagesBefore :many
|
||||
SELECT
|
||||
id,
|
||||
bot_id,
|
||||
route_id,
|
||||
sender_channel_identity_id,
|
||||
sender_account_user_id AS sender_user_id,
|
||||
channel_type AS platform,
|
||||
source_message_id AS external_message_id,
|
||||
source_reply_to_message_id,
|
||||
role,
|
||||
content,
|
||||
metadata,
|
||||
created_at
|
||||
FROM bot_history_messages
|
||||
WHERE bot_id = $1
|
||||
AND created_at < $2
|
||||
ORDER BY created_at DESC
|
||||
LIMIT $3
|
||||
`
|
||||
|
||||
type ListMessagesBeforeParams struct {
|
||||
BotID pgtype.UUID `json:"bot_id"`
|
||||
CreatedAt pgtype.Timestamptz `json:"created_at"`
|
||||
MaxCount int32 `json:"max_count"`
|
||||
}
|
||||
|
||||
type ListMessagesBeforeRow struct {
|
||||
ID pgtype.UUID `json:"id"`
|
||||
BotID pgtype.UUID `json:"bot_id"`
|
||||
RouteID pgtype.UUID `json:"route_id"`
|
||||
SenderChannelIdentityID pgtype.UUID `json:"sender_channel_identity_id"`
|
||||
SenderUserID pgtype.UUID `json:"sender_user_id"`
|
||||
Platform pgtype.Text `json:"platform"`
|
||||
ExternalMessageID pgtype.Text `json:"external_message_id"`
|
||||
SourceReplyToMessageID pgtype.Text `json:"source_reply_to_message_id"`
|
||||
Role string `json:"role"`
|
||||
Content []byte `json:"content"`
|
||||
Metadata []byte `json:"metadata"`
|
||||
CreatedAt pgtype.Timestamptz `json:"created_at"`
|
||||
}
|
||||
|
||||
func (q *Queries) ListMessagesBefore(ctx context.Context, arg ListMessagesBeforeParams) ([]ListMessagesBeforeRow, error) {
|
||||
rows, err := q.db.Query(ctx, listMessagesBefore, arg.BotID, arg.CreatedAt, arg.MaxCount)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer rows.Close()
|
||||
var items []ListMessagesBeforeRow
|
||||
for rows.Next() {
|
||||
var i ListMessagesBeforeRow
|
||||
if err := rows.Scan(
|
||||
&i.ID,
|
||||
&i.BotID,
|
||||
&i.RouteID,
|
||||
&i.SenderChannelIdentityID,
|
||||
&i.SenderUserID,
|
||||
&i.Platform,
|
||||
&i.ExternalMessageID,
|
||||
&i.SourceReplyToMessageID,
|
||||
&i.Role,
|
||||
&i.Content,
|
||||
&i.Metadata,
|
||||
&i.CreatedAt,
|
||||
); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
items = append(items, i)
|
||||
}
|
||||
if err := rows.Err(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return items, nil
|
||||
}
|
||||
|
||||
const listMessagesLatest = `-- name: ListMessagesLatest :many
|
||||
SELECT
|
||||
id,
|
||||
bot_id,
|
||||
route_id,
|
||||
sender_channel_identity_id,
|
||||
sender_account_user_id AS sender_user_id,
|
||||
channel_type AS platform,
|
||||
source_message_id AS external_message_id,
|
||||
source_reply_to_message_id,
|
||||
role,
|
||||
content,
|
||||
metadata,
|
||||
created_at
|
||||
FROM bot_history_messages
|
||||
WHERE bot_id = $1
|
||||
ORDER BY created_at DESC
|
||||
LIMIT $2
|
||||
`
|
||||
|
||||
type ListMessagesLatestParams struct {
|
||||
BotID pgtype.UUID `json:"bot_id"`
|
||||
MaxCount int32 `json:"max_count"`
|
||||
}
|
||||
|
||||
type ListMessagesLatestRow struct {
|
||||
ID pgtype.UUID `json:"id"`
|
||||
BotID pgtype.UUID `json:"bot_id"`
|
||||
RouteID pgtype.UUID `json:"route_id"`
|
||||
SenderChannelIdentityID pgtype.UUID `json:"sender_channel_identity_id"`
|
||||
SenderUserID pgtype.UUID `json:"sender_user_id"`
|
||||
Platform pgtype.Text `json:"platform"`
|
||||
ExternalMessageID pgtype.Text `json:"external_message_id"`
|
||||
SourceReplyToMessageID pgtype.Text `json:"source_reply_to_message_id"`
|
||||
Role string `json:"role"`
|
||||
Content []byte `json:"content"`
|
||||
Metadata []byte `json:"metadata"`
|
||||
CreatedAt pgtype.Timestamptz `json:"created_at"`
|
||||
}
|
||||
|
||||
func (q *Queries) ListMessagesLatest(ctx context.Context, arg ListMessagesLatestParams) ([]ListMessagesLatestRow, error) {
|
||||
rows, err := q.db.Query(ctx, listMessagesLatest, arg.BotID, arg.MaxCount)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer rows.Close()
|
||||
var items []ListMessagesLatestRow
|
||||
for rows.Next() {
|
||||
var i ListMessagesLatestRow
|
||||
if err := rows.Scan(
|
||||
&i.ID,
|
||||
&i.BotID,
|
||||
&i.RouteID,
|
||||
&i.SenderChannelIdentityID,
|
||||
&i.SenderUserID,
|
||||
&i.Platform,
|
||||
&i.ExternalMessageID,
|
||||
&i.SourceReplyToMessageID,
|
||||
&i.Role,
|
||||
&i.Content,
|
||||
&i.Metadata,
|
||||
&i.CreatedAt,
|
||||
); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
items = append(items, i)
|
||||
}
|
||||
if err := rows.Err(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return items, nil
|
||||
}
|
||||
|
||||
const listMessagesSince = `-- name: ListMessagesSince :many
|
||||
SELECT
|
||||
id,
|
||||
bot_id,
|
||||
route_id,
|
||||
sender_channel_identity_id,
|
||||
sender_account_user_id AS sender_user_id,
|
||||
channel_type AS platform,
|
||||
source_message_id AS external_message_id,
|
||||
source_reply_to_message_id,
|
||||
role,
|
||||
content,
|
||||
metadata,
|
||||
created_at
|
||||
FROM bot_history_messages
|
||||
WHERE bot_id = $1
|
||||
AND created_at >= $2
|
||||
ORDER BY created_at ASC
|
||||
`
|
||||
|
||||
type ListMessagesSinceParams struct {
|
||||
BotID pgtype.UUID `json:"bot_id"`
|
||||
CreatedAt pgtype.Timestamptz `json:"created_at"`
|
||||
}
|
||||
|
||||
type ListMessagesSinceRow struct {
|
||||
ID pgtype.UUID `json:"id"`
|
||||
BotID pgtype.UUID `json:"bot_id"`
|
||||
RouteID pgtype.UUID `json:"route_id"`
|
||||
SenderChannelIdentityID pgtype.UUID `json:"sender_channel_identity_id"`
|
||||
SenderUserID pgtype.UUID `json:"sender_user_id"`
|
||||
Platform pgtype.Text `json:"platform"`
|
||||
ExternalMessageID pgtype.Text `json:"external_message_id"`
|
||||
SourceReplyToMessageID pgtype.Text `json:"source_reply_to_message_id"`
|
||||
Role string `json:"role"`
|
||||
Content []byte `json:"content"`
|
||||
Metadata []byte `json:"metadata"`
|
||||
CreatedAt pgtype.Timestamptz `json:"created_at"`
|
||||
}
|
||||
|
||||
func (q *Queries) ListMessagesSince(ctx context.Context, arg ListMessagesSinceParams) ([]ListMessagesSinceRow, error) {
|
||||
rows, err := q.db.Query(ctx, listMessagesSince, arg.BotID, arg.CreatedAt)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer rows.Close()
|
||||
var items []ListMessagesSinceRow
|
||||
for rows.Next() {
|
||||
var i ListMessagesSinceRow
|
||||
if err := rows.Scan(
|
||||
&i.ID,
|
||||
&i.BotID,
|
||||
&i.RouteID,
|
||||
&i.SenderChannelIdentityID,
|
||||
&i.SenderUserID,
|
||||
&i.Platform,
|
||||
&i.ExternalMessageID,
|
||||
&i.SourceReplyToMessageID,
|
||||
&i.Role,
|
||||
&i.Content,
|
||||
&i.Metadata,
|
||||
&i.CreatedAt,
|
||||
); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
items = append(items, i)
|
||||
}
|
||||
if err := rows.Err(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return items, nil
|
||||
}
|
||||
Reference in New Issue
Block a user