对服务增加基础的数据统计/部分代码分Package

This commit is contained in:
GoEdgeLab
2021-01-25 16:40:03 +08:00
parent f1c325713d
commit 2f9fe99088
106 changed files with 2095 additions and 148 deletions

View File

@@ -0,0 +1,248 @@
package dns
import (
"encoding/json"
"github.com/TeaOSLab/EdgeAPI/internal/dnsclients"
"github.com/TeaOSLab/EdgeAPI/internal/errors"
_ "github.com/go-sql-driver/mysql"
"github.com/iwind/TeaGo/Tea"
"github.com/iwind/TeaGo/dbs"
"github.com/iwind/TeaGo/maps"
"github.com/iwind/TeaGo/types"
"strings"
"time"
)
const (
DNSDomainStateEnabled = 1 // 已启用
DNSDomainStateDisabled = 0 // 已禁用
)
type DNSDomainDAO dbs.DAO
func NewDNSDomainDAO() *DNSDomainDAO {
return dbs.NewDAO(&DNSDomainDAO{
DAOObject: dbs.DAOObject{
DB: Tea.Env,
Table: "edgeDNSDomains",
Model: new(DNSDomain),
PkName: "id",
},
}).(*DNSDomainDAO)
}
var SharedDNSDomainDAO *DNSDomainDAO
func init() {
dbs.OnReady(func() {
SharedDNSDomainDAO = NewDNSDomainDAO()
})
}
// 启用条目
func (this *DNSDomainDAO) EnableDNSDomain(tx *dbs.Tx, id int64) error {
_, err := this.Query(tx).
Pk(id).
Set("state", DNSDomainStateEnabled).
Update()
return err
}
// 禁用条目
func (this *DNSDomainDAO) DisableDNSDomain(tx *dbs.Tx, id int64) error {
_, err := this.Query(tx).
Pk(id).
Set("state", DNSDomainStateDisabled).
Update()
return err
}
// 查找启用中的条目
func (this *DNSDomainDAO) FindEnabledDNSDomain(tx *dbs.Tx, id int64) (*DNSDomain, error) {
result, err := this.Query(tx).
Pk(id).
Attr("state", DNSDomainStateEnabled).
Find()
if result == nil {
return nil, err
}
return result.(*DNSDomain), err
}
// 根据主键查找名称
func (this *DNSDomainDAO) FindDNSDomainName(tx *dbs.Tx, id int64) (string, error) {
return this.Query(tx).
Pk(id).
Result("name").
FindStringCol("")
}
// 创建域名
func (this *DNSDomainDAO) CreateDomain(tx *dbs.Tx, adminId int64, userId int64, providerId int64, name string) (int64, error) {
op := NewDNSDomainOperator()
op.ProviderId = providerId
op.AdminId = adminId
op.UserId = userId
op.Name = name
op.State = DNSDomainStateEnabled
op.IsOn = true
err := this.Save(tx, op)
if err != nil {
return 0, err
}
return types.Int64(op.Id), nil
}
// 修改域名
func (this *DNSDomainDAO) UpdateDomain(tx *dbs.Tx, domainId int64, name string, isOn bool) error {
if domainId <= 0 {
return errors.New("invalid domainId")
}
op := NewDNSDomainOperator()
op.Id = domainId
op.Name = name
op.IsOn = isOn
err := this.Save(tx, op)
if err != nil {
return err
}
return nil
}
// 查询一个服务商下面的所有域名
func (this *DNSDomainDAO) FindAllEnabledDomainsWithProviderId(tx *dbs.Tx, providerId int64) (result []*DNSDomain, err error) {
_, err = this.Query(tx).
State(DNSDomainStateEnabled).
Attr("providerId", providerId).
AscPk().
Slice(&result).
FindAll()
return
}
// 计算某个服务商下的域名数量
func (this *DNSDomainDAO) CountAllEnabledDomainsWithProviderId(tx *dbs.Tx, providerId int64) (int64, error) {
return this.Query(tx).
State(DNSDomainStateEnabled).
Attr("providerId", providerId).
Count()
}
// 更新域名数据
func (this *DNSDomainDAO) UpdateDomainData(tx *dbs.Tx, domainId int64, data string) error {
if domainId <= 0 {
return errors.New("invalid domainId")
}
op := NewDNSDomainOperator()
op.Id = domainId
op.Data = data
err := this.Save(tx, op)
return err
}
// 更新域名解析记录
func (this *DNSDomainDAO) UpdateDomainRecords(tx *dbs.Tx, domainId int64, recordsJSON []byte) error {
if domainId <= 0 {
return errors.New("invalid domainId")
}
op := NewDNSDomainOperator()
op.Id = domainId
op.Records = recordsJSON
op.DataUpdatedAt = time.Now().Unix()
err := this.Save(tx, op)
return err
}
// 更新线路
func (this *DNSDomainDAO) UpdateDomainRoutes(tx *dbs.Tx, domainId int64, routesJSON []byte) error {
if domainId <= 0 {
return errors.New("invalid domainId")
}
op := NewDNSDomainOperator()
op.Id = domainId
op.Routes = routesJSON
op.DataUpdatedAt = time.Now().Unix()
err := this.Save(tx, op)
return err
}
// 查找域名线路
func (this *DNSDomainDAO) FindDomainRoutes(tx *dbs.Tx, domainId int64) ([]*dnsclients.Route, error) {
routes, err := this.Query(tx).
Pk(domainId).
Result("routes").
FindStringCol("")
if err != nil {
return nil, err
}
if len(routes) == 0 || routes == "null" {
return nil, nil
}
result := []*dnsclients.Route{}
err = json.Unmarshal([]byte(routes), &result)
if err != nil {
return nil, err
}
return result, nil
}
// 查找线路名称
func (this *DNSDomainDAO) FindDomainRouteName(tx *dbs.Tx, domainId int64, routeCode string) (string, error) {
routes, err := this.FindDomainRoutes(tx, domainId)
if err != nil {
return "", err
}
for _, route := range routes {
if route.Code == routeCode {
return route.Name, nil
}
}
return "", nil
}
// 判断是否有域名可选
func (this *DNSDomainDAO) ExistAvailableDomains(tx *dbs.Tx) (bool, error) {
subQuery, err := SharedDNSProviderDAO.Query(tx).
Where("state=1"). // 这里要使用非变量
ResultPk().
AsSQL()
if err != nil {
return false, err
}
return this.Query(tx).
State(DNSDomainStateEnabled).
Attr("isOn", true).
Where("providerId IN (" + subQuery + ")").
Exist()
}
// 检查域名解析记录是否存在
func (this *DNSDomainDAO) ExistDomainRecord(tx *dbs.Tx, domainId int64, recordName string, recordType string, recordRoute string, recordValue string) (bool, error) {
query := maps.Map{
"name": recordName,
"type": recordType,
}
if len(recordRoute) > 0 {
query["route"] = recordRoute
}
if len(recordValue) > 0 {
query["value"] = recordValue
// CNAME兼容点.)符号
if recordType == "CNAME" && !strings.HasSuffix(recordValue, ".") {
b, err := this.ExistDomainRecord(tx, domainId, recordName, recordType, recordRoute, recordValue+".")
if err != nil {
return false, err
}
if b {
return true, nil
}
}
}
recordType = strings.ToUpper(recordType)
return this.Query(tx).
Pk(domainId).
Where("JSON_CONTAINS(records, :query)").
Param("query", query.AsJSON()).
Exist()
}

View File

@@ -0,0 +1,40 @@
package dns
import (
_ "github.com/go-sql-driver/mysql"
"github.com/iwind/TeaGo/dbs"
"testing"
)
func TestDNSDomainDAO_ExistDomainRecord(t *testing.T) {
var tx *dbs.Tx
{
b, err := NewDNSDomainDAO().ExistDomainRecord(tx, 1, "mycluster", "A", "", "")
if err != nil {
t.Fatal(err)
}
t.Log(b)
}
{
b, err := NewDNSDomainDAO().ExistDomainRecord(tx, 2, "mycluster", "A", "", "")
if err != nil {
t.Fatal(err)
}
t.Log(b)
}
{
b, err := NewDNSDomainDAO().ExistDomainRecord(tx, 2, "mycluster", "MX", "", "")
if err != nil {
t.Fatal(err)
}
t.Log(b)
}
{
b, err := NewDNSDomainDAO().ExistDomainRecord(tx, 2, "mycluster123", "A", "", "")
if err != nil {
t.Fatal(err)
}
t.Log(b)
}
}

View File

@@ -0,0 +1,38 @@
package dns
// 管理的域名
type DNSDomain struct {
Id uint32 `field:"id"` // ID
AdminId uint32 `field:"adminId"` // 管理员ID
UserId uint32 `field:"userId"` // 用户ID
ProviderId uint32 `field:"providerId"` // 服务商ID
IsOn uint8 `field:"isOn"` // 是否可用
Name string `field:"name"` // 域名
CreatedAt uint64 `field:"createdAt"` // 创建时间
DataUpdatedAt uint64 `field:"dataUpdatedAt"` // 数据更新时间
DataError string `field:"dataError"` // 数据更新错误
Data string `field:"data"` // 原始数据信息
Records string `field:"records"` // 所有解析记录
Routes string `field:"routes"` // 线路数据
State uint8 `field:"state"` // 状态
}
type DNSDomainOperator struct {
Id interface{} // ID
AdminId interface{} // 管理员ID
UserId interface{} // 用户ID
ProviderId interface{} // 服务商ID
IsOn interface{} // 是否可用
Name interface{} // 域名
CreatedAt interface{} // 创建时间
DataUpdatedAt interface{} // 数据更新时间
DataError interface{} // 数据更新错误
Data interface{} // 原始数据信息
Records interface{} // 所有解析记录
Routes interface{} // 线路数据
State interface{} // 状态
}
func NewDNSDomainOperator() *DNSDomainOperator {
return &DNSDomainOperator{}
}

View File

@@ -0,0 +1,47 @@
package dns
import (
"encoding/json"
"github.com/TeaOSLab/EdgeAPI/internal/dnsclients"
)
// 获取所有的线路
func (this *DNSDomain) DecodeRoutes() ([]*dnsclients.Route, error) {
if len(this.Routes) == 0 || this.Routes == "null" {
return nil, nil
}
result := []*dnsclients.Route{}
err := json.Unmarshal([]byte(this.Routes), &result)
if err != nil {
return nil, err
}
return result, nil
}
// 检查是否包含某个线路
func (this *DNSDomain) ContainsRouteCode(route string) (bool, error) {
routes, err := this.DecodeRoutes()
if err != nil {
return false, err
}
for _, r := range routes {
if r.Code == route {
return true, nil
}
}
return false, nil
}
// 获取所有的记录
func (this *DNSDomain) DecodeRecords() ([]*dnsclients.Record, error) {
records := this.Records
if len(records) == 0 || records == "null" {
return nil, nil
}
result := []*dnsclients.Record{}
err := json.Unmarshal([]byte(records), &result)
if err != nil {
return nil, err
}
return result, nil
}

View File

@@ -0,0 +1,156 @@
package dns
import (
dbutils "github.com/TeaOSLab/EdgeAPI/internal/db/utils"
"github.com/TeaOSLab/EdgeAPI/internal/errors"
_ "github.com/go-sql-driver/mysql"
"github.com/iwind/TeaGo/Tea"
"github.com/iwind/TeaGo/dbs"
"github.com/iwind/TeaGo/types"
"time"
)
const (
DNSProviderStateEnabled = 1 // 已启用
DNSProviderStateDisabled = 0 // 已禁用
)
type DNSProviderDAO dbs.DAO
func NewDNSProviderDAO() *DNSProviderDAO {
return dbs.NewDAO(&DNSProviderDAO{
DAOObject: dbs.DAOObject{
DB: Tea.Env,
Table: "edgeDNSProviders",
Model: new(DNSProvider),
PkName: "id",
},
}).(*DNSProviderDAO)
}
var SharedDNSProviderDAO *DNSProviderDAO
func init() {
dbs.OnReady(func() {
SharedDNSProviderDAO = NewDNSProviderDAO()
})
}
// 启用条目
func (this *DNSProviderDAO) EnableDNSProvider(tx *dbs.Tx, id int64) error {
_, err := this.Query(tx).
Pk(id).
Set("state", DNSProviderStateEnabled).
Update()
return err
}
// 禁用条目
func (this *DNSProviderDAO) DisableDNSProvider(tx *dbs.Tx, id int64) error {
_, err := this.Query(tx).
Pk(id).
Set("state", DNSProviderStateDisabled).
Update()
return err
}
// 查找启用中的条目
func (this *DNSProviderDAO) FindEnabledDNSProvider(tx *dbs.Tx, id int64) (*DNSProvider, error) {
result, err := this.Query(tx).
Pk(id).
Attr("state", DNSProviderStateEnabled).
Find()
if result == nil {
return nil, err
}
return result.(*DNSProvider), err
}
// 创建服务商
func (this *DNSProviderDAO) CreateDNSProvider(tx *dbs.Tx, adminId int64, userId int64, providerType string, name string, apiParamsJSON []byte) (int64, error) {
op := NewDNSProviderOperator()
op.AdminId = adminId
op.UserId = userId
op.Type = providerType
op.Name = name
if len(apiParamsJSON) > 0 {
op.ApiParams = apiParamsJSON
}
op.State = DNSProviderStateEnabled
err := this.Save(tx, op)
if err != nil {
return 0, err
}
return types.Int64(op.Id), nil
}
// 修改服务商
func (this *DNSProviderDAO) UpdateDNSProvider(tx *dbs.Tx, dnsProviderId int64, name string, apiParamsJSON []byte) error {
if dnsProviderId <= 0 {
return errors.New("invalid dnsProviderId")
}
op := NewDNSProviderOperator()
op.Id = dnsProviderId
op.Name = name
// 如果留空则表示不修改
if len(apiParamsJSON) > 0 {
op.ApiParams = apiParamsJSON
}
err := this.Save(tx, op)
if err != nil {
return err
}
return nil
}
// 计算服务商数量
func (this *DNSProviderDAO) CountAllEnabledDNSProviders(tx *dbs.Tx, adminId int64, userId int64) (int64, error) {
return dbutils.NewQuery(tx, this, adminId, userId).
State(DNSProviderStateEnabled).
Count()
}
// 列出单页服务商
func (this *DNSProviderDAO) ListEnabledDNSProviders(tx *dbs.Tx, adminId int64, userId int64, offset int64, size int64) (result []*DNSProvider, err error) {
_, err = dbutils.NewQuery(tx, this, adminId, userId).
State(DNSProviderStateEnabled).
Offset(offset).
Limit(size).
DescPk().
Slice(&result).
FindAll()
return
}
// 列出所有服务商
func (this *DNSProviderDAO) FindAllEnabledDNSProviders(tx *dbs.Tx, adminId int64, userId int64) (result []*DNSProvider, err error) {
_, err = dbutils.NewQuery(tx, this, adminId, userId).
State(DNSProviderStateEnabled).
DescPk().
Slice(&result).
FindAll()
return
}
// 查询某个类型下的所有服务商
func (this *DNSProviderDAO) FindAllEnabledDNSProvidersWithType(tx *dbs.Tx, providerType string) (result []*DNSProvider, err error) {
_, err = this.Query(tx).
State(DNSProviderStateEnabled).
Attr("type", providerType).
DescPk().
Slice(&result).
FindAll()
return
}
// 更新数据更新时间
func (this *DNSProviderDAO) UpdateProviderDataUpdatedTime(tx *dbs.Tx, providerId int64) error {
_, err := this.Query(tx).
Pk(providerId).
Set("dataUpdatedAt", time.Now().Unix()).
Update()
return err
}

View File

@@ -0,0 +1,5 @@
package dns
import (
_ "github.com/go-sql-driver/mysql"
)

View File

@@ -0,0 +1,30 @@
package dns
// DNS服务商
type DNSProvider struct {
Id uint32 `field:"id"` // ID
Name string `field:"name"` // 名称
AdminId uint32 `field:"adminId"` // 管理员ID
UserId uint32 `field:"userId"` // 用户ID
Type string `field:"type"` // 供应商类型
ApiParams string `field:"apiParams"` // API参数
CreatedAt uint64 `field:"createdAt"` // 创建时间
State uint8 `field:"state"` // 状态
DataUpdatedAt uint64 `field:"dataUpdatedAt"` // 数据同步时间
}
type DNSProviderOperator struct {
Id interface{} // ID
Name interface{} // 名称
AdminId interface{} // 管理员ID
UserId interface{} // 用户ID
Type interface{} // 供应商类型
ApiParams interface{} // API参数
CreatedAt interface{} // 创建时间
State interface{} // 状态
DataUpdatedAt interface{} // 数据同步时间
}
func NewDNSProviderOperator() *DNSProviderOperator {
return &DNSProviderOperator{}
}

View File

@@ -0,0 +1,16 @@
package dns
import (
"encoding/json"
"github.com/iwind/TeaGo/maps"
)
// 获取API参数
func (this *DNSProvider) DecodeAPIParams() (maps.Map, error) {
if len(this.ApiParams) == 0 || this.ApiParams == "null" {
return maps.Map{}, nil
}
result := maps.Map{}
err := json.Unmarshal([]byte(this.ApiParams), &result)
return result, err
}