Browse Source

修改模型

fancl 2 years ago
parent
commit
043cdf5649
3 changed files with 102 additions and 73 deletions
  1. 30 30
      model.go
  2. 38 43
      rest.go
  3. 34 0
      utils.go

+ 30 - 30
model.go

@@ -16,16 +16,16 @@ type (
 	}
 
 	ActiveModel interface {
-		BeforeQuery(ctx context.Context, query *Query) (err error)
-		AfterQuery(ctx context.Context, query *Query) (err error)
-		BeforeSave(ctx context.Context, model interface{}) (err error)
-		AfterSave(ctx context.Context, model interface{}, diff []*DiffAttr) (err error)
-		BeforeCreate(ctx context.Context, model interface{}) (err error)
-		AfterCreate(ctx context.Context, model interface{}, diff []*DiffAttr) (err error)
-		BeforeUpdate(ctx context.Context, model interface{}) (err error)
-		AfterUpdate(ctx context.Context, model interface{}, diff []*DiffAttr) (err error)
-		BeforeDelete(ctx context.Context, model interface{}) (err error)
-		AfterDelete(ctx context.Context, model interface{}) (err error)
+		OnBeforeQuery(ctx context.Context, query *Query) (err error)
+		OnAfterQuery(ctx context.Context, query *Query) (err error)
+		OnBeforeSave(ctx context.Context, model interface{}) (err error)
+		OnAfterSave(ctx context.Context, model interface{}, diff []*DiffAttr) (err error)
+		OnBeforeCreate(ctx context.Context, model interface{}) (err error)
+		OnAfterCreate(ctx context.Context, model interface{}, diff []*DiffAttr) (err error)
+		OnBeforeUpdate(ctx context.Context, model interface{}) (err error)
+		OnAfterUpdate(ctx context.Context, model interface{}, diff []*DiffAttr) (err error)
+		OnBeforeDelete(ctx context.Context, model interface{}) (err error)
+		OnAfterDelete(ctx context.Context, model interface{}) (err error)
 	}
 
 	BaseModel struct {
@@ -43,82 +43,82 @@ type (
 	}
 )
 
-func (rom *ReadonlyModel) BeforeQuery(ctx context.Context, query *Query) (err error) {
+func (rom *ReadonlyModel) OnBeforeQuery(ctx context.Context, query *Query) (err error) {
 	return
 }
 
-func (rom *ReadonlyModel) AfterQuery(ctx context.Context, query *Query) (err error) {
+func (rom *ReadonlyModel) OnAfterQuery(ctx context.Context, query *Query) (err error) {
 	return
 }
 
-func (rom *ReadonlyModel) BeforeSave(ctx context.Context, model interface{}) (err error) {
+func (rom *ReadonlyModel) OnBeforeSave(ctx context.Context, model interface{}) (err error) {
 	return
 }
 
-func (rom *ReadonlyModel) AfterSave(ctx context.Context, model interface{}, diff []*DiffAttr) (err error) {
+func (rom *ReadonlyModel) OnAfterSave(ctx context.Context, model interface{}, diff []*DiffAttr) (err error) {
 	return
 }
 
-func (rom *ReadonlyModel) BeforeCreate(ctx context.Context, model interface{}) (err error) {
+func (rom *ReadonlyModel) OnBeforeCreate(ctx context.Context, model interface{}) (err error) {
 	return
 }
 
-func (rom *ReadonlyModel) AfterCreate(ctx context.Context, model interface{}, diff []*DiffAttr) (err error) {
+func (rom *ReadonlyModel) OnAfterCreate(ctx context.Context, model interface{}, diff []*DiffAttr) (err error) {
 	return
 }
 
-func (rom *ReadonlyModel) BeforeUpdate(ctx context.Context, model interface{}) (err error) {
+func (rom *ReadonlyModel) OnBeforeUpdate(ctx context.Context, model interface{}) (err error) {
 	return
 }
 
-func (rom *ReadonlyModel) AfterUpdate(ctx context.Context, model interface{}, diff []*DiffAttr) (err error) {
+func (rom *ReadonlyModel) OnAfterUpdate(ctx context.Context, model interface{}, diff []*DiffAttr) (err error) {
 	return
 }
 
-func (rom *ReadonlyModel) BeforeDelete(ctx context.Context, model interface{}) (err error) {
+func (rom *ReadonlyModel) OnBeforeDelete(ctx context.Context, model interface{}) (err error) {
 	return
 }
 
-func (rom *ReadonlyModel) AfterDelete(ctx context.Context, model interface{}) (err error) {
+func (rom *ReadonlyModel) OnAfterDelete(ctx context.Context, model interface{}) (err error) {
 	return
 }
 
-func (bsm *BaseModel) BeforeQuery(ctx context.Context, query *Query) (err error) {
+func (bsm *BaseModel) OnBeforeQuery(ctx context.Context, query *Query) (err error) {
 	return
 }
 
-func (bsm *BaseModel) AfterQuery(ctx context.Context, query *Query) (err error) {
+func (bsm *BaseModel) OnAfterQuery(ctx context.Context, query *Query) (err error) {
 	return
 }
 
-func (bsm *BaseModel) BeforeSave(ctx context.Context, model interface{}) (err error) {
+func (bsm *BaseModel) OnBeforeSave(ctx context.Context, model interface{}) (err error) {
 	return
 }
 
-func (bsm *BaseModel) AfterSave(ctx context.Context, model interface{}, diff []*DiffAttr) (err error) {
+func (bsm *BaseModel) OnAfterSave(ctx context.Context, model interface{}, diff []*DiffAttr) (err error) {
 	return
 }
 
-func (bsm *BaseModel) BeforeCreate(ctx context.Context, model interface{}) (err error) {
+func (bsm *BaseModel) OnBeforeCreate(ctx context.Context, model interface{}) (err error) {
 	return
 }
 
-func (bsm *BaseModel) AfterCreate(ctx context.Context, model interface{}, diff []*DiffAttr) (err error) {
+func (bsm *BaseModel) OnAfterCreate(ctx context.Context, model interface{}, diff []*DiffAttr) (err error) {
 	return
 }
 
-func (bsm *BaseModel) BeforeUpdate(ctx context.Context, model interface{}) (err error) {
+func (bsm *BaseModel) OnBeforeUpdate(ctx context.Context, model interface{}) (err error) {
 	return
 }
 
-func (bsm *BaseModel) AfterUpdate(ctx context.Context, model interface{}, diff []*DiffAttr) (err error) {
+func (bsm *BaseModel) OnAfterUpdate(ctx context.Context, model interface{}, diff []*DiffAttr) (err error) {
 	return
 }
 
-func (bsm *BaseModel) BeforeDelete(ctx context.Context, model interface{}) (err error) {
+func (bsm *BaseModel) OnBeforeDelete(ctx context.Context, model interface{}) (err error) {
 	return
 }
 
-func (bsm *BaseModel) AfterDelete(ctx context.Context, model interface{}) (err error) {
+func (bsm *BaseModel) OnAfterDelete(ctx context.Context, model interface{}) (err error) {
 	return
 }

+ 38 - 43
rest.go

@@ -35,6 +35,12 @@ const (
 	ErrorAccessDeniedMessage = "access denied"
 )
 
+const (
+	restCtxRequest  = "rest-ctx-request"
+	restCtxResponse = "rest-ctx-response"
+	restCtxHttpctx  = "rest-ctx-httpctx"
+)
+
 const (
 	OperatorEqual        = "eq"
 	OperatorGreaterThan  = "gt"
@@ -193,7 +199,7 @@ func (r *Restful) prepareConditions(ctx context.Context, requestCtx *http.Contex
 		}
 	}
 	if activeModel, ok = model.(ActiveModel); ok {
-		if err = activeModel.BeforeQuery(ctx, query); err != nil {
+		if err = activeModel.OnBeforeQuery(ctx, query); err != nil {
 			return
 		}
 	}
@@ -301,7 +307,7 @@ func (r *Restful) prepareConditions(ctx context.Context, requestCtx *http.Contex
 		}
 	}
 	if activeModel, ok = model.(ActiveModel); ok {
-		err = activeModel.AfterQuery(ctx, query)
+		err = activeModel.OnAfterQuery(ctx, query)
 	}
 	if r.opts.Delegate != nil {
 		err = r.opts.Delegate.AfterQuery(ctx, query)
@@ -309,6 +315,17 @@ func (r *Restful) prepareConditions(ctx context.Context, requestCtx *http.Contex
 	return
 }
 
+func (r *Restful) createContext(httpCtx *http.Context) context.Context {
+	ctx := httpCtx.Request().Context()
+	if ctx == nil {
+		ctx = context.Background()
+	}
+	ctx = context.WithValue(ctx, restCtxRequest, httpCtx.Request())
+	ctx = context.WithValue(ctx, restCtxResponse, httpCtx.Response())
+	ctx = context.WithValue(ctx, restCtxHttpctx, httpCtx)
+	return ctx
+}
+
 func (r *Restful) actionIndex(httpCtx *http.Context) (err error) {
 	var (
 		page      int
@@ -320,13 +337,8 @@ func (r *Restful) actionIndex(httpCtx *http.Context) (err error) {
 	if !r.hasScenario(ScenarioList) {
 		return httpCtx.Error(HttpAccessDenied, ErrorAccessDeniedMessage)
 	}
-	ctx := httpCtx.Request().Context()
-	if ctx == nil {
-		ctx = context.Background()
-	}
+	ctx := r.createContext(httpCtx)
 	namespace = httpCtx.ParamValue(NamespaceVariable)
-	ctx = context.WithValue(ctx, NamespaceField, namespace)
-	ctx = context.WithValue(ctx, "request", httpCtx.Request())
 	page, _ = strconv.Atoi(httpCtx.FormValue("page"))
 	pageSize, _ = strconv.Atoi(httpCtx.FormValue("pagesize"))
 	if pageSize <= 0 {
@@ -374,10 +386,7 @@ func (r *Restful) actionCreate(httpCtx *http.Context) (err error) {
 		refModel  reflect.Value
 		diffAttrs []*DiffAttr
 	)
-	ctx := httpCtx.Request().Context()
-	if ctx == nil {
-		ctx = context.Background()
-	}
+	ctx := r.createContext(httpCtx)
 	diffAttrs = make([]*DiffAttr, 0, 10)
 	if !r.hasScenario(ScenarioCreate) {
 		return httpCtx.Error(HttpAccessDenied, ErrorAccessDeniedMessage)
@@ -407,10 +416,10 @@ func (r *Restful) actionCreate(httpCtx *http.Context) (err error) {
 			}
 		}
 		if activeModel, ok := model.(ActiveModel); ok {
-			if errTx = activeModel.BeforeCreate(ctx, model); errTx != nil {
+			if errTx = activeModel.OnBeforeCreate(ctx, model); errTx != nil {
 				return httpCtx.Error(HttpRequestCallbackFailed, errTx.Error())
 			}
-			if errTx = activeModel.BeforeSave(ctx, model); errTx != nil {
+			if errTx = activeModel.OnBeforeSave(ctx, model); errTx != nil {
 				return httpCtx.Error(HttpRequestCallbackFailed, errTx.Error())
 			}
 		}
@@ -428,10 +437,10 @@ func (r *Restful) actionCreate(httpCtx *http.Context) (err error) {
 			})
 		}
 		if activeModel, ok := model.(ActiveModel); ok {
-			if errTx = activeModel.AfterCreate(ctx, model, diffAttrs); errTx != nil {
+			if errTx = activeModel.OnAfterCreate(ctx, model, diffAttrs); errTx != nil {
 				return httpCtx.Error(HttpRequestCallbackFailed, err.Error())
 			}
-			if errTx = activeModel.AfterSave(ctx, model, diffAttrs); errTx != nil {
+			if errTx = activeModel.OnAfterSave(ctx, model, diffAttrs); errTx != nil {
 				return httpCtx.Error(HttpRequestCallbackFailed, err.Error())
 			}
 		}
@@ -474,10 +483,7 @@ func (r *Restful) actionUpdate(httpCtx *http.Context) (err error) {
 		diffs     = make(map[string]interface{})
 		diffAttrs = make([]*DiffAttr, 0)
 	)
-	ctx := httpCtx.Request().Context()
-	if ctx == nil {
-		ctx = context.Background()
-	}
+	ctx := r.createContext(httpCtx)
 	if !r.hasScenario(ScenarioUpdate) {
 		return httpCtx.Error(HttpAccessDenied, ErrorAccessDeniedMessage)
 	}
@@ -514,10 +520,10 @@ func (r *Restful) actionUpdate(httpCtx *http.Context) (err error) {
 			}
 		}
 		if activeModel, ok := model.(ActiveModel); ok {
-			if errTx = activeModel.BeforeUpdate(ctx, model); errTx != nil {
+			if errTx = activeModel.OnBeforeUpdate(ctx, model); errTx != nil {
 				return httpCtx.Error(HttpRequestCallbackFailed, errTx.Error())
 			}
-			if errTx = activeModel.BeforeSave(ctx, model); errTx != nil {
+			if errTx = activeModel.OnBeforeSave(ctx, model); errTx != nil {
 				return httpCtx.Error(HttpRequestCallbackFailed, errTx.Error())
 			}
 		}
@@ -541,10 +547,10 @@ func (r *Restful) actionUpdate(httpCtx *http.Context) (err error) {
 			}
 		}
 		if activeModel, ok := model.(ActiveModel); ok {
-			if errTx = activeModel.AfterUpdate(ctx, model, diffAttrs); errTx != nil {
+			if errTx = activeModel.OnAfterUpdate(ctx, model, diffAttrs); errTx != nil {
 				return httpCtx.Error(HttpRequestCallbackFailed, errTx.Error())
 			}
-			if errTx = activeModel.AfterSave(ctx, model, diffAttrs); errTx != nil {
+			if errTx = activeModel.OnAfterSave(ctx, model, diffAttrs); errTx != nil {
 				return httpCtx.Error(HttpRequestCallbackFailed, errTx.Error())
 			}
 		}
@@ -585,10 +591,7 @@ func (r *Restful) actionDelete(httpCtx *http.Context) (err error) {
 	if !r.hasScenario(ScenarioDelete) {
 		return httpCtx.Error(HttpAccessDenied, ErrorAccessDeniedMessage)
 	}
-	ctx := httpCtx.Request().Context()
-	if ctx == nil {
-		ctx = context.Background()
-	}
+	ctx := r.createContext(httpCtx)
 	idStr := httpCtx.ParamValue("id")
 	namespace = httpCtx.ParamValue(NamespaceVariable)
 	model = reflect.New(r.reflectType).Interface()
@@ -608,7 +611,7 @@ func (r *Restful) actionDelete(httpCtx *http.Context) (err error) {
 			}
 		}
 		if activeModel, ok := model.(ActiveModel); ok {
-			if errTx = activeModel.BeforeDelete(ctx, model); errTx != nil {
+			if errTx = activeModel.OnBeforeDelete(ctx, model); errTx != nil {
 				return httpCtx.Error(HttpRequestCallbackFailed, errTx.Error())
 			}
 		}
@@ -616,7 +619,7 @@ func (r *Restful) actionDelete(httpCtx *http.Context) (err error) {
 			return errTx
 		}
 		if activeModel, ok := model.(ActiveModel); ok {
-			if errTx = activeModel.AfterDelete(ctx, model); errTx != nil {
+			if errTx = activeModel.OnAfterDelete(ctx, model); errTx != nil {
 				return httpCtx.Error(HttpRequestCallbackFailed, errTx.Error())
 			}
 		}
@@ -645,11 +648,7 @@ func (r *Restful) actionExport(httpCtx *http.Context) (err error) {
 	if !r.hasScenario(ScenarioExport) {
 		return httpCtx.Error(HttpAccessDenied, ErrorAccessDeniedMessage)
 	}
-	ctx := httpCtx.Request().Context()
-	if ctx == nil {
-		ctx = context.Background()
-	}
-	ctx = context.WithValue(ctx, NamespaceVariable, namespace)
+	ctx := r.createContext(httpCtx)
 	namespace = httpCtx.ParamValue(NamespaceVariable)
 	sliceValue := reflect.MakeSlice(reflect.SliceOf(r.reflectType), 0, 0)
 	models := reflect.New(sliceValue.Type())
@@ -704,6 +703,7 @@ func (r *Restful) actionView(httpCtx *http.Context) (err error) {
 	if !r.hasScenario(ScenarioView) {
 		return httpCtx.Error(HttpAccessDenied, ErrorAccessDeniedMessage)
 	}
+	ctx := r.createContext(httpCtx)
 	namespace = httpCtx.ParamValue(NamespaceVariable)
 	scenario := httpCtx.FormValue("scenario")
 	idStr := httpCtx.ParamValue("id")
@@ -721,16 +721,11 @@ func (r *Restful) actionView(httpCtx *http.Context) (err error) {
 		//获取指定场景下面的字段进行渲染显示
 		var schemas []*Schema
 		if scenario == "" {
-			schemas = r.opts.LookupFunc(httpCtx.Request().Context(), namespace, r.model.ModuleName(), r.model.TableName(), ScenarioView)
+			schemas = r.opts.LookupFunc(ctx, namespace, r.model.ModuleName(), r.model.TableName(), ScenarioView)
 		} else {
-			schemas = r.opts.LookupFunc(httpCtx.Request().Context(), namespace, r.model.ModuleName(), r.model.TableName(), scenario)
-		}
-		requestCtx := httpCtx.Request().Context()
-		if requestCtx == nil {
-			requestCtx = context.Background()
+			schemas = r.opts.LookupFunc(ctx, namespace, r.model.ModuleName(), r.model.TableName(), scenario)
 		}
-		requestCtx = context.WithValue(requestCtx, NamespaceVariable, namespace)
-		return httpCtx.Success(r.opts.Formatter.formatModel(requestCtx, model, schemas, r.statement))
+		return httpCtx.Success(r.opts.Formatter.formatModel(ctx, model, schemas, r.statement))
 	}
 	return httpCtx.Success(model)
 }

+ 34 - 0
utils.go

@@ -0,0 +1,34 @@
+package rest
+
+import (
+	"context"
+	httppkg "git.nspix.com/golang/micro/gateway/http"
+	"net/http"
+)
+
+func HttpRequestFromContext(ctx context.Context) *http.Request {
+	if v := ctx.Value(restCtxRequest); v != nil {
+		if r, ok := v.(*http.Request); ok {
+			return r
+		}
+	}
+	return nil
+}
+
+func HttpResponseFromContext(ctx context.Context) *http.Response {
+	if v := ctx.Value(restCtxResponse); v != nil {
+		if r, ok := v.(*http.Response); ok {
+			return r
+		}
+	}
+	return nil
+}
+
+func HttpContextFromContext(ctx context.Context) *httppkg.Context {
+	if v := ctx.Value(restCtxHttpctx); v != nil {
+		if r, ok := v.(*httppkg.Context); ok {
+			return r
+		}
+	}
+	return nil
+}