2020-09-16 20:29:18 +08:00
package models
import (
"encoding/json"
"errors"
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/shared"
_ "github.com/go-sql-driver/mysql"
"github.com/iwind/TeaGo/Tea"
"github.com/iwind/TeaGo/dbs"
2021-01-17 16:48:00 +08:00
"github.com/iwind/TeaGo/maps"
2020-09-16 20:29:18 +08:00
"github.com/iwind/TeaGo/types"
)
const (
HTTPHeaderPolicyStateEnabled = 1 // 已启用
HTTPHeaderPolicyStateDisabled = 0 // 已禁用
)
type HTTPHeaderPolicyDAO dbs . DAO
func NewHTTPHeaderPolicyDAO ( ) * HTTPHeaderPolicyDAO {
return dbs . NewDAO ( & HTTPHeaderPolicyDAO {
DAOObject : dbs . DAOObject {
DB : Tea . Env ,
Table : "edgeHTTPHeaderPolicies" ,
Model : new ( HTTPHeaderPolicy ) ,
PkName : "id" ,
} ,
} ) . ( * HTTPHeaderPolicyDAO )
}
2020-10-13 20:05:13 +08:00
var SharedHTTPHeaderPolicyDAO * HTTPHeaderPolicyDAO
func init ( ) {
dbs . OnReady ( func ( ) {
SharedHTTPHeaderPolicyDAO = NewHTTPHeaderPolicyDAO ( )
} )
}
2020-09-16 20:29:18 +08:00
2021-10-01 16:25:16 +08:00
// Init 初始化
2020-09-26 08:06:40 +08:00
func ( this * HTTPHeaderPolicyDAO ) Init ( ) {
2021-01-17 16:48:00 +08:00
_ = this . DAOObject . Init ( )
2020-09-26 08:06:40 +08:00
}
2021-10-01 16:25:16 +08:00
// EnableHTTPHeaderPolicy 启用条目
2021-01-01 23:31:30 +08:00
func ( this * HTTPHeaderPolicyDAO ) EnableHTTPHeaderPolicy ( tx * dbs . Tx , id int64 ) error {
_ , err := this . Query ( tx ) .
2020-09-16 20:29:18 +08:00
Pk ( id ) .
Set ( "state" , HTTPHeaderPolicyStateEnabled ) .
Update ( )
return err
}
2021-10-01 16:25:16 +08:00
// DisableHTTPHeaderPolicy 禁用条目
2021-01-17 16:48:00 +08:00
func ( this * HTTPHeaderPolicyDAO ) DisableHTTPHeaderPolicy ( tx * dbs . Tx , policyId int64 ) error {
2021-01-01 23:31:30 +08:00
_ , err := this . Query ( tx ) .
2021-01-17 16:48:00 +08:00
Pk ( policyId ) .
2020-09-16 20:29:18 +08:00
Set ( "state" , HTTPHeaderPolicyStateDisabled ) .
Update ( )
2021-01-17 16:48:00 +08:00
if err != nil {
return err
}
return this . NotifyUpdate ( tx , policyId )
2020-09-16 20:29:18 +08:00
}
2021-10-01 16:25:16 +08:00
// FindEnabledHTTPHeaderPolicy 查找启用中的条目
2021-01-01 23:31:30 +08:00
func ( this * HTTPHeaderPolicyDAO ) FindEnabledHTTPHeaderPolicy ( tx * dbs . Tx , id int64 ) ( * HTTPHeaderPolicy , error ) {
result , err := this . Query ( tx ) .
2020-09-16 20:29:18 +08:00
Pk ( id ) .
Attr ( "state" , HTTPHeaderPolicyStateEnabled ) .
Find ( )
if result == nil {
return nil , err
}
return result . ( * HTTPHeaderPolicy ) , err
}
2021-10-01 16:25:16 +08:00
// CreateHeaderPolicy 创建策略
2021-01-01 23:31:30 +08:00
func ( this * HTTPHeaderPolicyDAO ) CreateHeaderPolicy ( tx * dbs . Tx ) ( int64 , error ) {
2020-09-16 20:29:18 +08:00
op := NewHTTPHeaderPolicyOperator ( )
op . IsOn = true
op . State = HTTPHeaderPolicyStateEnabled
2021-01-01 23:31:30 +08:00
err := this . Save ( tx , op )
2020-09-16 20:29:18 +08:00
if err != nil {
return 0 , err
}
return types . Int64 ( op . Id ) , nil
}
2021-10-01 16:25:16 +08:00
// UpdateAddingHeaders 修改AddHeaders
2021-01-01 23:31:30 +08:00
func ( this * HTTPHeaderPolicyDAO ) UpdateAddingHeaders ( tx * dbs . Tx , policyId int64 , headersJSON [ ] byte ) error {
2020-09-16 20:29:18 +08:00
if policyId <= 0 {
return errors . New ( "invalid policyId" )
}
op := NewHTTPHeaderPolicyOperator ( )
op . Id = policyId
op . AddHeaders = headersJSON
2021-01-01 23:31:30 +08:00
err := this . Save ( tx , op )
2021-01-17 16:48:00 +08:00
if err != nil {
return err
}
return this . NotifyUpdate ( tx , policyId )
2020-09-16 20:29:18 +08:00
}
2021-10-01 16:25:16 +08:00
// UpdateSettingHeaders 修改SetHeaders
2021-01-01 23:31:30 +08:00
func ( this * HTTPHeaderPolicyDAO ) UpdateSettingHeaders ( tx * dbs . Tx , policyId int64 , headersJSON [ ] byte ) error {
2020-09-16 20:29:18 +08:00
if policyId <= 0 {
return errors . New ( "invalid policyId" )
}
op := NewHTTPHeaderPolicyOperator ( )
op . Id = policyId
op . SetHeaders = headersJSON
2021-01-01 23:31:30 +08:00
err := this . Save ( tx , op )
2021-01-17 16:48:00 +08:00
if err != nil {
return err
}
return this . NotifyUpdate ( tx , policyId )
2020-09-16 20:29:18 +08:00
}
2021-10-01 16:25:16 +08:00
// UpdateReplacingHeaders 修改ReplaceHeaders
2021-01-01 23:31:30 +08:00
func ( this * HTTPHeaderPolicyDAO ) UpdateReplacingHeaders ( tx * dbs . Tx , policyId int64 , headersJSON [ ] byte ) error {
2020-09-16 20:29:18 +08:00
if policyId <= 0 {
return errors . New ( "invalid policyId" )
}
op := NewHTTPHeaderPolicyOperator ( )
op . Id = policyId
op . ReplaceHeaders = headersJSON
2021-01-01 23:31:30 +08:00
err := this . Save ( tx , op )
2021-01-17 16:48:00 +08:00
if err != nil {
return err
}
return this . NotifyUpdate ( tx , policyId )
2020-09-16 20:29:18 +08:00
}
2021-10-01 16:25:16 +08:00
// UpdateAddingTrailers 修改AddTrailers
2021-01-01 23:31:30 +08:00
func ( this * HTTPHeaderPolicyDAO ) UpdateAddingTrailers ( tx * dbs . Tx , policyId int64 , headersJSON [ ] byte ) error {
2020-09-16 20:29:18 +08:00
if policyId <= 0 {
return errors . New ( "invalid policyId" )
}
op := NewHTTPHeaderPolicyOperator ( )
op . Id = policyId
op . AddTrailers = headersJSON
2021-01-01 23:31:30 +08:00
err := this . Save ( tx , op )
2021-01-17 16:48:00 +08:00
if err != nil {
return err
}
return this . NotifyUpdate ( tx , policyId )
2020-09-16 20:29:18 +08:00
}
2021-10-01 16:25:16 +08:00
// UpdateDeletingHeaders 修改DeleteHeaders
2021-01-01 23:31:30 +08:00
func ( this * HTTPHeaderPolicyDAO ) UpdateDeletingHeaders ( tx * dbs . Tx , policyId int64 , headerNames [ ] string ) error {
2020-09-16 20:29:18 +08:00
if policyId <= 0 {
return errors . New ( "invalid policyId" )
}
namesJSON , err := json . Marshal ( headerNames )
if err != nil {
return err
}
op := NewHTTPHeaderPolicyOperator ( )
op . Id = policyId
op . DeleteHeaders = string ( namesJSON )
2021-01-01 23:31:30 +08:00
err = this . Save ( tx , op )
2021-01-17 16:48:00 +08:00
if err != nil {
return err
}
return this . NotifyUpdate ( tx , policyId )
2020-09-16 20:29:18 +08:00
}
2021-10-01 16:25:16 +08:00
// ComposeHeaderPolicyConfig 组合配置
2021-01-01 23:31:30 +08:00
func ( this * HTTPHeaderPolicyDAO ) ComposeHeaderPolicyConfig ( tx * dbs . Tx , headerPolicyId int64 ) ( * shared . HTTPHeaderPolicy , error ) {
policy , err := this . FindEnabledHTTPHeaderPolicy ( tx , headerPolicyId )
2020-09-16 20:29:18 +08:00
if err != nil {
return nil , err
}
if policy == nil {
return nil , nil
}
config := & shared . HTTPHeaderPolicy { }
config . Id = int64 ( policy . Id )
config . IsOn = policy . IsOn == 1
// SetHeaders
2022-03-22 19:30:30 +08:00
if IsNotNull ( policy . SetHeaders ) {
2020-09-26 08:06:40 +08:00
refs := [ ] * shared . HTTPHeaderRef { }
2022-03-22 19:30:30 +08:00
err = json . Unmarshal ( policy . SetHeaders , & refs )
2020-09-16 20:29:18 +08:00
if err != nil {
return nil , err
}
2020-09-26 08:06:40 +08:00
if len ( refs ) > 0 {
resultRefs := [ ] * shared . HTTPHeaderRef { }
for _ , ref := range refs {
2021-01-01 23:31:30 +08:00
headerConfig , err := SharedHTTPHeaderDAO . ComposeHeaderConfig ( tx , ref . HeaderId )
2020-09-16 20:29:18 +08:00
if err != nil {
return nil , err
}
2020-09-26 08:06:40 +08:00
if headerConfig == nil {
continue
}
resultRefs = append ( resultRefs , ref )
config . SetHeaders = append ( config . SetHeaders , headerConfig )
2020-09-16 20:29:18 +08:00
}
2020-09-26 08:06:40 +08:00
config . SetHeaderRefs = resultRefs
2020-09-16 20:29:18 +08:00
}
}
// Delete Headers
2022-03-22 19:30:30 +08:00
if IsNotNull ( policy . DeleteHeaders ) {
2020-09-16 20:29:18 +08:00
headers := [ ] string { }
2022-03-22 19:30:30 +08:00
err = json . Unmarshal ( policy . DeleteHeaders , & headers )
2020-09-16 20:29:18 +08:00
if err != nil {
return nil , err
}
2020-09-26 08:06:40 +08:00
config . DeleteHeaders = headers
2020-09-16 20:29:18 +08:00
}
// Expires
// TODO
return config , nil
}
2021-01-17 16:48:00 +08:00
2021-10-01 16:25:16 +08:00
// FindHeaderPolicyIdWithHeaderId 查找Header所在Policy
2021-01-17 16:48:00 +08:00
func ( this * HTTPHeaderPolicyDAO ) FindHeaderPolicyIdWithHeaderId ( tx * dbs . Tx , headerId int64 ) ( int64 , error ) {
return this . Query ( tx ) .
Where ( "(JSON_CONTAINS(addHeaders, :jsonQuery) OR JSON_CONTAINS(addTrailers, :jsonQuery) OR JSON_CONTAINS(setHeaders, :jsonQuery) OR JSON_CONTAINS(replaceHeaders, :jsonQuery))" ) .
2021-10-01 16:25:16 +08:00
Param ( "jsonQuery" , maps . Map { "headerId" : headerId } . AsJSON ( ) ) .
2021-01-17 16:48:00 +08:00
ResultPk ( ) .
FindInt64Col ( 0 )
}
2021-10-01 16:25:16 +08:00
// NotifyUpdate 通知更新
2021-01-17 16:48:00 +08:00
func ( this * HTTPHeaderPolicyDAO ) NotifyUpdate ( tx * dbs . Tx , policyId int64 ) error {
webId , err := SharedHTTPWebDAO . FindEnabledWebIdWithHeaderPolicyId ( tx , policyId )
if err != nil {
return err
}
if webId > 0 {
return SharedHTTPWebDAO . NotifyUpdate ( tx , webId )
}
return nil
}