mirror of
https://github.com/memohai/Memoh.git
synced 2026-04-27 07:16:19 +09:00
refactor(core): migrate channel identity and binding across app
Align channel identity and bind flow across backend and app-facing layers, including generated swagger artifacts and package lock updates while excluding docs content changes.
This commit is contained in:
@@ -0,0 +1,214 @@
|
||||
-- name: CreateChat :one
|
||||
INSERT INTO chats (bot_id, kind, parent_chat_id, title, created_by_user_id, metadata)
|
||||
VALUES ($1, $2, $3, $4, $5, $6)
|
||||
RETURNING id, bot_id, kind, parent_chat_id, title, created_by_user_id, metadata, enable_chat_memory, enable_private_memory, enable_public_memory, model_id, settings_metadata, created_at, updated_at;
|
||||
|
||||
-- name: GetChatByID :one
|
||||
SELECT id, bot_id, kind, parent_chat_id, title, created_by_user_id, metadata, enable_chat_memory, enable_private_memory, enable_public_memory, model_id, settings_metadata, created_at, updated_at
|
||||
FROM chats
|
||||
WHERE id = $1;
|
||||
|
||||
-- name: ListChatsByBotAndUser :many
|
||||
SELECT c.id, c.bot_id, c.kind, c.parent_chat_id, c.title, c.created_by_user_id, c.metadata, c.enable_chat_memory, c.enable_private_memory, c.enable_public_memory, c.model_id, c.settings_metadata, c.created_at, c.updated_at
|
||||
FROM chats c
|
||||
JOIN chat_participants cp ON cp.chat_id = c.id
|
||||
WHERE c.bot_id = $1 AND cp.user_id = $2
|
||||
ORDER BY c.updated_at DESC;
|
||||
|
||||
-- name: ListVisibleChatsByBotAndUser :many
|
||||
WITH participant_chats AS (
|
||||
SELECT c.id, c.bot_id, c.kind, c.parent_chat_id, c.title, c.created_by_user_id, c.metadata, c.created_at, c.updated_at,
|
||||
'participant'::text AS access_mode,
|
||||
cp.role AS participant_role,
|
||||
NULL::timestamptz AS last_observed_at
|
||||
FROM chats c
|
||||
JOIN chat_participants cp ON cp.chat_id = c.id
|
||||
WHERE c.bot_id = $1 AND cp.user_id = $2
|
||||
),
|
||||
observed_chats AS (
|
||||
SELECT c.id, c.bot_id, c.kind, c.parent_chat_id, c.title, c.created_by_user_id, c.metadata, c.created_at, c.updated_at,
|
||||
'channel_identity_observed'::text AS access_mode,
|
||||
''::text AS participant_role,
|
||||
MAX(cap.last_seen_at) AS last_observed_at
|
||||
FROM chats c
|
||||
JOIN chat_channel_identity_presence cap ON cap.chat_id = c.id
|
||||
JOIN channel_identities ci ON ci.id = cap.channel_identity_id
|
||||
WHERE c.bot_id = $1
|
||||
AND ci.user_id = $2
|
||||
AND NOT EXISTS (
|
||||
SELECT 1 FROM chat_participants cp
|
||||
WHERE cp.chat_id = c.id AND cp.user_id = $2
|
||||
)
|
||||
GROUP BY c.id, c.bot_id, c.kind, c.parent_chat_id, c.title, c.created_by_user_id, c.metadata, c.created_at, c.updated_at
|
||||
)
|
||||
SELECT id, bot_id, kind, parent_chat_id, title, created_by_user_id, metadata, created_at, updated_at,
|
||||
access_mode, participant_role, last_observed_at
|
||||
FROM (
|
||||
SELECT * FROM participant_chats
|
||||
UNION ALL
|
||||
SELECT * FROM observed_chats
|
||||
) v
|
||||
ORDER BY v.updated_at DESC, v.last_observed_at DESC NULLS LAST;
|
||||
|
||||
-- name: GetChatReadAccessByUser :one
|
||||
WITH participant_access AS (
|
||||
SELECT 'participant'::text AS access_mode,
|
||||
cp.role AS participant_role,
|
||||
NULL::timestamptz AS last_observed_at
|
||||
FROM chat_participants cp
|
||||
WHERE cp.chat_id = $1 AND cp.user_id = $2
|
||||
),
|
||||
observed_access AS (
|
||||
SELECT 'channel_identity_observed'::text AS access_mode,
|
||||
''::text AS participant_role,
|
||||
MAX(cap.last_seen_at) AS last_observed_at
|
||||
FROM chat_channel_identity_presence cap
|
||||
JOIN channel_identities ci ON ci.id = cap.channel_identity_id
|
||||
WHERE cap.chat_id = $1 AND ci.user_id = $2
|
||||
GROUP BY cap.chat_id
|
||||
),
|
||||
all_access AS (
|
||||
SELECT * FROM participant_access
|
||||
UNION ALL
|
||||
SELECT * FROM observed_access
|
||||
)
|
||||
SELECT access_mode, participant_role, last_observed_at
|
||||
FROM all_access
|
||||
ORDER BY CASE WHEN access_mode = 'participant' THEN 0 ELSE 1 END, last_observed_at DESC NULLS LAST
|
||||
LIMIT 1;
|
||||
|
||||
-- name: ListThreadsByParent :many
|
||||
SELECT id, bot_id, kind, parent_chat_id, title, created_by_user_id, metadata, enable_chat_memory, enable_private_memory, enable_public_memory, model_id, settings_metadata, created_at, updated_at
|
||||
FROM chats
|
||||
WHERE parent_chat_id = $1 AND kind = 'thread'
|
||||
ORDER BY created_at DESC;
|
||||
|
||||
-- name: UpdateChatTitle :one
|
||||
UPDATE chats SET title = $2, updated_at = now()
|
||||
WHERE id = $1
|
||||
RETURNING id, bot_id, kind, parent_chat_id, title, created_by_user_id, metadata, enable_chat_memory, enable_private_memory, enable_public_memory, model_id, settings_metadata, created_at, updated_at;
|
||||
|
||||
-- name: TouchChat :exec
|
||||
UPDATE chats SET updated_at = now() WHERE id = $1;
|
||||
|
||||
-- name: DeleteChat :exec
|
||||
DELETE FROM chats WHERE id = $1;
|
||||
|
||||
-- chat_participants
|
||||
|
||||
-- name: AddChatParticipant :one
|
||||
INSERT INTO chat_participants (chat_id, user_id, role)
|
||||
VALUES ($1, $2, $3)
|
||||
ON CONFLICT (chat_id, user_id) DO UPDATE SET role = EXCLUDED.role
|
||||
RETURNING chat_id, user_id, role, joined_at;
|
||||
|
||||
-- name: GetChatParticipant :one
|
||||
SELECT chat_id, user_id, role, joined_at
|
||||
FROM chat_participants
|
||||
WHERE chat_id = $1 AND user_id = $2;
|
||||
|
||||
-- name: ListChatParticipants :many
|
||||
SELECT chat_id, user_id, role, joined_at
|
||||
FROM chat_participants
|
||||
WHERE chat_id = $1
|
||||
ORDER BY joined_at ASC;
|
||||
|
||||
-- name: RemoveChatParticipant :exec
|
||||
DELETE FROM chat_participants WHERE chat_id = $1 AND user_id = $2;
|
||||
|
||||
-- name: CopyParticipantsToChat :exec
|
||||
INSERT INTO chat_participants (chat_id, user_id, role)
|
||||
SELECT $2, cp.user_id, cp.role FROM chat_participants cp WHERE cp.chat_id = $1
|
||||
ON CONFLICT (chat_id, user_id) DO NOTHING;
|
||||
|
||||
-- chat_settings
|
||||
|
||||
-- name: UpsertChatSettings :one
|
||||
UPDATE chats
|
||||
SET enable_chat_memory = $2,
|
||||
enable_private_memory = $3,
|
||||
enable_public_memory = $4,
|
||||
model_id = $5,
|
||||
settings_metadata = $6
|
||||
WHERE id = $1
|
||||
RETURNING id AS chat_id, enable_chat_memory, enable_private_memory, enable_public_memory, model_id, settings_metadata AS metadata, updated_at;
|
||||
|
||||
-- name: GetChatSettings :one
|
||||
SELECT id AS chat_id, enable_chat_memory, enable_private_memory, enable_public_memory, model_id, settings_metadata AS metadata, updated_at
|
||||
FROM chats
|
||||
WHERE id = $1;
|
||||
|
||||
-- chat_routes
|
||||
|
||||
-- name: CreateChatRoute :one
|
||||
INSERT INTO chat_routes (chat_id, bot_id, platform, channel_config_id, conversation_id, thread_id, reply_target, metadata)
|
||||
VALUES ($1, $2, $3, $4, $5, $6, $7, $8)
|
||||
RETURNING id, chat_id, bot_id, platform, channel_config_id, conversation_id, thread_id, reply_target, metadata, created_at, updated_at;
|
||||
|
||||
-- name: FindChatRoute :one
|
||||
SELECT id, chat_id, bot_id, platform, channel_config_id, conversation_id, thread_id, reply_target, metadata, created_at, updated_at
|
||||
FROM chat_routes
|
||||
WHERE bot_id = $1 AND platform = $2 AND conversation_id = $3
|
||||
AND COALESCE(thread_id, '') = COALESCE(sqlc.narg('thread_id'), '')
|
||||
LIMIT 1;
|
||||
|
||||
-- name: GetChatRouteByID :one
|
||||
SELECT id, chat_id, bot_id, platform, channel_config_id, conversation_id, thread_id, reply_target, metadata, created_at, updated_at
|
||||
FROM chat_routes
|
||||
WHERE id = $1;
|
||||
|
||||
-- name: ListChatRoutes :many
|
||||
SELECT id, chat_id, bot_id, platform, channel_config_id, conversation_id, thread_id, reply_target, metadata, created_at, updated_at
|
||||
FROM chat_routes
|
||||
WHERE chat_id = $1
|
||||
ORDER BY created_at ASC;
|
||||
|
||||
-- name: UpdateChatRouteReplyTarget :exec
|
||||
UPDATE chat_routes SET reply_target = $2, updated_at = now() WHERE id = $1;
|
||||
|
||||
-- name: DeleteChatRoute :exec
|
||||
DELETE FROM chat_routes WHERE id = $1;
|
||||
|
||||
-- chat_messages
|
||||
|
||||
-- name: CreateChatMessage :one
|
||||
INSERT INTO chat_messages (chat_id, bot_id, route_id, sender_channel_identity_id, sender_user_id, platform, external_message_id, role, content, metadata)
|
||||
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)
|
||||
RETURNING id, chat_id, bot_id, route_id, sender_channel_identity_id, sender_user_id, platform, external_message_id, role, content, metadata, created_at;
|
||||
|
||||
-- name: UpsertChatChannelIdentityPresence :exec
|
||||
INSERT INTO chat_channel_identity_presence (chat_id, channel_identity_id, first_seen_at, last_seen_at, message_count)
|
||||
VALUES ($1, $2, now(), now(), 1)
|
||||
ON CONFLICT (chat_id, channel_identity_id)
|
||||
DO UPDATE SET
|
||||
last_seen_at = now(),
|
||||
message_count = chat_channel_identity_presence.message_count + 1;
|
||||
|
||||
-- name: ListChatMessages :many
|
||||
SELECT id, chat_id, bot_id, route_id, sender_channel_identity_id, sender_user_id, platform, external_message_id, role, content, metadata, created_at
|
||||
FROM chat_messages
|
||||
WHERE chat_id = $1
|
||||
ORDER BY created_at ASC;
|
||||
|
||||
-- name: ListChatMessagesSince :many
|
||||
SELECT id, chat_id, bot_id, route_id, sender_channel_identity_id, sender_user_id, platform, external_message_id, role, content, metadata, created_at
|
||||
FROM chat_messages
|
||||
WHERE chat_id = $1 AND created_at >= $2
|
||||
ORDER BY created_at ASC;
|
||||
|
||||
-- name: ListChatMessagesBefore :many
|
||||
SELECT id, chat_id, bot_id, route_id, sender_channel_identity_id, sender_user_id, platform, external_message_id, role, content, metadata, created_at
|
||||
FROM chat_messages
|
||||
WHERE chat_id = $1 AND created_at < $2
|
||||
ORDER BY created_at DESC
|
||||
LIMIT $3;
|
||||
|
||||
-- name: ListChatMessagesLatest :many
|
||||
SELECT id, chat_id, bot_id, route_id, sender_channel_identity_id, sender_user_id, platform, external_message_id, role, content, metadata, created_at
|
||||
FROM chat_messages
|
||||
WHERE chat_id = $1
|
||||
ORDER BY created_at DESC
|
||||
LIMIT $2;
|
||||
|
||||
-- name: DeleteChatMessagesByChat :exec
|
||||
DELETE FROM chat_messages WHERE chat_id = $1;
|
||||
Reference in New Issue
Block a user