scene

package module
v0.0.0-...-62e58e0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 22, 2024 License: BSD-3-Clause Imports: 24 Imported by: 0

README

后端

  • 方法参数交互式后端定义
  • 支持同一个struct存储
  • 但是不同的行为支持设置不同的struct
  • 每个行为都有一个默认值
  • 一个入口方便加密
{
  "module": {
    "scope": "", // 作用域 例如说 miniapp admin
    "model": "", // 对应的模型 tasks
    "scene": "", // 对应的场景选填 某些action必填
    "action": "", // 对应的操作 getAllModel
  },
  "query": {}, // 这里是map[string]string 也顺理成章了
  "body": "", //这里是json字符串 那么就顺理成章了
  "comm":{} // 这里放置一些通用信息 版本号之类的 map即可
}
scene列表
  • table
  • add
  • edit 等等可以任意

Documentation

Index

Constants

This section is empty.

Variables

View Source
var (
	FuncGetAll = func(ctx iris.Context, self ISceneModelItem) *pipe.RunResp[any] {
		mapper := self.GetMapper()
		if mapper == nil {
			return pipe.NewPipeErrMsg[any]("mapper为空", nil)
		}
		queryParams := pipe.QueryParseConfig{
			UrlParams: mapper.Query,
		}

		if self.GetExtra().MustLastId {
			if _, ok := mapper.Query["_last"]; !ok {
				return pipe.NewPipeErrMsg[any]("必传参数缺失", nil)
			}
		}

		q, err := getQueryParse(ctx, self.GetContextInjectFilter(), self.GetFilterInjects(), queryParams)
		if err != nil {
			return pipe.NewPipeErrMsg[any]("解析注入内容失败", err)
		}

		resp := pipe.QueryParse.Run(ctx, nil, q, nil)
		if resp.Err != nil {
			return pipe.NewPipeErrMsg[any]("解析查询参数失败", resp.Err)
		}
		if resp.Result.Page < 1 {
			resp.Result.Page = 1
		}
		if resp.Result.Page > 100 {
			resp.Result.Page = 100
		}
		if resp.Result.PageSize <= 0 {
			resp.Result.PageSize = 10
		}
		if resp.Result.PageSize > 100 {
			resp.Result.PageSize = 100
		}

		if resp.Result.SortAsc == nil && resp.Result.SortDesc == nil {
			resp.Result.SortDesc = append(resp.Result.SortDesc, "update_at")
		}
		if len(resp.Result.SortAsc) < 1 && len(resp.Result.SortDesc) < 1 {
			resp.Result.SortDesc = append(resp.Result.SortDesc, "update_at")
		}

		var getCount = self.GetExtra().GetCount

		dataResp := pipe.QueryGetData.Run(ctx,
			&pipe.ModelGetDataDep{
				ModelId: self.GetTableName(),
				Query:   resp.Result,
			},
			&pipe.ModelGetData{
				Single:        false,
				GetQueryCount: getCount,
			},
			self.GetDb())
		if dataResp.Err != nil {
			if dataResp.Err != qmgo.ErrNoSuchDocuments {
				return pipe.NewPipeErrMsg[any]("查询出内容失败", resp.Err)
			}
		}

		var result = new(SchemaGetResp)
		result.MongoFacetResult = dataResp.Result
		result.Page = resp.Result.Page
		result.PageSize = resp.Result.PageSize
		result.Filters = resp.Result.QueryParse
		result.Sorts = resp.Result.BaseSort
		return pipe.NewPipeResult[any](result)
	}
	FuncGetSingle = func(ctx iris.Context, self ISceneModelItem) *pipe.RunResp[any] {
		mapper := self.GetMapper()
		if mapper == nil {
			return pipe.NewPipeErrMsg[any]("mapper为空", nil)
		}

		uid := mapper.GetUid()
		if len(uid) < 1 {
			return pipe.NewPipeErrMsg[any]("获取参数uid失败", nil)
		}
		queryParams := pipe.QueryParseConfig{}
		queryParams.InjectAnd = append(queryParams.InjectAnd, &ut.Kov{
			Key:   ut.DefaultUidTag,
			Value: uid,
		})
		q, err := getQueryParse(ctx, self.GetContextInjectFilter(), self.GetFilterInjects(), queryParams)
		if err != nil {
			return pipe.NewPipeErrMsg[any]("解析注入内容失败", err)
		}

		resp := pipe.QueryParse.Run(ctx, nil, q, nil)
		if resp.Err != nil {
			return pipe.NewPipeErrMsg[any]("解析查询参数失败", err)
		}

		dataResp := pipe.QueryGetData.Run(ctx,
			&pipe.ModelGetDataDep{
				ModelId: self.GetTableName(),
				Query:   resp.Result,
			},
			&pipe.ModelGetData{
				Single: true,
			},
			self.GetDb())
		if dataResp.Err != nil {
			return pipe.NewPipeErrMsg[any]("查询出数据失败", dataResp.Err)
		}

		if dataResp.Result.Data == nil {
			return pipe.NewPipeErrMsg[any]("获取数据不存在", nil)
		}

		return pipe.NewPipeResult(dataResp.Result.Data)
	}
	FuncPostAdd = func(ctx iris.Context, self ISceneModelItem) *pipe.RunResp[any] {
		mapper := self.GetMapper()
		if mapper == nil {
			return pipe.NewPipeErrMsg[any]("mapper为空", nil)
		}
		if len(mapper.Body) < 1 {
			return pipe.NewPipeErrMsg[any]("内容体为空", nil)
		}

		injectQuery, err := ParseInject(ctx, self.GetContextInjectFilter()...)
		if err != nil {
			return pipe.NewPipeErrMsg[any]("解析注入数据失败", err)
		}
		injectQuery = append(injectQuery, self.GetFilterInjects()...)
		var injectData = make(map[string]any, len(injectQuery))
		for _, kov := range injectQuery {
			injectData[kov.Key] = kov.Value
		}

		// 把body字符串序列化成map 进行 schema的核验
		var bodyMap = make(map[string]any)
		err = json.Unmarshal([]byte(mapper.Body), &bodyMap)
		if err != nil {
			return pipe.NewPipeErrMsg[any]("解析body参数体失败", err)
		}

		for k, v := range injectData {
			bodyMap[k] = v
		}

		resp := pipe.SchemaValid.Run(ctx, bodyMap, &pipe.SchemaValidConfig{
			Schema: self.GetSchema(),
		}, nil)
		if resp.Err != nil {
			return pipe.NewPipeErr[any](resp.Err)
		}

		// 把字符串序列化成body
		var newInst = self.GetRawNew()
		err = json.Unmarshal([]byte(mapper.Body), newInst)
		if err != nil {
			return pipe.NewPipeErrMsg[any]("解析body参数体失败", err)
		}

		injectResult := pipe.ModelMapper.Run(ctx, newInst, &pipe.ModelCtxMapperPack{
			InjectData: injectData,
		}, nil)
		if injectResult.Err != nil {
			return pipe.NewPipeErrMsg[any]("数据核验失败", injectResult.Err)
		}

		insertResult := pipe.ModelAdd.Run(ctx, injectResult.Result, &pipe.ModelCtxAddConfig{ModelId: self.GetTableName()}, self.GetDb())
		if insertResult.Err != nil {
			return pipe.NewPipeErrMsg[any]("新增失败", insertResult.Err)
		}

		return pipe.NewPipeResult[any](insertResult.Result)

	}
	FuncEdit = func(ctx iris.Context, self ISceneModelItem) *pipe.RunResp[any] {
		mapper := self.GetMapper()
		if mapper == nil {
			return pipe.NewPipeErrMsg[any]("mapper为空", nil)
		}
		if len(mapper.Body) < 1 {
			return pipe.NewPipeErrMsg[any]("内容体为空", nil)

		}
		uid := mapper.GetUid()
		if len(uid) < 1 {
			return pipe.NewPipeErrMsg[any]("获取关键参数失败", nil)
		}

		// 把body序列化成map 好进行diff比对
		var bodyMap = make(map[string]any)
		err := json.Unmarshal([]byte(mapper.Body), &bodyMap)
		if err != nil {
			return pipe.NewPipeErrMsg[any]("解析body参数体失败", err)
		}

		injectQuery, err := ParseInject(ctx, self.GetContextInjectFilter()...)
		if err != nil {
			return pipe.NewPipeErrMsg[any]("解析注入数据失败", err)

		}
		queryFilter := new(ut.QueryFull)
		queryFilter.QueryParse.InsertOrReplaces("and", injectQuery...)
		queryFilter.QueryParse.InsertOrReplaces("and", self.GetFilterInjects()...)

		var params = pipe.ModelPutConfig{
			QueryFilter: queryFilter,
			ModelId:     self.GetTableName(),
			RowId:       uid,
			BodyMap:     bodyMap,
		}
		// 把字符串序列化成body
		var newInst = self.GetRawNew()
		err = json.Unmarshal([]byte(mapper.Body), newInst)
		if err != nil {
			return pipe.NewPipeErrMsg[any]("解析body参数体失败", err)
		}

		resp := pipe.ModelPut.Run(ctx, newInst, &params, self.GetDb())
		if resp.Err != nil {
			return pipe.NewPipeErrMsg[any]("修改失败", resp.Err)
		}
		return pipe.NewPipeResult[any](resp.Result)
	}
	FuncDelete = func(ctx iris.Context, self ISceneModelItem) *pipe.RunResp[any] {
		mapper := self.GetMapper()
		if mapper == nil {
			return pipe.NewPipeErrMsg[any]("mapper为空", nil)
		}
		uid := mapper.GetUid()
		if len(uid) < 1 {
			return pipe.NewPipeErrMsg[any]("获取关键参数失败", nil)
		}

		injectQuery, err := ParseInject(ctx, self.GetContextInjectFilter()...)
		if err != nil {
			return pipe.NewPipeErrMsg[any]("解析注入数据失败", err)
		}
		queryFilter := new(ut.QueryFull)
		if queryFilter.QueryParse == nil {
			queryFilter.QueryParse = new(ut.QueryParse)
		}
		queryFilter.QueryParse.InsertOrReplaces("and", injectQuery...)
		queryFilter.QueryParse.InsertOrReplaces("and", self.GetFilterInjects()...)
		var params = pipe.ModelDelConfig{
			QueryFilter: queryFilter,
			ModelId:     self.GetTableName(),
			RowId:       uid,
		}
		resp := pipe.ModelDel.Run(ctx, nil, &params, self.GetDb())
		if resp.Err != nil {
			return pipe.NewPipeErrMsg[any]("删除失败", resp.Err)
		}
		return pipe.NewPipeResult[any](resp.Result)
	}
)
View Source
var (
	ErrTableNameEmpty = errors.New("表名为空")
)
View Source
var (
	ScenesInst = NewScenes()
)

Functions

func CleanTypeName

func CleanTypeName(typeName string) string

func ParseInject

func ParseInject(ctx iris.Context, contextInject ...ContextValueInject) ([]*ut.Kov, error)

Types

type ContextValueInject

type ContextValueInject struct {
	FromKey    string `json:"from_key,omitempty"`
	ToKey      string `json:"to_key,omitempty"`
	AllowEmpty bool   `json:"allow_empty,omitempty"`
}

type Crud

type Crud struct {
	// contains filtered or unexported fields
}

func NewCrud

func NewCrud(db *qmgo.Database, tableName string, inputStruct any) *Crud

func (*Crud) Add

func (c *Crud) Add() ISceneModelItem

func (*Crud) ContextInjectToBody

func (c *Crud) ContextInjectToBody() []ContextValueInject

func (*Crud) ContextInjectToFilter

func (c *Crud) ContextInjectToFilter() []ContextValueInject

func (*Crud) Delete

func (c *Crud) Delete() ISceneModelItem

func (*Crud) Edit

func (c *Crud) Edit() ISceneModelItem

func (*Crud) GetAll

func (c *Crud) GetAll() ISceneModelItem

func (*Crud) GetCount

func (c *Crud) GetCount() bool

func (*Crud) GetSingle

func (c *Crud) GetSingle() ISceneModelItem

func (*Crud) InjectsToBody

func (c *Crud) InjectsToBody() []*ut.Kov

func (*Crud) InjectsToFilter

func (c *Crud) InjectsToFilter() []*ut.Kov

func (*Crud) MustLastId

func (c *Crud) MustLastId() bool

func (*Crud) RegistryToManager

func (c *Crud) RegistryToManager(m IScenes, scope string, model string) error

func (*Crud) SetAdd

func (c *Crud) SetAdd(add ISceneModelItem)

func (*Crud) SetContextInjectToBody

func (c *Crud) SetContextInjectToBody(contextInjectToBody []ContextValueInject)

func (*Crud) SetContextInjectToFilter

func (c *Crud) SetContextInjectToFilter(contextInjectToFilter []ContextValueInject)

func (*Crud) SetDelete

func (c *Crud) SetDelete(delete ISceneModelItem)

func (*Crud) SetEdit

func (c *Crud) SetEdit(edit ISceneModelItem)

func (*Crud) SetGetAll

func (c *Crud) SetGetAll(getAll ISceneModelItem)

func (*Crud) SetGetCount

func (c *Crud) SetGetCount(getCount bool)

func (*Crud) SetGetSingle

func (c *Crud) SetGetSingle(getSingle ISceneModelItem)

func (*Crud) SetInjectsToBody

func (c *Crud) SetInjectsToBody(injectsToBody []*ut.Kov)

func (*Crud) SetInjectsToFilter

func (c *Crud) SetInjectsToFilter(injectsToFilter []*ut.Kov)

func (*Crud) SetMustLastId

func (c *Crud) SetMustLastId(mustLastId bool)

type ISceneModelItem

type ISceneModelItem interface {
	SetRaw(raw any)
	GetRaw() any
	GetRawNew() any

	GetDb() *qmgo.Database
	SetDb(newDb *qmgo.Database)

	GetTableName() string
	SetTableName(newTableName string)

	SetSchema(newStruct any)
	GetSchema() *jsonschema.Schema

	GetMapper() *RequestData
	SetMapper(mapper *RequestData)

	Clone() ISceneModelItem

	GetExtra() *ItemExtra
	SetExtra(newExtra *ItemExtra)

	SetContextInjectFilter(injects []ContextValueInject)
	AddContextInjectFilter(injects ...ContextValueInject)
	GetContextInjectFilter() []ContextValueInject

	SetFilterInjects(injects []*ut.Kov)
	GetFilterInjects() []*ut.Kov
	AddFilterInject(injects ...*ut.Kov)

	SetHandler(ItemHandler)
	GetHandler() ItemHandler
}

func NewAddItem

func NewAddItem(db *qmgo.Database, tableName string, inputStruct any, contextInjectToBody []ContextValueInject, injectsToBody []*ut.Kov) (ISceneModelItem, error)

func NewDeleteItem

func NewDeleteItem(db *qmgo.Database, tableName string, inputStruct any, contextInjectToFilter []ContextValueInject, injectsToFilter []*ut.Kov) (ISceneModelItem, error)

func NewEditItem

func NewEditItem(db *qmgo.Database, tableName string, inputStruct any, contextInjectToFilter []ContextValueInject, injectsToFilter []*ut.Kov) (ISceneModelItem, error)

func NewGetAllItem

func NewGetAllItem(db *qmgo.Database, tableName string, inputStruct any, contextInjectToFilter []ContextValueInject, injectsToFilter []*ut.Kov, getCount bool, mustLastId bool) (ISceneModelItem, error)

func NewGetSingleItem

func NewGetSingleItem(db *qmgo.Database, tableName string, inputStruct any, contextInjectToFilter []ContextValueInject, injectsToFilter []*ut.Kov) (ISceneModelItem, error)

func NewItem

func NewItem(db *qmgo.Database, tableName string, inputStruct any, f ItemHandler) (ISceneModelItem, error)

type IScenes

type IScenes interface {
	GetPrefix() string
	SetPrefix(prefix string)
	SetParty(party iris.Party)
	GetParty() iris.Party

	GetCbcSign() bool
	SetCbcSign(iv []byte)
	GetCbcIv() []byte

	Decrypt(cipherText string) ([]byte, error)
	Encrypt(plainText []byte) (string, error)

	AddPreHandler(handler ...ScenesHandler)
	GetPreHandler() []ScenesHandler
	AddAfterHandler(handler ...ScenesHandler)
	GetAfterHandler() []ScenesHandler

	RegistryRouter(party iris.Party, prefix string)
	ParseRequest() iris.Handler

	GetItem(scope string, model string, scene string) (*ScenesOptions, bool)
	GetScope(scope string) []*ScenesItem
	GetModel(scope string, model string) []*ScenesItem
	RegistryItem(scope string, model string, scene string, item ISceneModelItem) error
	AddItemRate(scope string, model string, scene string, redisClient rueidiscompat.Cmdable, period time.Duration, maxCount int, interfaceKey string, keyFunc ScenesRateKeyFunc) error
}

func NewScenes

func NewScenes() IScenes

type Item

type Item struct {
	// contains filtered or unexported fields
}

func (*Item) AddContextInjectFilter

func (i *Item) AddContextInjectFilter(injects ...ContextValueInject)

func (*Item) AddFilterInject

func (i *Item) AddFilterInject(injects ...*ut.Kov)

func (*Item) Clone

func (i *Item) Clone() ISceneModelItem

func (*Item) GetContextInjectFilter

func (i *Item) GetContextInjectFilter() []ContextValueInject

func (*Item) GetDb

func (i *Item) GetDb() *qmgo.Database

func (*Item) GetExtra

func (i *Item) GetExtra() *ItemExtra

func (*Item) GetFilterInjects

func (i *Item) GetFilterInjects() []*ut.Kov

func (*Item) GetHandler

func (i *Item) GetHandler() ItemHandler

func (*Item) GetMapper

func (i *Item) GetMapper() *RequestData

func (*Item) GetRaw

func (i *Item) GetRaw() any

func (*Item) GetRawNew

func (i *Item) GetRawNew() any

func (*Item) GetSchema

func (i *Item) GetSchema() *jsonschema.Schema

func (*Item) GetTableName

func (i *Item) GetTableName() string

func (*Item) SetContextInjectFilter

func (i *Item) SetContextInjectFilter(injects []ContextValueInject)

func (*Item) SetDb

func (i *Item) SetDb(newDb *qmgo.Database)

func (*Item) SetExtra

func (i *Item) SetExtra(newExtra *ItemExtra)

func (*Item) SetFilterInjects

func (i *Item) SetFilterInjects(injects []*ut.Kov)

func (*Item) SetHandler

func (i *Item) SetHandler(f ItemHandler)

func (*Item) SetMapper

func (i *Item) SetMapper(mapper *RequestData)

func (*Item) SetRaw

func (i *Item) SetRaw(raw any)

func (*Item) SetSchema

func (i *Item) SetSchema(newStruct any)

func (*Item) SetTableName

func (i *Item) SetTableName(newTableName string)

type ItemExtra

type ItemExtra struct {
	GetCount   bool
	MustLastId bool
}

type ItemHandler

type ItemHandler func(ctx iris.Context, self ISceneModelItem) *pipe.RunResp[any]

type ModelInfo

type ModelInfo struct {
	Group     string `json:"group,omitempty"`      // 组名
	Priority  int    `json:"priority,omitempty"`   // 在组下显示的优先级 越大越优先
	TableName string `json:"table_name,omitempty"` // 表名
	UniqueId  string `json:"unique_id,omitempty"`  // 唯一ID 默认生成sonyflakeId
	PathId    string `json:"path_id,omitempty"`    // 路径ID 默认取UniqueId 在加入backend时会自动修改
	RawName   string `json:"raw_name,omitempty"`   // 原始名称
	Alias     string `json:"alias,omitempty"`      // 别名 中文名
}

type RateLimiter

type RateLimiter struct {
	// contains filtered or unexported fields
}

RateLimiter 基于redis的滑窗限速带加入黑名单功能 默认黑名单时间为 黑名单次数*滑窗时间周期*2

func NewRateLimiter

func NewRateLimiter(redisClient rueidiscompat.Cmdable, period time.Duration, maxCount int, interfaceKey string) *RateLimiter

NewRateLimiter 初始化

func (*RateLimiter) Allow

func (rl *RateLimiter) Allow(ctx context.Context, identifier string) (bool, error)

Allow 检查请求是否被允许

type RequestData

type RequestData struct {
	Module RequestModule     `json:"module"`
	Query  map[string]string `json:"query"` // 查询参数 跟解析url参数一样
	Body   string            `json:"body"`  // 这里是json字符串 需要序列化
	Comm   map[string]string `json:"comm"`  // 这里放置一些通用信息 版本号之类的 map即可
}

func (*RequestData) GetUid

func (c *RequestData) GetUid() string

type RequestModule

type RequestModule struct {
	Scope  string `json:"scope"`  // 作用域 例如说 miniapp admin
	Model  string `json:"model"`  // 对应的模型 tasks
	Scene  string `json:"scene"`  // 对应的场景
	Action string `json:"action"` // 对应的操作 getAllModel
}

type Scenes

type Scenes struct {
	// contains filtered or unexported fields
}

func (*Scenes) AddAfterHandler

func (m *Scenes) AddAfterHandler(handler ...ScenesHandler)

func (*Scenes) AddItemRate

func (m *Scenes) AddItemRate(scope string, model string, scene string, redisClient rueidiscompat.Cmdable, period time.Duration, maxCount int, interfaceKey string, keyFunc ScenesRateKeyFunc) error

func (*Scenes) AddPreHandler

func (m *Scenes) AddPreHandler(handler ...ScenesHandler)

func (*Scenes) Decrypt

func (m *Scenes) Decrypt(cipherText string) ([]byte, error)

func (*Scenes) Encrypt

func (m *Scenes) Encrypt(plainText []byte) (string, error)

func (*Scenes) GetAfterHandler

func (m *Scenes) GetAfterHandler() []ScenesHandler

func (*Scenes) GetCbcIv

func (m *Scenes) GetCbcIv() []byte

func (*Scenes) GetCbcSign

func (m *Scenes) GetCbcSign() bool

func (*Scenes) GetItem

func (m *Scenes) GetItem(scope string, model string, scene string) (*ScenesOptions, bool)

func (*Scenes) GetModel

func (m *Scenes) GetModel(scope string, model string) []*ScenesItem

func (*Scenes) GetParty

func (m *Scenes) GetParty() iris.Party

func (*Scenes) GetPreHandler

func (m *Scenes) GetPreHandler() []ScenesHandler

func (*Scenes) GetPrefix

func (m *Scenes) GetPrefix() string

func (*Scenes) GetScope

func (m *Scenes) GetScope(scope string) []*ScenesItem

func (*Scenes) ParseRequest

func (m *Scenes) ParseRequest() iris.Handler

func (*Scenes) RegistryItem

func (m *Scenes) RegistryItem(scope string, model string, scene string, item ISceneModelItem) error

func (*Scenes) RegistryRouter

func (m *Scenes) RegistryRouter(party iris.Party, prefix string)

func (*Scenes) SetCbcSign

func (m *Scenes) SetCbcSign(iv []byte)

func (*Scenes) SetParty

func (m *Scenes) SetParty(party iris.Party)

func (*Scenes) SetPrefix

func (m *Scenes) SetPrefix(prefix string)

type ScenesHandler

type ScenesHandler func(ctx iris.Context, mapper *RequestData) *pipe.RunResp[any]

type ScenesItem

type ScenesItem struct {
	// contains filtered or unexported fields
}

type ScenesOptions

type ScenesOptions struct {
	Scene ISceneModelItem
	// contains filtered or unexported fields
}

type ScenesRateKeyFunc

type ScenesRateKeyFunc func(ctx iris.Context) (string, error)

func RateIpAndUaFunc

func RateIpAndUaFunc() ScenesRateKeyFunc

func RateIpKeyFunc

func RateIpKeyFunc() ScenesRateKeyFunc

func RateUserAgentFunc

func RateUserAgentFunc() ScenesRateKeyFunc

func RateUserIdAndIpAndUaFunc

func RateUserIdAndIpAndUaFunc(contextUserId string) ScenesRateKeyFunc

func RateUserIdKeyFunc

func RateUserIdKeyFunc(contextUserId string) ScenesRateKeyFunc

type SchemaGetResp

type SchemaGetResp struct {
	*ut.MongoFacetResult
	Page     int64          `json:"page,omitempty"`
	PageSize int64          `json:"page_size,omitempty"`
	Sorts    *ut.BaseSort   `json:"sorts,omitempty"`
	Filters  *ut.QueryParse `json:"filters,omitempty"`
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL