Enable Binding-scoped agent push/pull, empty-table schema ensure, SyncPage inspect/drop-table, default module import, and agent-bound publish docs from the 宇恒联调意见. Co-authored-by: Cursor <cursoragent@cursor.com>
66 lines
1.6 KiB
Go
66 lines
1.6 KiB
Go
package handler
|
|
|
|
import (
|
|
"encoding/json"
|
|
"net/http"
|
|
|
|
"aijianzhan/platform/internal/authx"
|
|
"aijianzhan/platform/internal/dbsync"
|
|
"aijianzhan/platform/internal/svc"
|
|
|
|
"github.com/zeromicro/go-zero/rest/httpx"
|
|
)
|
|
|
|
func syncBindingsListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
|
|
return func(w http.ResponseWriter, r *http.Request) {
|
|
if !requireDBSync(svcCtx, w) {
|
|
return
|
|
}
|
|
localID := r.URL.Query().Get("local_database_id")
|
|
tid := syncTenantID(r)
|
|
var (
|
|
list []dbsync.Binding
|
|
err error
|
|
)
|
|
if authx.SyncTenantWide(r.Context()) {
|
|
list, err = svcCtx.DBSync.Store().ListBindings(tid, localID)
|
|
} else {
|
|
list, err = svcCtx.DBSync.Store().ListBindingsFiltered(tid, authx.UserID(r.Context()), localID)
|
|
}
|
|
if err != nil {
|
|
authx.WriteError(w, http.StatusBadRequest, err.Error())
|
|
return
|
|
}
|
|
httpx.OkJson(w, map[string]any{"items": list})
|
|
}
|
|
}
|
|
|
|
func syncBindingsEnsureHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
|
|
return func(w http.ResponseWriter, r *http.Request) {
|
|
if !requireDBSync(svcCtx, w) {
|
|
return
|
|
}
|
|
var body dbsync.Binding
|
|
if err := json.NewDecoder(r.Body).Decode(&body); err != nil {
|
|
authx.WriteError(w, http.StatusBadRequest, err.Error())
|
|
return
|
|
}
|
|
body.TenantID = syncTenantID(r)
|
|
uid := authx.UserID(r.Context())
|
|
if authx.SyncTenantWide(r.Context()) {
|
|
if body.UserID == 0 {
|
|
body.UserID = uid
|
|
}
|
|
} else {
|
|
// 用户自助:强制绑定到本人,禁止冒用他人 user_id
|
|
body.UserID = uid
|
|
}
|
|
saved, err := svcCtx.DBSync.Store().EnsureBinding(body)
|
|
if err != nil {
|
|
authx.WriteError(w, http.StatusBadRequest, err.Error())
|
|
return
|
|
}
|
|
httpx.OkJson(w, saved)
|
|
}
|
|
}
|