Ship ticket-exchange and bind/policy for Z13, keep trial binds SMS-free, allow shared company bindings, and align SyncPage plus sync docs. Co-authored-by: Cursor <cursoragent@cursor.com>
85 lines
2.2 KiB
Go
85 lines
2.2 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 {
|
||
// 附带公司共享库 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)
|
||
}
|
||
}
|