| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483 |
- 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 EntityCRUD(builder *gateway.Builder, params *EntityCRUDParams, opts ...any) {
- globalOptions := new(EntityCRUDGlobalOptions)
- createOptions := new(EntityCRUDCreateOptions)
- deleteOptions := new(EntityCRUDDeleteOptions)
- updateOptions := new(EntityCRUDUpdateOptions)
- queryOptions := new(EntityCRUDQueryOptions)
- getByIDOptions := new(EntityCRUDGetByIDOptions)
- for _, opt := range opts {
- switch o := opt.(type) {
- case EntityCRUDGlobalOption:
- o(globalOptions)
- case EntityCRUDCreateOption:
- o(createOptions)
- case EntityCRUDDeleteOption:
- o(deleteOptions)
- case EntityCRUDUpdateOption:
- o(updateOptions)
- case EntityCRUDQueryOption:
- o(queryOptions)
- case EntityCRUDGetByIDOption:
- o(getByIDOptions)
- default:
- continue
- }
- }
- params.globalOptions = globalOptions
- params.createOptions = createOptions
- params.deleteOptions = deleteOptions
- params.updateOptions = updateOptions
- params.queryOptions = queryOptions
- params.getByIDOptions = getByIDOptions
- params.crud(builder)
- }
- type EntityCRUDParams struct {
- // 除去后缀的服务URL,如http://localhost:8080/example/api/v1
- ServiceVersionedUrl string
- // 领域名称
- DomainCamelName string
- // 可选配置项,通过WithXXX配置
- globalOptions *EntityCRUDGlobalOptions
- createOptions *EntityCRUDCreateOptions
- deleteOptions *EntityCRUDDeleteOptions
- updateOptions *EntityCRUDUpdateOptions
- queryOptions *EntityCRUDQueryOptions
- getByIDOptions *EntityCRUDGetByIDOptions
- }
- func (params *EntityCRUDParams) crud(builder *gateway.Builder) {
- globalOptions := params.globalOptions
- createOptions := params.createOptions
- deleteOptions := params.deleteOptions
- updateOptions := params.updateOptions
- queryOptions := params.queryOptions
- getByIDOptions := params.getByIDOptions
- 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.MethodDelete, domainPath+"/delete")
- queryParamsFormOption := gateway.DeleteRequestWithQueryParamsForm(
- func(c *api.Context, historyRequests []gateway.BuilderRequest, resultMap map[string]any) (map[string]string, error) {
- if deleteOptions.beforeBuilderCallback != nil {
- innerBuilder, err := deleteOptions.beforeBuilderCallback(copyBuilder, c, historyRequests, resultMap)
- if err != nil {
- return nil, err
- }
- copyBuilder = innerBuilder
- }
- return c.GetQueryParams().Map(), nil
- })
- deleteRequestCallback := 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.
- Delete(gateway.NewDeleteRequest(params.ServiceVersionedUrl+domainPath+"/delete", queryParamsFormOption), deleteRequestCallback).
- Build(deleteMiddlewares...)
- }
- // 修改
- if !updateOptions.disable {
- updateMiddlewares := append(globalOptions.middlewares, updateOptions.middlewares...)
- copyBuilder := builder.Url(http.MethodPut, domainPath+"/update")
- putRequestCallback := func(c *api.Context, response *http_client.Response, historyRequests []gateway.BuilderRequest, resultMap map[string]any) error {
- if updateOptions.afterBuilderCallback != nil {
- innerBuilder, err := updateOptions.afterBuilderCallback(copyBuilder, c, historyRequests, resultMap)
- if err != nil {
- return err
- }
- copyBuilder = innerBuilder
- }
- return nil
- }
- copyBuilder.Put(gateway.NewPutRequest(params.ServiceVersionedUrl+domainPath+"/update",
- gateway.PutRequestWithBodyForm(func(c *api.Context, historyRequests []gateway.BuilderRequest, resultMap map[string]any) (any, error) {
- _, err := gateway.FormJsonBodyWithTenantIDAndUserIDFunc("", "updateUserId")(c, historyRequests, resultMap)
- if err != nil {
- return nil, err
- }
- if updateOptions.beforeBuilderCallback != nil {
- innerBuilder, err := updateOptions.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
- })), putRequestCallback).
- Build(updateMiddlewares...)
- }
- // 查询
- 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...)
- }
- // 通过ID获取
- if !getByIDOptions.disable {
- getByIDMiddlewares := append(globalOptions.middlewares, getByIDOptions.middlewares...)
- copyBuilder := builder.Url(http.MethodGet, domainPath+"/get")
- formQueryParamsOption := gateway.GetRequestWithQueryParamsForm(func(c *api.Context, historyRequests []gateway.BuilderRequest, resultMap map[string]any) (map[string]string, error) {
- if getByIDOptions.beforeBuilderCallback != nil {
- innerBuilder, err := getByIDOptions.beforeBuilderCallback(copyBuilder, c, historyRequests, resultMap)
- if err != nil {
- return nil, err
- }
- copyBuilder = innerBuilder
- }
- return c.GetQueryParams().Map(), nil
- })
- getRequestCallback := func(c *api.Context, response *http_client.Response, historyRequests []gateway.BuilderRequest, resultMap map[string]any) error {
- if getByIDOptions.afterBuilderCallback != nil {
- innerBuilder, err := getByIDOptions.afterBuilderCallback(copyBuilder, c, historyRequests, resultMap)
- if err != nil {
- return err
- }
- copyBuilder = innerBuilder
- }
- return nil
- }
- copyBuilder.
- Get(gateway.NewGetRequest(params.ServiceVersionedUrl+domainPath+"/get", formQueryParamsOption), getRequestCallback).
- Build(getByIDMiddlewares...)
- }
- }
- type EntityCRUDBuilderCallback func(builder *gateway.Builder, c *api.Context, historyRequests []gateway.BuilderRequest, resultMap map[string]any) (*gateway.Builder, error)
- type EntityCRUDGlobalOption func(options *EntityCRUDGlobalOptions)
- type EntityCRUDCreateOption func(options *EntityCRUDCreateOptions)
- type EntityCRUDDeleteOption func(options *EntityCRUDDeleteOptions)
- type EntityCRUDUpdateOption func(options *EntityCRUDUpdateOptions)
- type EntityCRUDQueryOption func(options *EntityCRUDQueryOptions)
- type EntityCRUDGetByIDOption func(options *EntityCRUDGetByIDOptions)
- type EntityCRUDGlobalOptions struct {
- middlewares []api.Handler
- }
- type EntityCRUDCreateOptions struct {
- // 关闭创建
- disable bool
- // 创建请求前回调
- beforeBuilderCallback EntityCRUDBuilderCallback
- // 创建请求后回调
- afterBuilderCallback EntityCRUDBuilderCallback
- // 创建中间件
- middlewares []api.Handler
- }
- type EntityCRUDDeleteOptions struct {
- // 关闭删除
- disable bool
- // 删除请求前回调
- beforeBuilderCallback EntityCRUDBuilderCallback
- // 删除请求后回调
- afterBuilderCallback EntityCRUDBuilderCallback
- // 删除中间件
- middlewares []api.Handler
- }
- type EntityCRUDUpdateOptions struct {
- // 关闭更新
- disable bool
- // 更新请求前回调
- beforeBuilderCallback EntityCRUDBuilderCallback
- // 更新请求后回调
- afterBuilderCallback EntityCRUDBuilderCallback
- // 更新中间件
- middlewares []api.Handler
- }
- type EntityCRUDQueryOptions struct {
- // 关闭查询
- disable bool
- // 查询请求前回调
- beforeBuilderCallback EntityCRUDBuilderCallback
- // 查询请求后回调
- afterBuilderCallback EntityCRUDBuilderCallback
- // 查询中间件
- middlewares []api.Handler
- }
- type EntityCRUDGetByIDOptions struct {
- // 关闭根据ID查询
- disable bool
- // 根据ID请求前回调
- beforeBuilderCallback EntityCRUDBuilderCallback
- // 根据ID请求后回调
- afterBuilderCallback EntityCRUDBuilderCallback
- // 根据ID查询中间件
- middlewares []api.Handler
- }
- func WithEntityCRUDGlobalMiddlewares(middlewares ...api.Handler) EntityCRUDGlobalOption {
- return func(options *EntityCRUDGlobalOptions) {
- options.middlewares = middlewares
- }
- }
- func WithEntityCRUDBeforeCreateBuilderCallback(callbacks EntityCRUDBuilderCallback) EntityCRUDCreateOption {
- return func(options *EntityCRUDCreateOptions) {
- options.beforeBuilderCallback = callbacks
- }
- }
- func WithEntityCRUDAfterCreateBuilderCallback(callbacks EntityCRUDBuilderCallback) EntityCRUDCreateOption {
- return func(options *EntityCRUDCreateOptions) {
- options.afterBuilderCallback = callbacks
- }
- }
- func WithEntityCRUDCreateMiddlewares(middlewares []api.Handler) EntityCRUDCreateOption {
- return func(options *EntityCRUDCreateOptions) {
- options.middlewares = middlewares
- }
- }
- func WithEntityCRUDDisableDelete() EntityCRUDDeleteOption {
- return func(options *EntityCRUDDeleteOptions) {
- options.disable = true
- }
- }
- func WithEntityCRUDBeforeDeleteBuilderCallback(callbacks EntityCRUDBuilderCallback) EntityCRUDDeleteOption {
- return func(options *EntityCRUDDeleteOptions) {
- options.beforeBuilderCallback = callbacks
- }
- }
- func WithEntityCRUDAfterDeleteBuilderCallback(callbacks EntityCRUDBuilderCallback) EntityCRUDDeleteOption {
- return func(options *EntityCRUDDeleteOptions) {
- options.afterBuilderCallback = callbacks
- }
- }
- func WithEntityCRUDDeleteMiddlewares(middlewares []api.Handler) EntityCRUDDeleteOption {
- return func(options *EntityCRUDDeleteOptions) {
- options.middlewares = middlewares
- }
- }
- func WithEntityCRUDDisableUpdate() EntityCRUDUpdateOption {
- return func(options *EntityCRUDUpdateOptions) {
- options.disable = true
- }
- }
- func WithEntityCRUDBeforeUpdateBuilderCallback(callbacks EntityCRUDBuilderCallback) EntityCRUDUpdateOption {
- return func(options *EntityCRUDUpdateOptions) {
- options.beforeBuilderCallback = callbacks
- }
- }
- func WithEntityCRUDAfterUpdateBuilderCallback(callbacks EntityCRUDBuilderCallback) EntityCRUDUpdateOption {
- return func(options *EntityCRUDUpdateOptions) {
- options.afterBuilderCallback = callbacks
- }
- }
- func WithEntityCRUDUpdateMiddlewares(middlewares []api.Handler) EntityCRUDUpdateOption {
- return func(options *EntityCRUDUpdateOptions) {
- options.middlewares = middlewares
- }
- }
- func WithEntityCRUDDisableQuery() EntityCRUDQueryOption {
- return func(options *EntityCRUDQueryOptions) {
- options.disable = true
- }
- }
- func WithEntityCRUDBeforeQueryBuilderCallback(callbacks EntityCRUDBuilderCallback) EntityCRUDQueryOption {
- return func(options *EntityCRUDQueryOptions) {
- options.beforeBuilderCallback = callbacks
- }
- }
- func WithEntityCRUDAfterQueryBuilderCallback(callbacks EntityCRUDBuilderCallback) EntityCRUDQueryOption {
- return func(options *EntityCRUDQueryOptions) {
- options.afterBuilderCallback = callbacks
- }
- }
- func WithEntityCRUDQueryMiddlewares(middlewares []api.Handler) EntityCRUDQueryOption {
- return func(options *EntityCRUDQueryOptions) {
- options.middlewares = middlewares
- }
- }
- func WithEntityCRUDDisableGetByID() EntityCRUDGetByIDOption {
- return func(options *EntityCRUDGetByIDOptions) {
- options.disable = true
- }
- }
- func WithEntityCRUDBeforeGetByIDBuilderCallback(callbacks EntityCRUDBuilderCallback) EntityCRUDGetByIDOption {
- return func(options *EntityCRUDGetByIDOptions) {
- options.beforeBuilderCallback = callbacks
- }
- }
- func WithEntityCRUDAfterGetByIDBuilderCallback(callbacks EntityCRUDBuilderCallback) EntityCRUDGetByIDOption {
- return func(options *EntityCRUDGetByIDOptions) {
- options.afterBuilderCallback = callbacks
- }
- }
- func WithEntityCRUDGetByIDMiddlewares(middlewares []api.Handler) EntityCRUDGetByIDOption {
- return func(options *EntityCRUDGetByIDOptions) {
- options.middlewares = middlewares
- }
- }
|