154 lines
4.0 KiB
Go
154 lines
4.0 KiB
Go
package contracts
|
|
|
|
import (
|
|
"context"
|
|
"reflect"
|
|
|
|
"git.fsdpf.net/go/condition"
|
|
"git.fsdpf.net/go/db"
|
|
"git.fsdpf.net/go/db/exp"
|
|
"git.fsdpf.net/go/reflux"
|
|
"git.fsdpf.net/go/req"
|
|
)
|
|
|
|
type OrmExecute int
|
|
|
|
type RelationType string
|
|
|
|
const (
|
|
OrmQuery OrmExecute = iota
|
|
OrmShow
|
|
OrmStore
|
|
OrmDestroy
|
|
)
|
|
|
|
const (
|
|
OrmHasOne RelationType = "hasOne"
|
|
OrmHasMany RelationType = "hasMany"
|
|
OrmInnerJoin RelationType = "inner"
|
|
OrmLeftJoin RelationType = "left"
|
|
OrmRightJoin RelationType = "right"
|
|
)
|
|
|
|
type ModelDecorator func(Model) Model
|
|
|
|
type Orm interface {
|
|
SetGlobalParams(g req.UserAccessor) Orm
|
|
GetModel(params ...string) Model
|
|
SetRelationModel(m Model) Model
|
|
SetQueryField(qf req.QueryField) error
|
|
SetOrderBy(params []OrderBy) error
|
|
SetCondition(cond *condition.Condition) error
|
|
SetController(ctr OrmController) error
|
|
Controller() reflect.Value
|
|
Execute(OrmExecute) (reflux.R, error)
|
|
Clone(tx *db.TxDatabase) Orm
|
|
Count() int64
|
|
// Exists() bool
|
|
}
|
|
|
|
type Relation interface {
|
|
Parent() Model
|
|
AppendTo(Model)
|
|
Type() RelationType
|
|
SetType(RelationType)
|
|
SetCondition(*condition.Condition) *condition.Condition
|
|
GetCondition() *condition.Condition
|
|
GetRelationResource() string
|
|
GetRelationField() string
|
|
GetRelationForeignKey() string
|
|
}
|
|
|
|
type Join interface {
|
|
Relation
|
|
GetCode() string
|
|
GetResource() req.Resource
|
|
// GetDependencies(items []ResRelation, dependencies ...string) []string
|
|
Inject(dbBuilder *db.SelectDataset, m Model)
|
|
}
|
|
|
|
type Model interface {
|
|
Relation
|
|
condition.TokenValue
|
|
IsDuplicated() bool
|
|
GetCode() string
|
|
GetPrimaryKey() string
|
|
GetQueryFieldsStruct(extends ...reflect.StructField) any
|
|
GetQueryFieldsSliceStruct(fields ...reflect.StructField) any
|
|
GetAttribute() reflux.R
|
|
SetRelationAttribute(string, reflux.R) error
|
|
GetResult() reflux.R
|
|
GetResource() req.Resource
|
|
GetTransaction() *db.TxDatabase
|
|
SetQueryField(...req.QueryField)
|
|
// SetRelationResult(code string, items []reflux.R)
|
|
GetJoinsCode() []string
|
|
SetAuthDB(req.ResAuthDB)
|
|
SetOrderBy(params ...OrderBy) Model
|
|
SetGroupBy(params ...GroupBy) Model
|
|
SetJoin(Join) Model
|
|
SetLimit(uint) Model
|
|
SetOffset(uint) Model
|
|
// SetAttribute(data any) Model
|
|
SetPrimaryKey(string) Model
|
|
SetWithRecursive(QueryWithRecursive) Model
|
|
DelQueryField(string)
|
|
SelectDataset() *db.SelectDataset
|
|
SelectDatasetWithUser(u req.User) *db.SelectDataset
|
|
Query() error
|
|
Store() error
|
|
Destroy() error
|
|
Count() (int64, error)
|
|
// Exists() (bool, error)
|
|
}
|
|
|
|
type OrmController interface {
|
|
AuthDB() req.ResAuthDB
|
|
}
|
|
|
|
type OrderBy interface {
|
|
ToSql() exp.OrderedExpression
|
|
Inject(sd *db.SelectDataset, m Model)
|
|
}
|
|
|
|
type GroupBy interface {
|
|
ToSql() exp.ColumnListExpression
|
|
Inject(sd *db.SelectDataset, m Model)
|
|
}
|
|
|
|
type QueryWithRecursive interface {
|
|
ToQueryBuilder(*db.SelectDataset, Model) (*db.SelectDataset, any)
|
|
ToTreeData([]reflux.R) reflux.R
|
|
}
|
|
|
|
// @title 创建关联模型
|
|
// @param t 关联类型
|
|
// @param m 关联模型
|
|
// @param rResource 链接父模型
|
|
// @param rField 连接父模型字段, 如 xx_id
|
|
// @param rForeignKey 关联外键, 如 id
|
|
type NewOrmRelation func(t RelationType, m Model, rResource, rField, rForeignKey string) Model
|
|
|
|
type NewOrmJoin func(t RelationType, res req.Resource, alias, rResource, rField, rForeignKey string) Join
|
|
|
|
type NewOrmQueryWithRecursive func(pField, cField exp.IdentifierExpression, root any, isWithoutCondition bool, depth uint) QueryWithRecursive
|
|
|
|
type NewOrmOrderBy func(sql db.Expression, direction exp.SortDirection) OrderBy
|
|
|
|
type NewOrmGroupBy func(db.Expression) GroupBy
|
|
|
|
type NewOrmModel func(res req.Resource, code, name string) Model
|
|
|
|
type NewOrm func(res req.Resource, opts ...OrmOption) Orm
|
|
|
|
type GetOrmConditions func(categoryUuid string, opts ...condition.Option) *condition.Condition
|
|
|
|
type GetOrmOrderBy func(categoryUuid string) []OrderBy
|
|
|
|
type GetOrmGroupBy func(categoryUuid string) []GroupBy
|
|
|
|
type OrmOption func(Orm)
|
|
type WithTx func(tx *db.TxDatabase) OrmOption
|
|
type WithContext func(ctx context.Context) OrmOption
|
|
type WithUserAccessor func(ua req.UserAccessor) OrmOption
|