mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-09-24 16:03:43 +08:00
改进:把path中的params合并到querystring中,这样允许在listItemFilter中访问这些params参数,并且实现对数据的过滤
This commit is contained in:
@@ -7,6 +7,7 @@ import (
|
||||
|
||||
"yunion.io/x/jsonutils"
|
||||
"yunion.io/x/log"
|
||||
"yunion.io/x/pkg/utils"
|
||||
|
||||
"yunion.io/x/onecloud/pkg/appctx"
|
||||
"yunion.io/x/onecloud/pkg/appsrv"
|
||||
@@ -107,9 +108,22 @@ func _fetchEnv(ctx context.Context, w http.ResponseWriter, r *http.Request) (map
|
||||
return params, query, body
|
||||
}
|
||||
|
||||
func mergeQueryParams(params map[string]string, query jsonutils.JSONObject, excludes ...string) jsonutils.JSONObject {
|
||||
if query == nil {
|
||||
query = jsonutils.NewDict()
|
||||
}
|
||||
queryDict := query.(*jsonutils.JSONDict)
|
||||
for k, v := range params {
|
||||
if !utils.IsInStringArray(k, excludes) {
|
||||
queryDict.Add(jsonutils.NewString(v), k[1:len(k)-1])
|
||||
}
|
||||
}
|
||||
return queryDict
|
||||
}
|
||||
|
||||
func listHandler(ctx context.Context, w http.ResponseWriter, r *http.Request) {
|
||||
manager, _, query, _ := fetchEnv(ctx, w, r)
|
||||
handleList(ctx, w, manager, "", query)
|
||||
manager, params, query, _ := fetchEnv(ctx, w, r)
|
||||
handleList(ctx, w, manager, "", mergeQueryParams(params, query))
|
||||
}
|
||||
|
||||
func handleList(ctx context.Context, w http.ResponseWriter, manager IModelDispatchHandler, ctxId string, query jsonutils.JSONObject) {
|
||||
@@ -124,7 +138,7 @@ func handleList(ctx context.Context, w http.ResponseWriter, manager IModelDispat
|
||||
func listInContextHandler(ctx context.Context, w http.ResponseWriter, r *http.Request) {
|
||||
manager, params, query, _ := fetchEnv(ctx, w, r)
|
||||
ctxId := params["<resid>"]
|
||||
handleList(ctx, w, manager, ctxId, query)
|
||||
handleList(ctx, w, manager, ctxId, mergeQueryParams(params, query, "<resid>"))
|
||||
}
|
||||
|
||||
func wrapBody(body jsonutils.JSONObject, key string) jsonutils.JSONObject {
|
||||
@@ -139,7 +153,7 @@ func wrapBody(body jsonutils.JSONObject, key string) jsonutils.JSONObject {
|
||||
|
||||
func getHandler(ctx context.Context, w http.ResponseWriter, r *http.Request) {
|
||||
manager, params, query, _ := fetchEnv(ctx, w, r)
|
||||
result, err := manager.Get(ctx, params["<resid>"], query)
|
||||
result, err := manager.Get(ctx, params["<resid>"], mergeQueryParams(params, query, "<resid>"))
|
||||
if err != nil {
|
||||
httperrors.GeneralServerError(w, err)
|
||||
return
|
||||
@@ -149,7 +163,7 @@ func getHandler(ctx context.Context, w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
func getSpecHandler(ctx context.Context, w http.ResponseWriter, r *http.Request) {
|
||||
manager, params, query, _ := fetchEnv(ctx, w, r)
|
||||
result, err := manager.GetSpecific(ctx, params["<resid>"], params["<spec>"], query)
|
||||
result, err := manager.GetSpecific(ctx, params["<resid>"], params["<spec>"], mergeQueryParams(params, query, "<resid>", "<spec>"))
|
||||
if err != nil {
|
||||
httperrors.GeneralServerError(w, err)
|
||||
return
|
||||
@@ -158,8 +172,8 @@ func getSpecHandler(ctx context.Context, w http.ResponseWriter, r *http.Request)
|
||||
}
|
||||
|
||||
func createHandler(ctx context.Context, w http.ResponseWriter, r *http.Request) {
|
||||
manager, _, query, body := fetchEnv(ctx, w, r)
|
||||
handleCreate(ctx, w, manager, "", query, body)
|
||||
manager, params, query, body := fetchEnv(ctx, w, r)
|
||||
handleCreate(ctx, w, manager, "", mergeQueryParams(params, query), body)
|
||||
}
|
||||
|
||||
func handleCreate(ctx context.Context, w http.ResponseWriter, manager IModelDispatchHandler, ctxId string, query jsonutils.JSONObject, body jsonutils.JSONObject) {
|
||||
@@ -197,7 +211,7 @@ func handleCreate(ctx context.Context, w http.ResponseWriter, manager IModelDisp
|
||||
func createInContextHandler(ctx context.Context, w http.ResponseWriter, r *http.Request) {
|
||||
manager, params, query, body := fetchEnv(ctx, w, r)
|
||||
ctxId := params["<resid>"]
|
||||
handleCreate(ctx, w, manager, ctxId, query, body)
|
||||
handleCreate(ctx, w, manager, ctxId, mergeQueryParams(params, query, "<resid>"), body)
|
||||
}
|
||||
|
||||
func performClassActionHandler(ctx context.Context, w http.ResponseWriter, r *http.Request) {
|
||||
@@ -212,7 +226,7 @@ func performClassActionHandler(ctx context.Context, w http.ResponseWriter, r *ht
|
||||
} else {
|
||||
data = jsonutils.NewDict()
|
||||
}
|
||||
results, err := manager.PerformClassAction(ctx, params["<action>"], query, data)
|
||||
results, err := manager.PerformClassAction(ctx, params["<action>"], mergeQueryParams(params, query, "<action>"), data)
|
||||
if err != nil {
|
||||
httperrors.GeneralServerError(w, err)
|
||||
return
|
||||
@@ -226,7 +240,7 @@ func performActionHandler(ctx context.Context, w http.ResponseWriter, r *http.Re
|
||||
if data == nil {
|
||||
data = jsonutils.NewDict()
|
||||
}
|
||||
result, err := manager.PerformAction(ctx, params["<resid>"], params["<action>"], query, data)
|
||||
result, err := manager.PerformAction(ctx, params["<resid>"], params["<action>"], mergeQueryParams(params, query, "<resid>", "<action>"), data)
|
||||
if err != nil {
|
||||
httperrors.GeneralServerError(w, err)
|
||||
return
|
||||
@@ -260,7 +274,7 @@ func updateHandler(ctx context.Context, w http.ResponseWriter, r *http.Request)
|
||||
fmt.Sprintf("No request key: %s", manager.Keyword()))
|
||||
return
|
||||
}
|
||||
result, err := manager.Update(ctx, params["<resid>"], query, data)
|
||||
result, err := manager.Update(ctx, params["<resid>"], mergeQueryParams(params, query, "<resid>"), data)
|
||||
if err != nil {
|
||||
httperrors.GeneralServerError(w, err)
|
||||
return
|
||||
@@ -301,7 +315,7 @@ func deleteHandler(ctx context.Context, w http.ResponseWriter, r *http.Request)
|
||||
return
|
||||
}
|
||||
}
|
||||
result, err := manager.Delete(ctx, params["<resid>"], query, data)
|
||||
result, err := manager.Delete(ctx, params["<resid>"], mergeQueryParams(params, query, "<resid>"), data)
|
||||
if err != nil {
|
||||
httperrors.GeneralServerError(w, err)
|
||||
return
|
||||
|
||||
@@ -100,8 +100,8 @@ func fetchJointEnv(ctx context.Context, w http.ResponseWriter, r *http.Request)
|
||||
}
|
||||
|
||||
func jointListHandler(ctx context.Context, w http.ResponseWriter, r *http.Request) {
|
||||
manager, _, query, _ := fetchJointEnv(ctx, w, r)
|
||||
listResult, err := manager.List(ctx, query, "")
|
||||
manager, params, query, _ := fetchJointEnv(ctx, w, r)
|
||||
listResult, err := manager.List(ctx, mergeQueryParams(params, query), "")
|
||||
if err != nil {
|
||||
httperrors.GeneralServerError(w, err)
|
||||
return
|
||||
@@ -114,9 +114,9 @@ func jointListDescendentHandler(ctx context.Context, w http.ResponseWriter, r *h
|
||||
var listResult *modules.ListResult
|
||||
var err error
|
||||
if _, ok := params["<master_id>"]; ok {
|
||||
listResult, err = manager.ListMasterDescendent(ctx, params["<master_id>"], query)
|
||||
listResult, err = manager.ListMasterDescendent(ctx, params["<master_id>"], mergeQueryParams(params, query, "<master_id>"))
|
||||
} else if _, ok := params["<slave_id>"]; ok {
|
||||
listResult, err = manager.ListSlaveDescendent(ctx, params["<slave_id>"], query)
|
||||
listResult, err = manager.ListSlaveDescendent(ctx, params["<slave_id>"], mergeQueryParams(params, query, "<slave_id>"))
|
||||
}
|
||||
if err != nil {
|
||||
httperrors.GeneralServerError(w, err)
|
||||
@@ -127,7 +127,7 @@ func jointListDescendentHandler(ctx context.Context, w http.ResponseWriter, r *h
|
||||
|
||||
func jointGetHandler(ctx context.Context, w http.ResponseWriter, r *http.Request) {
|
||||
manager, params, query, _ := fetchJointEnv(ctx, w, r)
|
||||
result, err := manager.Get(ctx, params["<master_id>"], params["<slave_id>"], query)
|
||||
result, err := manager.Get(ctx, params["<master_id>"], params["<slave_id>"], mergeQueryParams(params, query, "<master_id>", "<slave_id>"))
|
||||
if err != nil {
|
||||
httperrors.GeneralServerError(w, err)
|
||||
return
|
||||
@@ -145,7 +145,7 @@ func attachHandler(ctx context.Context, w http.ResponseWriter, r *http.Request)
|
||||
if data == nil {
|
||||
data = jsonutils.NewDict()
|
||||
}
|
||||
result, err := manager.Attach(ctx, params["<master_id>"], params["<slave_id>"], query, data)
|
||||
result, err := manager.Attach(ctx, params["<master_id>"], params["<slave_id>"], mergeQueryParams(params, query, "<master_id>", "<slave_id>"), data)
|
||||
if err != nil {
|
||||
httperrors.GeneralServerError(w, err)
|
||||
return
|
||||
@@ -160,7 +160,7 @@ func updateJointHandler(ctx context.Context, w http.ResponseWriter, r *http.Requ
|
||||
httperrors.GeneralServerError(w, err)
|
||||
return
|
||||
}
|
||||
result, err := manager.Update(ctx, params["<master_id>"], params["<slave_id>"], query, data)
|
||||
result, err := manager.Update(ctx, params["<master_id>"], params["<slave_id>"], mergeQueryParams(params, query, "<master_id>", "<slave_id>"), data)
|
||||
if err != nil {
|
||||
httperrors.GeneralServerError(w, err)
|
||||
return
|
||||
@@ -174,7 +174,7 @@ func detachHandler(ctx context.Context, w http.ResponseWriter, r *http.Request)
|
||||
if body != nil {
|
||||
data, _ = body.Get(manager.Keyword())
|
||||
}
|
||||
result, err := manager.Detach(ctx, params["<master_id>"], params["<slave_id>"], query, data)
|
||||
result, err := manager.Detach(ctx, params["<master_id>"], params["<slave_id>"], mergeQueryParams(params, query, "<master_id>", "<slave_id>"), data)
|
||||
if err != nil {
|
||||
httperrors.GeneralServerError(w, err)
|
||||
return
|
||||
|
||||
@@ -53,33 +53,12 @@ func (dispatcher *DBModelDispatcher) ContextKeywordPlural() []string {
|
||||
return nil
|
||||
}
|
||||
|
||||
/*
|
||||
const (
|
||||
AUTH_TOKEN = appctx.AppContextKey("X_AUTH_TOKEN")
|
||||
)
|
||||
*/
|
||||
|
||||
func (dispatcher *DBModelDispatcher) Filter(f appsrv.FilterHandler) appsrv.FilterHandler {
|
||||
return auth.Authenticate(f)
|
||||
/*return func(ctx context.Context, w http.ResponseWriter, r *http.Request) {
|
||||
tokenStr := r.Header.Get("X-Auth-Token")
|
||||
if len(tokenStr) == 0 {
|
||||
httperrors.UnauthorizedError(w, "Unauthorized")
|
||||
return
|
||||
}
|
||||
token, err := auth.Verify(tokenStr)
|
||||
if err != nil {
|
||||
log.Errorf("Verify token failed: %s", err)
|
||||
httperrors.UnauthorizedError(w, "InvalidToken")
|
||||
return
|
||||
}
|
||||
ctx = context.WithValue(ctx, AUTH_TOKEN, token)
|
||||
f(ctx, w, r)
|
||||
} */
|
||||
}
|
||||
|
||||
func fetchUserCredential(ctx context.Context) mcclient.TokenCredential {
|
||||
// token, ok := ctx.Value(AUTH_TOKEN).(mcclient.TokenCredential)
|
||||
token := auth.FetchUserCredential(ctx)
|
||||
if token == nil {
|
||||
log.Fatalf("user token credential not found?")
|
||||
|
||||
Reference in New Issue
Block a user