package gwtools import ( "git.sxidc.com/go-framework/baize/framework/core/api" "git.sxidc.com/go-framework/baize/framework/gateway" "git.sxidc.com/go-tools/utils/http_client" "git.sxidc.com/go-tools/utils/template" "github.com/iancoleman/strcase" "net/http" ) func ValueObjectCRUD(builder *gateway.Builder, params *ValueObjectCRUDParams, opts ...any) { globalOptions := new(ValueObjectCRUDGlobalOptions) createOptions := new(ValueObjectCRUDCreateOptions) deleteOptions := new(ValueObjectCRUDDeleteOptions) queryOptions := new(ValueObjectCRUDQueryOptions) for _, opt := range opts { switch o := opt.(type) { case ValueObjectCRUDGlobalOption: o(globalOptions) case ValueObjectCRUDCreateOption: o(createOptions) case ValueObjectCRUDDeleteOption: o(deleteOptions) case ValueObjectCRUDQueryOption: o(queryOptions) default: continue } } params.globalOptions = globalOptions params.createOptions = createOptions params.deleteOptions = deleteOptions params.queryOptions = queryOptions params.crud(builder) } type ValueObjectCRUDParams struct { // 除去后缀的服务URL,如http://localhost:8080/example/api/v1 ServiceVersionedUrl string // 领域名称 DomainCamelName string // 可选配置项,通过WithXXX配置 globalOptions *ValueObjectCRUDGlobalOptions createOptions *ValueObjectCRUDCreateOptions deleteOptions *ValueObjectCRUDDeleteOptions queryOptions *ValueObjectCRUDQueryOptions } func (params *ValueObjectCRUDParams) crud(builder *gateway.Builder) { globalOptions := params.globalOptions createOptions := params.createOptions deleteOptions := params.deleteOptions queryOptions := params.queryOptions domainPath := "/" + strcase.ToLowerCamel(template.Id(params.DomainCamelName)) // 创建 if !createOptions.disable { createMiddlewares := append(globalOptions.middlewares, createOptions.middlewares...) copyBuilder := builder.Url(http.MethodPost, domainPath+"/create") postRequestCallback := func(c *api.Context, response *http_client.Response, historyRequests []gateway.BuilderRequest, resultMap map[string]any) error { if createOptions.afterBuilderCallback != nil { innerBuilder, err := createOptions.afterBuilderCallback(copyBuilder, c, historyRequests, resultMap) if err != nil { return err } copyBuilder = innerBuilder } return nil } copyBuilder.Post(gateway.NewPostRequest(params.ServiceVersionedUrl+domainPath+"/create", gateway.PostRequestWithBodyForm(func(c *api.Context, historyRequests []gateway.BuilderRequest, resultMap map[string]any) (any, error) { _, err := gateway.FormJsonBodyWithTenantIDAndUserIDFunc("tenantId", "createUserId")(c, historyRequests, resultMap) if err != nil { return nil, err } if createOptions.beforeBuilderCallback != nil { innerBuilder, err := createOptions.beforeBuilderCallback(copyBuilder, c, historyRequests, resultMap) if err != nil { return nil, err } copyBuilder = innerBuilder } jsonBody, err := c.GetJsonBody() if err != nil { return nil, err } return jsonBody.Map(), nil })), postRequestCallback). Build(createMiddlewares...) } // 删除 if !deleteOptions.disable { deleteMiddlewares := append(globalOptions.middlewares, deleteOptions.middlewares...) copyBuilder := builder.Url(http.MethodPost, domainPath+"/delete") formBodyOption := gateway.PostRequestWithBodyForm(func(c *api.Context, historyRequests []gateway.BuilderRequest, resultMap map[string]any) (any, error) { jsonBody, err := c.GetJsonBody() if err != nil { return nil, err } if deleteOptions.beforeBuilderCallback != nil { innerBuilder, err := deleteOptions.beforeBuilderCallback(copyBuilder, c, historyRequests, resultMap) if err != nil { return nil, err } copyBuilder = innerBuilder } return jsonBody.Map(), nil }) postRequestCallback := func(c *api.Context, response *http_client.Response, historyRequests []gateway.BuilderRequest, resultMap map[string]any) error { if deleteOptions.afterBuilderCallback != nil { innerBuilder, err := deleteOptions.afterBuilderCallback(copyBuilder, c, historyRequests, resultMap) if err != nil { return err } copyBuilder = innerBuilder } return nil } copyBuilder. Post(gateway.NewPostRequest(params.ServiceVersionedUrl+domainPath+"/delete", formBodyOption), postRequestCallback). Build(deleteMiddlewares...) } // 查询 if !queryOptions.disable { queryMiddlewares := append(globalOptions.middlewares, queryOptions.middlewares...) copyBuilder := builder.Url(http.MethodGet, domainPath+"/query") getRequestCallback := func(c *api.Context, response *http_client.Response, historyRequests []gateway.BuilderRequest, resultMap map[string]any) error { if queryOptions.afterBuilderCallback != nil { innerBuilder, err := queryOptions.afterBuilderCallback(copyBuilder, c, historyRequests, resultMap) if err != nil { return err } copyBuilder = innerBuilder } return nil } copyBuilder.Get(gateway.NewGetRequest(params.ServiceVersionedUrl+domainPath+"/query", gateway.GetRequestWithQueryParamsForm(func(c *api.Context, historyRequests []gateway.BuilderRequest, resultMap map[string]any) (map[string]string, error) { _, err := gateway.FormQueryParamsWithTenantIDAndUserIDFunc("tenantId", "")(c, historyRequests, resultMap) if err != nil { return nil, err } if queryOptions.beforeBuilderCallback != nil { innerBuilder, err := queryOptions.beforeBuilderCallback(copyBuilder, c, historyRequests, resultMap) if err != nil { return nil, err } copyBuilder = innerBuilder } return c.GetQueryParams().Map(), nil })), getRequestCallback). Build(queryMiddlewares...) } } type ValueObjectCRUDBuilderCallback func(builder *gateway.Builder, c *api.Context, historyRequests []gateway.BuilderRequest, resultMap map[string]any) (*gateway.Builder, error) type ValueObjectCRUDGlobalOption func(options *ValueObjectCRUDGlobalOptions) type ValueObjectCRUDCreateOption func(options *ValueObjectCRUDCreateOptions) type ValueObjectCRUDDeleteOption func(options *ValueObjectCRUDDeleteOptions) type ValueObjectCRUDQueryOption func(options *ValueObjectCRUDQueryOptions) type ValueObjectCRUDGlobalOptions struct { middlewares []api.Handler } type ValueObjectCRUDCreateOptions struct { // 关闭创建 disable bool // 创建请求前回调 beforeBuilderCallback ValueObjectCRUDBuilderCallback // 创建请求后回调 afterBuilderCallback ValueObjectCRUDBuilderCallback // 创建中间件 middlewares []api.Handler } type ValueObjectCRUDDeleteOptions struct { // 关闭删除 disable bool // 删除请求前回调 beforeBuilderCallback ValueObjectCRUDBuilderCallback // 删除请求后回调 afterBuilderCallback ValueObjectCRUDBuilderCallback // 删除中间件 middlewares []api.Handler } type ValueObjectCRUDQueryOptions struct { // 关闭查询 disable bool // 查询请求前回调 beforeBuilderCallback ValueObjectCRUDBuilderCallback // 查询请求后回调 afterBuilderCallback ValueObjectCRUDBuilderCallback // 查询中间件 middlewares []api.Handler } func WithValueObjectCRUDGlobalMiddlewares(middlewares ...api.Handler) ValueObjectCRUDGlobalOption { return func(options *ValueObjectCRUDGlobalOptions) { options.middlewares = middlewares } } func WithValueObjectCRUDBeforeCreateBuilderCallback(callbacks ValueObjectCRUDBuilderCallback) ValueObjectCRUDCreateOption { return func(options *ValueObjectCRUDCreateOptions) { options.beforeBuilderCallback = callbacks } } func WithValueObjectCRUDAfterCreateBuilderCallback(callbacks ValueObjectCRUDBuilderCallback) ValueObjectCRUDCreateOption { return func(options *ValueObjectCRUDCreateOptions) { options.afterBuilderCallback = callbacks } } func WithValueObjectCRUDCreateMiddlewares(middlewares []api.Handler) ValueObjectCRUDCreateOption { return func(options *ValueObjectCRUDCreateOptions) { options.middlewares = middlewares } } func WithValueObjectCRUDDisableDelete() ValueObjectCRUDDeleteOption { return func(options *ValueObjectCRUDDeleteOptions) { options.disable = true } } func WithValueObjectCRUDBeforeDeleteBuilderCallback(callbacks ValueObjectCRUDBuilderCallback) ValueObjectCRUDDeleteOption { return func(options *ValueObjectCRUDDeleteOptions) { options.beforeBuilderCallback = callbacks } } func WithValueObjectCRUDAfterDeleteBuilderCallback(callbacks ValueObjectCRUDBuilderCallback) ValueObjectCRUDDeleteOption { return func(options *ValueObjectCRUDDeleteOptions) { options.afterBuilderCallback = callbacks } } func WithValueObjectCRUDDeleteMiddlewares(middlewares []api.Handler) ValueObjectCRUDDeleteOption { return func(options *ValueObjectCRUDDeleteOptions) { options.middlewares = middlewares } } func WithValueObjectCRUDDisableQuery() ValueObjectCRUDQueryOption { return func(options *ValueObjectCRUDQueryOptions) { options.disable = true } } func WithValueObjectCRUDBeforeQueryBuilderCallback(callbacks ValueObjectCRUDBuilderCallback) ValueObjectCRUDQueryOption { return func(options *ValueObjectCRUDQueryOptions) { options.beforeBuilderCallback = callbacks } } func WithValueObjectCRUDAfterQueryBuilderCallback(callbacks ValueObjectCRUDBuilderCallback) ValueObjectCRUDQueryOption { return func(options *ValueObjectCRUDQueryOptions) { options.afterBuilderCallback = callbacks } } func WithValueObjectCRUDQueryMiddlewares(middlewares []api.Handler) ValueObjectCRUDQueryOption { return func(options *ValueObjectCRUDQueryOptions) { options.middlewares = middlewares } }