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 { // 附带公司共享库 Binding,便于客户端展示 all, e2 := svcCtx.DBSync.Store().ListBindings(tid, localID) if e2 == nil { seen := map[string]bool{} for _, b := range list { seen[b.ID] = true } for _, b := range all { if b.Shared && !seen[b.ID] { list = append(list, b) } } } } } 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 if body.Shared { authx.WriteError(w, http.StatusForbidden, "仅公司管理员可将 Binding 标为公司共享库(shared)") return } } saved, err := svcCtx.DBSync.Store().EnsureBinding(body) if err != nil { authx.WriteError(w, http.StatusBadRequest, err.Error()) return } httpx.OkJson(w, saved) } }