feat: channel gateway implementation and multi-bot refactor

- Refactor channel manager with support for Sender/Receiver interfaces and hot-swappable adapters.
- Implement identity routing and pre-authentication logic for inbound messages.
- Update database schema to support bot pre-auth keys and extended channel session metadata.
- Add Telegram and Feishu channel configuration and adapter enhancements.
- Update Swagger documentation and internal handlers for channel management.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
BBQ
2026-02-06 14:41:54 +08:00
parent 0bba6d2913
commit 5a35ef34ac
106 changed files with 7910 additions and 3044 deletions
+89
View File
@@ -0,0 +1,89 @@
// Code generated by sqlc. DO NOT EDIT.
// versions:
// sqlc v1.30.0
// source: preauth.sql
package sqlc
import (
"context"
"github.com/jackc/pgx/v5/pgtype"
)
const createBotPreauthKey = `-- name: CreateBotPreauthKey :one
INSERT INTO bot_preauth_keys (bot_id, token, issued_by_user_id, expires_at)
VALUES ($1, $2, $3, $4)
RETURNING id, bot_id, token, issued_by_user_id, expires_at, used_at, created_at
`
type CreateBotPreauthKeyParams struct {
BotID pgtype.UUID `json:"bot_id"`
Token string `json:"token"`
IssuedByUserID pgtype.UUID `json:"issued_by_user_id"`
ExpiresAt pgtype.Timestamptz `json:"expires_at"`
}
func (q *Queries) CreateBotPreauthKey(ctx context.Context, arg CreateBotPreauthKeyParams) (BotPreauthKey, error) {
row := q.db.QueryRow(ctx, createBotPreauthKey,
arg.BotID,
arg.Token,
arg.IssuedByUserID,
arg.ExpiresAt,
)
var i BotPreauthKey
err := row.Scan(
&i.ID,
&i.BotID,
&i.Token,
&i.IssuedByUserID,
&i.ExpiresAt,
&i.UsedAt,
&i.CreatedAt,
)
return i, err
}
const getBotPreauthKey = `-- name: GetBotPreauthKey :one
SELECT id, bot_id, token, issued_by_user_id, expires_at, used_at, created_at
FROM bot_preauth_keys
WHERE token = $1
LIMIT 1
`
func (q *Queries) GetBotPreauthKey(ctx context.Context, token string) (BotPreauthKey, error) {
row := q.db.QueryRow(ctx, getBotPreauthKey, token)
var i BotPreauthKey
err := row.Scan(
&i.ID,
&i.BotID,
&i.Token,
&i.IssuedByUserID,
&i.ExpiresAt,
&i.UsedAt,
&i.CreatedAt,
)
return i, err
}
const markBotPreauthKeyUsed = `-- name: MarkBotPreauthKeyUsed :one
UPDATE bot_preauth_keys
SET used_at = now()
WHERE id = $1
RETURNING id, bot_id, token, issued_by_user_id, expires_at, used_at, created_at
`
func (q *Queries) MarkBotPreauthKeyUsed(ctx context.Context, id pgtype.UUID) (BotPreauthKey, error) {
row := q.db.QueryRow(ctx, markBotPreauthKeyUsed, id)
var i BotPreauthKey
err := row.Scan(
&i.ID,
&i.BotID,
&i.Token,
&i.IssuedByUserID,
&i.ExpiresAt,
&i.UsedAt,
&i.CreatedAt,
)
return i, err
}