package entity_crud import ( "git.sxidc.com/go-framework/baize/framework/binding" "git.sxidc.com/go-framework/baize/framework/binding/request" "git.sxidc.com/go-framework/baize/framework/binding/response" "git.sxidc.com/go-framework/baize/framework/core/api" "git.sxidc.com/go-framework/baize/framework/core/domain" "git.sxidc.com/go-framework/baize/framework/core/domain/entity" ) // Simple 实体CRUD的Bind参数 // I 为查询相关接口返回的Info类型 type Simple[I any] struct { // 使用的领域实体,注意是Entity类型 Entity entity.Entity // 数据库Schema Schema string // 创建使用的请求参数 CreateJsonBody request.Params // 删除使用的请求参数,注意是WithID类型 DeleteQueryParams request.IDRequestParam // 更新使用的请求参数,注意是WithID类型 UpdateJsonBody request.IDRequestParam // 查询使用的请求参数,注意是Query类型 QueryQueryParams request.QueryRequestParams // 根据ID查询使用的请求参数,注意是WithID类型 GetByIDQueryParams request.IDRequestParam // 可选配置项,通过WithXXX配置 createOptions *CreateOptions deleteOptions *DeleteOptions updateOptions *UpdateOptions queryOptions *QueryOptions[I] queryByIDOptions *QueryByIDOptions[I] } func (simple *Simple[I]) bind(binder *binding.Binder) { createOptions := simple.createOptions deleteOptions := simple.deleteOptions updateOptions := simple.updateOptions queryOptions := simple.queryOptions queryByIDOptions := simple.queryByIDOptions tableName := domain.TableName(simple.Schema, simple.Entity) domainPath := domain.RelativeDomainPath(simple.Entity) // 创建 if !createOptions.disableCreate { if !createOptions.createNeedTx { binding.PostBind[string](binder, &binding.SimpleBindItem[string]{ Path: domainPath + "/create", ResponseFunc: response.SendIDResponse, RequestParams: simple.CreateJsonBody, Objects: []domain.Object{simple.Entity}, ServiceFunc: Create(tableName, createOptions.createCallbacks), }, createOptions.createMiddlewares...) } else { binding.PostBind(binder, &binding.SimpleBindItem[string]{ Path: domainPath + "/create", ResponseFunc: response.SendIDResponse, RequestParams: simple.CreateJsonBody, Objects: []domain.Object{simple.Entity}, ServiceFunc: CreateTx(tableName, createOptions.createCallbacks), }, createOptions.createMiddlewares...) } } // 删除 if !deleteOptions.disableDelete { if !deleteOptions.deleteNeedTx { binding.DeleteBind(binder, &binding.SimpleBindItem[any]{ Path: domainPath + "/delete", ResponseFunc: response.SendMsgResponse, RequestParams: simple.DeleteQueryParams, Objects: []domain.Object{simple.Entity}, ServiceFunc: Delete(tableName, deleteOptions.deleteCallbacks), }, deleteOptions.deleteMiddlewares...) } else { binding.DeleteBind(binder, &binding.SimpleBindItem[any]{ Path: domainPath + "/delete", ResponseFunc: response.SendMsgResponse, RequestParams: simple.DeleteQueryParams, Objects: []domain.Object{simple.Entity}, ServiceFunc: DeleteTx(tableName, deleteOptions.deleteCallbacks), }, deleteOptions.deleteMiddlewares...) } } // 修改 if !updateOptions.disableUpdate { if !updateOptions.updateNeedTx { binding.PutBind(binder, &binding.SimpleBindItem[any]{ Path: domainPath + "/update", ResponseFunc: response.SendMsgResponse, RequestParams: simple.UpdateJsonBody, Objects: []domain.Object{simple.Entity}, ServiceFunc: Update(tableName, updateOptions.updateCallbacks), }, updateOptions.updateMiddlewares...) } else { binding.PutBind(binder, &binding.SimpleBindItem[any]{ Path: domainPath + "/update", ResponseFunc: response.SendMsgResponse, RequestParams: simple.UpdateJsonBody, Objects: []domain.Object{simple.Entity}, ServiceFunc: UpdateTx(tableName, updateOptions.updateCallbacks), }, updateOptions.updateMiddlewares...) } } // 查询 if !queryOptions.disableQuery { binding.GetBind(binder, &binding.SimpleBindItem[response.InfosData[I]]{ Path: domainPath + "/query", ResponseFunc: response.SendInfosResponse[I], RequestParams: simple.QueryQueryParams, Objects: []domain.Object{simple.Entity}, ServiceFunc: Query[I](tableName, queryOptions.queryCallbacks, queryOptions.queryConditionFieldCallback), }, queryOptions.queryMiddlewares...) } // 通过ID获取 if !queryByIDOptions.disableQueryByID { binding.GetBind(binder, &binding.SimpleBindItem[I]{ Path: domainPath + "/get", ResponseFunc: response.SendInfoResponse[I], RequestParams: simple.GetByIDQueryParams, Objects: []domain.Object{simple.Entity}, ServiceFunc: GetByID[I](tableName, queryByIDOptions.getByIDCallbacks), }, queryByIDOptions.getByIDMiddlewares...) } } func BindSimple[I any](binder *binding.Binder, simple *Simple[I], opts ...any) { createOptions := new(CreateOptions) deleteOptions := new(DeleteOptions) updateOptions := new(UpdateOptions) queryOptions := new(QueryOptions[I]) queryByIDOptions := new(QueryByIDOptions[I]) for _, opt := range opts { switch o := opt.(type) { case CreateOption: o(createOptions) case DeleteOption: o(deleteOptions) case UpdateOption: o(updateOptions) case QueryOption[I]: o(queryOptions) case QueryByIDOption[I]: o(queryByIDOptions) default: continue } } simple.createOptions = createOptions simple.deleteOptions = deleteOptions simple.updateOptions = updateOptions simple.queryOptions = queryOptions simple.queryByIDOptions = queryByIDOptions simple.bind(binder) } type CreateOption func(options *CreateOptions) type DeleteOption func(options *DeleteOptions) type UpdateOption func(options *UpdateOptions) type QueryOption[I any] func(options *QueryOptions[I]) type QueryByIDOption[I any] func(options *QueryByIDOptions[I]) type CreateOptions struct { // 关闭创建 disableCreate bool // 创建是否使用事务 createNeedTx bool // 创建回调 createCallbacks *CreateCallbacks // 创建中间件 createMiddlewares []api.Handler } type DeleteOptions struct { // 关闭删除 disableDelete bool // 删除是否使用事务 deleteNeedTx bool // 删除回调 deleteCallbacks *DeleteCallbacks // 删除中间件 deleteMiddlewares []api.Handler } type UpdateOptions struct { // 关闭更新 disableUpdate bool // 更新是否使用事务 updateNeedTx bool // 更新回调 updateCallbacks *UpdateCallbacks // 更新中间件 updateMiddlewares []api.Handler } type QueryOptions[I any] struct { // 关闭查询 disableQuery bool // 查询条件构造回调 queryConditionFieldCallback ConditionFieldCallback // 查询回调 queryCallbacks *QueryCallbacks[I] // 查询中间件 queryMiddlewares []api.Handler } type QueryByIDOptions[I any] struct { // 关闭根据ID查询 disableQueryByID bool // 根据ID查询回调 getByIDCallbacks *QueryByIDCallbacks[I] // 根据ID查询中间件 getByIDMiddlewares []api.Handler } func WithDisableCreate() CreateOption { return func(options *CreateOptions) { options.disableCreate = true } } func WithCreateTx() CreateOption { return func(options *CreateOptions) { options.createNeedTx = true } } func WithCreateCallbacks(callbacks *CreateCallbacks) CreateOption { return func(options *CreateOptions) { options.createCallbacks = callbacks } } func WithCreateMiddlewares(middlewares []api.Handler) CreateOption { return func(options *CreateOptions) { options.createMiddlewares = middlewares } } func WithDisableDelete() DeleteOption { return func(options *DeleteOptions) { options.disableDelete = true } } func WithDeleteTx() DeleteOption { return func(options *DeleteOptions) { options.deleteNeedTx = true } } func WithDeleteCallbacks(callbacks *DeleteCallbacks) DeleteOption { return func(options *DeleteOptions) { options.deleteCallbacks = callbacks } } func WithDeleteMiddlewares(middlewares []api.Handler) DeleteOption { return func(options *DeleteOptions) { options.deleteMiddlewares = middlewares } } func WithDisableUpdate() UpdateOption { return func(options *UpdateOptions) { options.disableUpdate = true } } func WithUpdateTx() UpdateOption { return func(options *UpdateOptions) { options.updateNeedTx = true } } func WithUpdateCallbacks(callbacks *UpdateCallbacks) UpdateOption { return func(options *UpdateOptions) { options.updateCallbacks = callbacks } } func WithUpdateMiddlewares(middlewares []api.Handler) UpdateOption { return func(options *UpdateOptions) { options.updateMiddlewares = middlewares } } func WithDisableQuery[I any]() QueryOption[I] { return func(options *QueryOptions[I]) { options.disableQuery = true } } func WithQueryConditionFieldCallback[I any](callback ConditionFieldCallback) QueryOption[I] { return func(options *QueryOptions[I]) { options.queryConditionFieldCallback = callback } } func WithQueryCallbacks[I any](callbacks *QueryCallbacks[I]) QueryOption[I] { return func(options *QueryOptions[I]) { options.queryCallbacks = callbacks } } func WithQueryMiddlewares[I any](middlewares []api.Handler) QueryOption[I] { return func(options *QueryOptions[I]) { options.queryMiddlewares = middlewares } } func WithDisableQueryByID[I any]() QueryByIDOption[I] { return func(options *QueryByIDOptions[I]) { options.disableQueryByID = true } } func WithGetByIDCallbacks[I any](callbacks *QueryByIDCallbacks[I]) QueryByIDOption[I] { return func(options *QueryByIDOptions[I]) { options.getByIDCallbacks = callbacks } } func WithGetByIDMiddlewares[I any](middlewares []api.Handler) QueryByIDOption[I] { return func(options *QueryByIDOptions[I]) { options.getByIDMiddlewares = middlewares } }