mirror of
https://github.com/TeaOSLab/EdgeAPI.git
synced 2025-11-05 17:40:24 +08:00
对服务增加基础的数据统计/部分代码分Package
This commit is contained in:
@@ -2,7 +2,7 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
|
"github.com/TeaOSLab/EdgeAPI/internal/db/models/regions"
|
||||||
"github.com/iwind/TeaGo/Tea"
|
"github.com/iwind/TeaGo/Tea"
|
||||||
_ "github.com/iwind/TeaGo/bootstrap"
|
_ "github.com/iwind/TeaGo/bootstrap"
|
||||||
"github.com/iwind/TeaGo/dbs"
|
"github.com/iwind/TeaGo/dbs"
|
||||||
@@ -48,21 +48,21 @@ func main() {
|
|||||||
|
|
||||||
switch level {
|
switch level {
|
||||||
case "1": // 国家|地区
|
case "1": // 国家|地区
|
||||||
countryId, err := models.SharedRegionCountryDAO.FindCountryIdWithDataId(dataId)
|
countryId, err := regions.SharedRegionCountryDAO.FindCountryIdWithDataId(nil, dataId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Println("[ERROR]" + err.Error())
|
logs.Println("[ERROR]" + err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if countryId == 0 {
|
if countryId == 0 {
|
||||||
logs.Println("creating country or region ", name)
|
logs.Println("creating country or region ", name)
|
||||||
_, err = models.SharedRegionCountryDAO.CreateCountry(name, dataId)
|
_, err = regions.SharedRegionCountryDAO.CreateCountry(nil, name, dataId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Println("[ERROR]" + err.Error())
|
logs.Println("[ERROR]" + err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case "2": // 省份|地区
|
case "2": // 省份|地区
|
||||||
provinceId, err := models.SharedRegionProvinceDAO.FindProvinceIdWithDataId(dataId)
|
provinceId, err := regions.SharedRegionProvinceDAO.FindProvinceIdWithDataId(nil, dataId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Println("[ERROR]" + err.Error())
|
logs.Println("[ERROR]" + err.Error())
|
||||||
return
|
return
|
||||||
@@ -70,7 +70,7 @@ func main() {
|
|||||||
if provinceId == 0 {
|
if provinceId == 0 {
|
||||||
logs.Println("creating province", name)
|
logs.Println("creating province", name)
|
||||||
|
|
||||||
countryId, err := models.SharedRegionCountryDAO.FindCountryIdWithDataId(parentDataId)
|
countryId, err := regions.SharedRegionCountryDAO.FindCountryIdWithDataId(nil, parentDataId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Println("[ERROR]" + err.Error())
|
logs.Println("[ERROR]" + err.Error())
|
||||||
return
|
return
|
||||||
@@ -80,14 +80,14 @@ func main() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = models.SharedRegionProvinceDAO.CreateProvince(countryId, name, dataId)
|
_, err = regions.SharedRegionProvinceDAO.CreateProvince(nil, countryId, name, dataId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Println("[ERROR]" + err.Error())
|
logs.Println("[ERROR]" + err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case "3": // 城市
|
case "3": // 城市
|
||||||
cityId, err := models.SharedRegionCityDAO.FindCityWithDataId(dataId)
|
cityId, err := regions.SharedRegionCityDAO.FindCityWithDataId(nil, dataId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Println("[ERROR]" + err.Error())
|
logs.Println("[ERROR]" + err.Error())
|
||||||
return
|
return
|
||||||
@@ -95,12 +95,12 @@ func main() {
|
|||||||
if cityId == 0 {
|
if cityId == 0 {
|
||||||
logs.Println("creating city", name)
|
logs.Println("creating city", name)
|
||||||
|
|
||||||
provinceId, err := models.SharedRegionProvinceDAO.FindProvinceIdWithDataId(parentDataId)
|
provinceId, err := regions.SharedRegionProvinceDAO.FindProvinceIdWithDataId(nil, parentDataId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Println("[ERROR]" + err.Error())
|
logs.Println("[ERROR]" + err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
_, err = models.SharedRegionCityDAO.CreateCity(provinceId, name, dataId)
|
_, err = regions.SharedRegionCityDAO.CreateCity(nil, provinceId, name, dataId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Println("[ERROR]" + err.Error())
|
logs.Println("[ERROR]" + err.Error())
|
||||||
return
|
return
|
||||||
@@ -134,13 +134,33 @@ func main() {
|
|||||||
pieces := strings.Split(s, "|")
|
pieces := strings.Split(s, "|")
|
||||||
countryName := pieces[2]
|
countryName := pieces[2]
|
||||||
provinceName := pieces[4]
|
provinceName := pieces[4]
|
||||||
|
providerName := pieces[6]
|
||||||
|
|
||||||
|
// 记录provider
|
||||||
|
if len(providerName) > 0 && providerName != "0" {
|
||||||
|
providerId, err := regions.SharedRegionProviderDAO.FindProviderIdWithNameCacheable(nil, providerName)
|
||||||
|
if err != nil {
|
||||||
|
logs.Println("[ERROR]find provider id failed: " + err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if providerId == 0 {
|
||||||
|
logs.Println("creating new provider '"+providerName+"' ... ", index, "line")
|
||||||
|
_, err = regions.SharedRegionProviderDAO.CreateProvider(nil, providerName)
|
||||||
|
if err != nil {
|
||||||
|
logs.Println("create new provider failed: " + providerName)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
logs.Println("created new provider '" + providerName + "'")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if lists.ContainsString([]string{"0", "欧洲", "北美地区", "法国南部领地", "非洲地区", "亚太地区"}, countryName) {
|
if lists.ContainsString([]string{"0", "欧洲", "北美地区", "法国南部领地", "非洲地区", "亚太地区"}, countryName) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
// 检查国家
|
// 检查国家
|
||||||
countryId, err := models.SharedRegionCountryDAO.FindCountryIdWithCountryName(countryName)
|
countryId, err := regions.SharedRegionCountryDAO.FindCountryIdWithNameCacheable(nil, countryName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Println("[ERROR]" + err.Error())
|
logs.Println("[ERROR]" + err.Error())
|
||||||
return
|
return
|
||||||
@@ -156,7 +176,7 @@ func main() {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
provinceId, err := models.SharedRegionProvinceDAO.FindProvinceIdWithProvinceName(provinceName)
|
provinceId, err := regions.SharedRegionProvinceDAO.FindProvinceIdWithNameCacheable(nil, countryId, provinceName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Println("[ERROR]" + err.Error())
|
logs.Println("[ERROR]" + err.Error())
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package models
|
package acme
|
||||||
|
|
||||||
import (
|
import (
|
||||||
_ "github.com/go-sql-driver/mysql"
|
_ "github.com/go-sql-driver/mysql"
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package models
|
package acme
|
||||||
|
|
||||||
import (
|
import (
|
||||||
_ "github.com/go-sql-driver/mysql"
|
_ "github.com/go-sql-driver/mysql"
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package models
|
package acme
|
||||||
|
|
||||||
// ACME认证
|
// ACME认证
|
||||||
type ACMEAuthentication struct {
|
type ACMEAuthentication struct {
|
||||||
1
internal/db/models/acme/acme_authentication_model_ext.go
Normal file
1
internal/db/models/acme/acme_authentication_model_ext.go
Normal file
@@ -0,0 +1 @@
|
|||||||
|
package acme
|
||||||
@@ -1,8 +1,11 @@
|
|||||||
package models
|
package acme
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/acme"
|
"github.com/TeaOSLab/EdgeAPI/internal/acme"
|
||||||
|
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
|
||||||
|
"github.com/TeaOSLab/EdgeAPI/internal/db/models/dns"
|
||||||
|
dbutils "github.com/TeaOSLab/EdgeAPI/internal/db/utils"
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/dnsclients"
|
"github.com/TeaOSLab/EdgeAPI/internal/dnsclients"
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/errors"
|
"github.com/TeaOSLab/EdgeAPI/internal/errors"
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/sslconfigs"
|
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/sslconfigs"
|
||||||
@@ -97,14 +100,14 @@ func (this *ACMETaskDAO) DisableAllTasksWithCertId(tx *dbs.Tx, certId int64) err
|
|||||||
|
|
||||||
// 计算所有任务数量
|
// 计算所有任务数量
|
||||||
func (this *ACMETaskDAO) CountAllEnabledACMETasks(tx *dbs.Tx, adminId int64, userId int64) (int64, error) {
|
func (this *ACMETaskDAO) CountAllEnabledACMETasks(tx *dbs.Tx, adminId int64, userId int64) (int64, error) {
|
||||||
return NewQuery(tx, this, adminId, userId).
|
return dbutils.NewQuery(tx, this, adminId, userId).
|
||||||
State(ACMETaskStateEnabled).
|
State(ACMETaskStateEnabled).
|
||||||
Count()
|
Count()
|
||||||
}
|
}
|
||||||
|
|
||||||
// 列出单页任务
|
// 列出单页任务
|
||||||
func (this *ACMETaskDAO) ListEnabledACMETasks(tx *dbs.Tx, adminId int64, userId int64, offset int64, size int64) (result []*ACMETask, err error) {
|
func (this *ACMETaskDAO) ListEnabledACMETasks(tx *dbs.Tx, adminId int64, userId int64, offset int64, size int64) (result []*ACMETask, err error) {
|
||||||
_, err = NewQuery(tx, this, adminId, userId).
|
_, err = dbutils.NewQuery(tx, this, adminId, userId).
|
||||||
State(ACMETaskStateEnabled).
|
State(ACMETaskStateEnabled).
|
||||||
DescPk().
|
DescPk().
|
||||||
Offset(offset).
|
Offset(offset).
|
||||||
@@ -173,7 +176,7 @@ func (this *ACMETaskDAO) UpdateACMETask(tx *dbs.Tx, acmeTaskId int64, acmeUserId
|
|||||||
|
|
||||||
// 检查权限
|
// 检查权限
|
||||||
func (this *ACMETaskDAO) CheckACMETask(tx *dbs.Tx, adminId int64, userId int64, acmeTaskId int64) (bool, error) {
|
func (this *ACMETaskDAO) CheckACMETask(tx *dbs.Tx, adminId int64, userId int64, acmeTaskId int64) (bool, error) {
|
||||||
return NewQuery(tx, this, adminId, userId).
|
return dbutils.NewQuery(tx, this, adminId, userId).
|
||||||
State(ACMETaskStateEnabled).
|
State(ACMETaskStateEnabled).
|
||||||
Pk(acmeTaskId).
|
Pk(acmeTaskId).
|
||||||
Exist()
|
Exist()
|
||||||
@@ -259,7 +262,7 @@ func (this *ACMETaskDAO) runTaskWithoutLog(tx *dbs.Tx, taskId int64) (isOk bool,
|
|||||||
var acmeTask *acme.Task = nil
|
var acmeTask *acme.Task = nil
|
||||||
if task.AuthType == acme.AuthTypeDNS {
|
if task.AuthType == acme.AuthTypeDNS {
|
||||||
// DNS服务商
|
// DNS服务商
|
||||||
dnsProvider, err := SharedDNSProviderDAO.FindEnabledDNSProvider(tx, int64(task.DnsProviderId))
|
dnsProvider, err := dns.SharedDNSProviderDAO.FindEnabledDNSProvider(tx, int64(task.DnsProviderId))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
errMsg = "查找DNS服务商账号信息时出错:" + err.Error()
|
errMsg = "查找DNS服务商账号信息时出错:" + err.Error()
|
||||||
return
|
return
|
||||||
@@ -326,7 +329,7 @@ func (this *ACMETaskDAO) runTaskWithoutLog(tx *dbs.Tx, taskId int64) (isOk bool,
|
|||||||
// 保存证书
|
// 保存证书
|
||||||
resultCertId = int64(task.CertId)
|
resultCertId = int64(task.CertId)
|
||||||
if resultCertId > 0 {
|
if resultCertId > 0 {
|
||||||
cert, err := SharedSSLCertDAO.FindEnabledSSLCert(tx, resultCertId)
|
cert, err := models.SharedSSLCertDAO.FindEnabledSSLCert(tx, resultCertId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
errMsg = "证书生成成功,但查询已绑定的证书时出错:" + err.Error()
|
errMsg = "证书生成成功,但查询已绑定的证书时出错:" + err.Error()
|
||||||
return
|
return
|
||||||
@@ -343,19 +346,19 @@ func (this *ACMETaskDAO) runTaskWithoutLog(tx *dbs.Tx, taskId int64) (isOk bool,
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
err = SharedSSLCertDAO.UpdateCert(tx, resultCertId, cert.IsOn == 1, cert.Name, cert.Description, cert.ServerName, cert.IsCA == 1, certData, keyData, sslConfig.TimeBeginAt, sslConfig.TimeEndAt, sslConfig.DNSNames, sslConfig.CommonNames)
|
err = models.SharedSSLCertDAO.UpdateCert(tx, resultCertId, cert.IsOn == 1, cert.Name, cert.Description, cert.ServerName, cert.IsCA == 1, certData, keyData, sslConfig.TimeBeginAt, sslConfig.TimeEndAt, sslConfig.DNSNames, sslConfig.CommonNames)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
errMsg = "证书生成成功,但是修改数据库中的证书信息时出错:" + err.Error()
|
errMsg = "证书生成成功,但是修改数据库中的证书信息时出错:" + err.Error()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
resultCertId, err = SharedSSLCertDAO.CreateCert(tx, int64(task.AdminId), int64(task.UserId), true, task.DnsDomain+"免费证书", "免费申请的证书", "", false, certData, keyData, sslConfig.TimeBeginAt, sslConfig.TimeEndAt, sslConfig.DNSNames, sslConfig.CommonNames)
|
resultCertId, err = models.SharedSSLCertDAO.CreateCert(tx, int64(task.AdminId), int64(task.UserId), true, task.DnsDomain+"免费证书", "免费申请的证书", "", false, certData, keyData, sslConfig.TimeBeginAt, sslConfig.TimeEndAt, sslConfig.DNSNames, sslConfig.CommonNames)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
errMsg = "证书生成成功,但是保存到数据库失败:" + err.Error()
|
errMsg = "证书生成成功,但是保存到数据库失败:" + err.Error()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
err = SharedSSLCertDAO.UpdateCertACME(tx, resultCertId, int64(task.Id))
|
err = models.SharedSSLCertDAO.UpdateCertACME(tx, resultCertId, int64(task.Id))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
errMsg = "证书生成成功,修改证书ACME信息时出错:" + err.Error()
|
errMsg = "证书生成成功,修改证书ACME信息时出错:" + err.Error()
|
||||||
return
|
return
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package models
|
package acme
|
||||||
|
|
||||||
import (
|
import (
|
||||||
_ "github.com/go-sql-driver/mysql"
|
_ "github.com/go-sql-driver/mysql"
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package models
|
package acme
|
||||||
|
|
||||||
import (
|
import (
|
||||||
_ "github.com/go-sql-driver/mysql"
|
_ "github.com/go-sql-driver/mysql"
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package models
|
package acme
|
||||||
|
|
||||||
import (
|
import (
|
||||||
_ "github.com/go-sql-driver/mysql"
|
_ "github.com/go-sql-driver/mysql"
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package models
|
package acme
|
||||||
|
|
||||||
// ACME任务运行日志
|
// ACME任务运行日志
|
||||||
type ACMETaskLog struct {
|
type ACMETaskLog struct {
|
||||||
1
internal/db/models/acme/acme_task_log_model_ext.go
Normal file
1
internal/db/models/acme/acme_task_log_model_ext.go
Normal file
@@ -0,0 +1 @@
|
|||||||
|
package acme
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package models
|
package acme
|
||||||
|
|
||||||
// ACME任务
|
// ACME任务
|
||||||
type ACMETask struct {
|
type ACMETask struct {
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package models
|
package acme
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package models
|
package acme
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/ecdsa"
|
"crypto/ecdsa"
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package models
|
package acme
|
||||||
|
|
||||||
import (
|
import (
|
||||||
_ "github.com/go-sql-driver/mysql"
|
_ "github.com/go-sql-driver/mysql"
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package models
|
package acme
|
||||||
|
|
||||||
//
|
//
|
||||||
type ACMEUser struct {
|
type ACMEUser struct {
|
||||||
1
internal/db/models/acme/acme_user_model_ext.go
Normal file
1
internal/db/models/acme/acme_user_model_ext.go
Normal file
@@ -0,0 +1 @@
|
|||||||
|
package acme
|
||||||
@@ -1 +0,0 @@
|
|||||||
package models
|
|
||||||
117
internal/db/models/client_browser_dao.go
Normal file
117
internal/db/models/client_browser_dao.go
Normal file
@@ -0,0 +1,117 @@
|
|||||||
|
package models
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
_ "github.com/go-sql-driver/mysql"
|
||||||
|
"github.com/iwind/TeaGo/Tea"
|
||||||
|
"github.com/iwind/TeaGo/dbs"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
ClientBrowserStateEnabled = 1 // 已启用
|
||||||
|
ClientBrowserStateDisabled = 0 // 已禁用
|
||||||
|
)
|
||||||
|
|
||||||
|
var clientBrowserNameAndIdCacheMap = map[string]int64{}
|
||||||
|
|
||||||
|
type ClientBrowserDAO dbs.DAO
|
||||||
|
|
||||||
|
func NewClientBrowserDAO() *ClientBrowserDAO {
|
||||||
|
return dbs.NewDAO(&ClientBrowserDAO{
|
||||||
|
DAOObject: dbs.DAOObject{
|
||||||
|
DB: Tea.Env,
|
||||||
|
Table: "edgeClientBrowsers",
|
||||||
|
Model: new(ClientBrowser),
|
||||||
|
PkName: "id",
|
||||||
|
},
|
||||||
|
}).(*ClientBrowserDAO)
|
||||||
|
}
|
||||||
|
|
||||||
|
var SharedClientBrowserDAO *ClientBrowserDAO
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
dbs.OnReady(func() {
|
||||||
|
SharedClientBrowserDAO = NewClientBrowserDAO()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 启用条目
|
||||||
|
func (this *ClientBrowserDAO) EnableClientBrowser(tx *dbs.Tx, id uint32) error {
|
||||||
|
_, err := this.Query(tx).
|
||||||
|
Pk(id).
|
||||||
|
Set("state", ClientBrowserStateEnabled).
|
||||||
|
Update()
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// 禁用条目
|
||||||
|
func (this *ClientBrowserDAO) DisableClientBrowser(tx *dbs.Tx, id uint32) error {
|
||||||
|
_, err := this.Query(tx).
|
||||||
|
Pk(id).
|
||||||
|
Set("state", ClientBrowserStateDisabled).
|
||||||
|
Update()
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查找启用中的条目
|
||||||
|
func (this *ClientBrowserDAO) FindEnabledClientBrowser(tx *dbs.Tx, id int64) (*ClientBrowser, error) {
|
||||||
|
result, err := this.Query(tx).
|
||||||
|
Pk(id).
|
||||||
|
Attr("state", ClientBrowserStateEnabled).
|
||||||
|
Find()
|
||||||
|
if result == nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return result.(*ClientBrowser), err
|
||||||
|
}
|
||||||
|
|
||||||
|
// 根据主键查找名称
|
||||||
|
func (this *ClientBrowserDAO) FindClientBrowserName(tx *dbs.Tx, id uint32) (string, error) {
|
||||||
|
return this.Query(tx).
|
||||||
|
Pk(id).
|
||||||
|
Result("name").
|
||||||
|
FindStringCol("")
|
||||||
|
}
|
||||||
|
|
||||||
|
// 根据浏览器名称查找浏览器ID
|
||||||
|
func (this *ClientBrowserDAO) FindBrowserIdWithNameCacheable(tx *dbs.Tx, browserName string) (int64, error) {
|
||||||
|
SharedCacheLocker.RLock()
|
||||||
|
browserId, ok := clientBrowserNameAndIdCacheMap[browserName]
|
||||||
|
if ok {
|
||||||
|
SharedCacheLocker.RUnlock()
|
||||||
|
return browserId, nil
|
||||||
|
}
|
||||||
|
SharedCacheLocker.RUnlock()
|
||||||
|
|
||||||
|
browserId, err := this.Query(tx).
|
||||||
|
Where("JSON_CONTAINS(codes, :browserName)").
|
||||||
|
Param("browserName", "\""+browserName+"\""). // 查询的需要是个JSON字符串,所以这里加双引号
|
||||||
|
ResultPk().
|
||||||
|
FindInt64Col(0)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if browserId > 0 {
|
||||||
|
// 只有找到的时候才放入缓存,以便于我们可以在不存在的时候创建一条新的记录
|
||||||
|
SharedCacheLocker.Lock()
|
||||||
|
clientBrowserNameAndIdCacheMap[browserName] = browserId
|
||||||
|
SharedCacheLocker.Unlock()
|
||||||
|
}
|
||||||
|
|
||||||
|
return browserId, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建浏览器
|
||||||
|
func (this *ClientBrowserDAO) CreateBrowser(tx *dbs.Tx, browserName string) (int64, error) {
|
||||||
|
op := NewClientBrowserOperator()
|
||||||
|
op.Name = browserName
|
||||||
|
codes := []string{browserName}
|
||||||
|
codesJSON, err := json.Marshal(codes)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
op.Codes = codesJSON
|
||||||
|
op.State = ClientBrowserStateEnabled
|
||||||
|
return this.SaveInt64(tx, op)
|
||||||
|
}
|
||||||
20
internal/db/models/client_browser_model.go
Normal file
20
internal/db/models/client_browser_model.go
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
package models
|
||||||
|
|
||||||
|
// 终端浏览器信息
|
||||||
|
type ClientBrowser struct {
|
||||||
|
Id uint32 `field:"id"` // ID
|
||||||
|
Name string `field:"name"` // 浏览器名称
|
||||||
|
Codes string `field:"codes"` // 代号
|
||||||
|
State uint8 `field:"state"` // 状态
|
||||||
|
}
|
||||||
|
|
||||||
|
type ClientBrowserOperator struct {
|
||||||
|
Id interface{} // ID
|
||||||
|
Name interface{} // 浏览器名称
|
||||||
|
Codes interface{} // 代号
|
||||||
|
State interface{} // 状态
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewClientBrowserOperator() *ClientBrowserOperator {
|
||||||
|
return &ClientBrowserOperator{}
|
||||||
|
}
|
||||||
119
internal/db/models/client_system_dao.go
Normal file
119
internal/db/models/client_system_dao.go
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
package models
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
_ "github.com/go-sql-driver/mysql"
|
||||||
|
"github.com/iwind/TeaGo/Tea"
|
||||||
|
"github.com/iwind/TeaGo/dbs"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
ClientSystemStateEnabled = 1 // 已启用
|
||||||
|
ClientSystemStateDisabled = 0 // 已禁用
|
||||||
|
)
|
||||||
|
|
||||||
|
var clientSystemNameAndIdCacheMap = map[string]int64{} // system name => id
|
||||||
|
|
||||||
|
type ClientSystemDAO dbs.DAO
|
||||||
|
|
||||||
|
func NewClientSystemDAO() *ClientSystemDAO {
|
||||||
|
return dbs.NewDAO(&ClientSystemDAO{
|
||||||
|
DAOObject: dbs.DAOObject{
|
||||||
|
DB: Tea.Env,
|
||||||
|
Table: "edgeClientSystems",
|
||||||
|
Model: new(ClientSystem),
|
||||||
|
PkName: "id",
|
||||||
|
},
|
||||||
|
}).(*ClientSystemDAO)
|
||||||
|
}
|
||||||
|
|
||||||
|
var SharedClientSystemDAO *ClientSystemDAO
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
dbs.OnReady(func() {
|
||||||
|
SharedClientSystemDAO = NewClientSystemDAO()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 启用条目
|
||||||
|
func (this *ClientSystemDAO) EnableClientSystem(tx *dbs.Tx, id uint32) error {
|
||||||
|
_, err := this.Query(tx).
|
||||||
|
Pk(id).
|
||||||
|
Set("state", ClientSystemStateEnabled).
|
||||||
|
Update()
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// 禁用条目
|
||||||
|
func (this *ClientSystemDAO) DisableClientSystem(tx *dbs.Tx, id uint32) error {
|
||||||
|
_, err := this.Query(tx).
|
||||||
|
Pk(id).
|
||||||
|
Set("state", ClientSystemStateDisabled).
|
||||||
|
Update()
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查找启用中的条目
|
||||||
|
func (this *ClientSystemDAO) FindEnabledClientSystem(tx *dbs.Tx, id int64) (*ClientSystem, error) {
|
||||||
|
result, err := this.Query(tx).
|
||||||
|
Pk(id).
|
||||||
|
Attr("state", ClientSystemStateEnabled).
|
||||||
|
Find()
|
||||||
|
if result == nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return result.(*ClientSystem), err
|
||||||
|
}
|
||||||
|
|
||||||
|
// 根据主键查找名称
|
||||||
|
func (this *ClientSystemDAO) FindClientSystemName(tx *dbs.Tx, id uint32) (string, error) {
|
||||||
|
return this.Query(tx).
|
||||||
|
Pk(id).
|
||||||
|
Result("name").
|
||||||
|
FindStringCol("")
|
||||||
|
}
|
||||||
|
|
||||||
|
// 根据操作系统名称查找系统ID
|
||||||
|
func (this *ClientSystemDAO) FindSystemIdWithNameCacheable(tx *dbs.Tx, systemName string) (int64, error) {
|
||||||
|
SharedCacheLocker.RLock()
|
||||||
|
systemId, ok := clientSystemNameAndIdCacheMap[systemName]
|
||||||
|
if ok {
|
||||||
|
SharedCacheLocker.RUnlock()
|
||||||
|
return systemId, nil
|
||||||
|
}
|
||||||
|
SharedCacheLocker.RUnlock()
|
||||||
|
|
||||||
|
systemId, err := this.Query(tx).
|
||||||
|
Where("JSON_CONTAINS(codes, :systemName)").
|
||||||
|
Param("systemName", "\""+systemName+"\""). // 查询的需要是个JSON字符串,所以这里加双引号
|
||||||
|
ResultPk().
|
||||||
|
FindInt64Col(0)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if systemId > 0 {
|
||||||
|
// 只有找到的时候才放入缓存,以便于我们可以在不存在的时候创建一条新的记录
|
||||||
|
SharedCacheLocker.Lock()
|
||||||
|
clientSystemNameAndIdCacheMap[systemName] = systemId
|
||||||
|
SharedCacheLocker.Unlock()
|
||||||
|
}
|
||||||
|
|
||||||
|
return systemId, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建浏览器
|
||||||
|
func (this *ClientSystemDAO) CreateSystem(tx *dbs.Tx, systemName string) (int64, error) {
|
||||||
|
op := NewClientSystemOperator()
|
||||||
|
op.Name = systemName
|
||||||
|
|
||||||
|
codes := []string{systemName}
|
||||||
|
codesJSON, err := json.Marshal(codes)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
op.Codes = codesJSON
|
||||||
|
|
||||||
|
op.State = ClientSystemStateEnabled
|
||||||
|
return this.SaveInt64(tx, op)
|
||||||
|
}
|
||||||
20
internal/db/models/client_system_model.go
Normal file
20
internal/db/models/client_system_model.go
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
package models
|
||||||
|
|
||||||
|
// 终端操作系统信息
|
||||||
|
type ClientSystem struct {
|
||||||
|
Id uint32 `field:"id"` // ID
|
||||||
|
Name string `field:"name"` // 系统名称
|
||||||
|
Codes string `field:"codes"` // 代号
|
||||||
|
State uint8 `field:"state"` //
|
||||||
|
}
|
||||||
|
|
||||||
|
type ClientSystemOperator struct {
|
||||||
|
Id interface{} // ID
|
||||||
|
Name interface{} // 系统名称
|
||||||
|
Codes interface{} // 代号
|
||||||
|
State interface{} //
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewClientSystemOperator() *ClientSystemOperator {
|
||||||
|
return &ClientSystemOperator{}
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package models
|
package dns
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package models
|
package dns
|
||||||
|
|
||||||
import (
|
import (
|
||||||
_ "github.com/go-sql-driver/mysql"
|
_ "github.com/go-sql-driver/mysql"
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package models
|
package dns
|
||||||
|
|
||||||
// 管理的域名
|
// 管理的域名
|
||||||
type DNSDomain struct {
|
type DNSDomain struct {
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package models
|
package dns
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
package models
|
package dns
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
dbutils "github.com/TeaOSLab/EdgeAPI/internal/db/utils"
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/errors"
|
"github.com/TeaOSLab/EdgeAPI/internal/errors"
|
||||||
_ "github.com/go-sql-driver/mysql"
|
_ "github.com/go-sql-driver/mysql"
|
||||||
"github.com/iwind/TeaGo/Tea"
|
"github.com/iwind/TeaGo/Tea"
|
||||||
@@ -107,14 +108,14 @@ func (this *DNSProviderDAO) UpdateDNSProvider(tx *dbs.Tx, dnsProviderId int64, n
|
|||||||
|
|
||||||
// 计算服务商数量
|
// 计算服务商数量
|
||||||
func (this *DNSProviderDAO) CountAllEnabledDNSProviders(tx *dbs.Tx, adminId int64, userId int64) (int64, error) {
|
func (this *DNSProviderDAO) CountAllEnabledDNSProviders(tx *dbs.Tx, adminId int64, userId int64) (int64, error) {
|
||||||
return NewQuery(tx, this, adminId, userId).
|
return dbutils.NewQuery(tx, this, adminId, userId).
|
||||||
State(DNSProviderStateEnabled).
|
State(DNSProviderStateEnabled).
|
||||||
Count()
|
Count()
|
||||||
}
|
}
|
||||||
|
|
||||||
// 列出单页服务商
|
// 列出单页服务商
|
||||||
func (this *DNSProviderDAO) ListEnabledDNSProviders(tx *dbs.Tx, adminId int64, userId int64, offset int64, size int64) (result []*DNSProvider, err error) {
|
func (this *DNSProviderDAO) ListEnabledDNSProviders(tx *dbs.Tx, adminId int64, userId int64, offset int64, size int64) (result []*DNSProvider, err error) {
|
||||||
_, err = NewQuery(tx, this, adminId, userId).
|
_, err = dbutils.NewQuery(tx, this, adminId, userId).
|
||||||
State(DNSProviderStateEnabled).
|
State(DNSProviderStateEnabled).
|
||||||
Offset(offset).
|
Offset(offset).
|
||||||
Limit(size).
|
Limit(size).
|
||||||
@@ -126,7 +127,7 @@ func (this *DNSProviderDAO) ListEnabledDNSProviders(tx *dbs.Tx, adminId int64, u
|
|||||||
|
|
||||||
// 列出所有服务商
|
// 列出所有服务商
|
||||||
func (this *DNSProviderDAO) FindAllEnabledDNSProviders(tx *dbs.Tx, adminId int64, userId int64) (result []*DNSProvider, err error) {
|
func (this *DNSProviderDAO) FindAllEnabledDNSProviders(tx *dbs.Tx, adminId int64, userId int64) (result []*DNSProvider, err error) {
|
||||||
_, err = NewQuery(tx, this, adminId, userId).
|
_, err = dbutils.NewQuery(tx, this, adminId, userId).
|
||||||
State(DNSProviderStateEnabled).
|
State(DNSProviderStateEnabled).
|
||||||
DescPk().
|
DescPk().
|
||||||
Slice(&result).
|
Slice(&result).
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package models
|
package dns
|
||||||
|
|
||||||
import (
|
import (
|
||||||
_ "github.com/go-sql-driver/mysql"
|
_ "github.com/go-sql-driver/mysql"
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package models
|
package dns
|
||||||
|
|
||||||
// DNS服务商
|
// DNS服务商
|
||||||
type DNSProvider struct {
|
type DNSProvider struct {
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package models
|
package dns
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
@@ -3,6 +3,7 @@ package models
|
|||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
|
"github.com/TeaOSLab/EdgeAPI/internal/db/models/dns"
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/utils/numberutils"
|
"github.com/TeaOSLab/EdgeAPI/internal/utils/numberutils"
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/dnsconfigs"
|
"github.com/TeaOSLab/EdgeCommon/pkg/dnsconfigs"
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
|
"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
|
||||||
@@ -332,7 +333,7 @@ func (this *NodeClusterDAO) FindAllEnabledClustersWithGrantId(tx *dbs.Tx, grantI
|
|||||||
func (this *NodeClusterDAO) CountAllEnabledClustersWithDNSProviderId(tx *dbs.Tx, dnsProviderId int64) (int64, error) {
|
func (this *NodeClusterDAO) CountAllEnabledClustersWithDNSProviderId(tx *dbs.Tx, dnsProviderId int64) (int64, error) {
|
||||||
return this.Query(tx).
|
return this.Query(tx).
|
||||||
State(NodeClusterStateEnabled).
|
State(NodeClusterStateEnabled).
|
||||||
Where("dnsDomainId IN (SELECT id FROM "+SharedDNSDomainDAO.Table+" WHERE state=1 AND providerId=:providerId)").
|
Where("dnsDomainId IN (SELECT id FROM "+dns.SharedDNSDomainDAO.Table+" WHERE state=1 AND providerId=:providerId)").
|
||||||
Param("providerId", dnsProviderId).
|
Param("providerId", dnsProviderId).
|
||||||
Count()
|
Count()
|
||||||
}
|
}
|
||||||
@@ -341,7 +342,7 @@ func (this *NodeClusterDAO) CountAllEnabledClustersWithDNSProviderId(tx *dbs.Tx,
|
|||||||
func (this *NodeClusterDAO) FindAllEnabledClustersWithDNSProviderId(tx *dbs.Tx, dnsProviderId int64) (result []*NodeCluster, err error) {
|
func (this *NodeClusterDAO) FindAllEnabledClustersWithDNSProviderId(tx *dbs.Tx, dnsProviderId int64) (result []*NodeCluster, err error) {
|
||||||
_, err = this.Query(tx).
|
_, err = this.Query(tx).
|
||||||
State(NodeClusterStateEnabled).
|
State(NodeClusterStateEnabled).
|
||||||
Where("dnsDomainId IN (SELECT id FROM "+SharedDNSDomainDAO.Table+" WHERE state=1 AND providerId=:providerId)").
|
Where("dnsDomainId IN (SELECT id FROM "+dns.SharedDNSDomainDAO.Table+" WHERE state=1 AND providerId=:providerId)").
|
||||||
Param("providerId", dnsProviderId).
|
Param("providerId", dnsProviderId).
|
||||||
Slice(&result).
|
Slice(&result).
|
||||||
DescPk().
|
DescPk().
|
||||||
@@ -462,7 +463,7 @@ func (this *NodeClusterDAO) CheckClusterDNS(tx *dbs.Tx, cluster *NodeCluster) (i
|
|||||||
domainId := int64(cluster.DnsDomainId)
|
domainId := int64(cluster.DnsDomainId)
|
||||||
|
|
||||||
// 检查域名
|
// 检查域名
|
||||||
domain, err := SharedDNSDomainDAO.FindEnabledDNSDomain(tx, domainId)
|
domain, err := dns.SharedDNSDomainDAO.FindEnabledDNSDomain(tx, domainId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
package models
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
package models
|
|
||||||
@@ -1,7 +1,8 @@
|
|||||||
package models
|
package regions
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"github.com/TeaOSLab/EdgeAPI/internal/utils/numberutils"
|
||||||
_ "github.com/go-sql-driver/mysql"
|
_ "github.com/go-sql-driver/mysql"
|
||||||
"github.com/iwind/TeaGo/Tea"
|
"github.com/iwind/TeaGo/Tea"
|
||||||
"github.com/iwind/TeaGo/dbs"
|
"github.com/iwind/TeaGo/dbs"
|
||||||
@@ -15,6 +16,8 @@ const (
|
|||||||
|
|
||||||
type RegionCityDAO dbs.DAO
|
type RegionCityDAO dbs.DAO
|
||||||
|
|
||||||
|
var regionCityNameAndIdCacheMap = map[string]int64{} // city name @ province id => id
|
||||||
|
|
||||||
func NewRegionCityDAO() *RegionCityDAO {
|
func NewRegionCityDAO() *RegionCityDAO {
|
||||||
return dbs.NewDAO(&RegionCityDAO{
|
return dbs.NewDAO(&RegionCityDAO{
|
||||||
DAOObject: dbs.DAOObject{
|
DAOObject: dbs.DAOObject{
|
||||||
@@ -53,7 +56,7 @@ func (this *RegionCityDAO) DisableRegionCity(tx *dbs.Tx, id uint32) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 查找启用中的条目
|
// 查找启用中的条目
|
||||||
func (this *RegionCityDAO) FindEnabledRegionCity(tx *dbs.Tx, id uint32) (*RegionCity, error) {
|
func (this *RegionCityDAO) FindEnabledRegionCity(tx *dbs.Tx, id int64) (*RegionCity, error) {
|
||||||
result, err := this.Query(tx).
|
result, err := this.Query(tx).
|
||||||
Pk(id).
|
Pk(id).
|
||||||
Attr("state", RegionCityStateEnabled).
|
Attr("state", RegionCityStateEnabled).
|
||||||
@@ -100,3 +103,31 @@ func (this *RegionCityDAO) CreateCity(tx *dbs.Tx, provinceId int64, name string,
|
|||||||
}
|
}
|
||||||
return types.Int64(op.Id), nil
|
return types.Int64(op.Id), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 根据城市名查找城市ID
|
||||||
|
func (this *RegionCityDAO) FindCityIdWithNameCacheable(tx *dbs.Tx, provinceId int64, cityName string) (int64, error) {
|
||||||
|
key := cityName + "@" + numberutils.FormatInt64(provinceId)
|
||||||
|
|
||||||
|
SharedCacheLocker.RLock()
|
||||||
|
cityId, ok := regionCityNameAndIdCacheMap[key]
|
||||||
|
if ok {
|
||||||
|
SharedCacheLocker.RUnlock()
|
||||||
|
return cityId, nil
|
||||||
|
}
|
||||||
|
SharedCacheLocker.RUnlock()
|
||||||
|
|
||||||
|
cityId, err := this.Query(tx).
|
||||||
|
Attr("provinceId", provinceId).
|
||||||
|
Where("JSON_CONTAINS(codes, :cityName)").
|
||||||
|
Param("cityName", "\""+cityName+"\""). // 查询的需要是个JSON字符串,所以这里加双引号
|
||||||
|
ResultPk().
|
||||||
|
FindInt64Col(0)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
SharedCacheLocker.Lock()
|
||||||
|
regionCityNameAndIdCacheMap[key] = cityId
|
||||||
|
SharedCacheLocker.Unlock()
|
||||||
|
|
||||||
|
return cityId, nil
|
||||||
|
}
|
||||||
22
internal/db/models/regions/region_city_dao_test.go
Normal file
22
internal/db/models/regions/region_city_dao_test.go
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
package regions
|
||||||
|
|
||||||
|
import (
|
||||||
|
_ "github.com/go-sql-driver/mysql"
|
||||||
|
_ "github.com/iwind/TeaGo/bootstrap"
|
||||||
|
"github.com/iwind/TeaGo/dbs"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestRegionCityDAO_FindCityIdWithCityNameCacheable(t *testing.T) {
|
||||||
|
dbs.NotifyReady()
|
||||||
|
|
||||||
|
for i := 0; i < 5; i++ {
|
||||||
|
now := time.Now()
|
||||||
|
cityId, err := SharedRegionCityDAO.FindCityIdWithNameCacheable(nil, 1, "北京市")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
t.Log("cityId", cityId, time.Since(now).Seconds()*1000, "ms")
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package models
|
package regions
|
||||||
|
|
||||||
//
|
//
|
||||||
type RegionCity struct {
|
type RegionCity struct {
|
||||||
1
internal/db/models/regions/region_city_model_ext.go
Normal file
1
internal/db/models/regions/region_city_model_ext.go
Normal file
@@ -0,0 +1 @@
|
|||||||
|
package regions
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package models
|
package regions
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
@@ -15,6 +15,8 @@ const (
|
|||||||
RegionCountryStateDisabled = 0 // 已禁用
|
RegionCountryStateDisabled = 0 // 已禁用
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var regionCountryNameAndIdCacheMap = map[string]int64{} // country name => int
|
||||||
|
|
||||||
type RegionCountryDAO dbs.DAO
|
type RegionCountryDAO dbs.DAO
|
||||||
|
|
||||||
func NewRegionCountryDAO() *RegionCountryDAO {
|
func NewRegionCountryDAO() *RegionCountryDAO {
|
||||||
@@ -83,8 +85,7 @@ func (this *RegionCountryDAO) FindCountryIdWithDataId(tx *dbs.Tx, dataId string)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 根据国家名查找国家ID
|
// 根据国家名查找国家ID
|
||||||
// TODO 加入缓存
|
func (this *RegionCountryDAO) FindCountryIdWithName(tx *dbs.Tx, countryName string) (int64, error) {
|
||||||
func (this *RegionCountryDAO) FindCountryIdWithCountryName(tx *dbs.Tx, countryName string) (int64, error) {
|
|
||||||
return this.Query(tx).
|
return this.Query(tx).
|
||||||
Where("JSON_CONTAINS(codes, :countryName)").
|
Where("JSON_CONTAINS(codes, :countryName)").
|
||||||
Param("countryName", "\""+countryName+"\""). // 查询的需要是个JSON字符串,所以这里加双引号
|
Param("countryName", "\""+countryName+"\""). // 查询的需要是个JSON字符串,所以这里加双引号
|
||||||
@@ -92,6 +93,28 @@ func (this *RegionCountryDAO) FindCountryIdWithCountryName(tx *dbs.Tx, countryNa
|
|||||||
FindInt64Col(0)
|
FindInt64Col(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 根据国家名查找国家ID,并可使用缓存
|
||||||
|
func (this *RegionCountryDAO) FindCountryIdWithNameCacheable(tx *dbs.Tx, countryName string) (int64, error) {
|
||||||
|
SharedCacheLocker.RLock()
|
||||||
|
provinceId, ok := regionCountryNameAndIdCacheMap[countryName]
|
||||||
|
if ok {
|
||||||
|
SharedCacheLocker.RUnlock()
|
||||||
|
return provinceId, nil
|
||||||
|
}
|
||||||
|
SharedCacheLocker.RUnlock()
|
||||||
|
|
||||||
|
countryId, err := this.FindCountryIdWithName(tx, countryName)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
SharedCacheLocker.Lock()
|
||||||
|
regionCountryNameAndIdCacheMap[countryName] = countryId
|
||||||
|
SharedCacheLocker.Unlock()
|
||||||
|
|
||||||
|
return countryId, nil
|
||||||
|
}
|
||||||
|
|
||||||
// 根据数据ID创建国家
|
// 根据数据ID创建国家
|
||||||
func (this *RegionCountryDAO) CreateCountry(tx *dbs.Tx, name string, dataId string) (int64, error) {
|
func (this *RegionCountryDAO) CreateCountry(tx *dbs.Tx, name string, dataId string) (int64, error) {
|
||||||
op := NewRegionCountryOperator()
|
op := NewRegionCountryOperator()
|
||||||
22
internal/db/models/regions/region_country_dao_test.go
Normal file
22
internal/db/models/regions/region_country_dao_test.go
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
package regions
|
||||||
|
|
||||||
|
import (
|
||||||
|
_ "github.com/go-sql-driver/mysql"
|
||||||
|
_ "github.com/iwind/TeaGo/bootstrap"
|
||||||
|
"github.com/iwind/TeaGo/dbs"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestRegionCountryDAO_FindCountryIdWithCountryNameCacheable(t *testing.T) {
|
||||||
|
dbs.NotifyReady()
|
||||||
|
|
||||||
|
for i := 0; i < 5; i++ {
|
||||||
|
now := time.Now()
|
||||||
|
countryId, err := SharedRegionCountryDAO.FindCountryIdWithNameCacheable(nil, "中国")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
t.Log("countryId", countryId, time.Since(now).Seconds()*1000, "ms")
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package models
|
package regions
|
||||||
|
|
||||||
//
|
//
|
||||||
type RegionCountry struct {
|
type RegionCountry struct {
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package models
|
package regions
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
package models
|
package regions
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/json"
|
||||||
_ "github.com/go-sql-driver/mysql"
|
_ "github.com/go-sql-driver/mysql"
|
||||||
"github.com/iwind/TeaGo/Tea"
|
"github.com/iwind/TeaGo/Tea"
|
||||||
"github.com/iwind/TeaGo/dbs"
|
"github.com/iwind/TeaGo/dbs"
|
||||||
@@ -11,6 +12,8 @@ const (
|
|||||||
RegionProviderStateDisabled = 0 // 已禁用
|
RegionProviderStateDisabled = 0 // 已禁用
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var regionProviderNameAndIdCacheMap = map[string]int64{} // provider name => id
|
||||||
|
|
||||||
type RegionProviderDAO dbs.DAO
|
type RegionProviderDAO dbs.DAO
|
||||||
|
|
||||||
func NewRegionProviderDAO() *RegionProviderDAO {
|
func NewRegionProviderDAO() *RegionProviderDAO {
|
||||||
@@ -69,3 +72,42 @@ func (this *RegionProviderDAO) FindRegionProviderName(tx *dbs.Tx, id uint32) (st
|
|||||||
Result("name").
|
Result("name").
|
||||||
FindStringCol("")
|
FindStringCol("")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 根据服务商名称查找服务商ID
|
||||||
|
func (this *RegionProviderDAO) FindProviderIdWithNameCacheable(tx *dbs.Tx, providerName string) (int64, error) {
|
||||||
|
SharedCacheLocker.RLock()
|
||||||
|
providerId, ok := regionProviderNameAndIdCacheMap[providerName]
|
||||||
|
if ok {
|
||||||
|
SharedCacheLocker.RUnlock()
|
||||||
|
return providerId, nil
|
||||||
|
}
|
||||||
|
SharedCacheLocker.RUnlock()
|
||||||
|
|
||||||
|
providerId, err := this.Query(tx).
|
||||||
|
Where("JSON_CONTAINS(codes, :providerName)").
|
||||||
|
Param("providerName", "\""+providerName+"\""). // 查询的需要是个JSON字符串,所以这里加双引号
|
||||||
|
ResultPk().
|
||||||
|
FindInt64Col(0)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
SharedCacheLocker.Lock()
|
||||||
|
regionProviderNameAndIdCacheMap[providerName] = providerId
|
||||||
|
SharedCacheLocker.Unlock()
|
||||||
|
|
||||||
|
return providerId, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建Provider
|
||||||
|
func (this *RegionProviderDAO) CreateProvider(tx *dbs.Tx, name string) (int64, error) {
|
||||||
|
op := NewRegionProviderOperator()
|
||||||
|
op.Name = name
|
||||||
|
|
||||||
|
codesJSON, err := json.Marshal([]string{name})
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
op.Codes = codesJSON
|
||||||
|
return this.SaveInt64(tx, op)
|
||||||
|
}
|
||||||
33
internal/db/models/regions/region_provider_dao_test.go
Normal file
33
internal/db/models/regions/region_provider_dao_test.go
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
package regions
|
||||||
|
|
||||||
|
import (
|
||||||
|
_ "github.com/go-sql-driver/mysql"
|
||||||
|
_ "github.com/iwind/TeaGo/bootstrap"
|
||||||
|
"github.com/iwind/TeaGo/dbs"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestRegionProviderDAO_FindProviderIdWithProviderNameCacheable(t *testing.T) {
|
||||||
|
dbs.NotifyReady()
|
||||||
|
|
||||||
|
for i := 0; i < 5; i++ {
|
||||||
|
now := time.Now()
|
||||||
|
providerId, err := SharedRegionProviderDAO.FindProviderIdWithNameCacheable(nil, "电信")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
t.Log("providerId", providerId, time.Since(now).Seconds()*1000, "ms")
|
||||||
|
}
|
||||||
|
|
||||||
|
t.Log("=====")
|
||||||
|
|
||||||
|
for i := 0; i < 5; i++ {
|
||||||
|
now := time.Now()
|
||||||
|
providerId, err := SharedRegionProviderDAO.FindProviderIdWithNameCacheable(nil, "胡乱填的")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
t.Log("providerId", providerId, time.Since(now).Seconds()*1000, "ms")
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package models
|
package regions
|
||||||
|
|
||||||
//
|
//
|
||||||
type RegionProvider struct {
|
type RegionProvider struct {
|
||||||
1
internal/db/models/regions/region_provider_model_ext.go
Normal file
1
internal/db/models/regions/region_provider_model_ext.go
Normal file
@@ -0,0 +1 @@
|
|||||||
|
package regions
|
||||||
@@ -1,7 +1,8 @@
|
|||||||
package models
|
package regions
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"github.com/TeaOSLab/EdgeAPI/internal/utils/numberutils"
|
||||||
_ "github.com/go-sql-driver/mysql"
|
_ "github.com/go-sql-driver/mysql"
|
||||||
"github.com/iwind/TeaGo/Tea"
|
"github.com/iwind/TeaGo/Tea"
|
||||||
"github.com/iwind/TeaGo/dbs"
|
"github.com/iwind/TeaGo/dbs"
|
||||||
@@ -13,6 +14,8 @@ const (
|
|||||||
RegionProvinceStateDisabled = 0 // 已禁用
|
RegionProvinceStateDisabled = 0 // 已禁用
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var regionProvinceNameAndIdCacheMap = map[string]int64{} // province name @ country id => province id
|
||||||
|
|
||||||
type RegionProvinceDAO dbs.DAO
|
type RegionProvinceDAO dbs.DAO
|
||||||
|
|
||||||
func NewRegionProvinceDAO() *RegionProvinceDAO {
|
func NewRegionProvinceDAO() *RegionProvinceDAO {
|
||||||
@@ -81,15 +84,38 @@ func (this *RegionProvinceDAO) FindProvinceIdWithDataId(tx *dbs.Tx, dataId strin
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 根据省份名查找省份ID
|
// 根据省份名查找省份ID
|
||||||
// TODO 加入缓存
|
func (this *RegionProvinceDAO) FindProvinceIdWithName(tx *dbs.Tx, countryId int64, provinceName string) (int64, error) {
|
||||||
func (this *RegionProvinceDAO) FindProvinceIdWithProvinceName(tx *dbs.Tx, provinceName string) (int64, error) {
|
|
||||||
return this.Query(tx).
|
return this.Query(tx).
|
||||||
|
Attr("countryId", countryId).
|
||||||
Where("JSON_CONTAINS(codes, :provinceName)").
|
Where("JSON_CONTAINS(codes, :provinceName)").
|
||||||
Param("provinceName", "\""+provinceName+"\""). // 查询的需要是个JSON字符串,所以这里加双引号
|
Param("provinceName", "\""+provinceName+"\""). // 查询的需要是个JSON字符串,所以这里加双引号
|
||||||
ResultPk().
|
ResultPk().
|
||||||
FindInt64Col(0)
|
FindInt64Col(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 根据省份名查找省份ID,并可使用缓存
|
||||||
|
func (this *RegionProvinceDAO) FindProvinceIdWithNameCacheable(tx *dbs.Tx, countryId int64, provinceName string) (int64, error) {
|
||||||
|
var key = provinceName + "@" + numberutils.FormatInt64(countryId)
|
||||||
|
|
||||||
|
SharedCacheLocker.RLock()
|
||||||
|
provinceId, ok := regionProvinceNameAndIdCacheMap[key]
|
||||||
|
if ok {
|
||||||
|
SharedCacheLocker.RUnlock()
|
||||||
|
return provinceId, nil
|
||||||
|
}
|
||||||
|
SharedCacheLocker.RUnlock()
|
||||||
|
|
||||||
|
provinceId, err := this.FindProvinceIdWithName(tx, countryId, provinceName)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
SharedCacheLocker.Lock()
|
||||||
|
regionProvinceNameAndIdCacheMap[key] = provinceId
|
||||||
|
SharedCacheLocker.Unlock()
|
||||||
|
|
||||||
|
return provinceId, nil
|
||||||
|
}
|
||||||
|
|
||||||
// 创建省份
|
// 创建省份
|
||||||
func (this *RegionProvinceDAO) CreateProvince(tx *dbs.Tx, countryId int64, name string, dataId string) (int64, error) {
|
func (this *RegionProvinceDAO) CreateProvince(tx *dbs.Tx, countryId int64, name string, dataId string) (int64, error) {
|
||||||
op := NewRegionProvinceOperator()
|
op := NewRegionProvinceOperator()
|
||||||
31
internal/db/models/regions/region_province_dao_test.go
Normal file
31
internal/db/models/regions/region_province_dao_test.go
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
package regions
|
||||||
|
|
||||||
|
import (
|
||||||
|
_ "github.com/go-sql-driver/mysql"
|
||||||
|
"github.com/iwind/TeaGo/dbs"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestRegionProvinceDAO_FindProvinceIdWithProvinceName(t *testing.T) {
|
||||||
|
dbs.NotifyReady()
|
||||||
|
|
||||||
|
for i := 0; i < 5; i++ {
|
||||||
|
now := time.Now()
|
||||||
|
provinceId, err := SharedRegionProvinceDAO.FindProvinceIdWithNameCacheable(nil, 1, "安徽省")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
t.Log(provinceId, time.Since(now).Seconds()*1000, "ms")
|
||||||
|
}
|
||||||
|
|
||||||
|
t.Log("====")
|
||||||
|
for i := 0; i < 5; i++ {
|
||||||
|
now := time.Now()
|
||||||
|
provinceId, err := SharedRegionProvinceDAO.FindProvinceIdWithNameCacheable(nil, 2, "安徽省")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
t.Log(provinceId, time.Since(now).Seconds()*1000, "ms")
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package models
|
package regions
|
||||||
|
|
||||||
//
|
//
|
||||||
type RegionProvince struct {
|
type RegionProvince struct {
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package models
|
package regions
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
5
internal/db/models/regions/utils.go
Normal file
5
internal/db/models/regions/utils.go
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
package regions
|
||||||
|
|
||||||
|
import "sync"
|
||||||
|
|
||||||
|
var SharedCacheLocker = sync.RWMutex{}
|
||||||
@@ -5,6 +5,7 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/TeaOSLab/EdgeAPI/internal/db/models/dns"
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/utils/numberutils"
|
"github.com/TeaOSLab/EdgeAPI/internal/utils/numberutils"
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/configutils"
|
"github.com/TeaOSLab/EdgeCommon/pkg/configutils"
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
||||||
@@ -762,7 +763,7 @@ func (this *ServerDAO) ComposeServerConfig(tx *dbs.Tx, serverId int64) (*serverc
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if clusterDNS != nil && clusterDNS.DnsDomainId > 0 {
|
if clusterDNS != nil && clusterDNS.DnsDomainId > 0 {
|
||||||
domain, err := SharedDNSDomainDAO.FindEnabledDNSDomain(tx, int64(clusterDNS.DnsDomainId))
|
domain, err := dns.SharedDNSDomainDAO.FindEnabledDNSDomain(tx, int64(clusterDNS.DnsDomainId))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,65 @@
|
|||||||
|
package stats
|
||||||
|
|
||||||
|
import (
|
||||||
|
"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"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ServerClientBrowserMonthlyStatDAO dbs.DAO
|
||||||
|
|
||||||
|
func NewServerClientBrowserMonthlyStatDAO() *ServerClientBrowserMonthlyStatDAO {
|
||||||
|
return dbs.NewDAO(&ServerClientBrowserMonthlyStatDAO{
|
||||||
|
DAOObject: dbs.DAOObject{
|
||||||
|
DB: Tea.Env,
|
||||||
|
Table: "edgeServerClientBrowserMonthlyStats",
|
||||||
|
Model: new(ServerClientBrowserMonthlyStat),
|
||||||
|
PkName: "id",
|
||||||
|
},
|
||||||
|
}).(*ServerClientBrowserMonthlyStatDAO)
|
||||||
|
}
|
||||||
|
|
||||||
|
var SharedServerClientBrowserMonthlyStatDAO *ServerClientBrowserMonthlyStatDAO
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
dbs.OnReady(func() {
|
||||||
|
SharedServerClientBrowserMonthlyStatDAO = NewServerClientBrowserMonthlyStatDAO()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 增加数量
|
||||||
|
func (this *ServerClientBrowserMonthlyStatDAO) IncreaseMonthlyCount(tx *dbs.Tx, serverId int64, browserId int64, version string, month string, count int64) error {
|
||||||
|
if len(month) != 6 {
|
||||||
|
return errors.New("invalid month '" + month + "'")
|
||||||
|
}
|
||||||
|
err := this.Query(tx).
|
||||||
|
Param("count", count).
|
||||||
|
InsertOrUpdateQuickly(maps.Map{
|
||||||
|
"serverId": serverId,
|
||||||
|
"browserId": browserId,
|
||||||
|
"version": version,
|
||||||
|
"month": month,
|
||||||
|
"count": count,
|
||||||
|
}, maps.Map{
|
||||||
|
"count": dbs.SQL("count+:count"),
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查找单页数据
|
||||||
|
func (this *ServerClientBrowserMonthlyStatDAO) ListStats(tx *dbs.Tx, serverId int64, month string, offset int64, size int64) (result []*ServerClientBrowserMonthlyStat, err error) {
|
||||||
|
query := this.Query(tx).
|
||||||
|
Attr("serverId", serverId).
|
||||||
|
Attr("month", month).
|
||||||
|
Offset(offset).
|
||||||
|
Limit(size).
|
||||||
|
Slice(&result).
|
||||||
|
Desc("count")
|
||||||
|
_, err = query.FindAll()
|
||||||
|
return
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
package stats
|
||||||
|
|
||||||
|
import (
|
||||||
|
_ "github.com/go-sql-driver/mysql"
|
||||||
|
_ "github.com/iwind/TeaGo/bootstrap"
|
||||||
|
"github.com/iwind/TeaGo/dbs"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestServerClientBrowserMonthlyStatDAO_IncreaseMonthlyCount(t *testing.T) {
|
||||||
|
dbs.NotifyReady()
|
||||||
|
|
||||||
|
var tx *dbs.Tx
|
||||||
|
err := SharedServerClientBrowserMonthlyStatDAO.IncreaseMonthlyCount(tx, 1, 1, "202101", 1)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
t.Log("ok")
|
||||||
|
}
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
package stats
|
||||||
|
|
||||||
|
// 浏览器统计(按月)
|
||||||
|
type ServerClientBrowserMonthlyStat struct {
|
||||||
|
Id uint64 `field:"id"` // ID
|
||||||
|
ServerId uint32 `field:"serverId"` // 服务ID
|
||||||
|
BrowserId uint32 `field:"browserId"` // 浏览器ID
|
||||||
|
Month string `field:"month"` // YYYYMM
|
||||||
|
Version string `field:"version"` // 主版本号
|
||||||
|
Count uint64 `field:"count"` // 数量
|
||||||
|
}
|
||||||
|
|
||||||
|
type ServerClientBrowserMonthlyStatOperator struct {
|
||||||
|
Id interface{} // ID
|
||||||
|
ServerId interface{} // 服务ID
|
||||||
|
BrowserId interface{} // 浏览器ID
|
||||||
|
Month interface{} // YYYYMM
|
||||||
|
Version interface{} // 主版本号
|
||||||
|
Count interface{} // 数量
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewServerClientBrowserMonthlyStatOperator() *ServerClientBrowserMonthlyStatOperator {
|
||||||
|
return &ServerClientBrowserMonthlyStatOperator{}
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
package stats
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
package stats
|
||||||
|
|
||||||
|
import (
|
||||||
|
"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"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ServerClientSystemMonthlyStatDAO dbs.DAO
|
||||||
|
|
||||||
|
func NewServerClientSystemMonthlyStatDAO() *ServerClientSystemMonthlyStatDAO {
|
||||||
|
return dbs.NewDAO(&ServerClientSystemMonthlyStatDAO{
|
||||||
|
DAOObject: dbs.DAOObject{
|
||||||
|
DB: Tea.Env,
|
||||||
|
Table: "edgeServerClientSystemMonthlyStats",
|
||||||
|
Model: new(ServerClientSystemMonthlyStat),
|
||||||
|
PkName: "id",
|
||||||
|
},
|
||||||
|
}).(*ServerClientSystemMonthlyStatDAO)
|
||||||
|
}
|
||||||
|
|
||||||
|
var SharedServerClientSystemMonthlyStatDAO *ServerClientSystemMonthlyStatDAO
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
dbs.OnReady(func() {
|
||||||
|
SharedServerClientSystemMonthlyStatDAO = NewServerClientSystemMonthlyStatDAO()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 增加数量
|
||||||
|
func (this *ServerClientSystemMonthlyStatDAO) IncreaseMonthlyCount(tx *dbs.Tx, serverId int64, systemId int64, version string, month string, count int64) error {
|
||||||
|
if len(month) != 6 {
|
||||||
|
return errors.New("invalid month '" + month + "'")
|
||||||
|
}
|
||||||
|
err := this.Query(tx).
|
||||||
|
Param("count", count).
|
||||||
|
InsertOrUpdateQuickly(maps.Map{
|
||||||
|
"serverId": serverId,
|
||||||
|
"systemId": systemId,
|
||||||
|
"version": version,
|
||||||
|
"month": month,
|
||||||
|
"count": count,
|
||||||
|
}, maps.Map{
|
||||||
|
"count": dbs.SQL("count+:count"),
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查找单页数据
|
||||||
|
func (this *ServerClientSystemMonthlyStatDAO) ListStats(tx *dbs.Tx, serverId int64, month string, offset int64, size int64) (result []*ServerClientSystemMonthlyStat, err error) {
|
||||||
|
query := this.Query(tx).
|
||||||
|
Attr("serverId", serverId).
|
||||||
|
Attr("month", month).
|
||||||
|
Offset(offset).
|
||||||
|
Limit(size).
|
||||||
|
Slice(&result).
|
||||||
|
Desc("count")
|
||||||
|
_, err = query.FindAll()
|
||||||
|
return
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package models
|
package stats
|
||||||
|
|
||||||
import (
|
import (
|
||||||
_ "github.com/go-sql-driver/mysql"
|
_ "github.com/go-sql-driver/mysql"
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
package stats
|
||||||
|
|
||||||
|
// 操作系统统计(按月)
|
||||||
|
type ServerClientSystemMonthlyStat struct {
|
||||||
|
Id uint64 `field:"id"` // ID
|
||||||
|
ServerId uint32 `field:"serverId"` // 服务ID
|
||||||
|
SystemId uint32 `field:"systemId"` // 系统ID
|
||||||
|
Version string `field:"version"` // 主版本号
|
||||||
|
Month string `field:"month"` // YYYYMM
|
||||||
|
Count uint64 `field:"count"` // 数量
|
||||||
|
}
|
||||||
|
|
||||||
|
type ServerClientSystemMonthlyStatOperator struct {
|
||||||
|
Id interface{} // ID
|
||||||
|
ServerId interface{} // 服务ID
|
||||||
|
SystemId interface{} // 系统ID
|
||||||
|
Version interface{} // 主版本号
|
||||||
|
Month interface{} // YYYYMM
|
||||||
|
Count interface{} // 数量
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewServerClientSystemMonthlyStatOperator() *ServerClientSystemMonthlyStatOperator {
|
||||||
|
return &ServerClientSystemMonthlyStatOperator{}
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
package stats
|
||||||
@@ -0,0 +1,73 @@
|
|||||||
|
package stats
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/TeaOSLab/EdgeAPI/internal/db/models/regions"
|
||||||
|
"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"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ServerRegionCityMonthlyStatDAO dbs.DAO
|
||||||
|
|
||||||
|
func NewServerRegionCityMonthlyStatDAO() *ServerRegionCityMonthlyStatDAO {
|
||||||
|
return dbs.NewDAO(&ServerRegionCityMonthlyStatDAO{
|
||||||
|
DAOObject: dbs.DAOObject{
|
||||||
|
DB: Tea.Env,
|
||||||
|
Table: "edgeServerRegionCityMonthlyStats",
|
||||||
|
Model: new(ServerRegionCityMonthlyStat),
|
||||||
|
PkName: "id",
|
||||||
|
},
|
||||||
|
}).(*ServerRegionCityMonthlyStatDAO)
|
||||||
|
}
|
||||||
|
|
||||||
|
var SharedServerRegionCityMonthlyStatDAO *ServerRegionCityMonthlyStatDAO
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
dbs.OnReady(func() {
|
||||||
|
SharedServerRegionCityMonthlyStatDAO = NewServerRegionCityMonthlyStatDAO()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 增加数量
|
||||||
|
func (this *ServerRegionCityMonthlyStatDAO) IncreaseMonthlyCount(tx *dbs.Tx, serverId int64, cityId int64, month string, count int64) error {
|
||||||
|
if len(month) != 6 {
|
||||||
|
return errors.New("invalid month '" + month + "'")
|
||||||
|
}
|
||||||
|
err := this.Query(tx).
|
||||||
|
Param("count", count).
|
||||||
|
InsertOrUpdateQuickly(maps.Map{
|
||||||
|
"serverId": serverId,
|
||||||
|
"cityId": cityId,
|
||||||
|
"month": month,
|
||||||
|
"count": count,
|
||||||
|
}, maps.Map{
|
||||||
|
"count": dbs.SQL("count+:count"),
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查找单页数据
|
||||||
|
func (this *ServerRegionCityMonthlyStatDAO) ListStats(tx *dbs.Tx, serverId int64, month string, countryId int64, provinceId int64, offset int64, size int64) (result []*ServerRegionCityMonthlyStat, err error) {
|
||||||
|
query := this.Query(tx).
|
||||||
|
Attr("serverId", serverId).
|
||||||
|
Attr("month", month).
|
||||||
|
Offset(offset).
|
||||||
|
Limit(size).
|
||||||
|
Slice(&result).
|
||||||
|
Desc("count")
|
||||||
|
if countryId > 0 {
|
||||||
|
query.Where("cityId IN (SELECT id FROM "+regions.SharedRegionCityDAO.Table+" WHERE provinceId IN (SELECT id FROM "+regions.SharedRegionProvinceDAO.Table+" WHERE countryId=:countryId AND state=1) AND state=1)").
|
||||||
|
Param("countryId", countryId)
|
||||||
|
}
|
||||||
|
if provinceId > 0 {
|
||||||
|
query.Where("cityId IN (SELECT id FROM "+regions.SharedRegionCityDAO.Table+" WHERE provinceId=:provinceId AND state=1)").
|
||||||
|
Param("provinceId", provinceId)
|
||||||
|
}
|
||||||
|
_, err = query.FindAll()
|
||||||
|
return
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package models
|
package stats
|
||||||
|
|
||||||
import (
|
import (
|
||||||
_ "github.com/go-sql-driver/mysql"
|
_ "github.com/go-sql-driver/mysql"
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
package stats
|
||||||
|
|
||||||
|
// 服务用户省份分布统计(按天)
|
||||||
|
type ServerRegionCityMonthlyStat struct {
|
||||||
|
Id uint64 `field:"id"` // ID
|
||||||
|
ServerId uint32 `field:"serverId"` // 服务ID
|
||||||
|
CityId uint32 `field:"cityId"` // 城市ID
|
||||||
|
Month string `field:"month"` // 月份YYYYMM
|
||||||
|
Count uint64 `field:"count"` // 数量
|
||||||
|
}
|
||||||
|
|
||||||
|
type ServerRegionCityMonthlyStatOperator struct {
|
||||||
|
Id interface{} // ID
|
||||||
|
ServerId interface{} // 服务ID
|
||||||
|
CityId interface{} // 城市ID
|
||||||
|
Month interface{} // 月份YYYYMM
|
||||||
|
Count interface{} // 数量
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewServerRegionCityMonthlyStatOperator() *ServerRegionCityMonthlyStatOperator {
|
||||||
|
return &ServerRegionCityMonthlyStatOperator{}
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
package stats
|
||||||
@@ -0,0 +1,64 @@
|
|||||||
|
package stats
|
||||||
|
|
||||||
|
import (
|
||||||
|
"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"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ServerRegionCountryMonthlyStatDAO dbs.DAO
|
||||||
|
|
||||||
|
func NewServerRegionCountryMonthlyStatDAO() *ServerRegionCountryMonthlyStatDAO {
|
||||||
|
return dbs.NewDAO(&ServerRegionCountryMonthlyStatDAO{
|
||||||
|
DAOObject: dbs.DAOObject{
|
||||||
|
DB: Tea.Env,
|
||||||
|
Table: "edgeServerRegionCountryMonthlyStats",
|
||||||
|
Model: new(ServerRegionCountryMonthlyStat),
|
||||||
|
PkName: "id",
|
||||||
|
},
|
||||||
|
}).(*ServerRegionCountryMonthlyStatDAO)
|
||||||
|
}
|
||||||
|
|
||||||
|
var SharedServerRegionCountryMonthlyStatDAO *ServerRegionCountryMonthlyStatDAO
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
dbs.OnReady(func() {
|
||||||
|
SharedServerRegionCountryMonthlyStatDAO = NewServerRegionCountryMonthlyStatDAO()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 增加数量
|
||||||
|
func (this *ServerRegionCountryMonthlyStatDAO) IncreaseMonthlyCount(tx *dbs.Tx, serverId int64, countryId int64, month string, count int64) error {
|
||||||
|
if len(month) != 6 {
|
||||||
|
return errors.New("invalid month '" + month + "'")
|
||||||
|
}
|
||||||
|
err := this.Query(tx).
|
||||||
|
Param("count", count).
|
||||||
|
InsertOrUpdateQuickly(maps.Map{
|
||||||
|
"serverId": serverId,
|
||||||
|
"countryId": countryId,
|
||||||
|
"month": month,
|
||||||
|
"count": count,
|
||||||
|
}, maps.Map{
|
||||||
|
"count": dbs.SQL("count+:count"),
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查找单页数据
|
||||||
|
func (this *ServerRegionCountryMonthlyStatDAO) ListStats(tx *dbs.Tx, serverId int64, month string, offset int64, size int64) (result []*ServerRegionCountryMonthlyStat, err error) {
|
||||||
|
query := this.Query(tx).
|
||||||
|
Attr("serverId", serverId).
|
||||||
|
Attr("month", month).
|
||||||
|
Offset(offset).
|
||||||
|
Limit(size).
|
||||||
|
Slice(&result).
|
||||||
|
Desc("count")
|
||||||
|
_, err = query.FindAll()
|
||||||
|
return
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
package stats
|
||||||
|
|
||||||
|
import (
|
||||||
|
_ "github.com/go-sql-driver/mysql"
|
||||||
|
)
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
package stats
|
||||||
|
|
||||||
|
// 服务用户区域分布统计(按天)
|
||||||
|
type ServerRegionCountryMonthlyStat struct {
|
||||||
|
Id uint64 `field:"id"` // ID
|
||||||
|
ServerId uint32 `field:"serverId"` // 服务ID
|
||||||
|
CountryId uint32 `field:"countryId"` // 国家/区域ID
|
||||||
|
Month string `field:"month"` // 月份YYYYMM
|
||||||
|
Count uint64 `field:"count"` // 数量
|
||||||
|
}
|
||||||
|
|
||||||
|
type ServerRegionCountryMonthlyStatOperator struct {
|
||||||
|
Id interface{} // ID
|
||||||
|
ServerId interface{} // 服务ID
|
||||||
|
CountryId interface{} // 国家/区域ID
|
||||||
|
Month interface{} // 月份YYYYMM
|
||||||
|
Count interface{} // 数量
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewServerRegionCountryMonthlyStatOperator() *ServerRegionCountryMonthlyStatOperator {
|
||||||
|
return &ServerRegionCountryMonthlyStatOperator{}
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
package stats
|
||||||
@@ -0,0 +1,64 @@
|
|||||||
|
package stats
|
||||||
|
|
||||||
|
import (
|
||||||
|
"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"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ServerRegionProviderMonthlyStatDAO dbs.DAO
|
||||||
|
|
||||||
|
func NewServerRegionProviderMonthlyStatDAO() *ServerRegionProviderMonthlyStatDAO {
|
||||||
|
return dbs.NewDAO(&ServerRegionProviderMonthlyStatDAO{
|
||||||
|
DAOObject: dbs.DAOObject{
|
||||||
|
DB: Tea.Env,
|
||||||
|
Table: "edgeServerRegionProviderMonthlyStats",
|
||||||
|
Model: new(ServerRegionProviderMonthlyStat),
|
||||||
|
PkName: "id",
|
||||||
|
},
|
||||||
|
}).(*ServerRegionProviderMonthlyStatDAO)
|
||||||
|
}
|
||||||
|
|
||||||
|
var SharedServerRegionProviderMonthlyStatDAO *ServerRegionProviderMonthlyStatDAO
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
dbs.OnReady(func() {
|
||||||
|
SharedServerRegionProviderMonthlyStatDAO = NewServerRegionProviderMonthlyStatDAO()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 增加数量
|
||||||
|
func (this *ServerRegionProviderMonthlyStatDAO) IncreaseMonthlyCount(tx *dbs.Tx, serverId int64, providerId int64, month string, count int64) error {
|
||||||
|
if len(month) != 6 {
|
||||||
|
return errors.New("invalid month '" + month + "'")
|
||||||
|
}
|
||||||
|
err := this.Query(tx).
|
||||||
|
Param("count", count).
|
||||||
|
InsertOrUpdateQuickly(maps.Map{
|
||||||
|
"serverId": serverId,
|
||||||
|
"providerId": providerId,
|
||||||
|
"month": month,
|
||||||
|
"count": count,
|
||||||
|
}, maps.Map{
|
||||||
|
"count": dbs.SQL("count+:count"),
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查找单页数据
|
||||||
|
func (this *ServerRegionProviderMonthlyStatDAO) ListStats(tx *dbs.Tx, serverId int64, month string, offset int64, size int64) (result []*ServerRegionProviderMonthlyStat, err error) {
|
||||||
|
query := this.Query(tx).
|
||||||
|
Attr("serverId", serverId).
|
||||||
|
Attr("month", month).
|
||||||
|
Offset(offset).
|
||||||
|
Limit(size).
|
||||||
|
Slice(&result).
|
||||||
|
Desc("count")
|
||||||
|
_, err = query.FindAll()
|
||||||
|
return
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
package stats
|
||||||
|
|
||||||
|
import (
|
||||||
|
_ "github.com/go-sql-driver/mysql"
|
||||||
|
)
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
package stats
|
||||||
|
|
||||||
|
// 服务用户省份分布统计(按天)
|
||||||
|
type ServerRegionProviderMonthlyStat struct {
|
||||||
|
Id uint64 `field:"id"` // ID
|
||||||
|
ServerId uint32 `field:"serverId"` // 服务ID
|
||||||
|
ProviderId uint32 `field:"providerId"` // 运营商ID
|
||||||
|
Month string `field:"month"` // 月份YYYYMM
|
||||||
|
Count uint64 `field:"count"` // 数量
|
||||||
|
}
|
||||||
|
|
||||||
|
type ServerRegionProviderMonthlyStatOperator struct {
|
||||||
|
Id interface{} // ID
|
||||||
|
ServerId interface{} // 服务ID
|
||||||
|
ProviderId interface{} // 运营商ID
|
||||||
|
Month interface{} // 月份YYYYMM
|
||||||
|
Count interface{} // 数量
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewServerRegionProviderMonthlyStatOperator() *ServerRegionProviderMonthlyStatOperator {
|
||||||
|
return &ServerRegionProviderMonthlyStatOperator{}
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
package stats
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
package stats
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/TeaOSLab/EdgeAPI/internal/db/models/regions"
|
||||||
|
"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"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ServerRegionProvinceMonthlyStatDAO dbs.DAO
|
||||||
|
|
||||||
|
func NewServerRegionProvinceMonthlyStatDAO() *ServerRegionProvinceMonthlyStatDAO {
|
||||||
|
return dbs.NewDAO(&ServerRegionProvinceMonthlyStatDAO{
|
||||||
|
DAOObject: dbs.DAOObject{
|
||||||
|
DB: Tea.Env,
|
||||||
|
Table: "edgeServerRegionProvinceMonthlyStats",
|
||||||
|
Model: new(ServerRegionProvinceMonthlyStat),
|
||||||
|
PkName: "id",
|
||||||
|
},
|
||||||
|
}).(*ServerRegionProvinceMonthlyStatDAO)
|
||||||
|
}
|
||||||
|
|
||||||
|
var SharedServerRegionProvinceMonthlyStatDAO *ServerRegionProvinceMonthlyStatDAO
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
dbs.OnReady(func() {
|
||||||
|
SharedServerRegionProvinceMonthlyStatDAO = NewServerRegionProvinceMonthlyStatDAO()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 增加数量
|
||||||
|
func (this *ServerRegionProvinceMonthlyStatDAO) IncreaseMonthlyCount(tx *dbs.Tx, serverId int64, provinceId int64, month string, count int64) error {
|
||||||
|
if len(month) != 6 {
|
||||||
|
return errors.New("invalid month '" + month + "'")
|
||||||
|
}
|
||||||
|
err := this.Query(tx).
|
||||||
|
Param("count", count).
|
||||||
|
InsertOrUpdateQuickly(maps.Map{
|
||||||
|
"serverId": serverId,
|
||||||
|
"provinceId": provinceId,
|
||||||
|
"month": month,
|
||||||
|
"count": count,
|
||||||
|
}, maps.Map{
|
||||||
|
"count": dbs.SQL("count+:count"),
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查找单页数据
|
||||||
|
func (this *ServerRegionProvinceMonthlyStatDAO) ListStats(tx *dbs.Tx, serverId int64, month string, countryId int64, offset int64, size int64) (result []*ServerRegionProvinceMonthlyStat, err error) {
|
||||||
|
query := this.Query(tx).
|
||||||
|
Attr("serverId", serverId).
|
||||||
|
Attr("month", month).
|
||||||
|
Offset(offset).
|
||||||
|
Limit(size).
|
||||||
|
Slice(&result).
|
||||||
|
Desc("count")
|
||||||
|
if countryId > 0 {
|
||||||
|
query.Where("id IN (SELECT id FROM "+regions.SharedRegionProvinceDAO.Table+" WHERE countryId=:countryId AND state=1)").
|
||||||
|
Param("countryId", countryId)
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = query.FindAll()
|
||||||
|
return
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
package stats
|
||||||
|
|
||||||
|
import (
|
||||||
|
_ "github.com/go-sql-driver/mysql"
|
||||||
|
)
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
package stats
|
||||||
|
|
||||||
|
// 服务用户省份分布统计(按天)
|
||||||
|
type ServerRegionProvinceMonthlyStat struct {
|
||||||
|
Id uint64 `field:"id"` // ID
|
||||||
|
ServerId uint32 `field:"serverId"` // 服务ID
|
||||||
|
ProvinceId uint32 `field:"provinceId"` // 省份ID
|
||||||
|
Month string `field:"month"` // 月份YYYYMM
|
||||||
|
Count uint64 `field:"count"` // 数量
|
||||||
|
}
|
||||||
|
|
||||||
|
type ServerRegionProvinceMonthlyStatOperator struct {
|
||||||
|
Id interface{} // ID
|
||||||
|
ServerId interface{} // 服务ID
|
||||||
|
ProvinceId interface{} // 省份ID
|
||||||
|
Month interface{} // 月份YYYYMM
|
||||||
|
Count interface{} // 数量
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewServerRegionProvinceMonthlyStatOperator() *ServerRegionProvinceMonthlyStatOperator {
|
||||||
|
return &ServerRegionProvinceMonthlyStatOperator{}
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
package stats
|
||||||
33
internal/db/utils/utils.go
Normal file
33
internal/db/utils/utils.go
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
package dbutils
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/iwind/TeaGo/dbs"
|
||||||
|
"sync"
|
||||||
|
)
|
||||||
|
|
||||||
|
var SharedCacheLocker = sync.RWMutex{}
|
||||||
|
|
||||||
|
// 处理JSON字节Slice
|
||||||
|
func JSONBytes(data []byte) []byte {
|
||||||
|
if len(data) == 0 {
|
||||||
|
return []byte("null")
|
||||||
|
}
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
|
||||||
|
// 判断JSON是否不为空
|
||||||
|
func IsNotNull(data string) bool {
|
||||||
|
return len(data) > 0 && data != "null"
|
||||||
|
}
|
||||||
|
|
||||||
|
// 构造Query
|
||||||
|
func NewQuery(tx *dbs.Tx, dao dbs.DAOWrapper, adminId int64, userId int64) *dbs.Query {
|
||||||
|
query := dao.Object().Query(tx)
|
||||||
|
if adminId > 0 {
|
||||||
|
//query.Attr("adminId", adminId)
|
||||||
|
}
|
||||||
|
if userId > 0 {
|
||||||
|
query.Attr("userId", userId)
|
||||||
|
}
|
||||||
|
return query
|
||||||
|
}
|
||||||
@@ -226,6 +226,12 @@ func (this *APINode) listenRPC(listener net.Listener, tlsConfig *tls.Config) err
|
|||||||
pb.RegisterSysLockerServiceServer(rpcServer, &services.SysLockerService{})
|
pb.RegisterSysLockerServiceServer(rpcServer, &services.SysLockerService{})
|
||||||
pb.RegisterNodeTaskServiceServer(rpcServer, &services.NodeTaskService{})
|
pb.RegisterNodeTaskServiceServer(rpcServer, &services.NodeTaskService{})
|
||||||
pb.RegisterDBServiceServer(rpcServer, &services.DBService{})
|
pb.RegisterDBServiceServer(rpcServer, &services.DBService{})
|
||||||
|
pb.RegisterServerRegionCityMonthlyStatServiceServer(rpcServer, &services.ServerRegionCityMonthlyStatService{})
|
||||||
|
pb.RegisterServerRegionCountryMonthlyStatServiceServer(rpcServer, &services.ServerRegionCountryMonthlyStatService{})
|
||||||
|
pb.RegisterServerRegionProvinceMonthlyStatServiceServer(rpcServer, &services.ServerRegionProvinceMonthlyStatService{})
|
||||||
|
pb.RegisterServerRegionProviderMonthlyStatServiceServer(rpcServer, &services.ServerRegionProviderMonthlyStatService{})
|
||||||
|
pb.RegisterServerClientSystemMonthlyStatServiceServer(rpcServer, &services.ServerClientSystemMonthlyStatService{})
|
||||||
|
pb.RegisterServerClientBrowserMonthlyStatServiceServer(rpcServer, &services.ServerClientBrowserMonthlyStatService{})
|
||||||
err := rpcServer.Serve(listener)
|
err := rpcServer.Serve(listener)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.New("[API_NODE]start rpc failed: " + err.Error())
|
return errors.New("[API_NODE]start rpc failed: " + err.Error())
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ package services
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
|
"github.com/TeaOSLab/EdgeAPI/internal/db/models/acme"
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/errors"
|
"github.com/TeaOSLab/EdgeAPI/internal/errors"
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
||||||
)
|
)
|
||||||
@@ -24,7 +24,7 @@ func (this *ACMEAuthenticationService) FindACMEAuthenticationKeyWithToken(ctx co
|
|||||||
|
|
||||||
tx := this.NullTx()
|
tx := this.NullTx()
|
||||||
|
|
||||||
auth, err := models.SharedACMEAuthenticationDAO.FindAuthWithToken(tx, req.Token)
|
auth, err := acme.SharedACMEAuthenticationDAO.FindAuthWithToken(tx, req.Token)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,8 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/acme"
|
"github.com/TeaOSLab/EdgeAPI/internal/acme"
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
|
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
|
||||||
|
acmemodels "github.com/TeaOSLab/EdgeAPI/internal/db/models/acme"
|
||||||
|
"github.com/TeaOSLab/EdgeAPI/internal/db/models/dns"
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/dnsclients"
|
"github.com/TeaOSLab/EdgeAPI/internal/dnsclients"
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
||||||
)
|
)
|
||||||
@@ -24,7 +26,7 @@ func (this *ACMETaskService) CountAllEnabledACMETasksWithACMEUserId(ctx context.
|
|||||||
|
|
||||||
tx := this.NullTx()
|
tx := this.NullTx()
|
||||||
|
|
||||||
count, err := models.SharedACMETaskDAO.CountACMETasksWithACMEUserId(tx, req.AcmeUserId)
|
count, err := acmemodels.SharedACMETaskDAO.CountACMETasksWithACMEUserId(tx, req.AcmeUserId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -42,7 +44,7 @@ func (this *ACMETaskService) CountEnabledACMETasksWithDNSProviderId(ctx context.
|
|||||||
|
|
||||||
tx := this.NullTx()
|
tx := this.NullTx()
|
||||||
|
|
||||||
count, err := models.SharedACMETaskDAO.CountACMETasksWithDNSProviderId(tx, req.DnsProviderId)
|
count, err := acmemodels.SharedACMETaskDAO.CountACMETasksWithDNSProviderId(tx, req.DnsProviderId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -58,7 +60,7 @@ func (this *ACMETaskService) CountAllEnabledACMETasks(ctx context.Context, req *
|
|||||||
|
|
||||||
tx := this.NullTx()
|
tx := this.NullTx()
|
||||||
|
|
||||||
count, err := models.SharedACMETaskDAO.CountAllEnabledACMETasks(tx, req.AdminId, req.UserId)
|
count, err := acmemodels.SharedACMETaskDAO.CountAllEnabledACMETasks(tx, req.AdminId, req.UserId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -74,7 +76,7 @@ func (this *ACMETaskService) ListEnabledACMETasks(ctx context.Context, req *pb.L
|
|||||||
|
|
||||||
tx := this.NullTx()
|
tx := this.NullTx()
|
||||||
|
|
||||||
tasks, err := models.SharedACMETaskDAO.ListEnabledACMETasks(tx, req.AdminId, req.UserId, req.Offset, req.Size)
|
tasks, err := acmemodels.SharedACMETaskDAO.ListEnabledACMETasks(tx, req.AdminId, req.UserId, req.Offset, req.Size)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -82,7 +84,7 @@ func (this *ACMETaskService) ListEnabledACMETasks(ctx context.Context, req *pb.L
|
|||||||
result := []*pb.ACMETask{}
|
result := []*pb.ACMETask{}
|
||||||
for _, task := range tasks {
|
for _, task := range tasks {
|
||||||
// ACME用户
|
// ACME用户
|
||||||
acmeUser, err := models.SharedACMEUserDAO.FindEnabledACMEUser(tx, int64(task.AcmeUserId))
|
acmeUser, err := acmemodels.SharedACMEUserDAO.FindEnabledACMEUser(tx, int64(task.AcmeUserId))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -99,7 +101,7 @@ func (this *ACMETaskService) ListEnabledACMETasks(ctx context.Context, req *pb.L
|
|||||||
var pbProvider *pb.DNSProvider
|
var pbProvider *pb.DNSProvider
|
||||||
if task.AuthType == acme.AuthTypeDNS {
|
if task.AuthType == acme.AuthTypeDNS {
|
||||||
// DNS
|
// DNS
|
||||||
provider, err := models.SharedDNSProviderDAO.FindEnabledDNSProvider(tx, int64(task.DnsProviderId))
|
provider, err := dns.SharedDNSProviderDAO.FindEnabledDNSProvider(tx, int64(task.DnsProviderId))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -135,7 +137,7 @@ func (this *ACMETaskService) ListEnabledACMETasks(ctx context.Context, req *pb.L
|
|||||||
|
|
||||||
// 最近一条日志
|
// 最近一条日志
|
||||||
var pbTaskLog *pb.ACMETaskLog = nil
|
var pbTaskLog *pb.ACMETaskLog = nil
|
||||||
taskLog, err := models.SharedACMETaskLogDAO.FindLatestACMETasKLog(tx, int64(task.Id))
|
taskLog, err := acmemodels.SharedACMETaskLogDAO.FindLatestACMETasKLog(tx, int64(task.Id))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -178,7 +180,7 @@ func (this *ACMETaskService) CreateACMETask(ctx context.Context, req *pb.CreateA
|
|||||||
}
|
}
|
||||||
|
|
||||||
tx := this.NullTx()
|
tx := this.NullTx()
|
||||||
taskId, err := models.SharedACMETaskDAO.CreateACMETask(tx, adminId, userId, req.AuthType, req.AcmeUserId, req.DnsProviderId, req.DnsDomain, req.Domains, req.AutoRenew)
|
taskId, err := acmemodels.SharedACMETaskDAO.CreateACMETask(tx, adminId, userId, req.AuthType, req.AcmeUserId, req.DnsProviderId, req.DnsDomain, req.Domains, req.AutoRenew)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -194,7 +196,7 @@ func (this *ACMETaskService) UpdateACMETask(ctx context.Context, req *pb.UpdateA
|
|||||||
|
|
||||||
tx := this.NullTx()
|
tx := this.NullTx()
|
||||||
|
|
||||||
canAccess, err := models.SharedACMETaskDAO.CheckACMETask(tx, adminId, userId, req.AcmeTaskId)
|
canAccess, err := acmemodels.SharedACMETaskDAO.CheckACMETask(tx, adminId, userId, req.AcmeTaskId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -202,7 +204,7 @@ func (this *ACMETaskService) UpdateACMETask(ctx context.Context, req *pb.UpdateA
|
|||||||
return nil, this.PermissionError()
|
return nil, this.PermissionError()
|
||||||
}
|
}
|
||||||
|
|
||||||
err = models.SharedACMETaskDAO.UpdateACMETask(tx, req.AcmeTaskId, req.AcmeUserId, req.DnsProviderId, req.DnsDomain, req.Domains, req.AutoRenew)
|
err = acmemodels.SharedACMETaskDAO.UpdateACMETask(tx, req.AcmeTaskId, req.AcmeUserId, req.DnsProviderId, req.DnsDomain, req.Domains, req.AutoRenew)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -218,7 +220,7 @@ func (this *ACMETaskService) DeleteACMETask(ctx context.Context, req *pb.DeleteA
|
|||||||
|
|
||||||
tx := this.NullTx()
|
tx := this.NullTx()
|
||||||
|
|
||||||
canAccess, err := models.SharedACMETaskDAO.CheckACMETask(tx, adminId, userId, req.AcmeTaskId)
|
canAccess, err := acmemodels.SharedACMETaskDAO.CheckACMETask(tx, adminId, userId, req.AcmeTaskId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -226,7 +228,7 @@ func (this *ACMETaskService) DeleteACMETask(ctx context.Context, req *pb.DeleteA
|
|||||||
return nil, this.PermissionError()
|
return nil, this.PermissionError()
|
||||||
}
|
}
|
||||||
|
|
||||||
err = models.SharedACMETaskDAO.DisableACMETask(tx, req.AcmeTaskId)
|
err = acmemodels.SharedACMETaskDAO.DisableACMETask(tx, req.AcmeTaskId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -242,7 +244,7 @@ func (this *ACMETaskService) RunACMETask(ctx context.Context, req *pb.RunACMETas
|
|||||||
|
|
||||||
tx := this.NullTx()
|
tx := this.NullTx()
|
||||||
|
|
||||||
canAccess, err := models.SharedACMETaskDAO.CheckACMETask(tx, adminId, userId, req.AcmeTaskId)
|
canAccess, err := acmemodels.SharedACMETaskDAO.CheckACMETask(tx, adminId, userId, req.AcmeTaskId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -250,7 +252,7 @@ func (this *ACMETaskService) RunACMETask(ctx context.Context, req *pb.RunACMETas
|
|||||||
return nil, this.PermissionError()
|
return nil, this.PermissionError()
|
||||||
}
|
}
|
||||||
|
|
||||||
isOk, msg, certId := models.SharedACMETaskDAO.RunTask(tx, req.AcmeTaskId)
|
isOk, msg, certId := acmemodels.SharedACMETaskDAO.RunTask(tx, req.AcmeTaskId)
|
||||||
|
|
||||||
return &pb.RunACMETaskResponse{
|
return &pb.RunACMETaskResponse{
|
||||||
IsOk: isOk,
|
IsOk: isOk,
|
||||||
@@ -268,7 +270,7 @@ func (this *ACMETaskService) FindEnabledACMETask(ctx context.Context, req *pb.Fi
|
|||||||
|
|
||||||
tx := this.NullTx()
|
tx := this.NullTx()
|
||||||
|
|
||||||
canAccess, err := models.SharedACMETaskDAO.CheckACMETask(tx, adminId, userId, req.AcmeTaskId)
|
canAccess, err := acmemodels.SharedACMETaskDAO.CheckACMETask(tx, adminId, userId, req.AcmeTaskId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -276,7 +278,7 @@ func (this *ACMETaskService) FindEnabledACMETask(ctx context.Context, req *pb.Fi
|
|||||||
return nil, this.PermissionError()
|
return nil, this.PermissionError()
|
||||||
}
|
}
|
||||||
|
|
||||||
task, err := models.SharedACMETaskDAO.FindEnabledACMETask(tx, req.AcmeTaskId)
|
task, err := acmemodels.SharedACMETaskDAO.FindEnabledACMETask(tx, req.AcmeTaskId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -287,7 +289,7 @@ func (this *ACMETaskService) FindEnabledACMETask(ctx context.Context, req *pb.Fi
|
|||||||
// 用户
|
// 用户
|
||||||
var pbACMEUser *pb.ACMEUser = nil
|
var pbACMEUser *pb.ACMEUser = nil
|
||||||
if task.AcmeUserId > 0 {
|
if task.AcmeUserId > 0 {
|
||||||
acmeUser, err := models.SharedACMEUserDAO.FindEnabledACMEUser(tx, int64(task.AcmeUserId))
|
acmeUser, err := acmemodels.SharedACMEUserDAO.FindEnabledACMEUser(tx, int64(task.AcmeUserId))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -303,7 +305,7 @@ func (this *ACMETaskService) FindEnabledACMETask(ctx context.Context, req *pb.Fi
|
|||||||
|
|
||||||
// DNS
|
// DNS
|
||||||
var pbProvider *pb.DNSProvider
|
var pbProvider *pb.DNSProvider
|
||||||
provider, err := models.SharedDNSProviderDAO.FindEnabledDNSProvider(tx, int64(task.DnsProviderId))
|
provider, err := dns.SharedDNSProviderDAO.FindEnabledDNSProvider(tx, int64(task.DnsProviderId))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ package services
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
|
acmemodels "github.com/TeaOSLab/EdgeAPI/internal/db/models/acme"
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -21,7 +21,7 @@ func (this *ACMEUserService) CreateACMEUser(ctx context.Context, req *pb.CreateA
|
|||||||
|
|
||||||
tx := this.NullTx()
|
tx := this.NullTx()
|
||||||
|
|
||||||
acmeUserId, err := models.SharedACMEUserDAO.CreateACMEUser(tx, adminId, userId, req.Email, req.Description)
|
acmeUserId, err := acmemodels.SharedACMEUserDAO.CreateACMEUser(tx, adminId, userId, req.Email, req.Description)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -39,7 +39,7 @@ func (this *ACMEUserService) UpdateACMEUser(ctx context.Context, req *pb.UpdateA
|
|||||||
tx := this.NullTx()
|
tx := this.NullTx()
|
||||||
|
|
||||||
// 检查是否有权限
|
// 检查是否有权限
|
||||||
b, err := models.SharedACMEUserDAO.CheckACMEUser(tx, req.AcmeUserId, adminId, userId)
|
b, err := acmemodels.SharedACMEUserDAO.CheckACMEUser(tx, req.AcmeUserId, adminId, userId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -47,7 +47,7 @@ func (this *ACMEUserService) UpdateACMEUser(ctx context.Context, req *pb.UpdateA
|
|||||||
return nil, this.PermissionError()
|
return nil, this.PermissionError()
|
||||||
}
|
}
|
||||||
|
|
||||||
err = models.SharedACMEUserDAO.UpdateACMEUser(tx, req.AcmeUserId, req.Description)
|
err = acmemodels.SharedACMEUserDAO.UpdateACMEUser(tx, req.AcmeUserId, req.Description)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -65,7 +65,7 @@ func (this *ACMEUserService) DeleteACMEUser(ctx context.Context, req *pb.DeleteA
|
|||||||
tx := this.NullTx()
|
tx := this.NullTx()
|
||||||
|
|
||||||
// 检查是否有权限
|
// 检查是否有权限
|
||||||
b, err := models.SharedACMEUserDAO.CheckACMEUser(tx, req.AcmeUserId, adminId, userId)
|
b, err := acmemodels.SharedACMEUserDAO.CheckACMEUser(tx, req.AcmeUserId, adminId, userId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -73,7 +73,7 @@ func (this *ACMEUserService) DeleteACMEUser(ctx context.Context, req *pb.DeleteA
|
|||||||
return nil, this.PermissionError()
|
return nil, this.PermissionError()
|
||||||
}
|
}
|
||||||
|
|
||||||
err = models.SharedACMEUserDAO.DisableACMEUser(tx, req.AcmeUserId)
|
err = acmemodels.SharedACMEUserDAO.DisableACMEUser(tx, req.AcmeUserId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -90,7 +90,7 @@ func (this *ACMEUserService) CountACMEUsers(ctx context.Context, req *pb.CountAc
|
|||||||
|
|
||||||
tx := this.NullTx()
|
tx := this.NullTx()
|
||||||
|
|
||||||
count, err := models.SharedACMEUserDAO.CountACMEUsersWithAdminId(tx, adminId, userId)
|
count, err := acmemodels.SharedACMEUserDAO.CountACMEUsersWithAdminId(tx, adminId, userId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -107,7 +107,7 @@ func (this *ACMEUserService) ListACMEUsers(ctx context.Context, req *pb.ListACME
|
|||||||
|
|
||||||
tx := this.NullTx()
|
tx := this.NullTx()
|
||||||
|
|
||||||
acmeUsers, err := models.SharedACMEUserDAO.ListACMEUsers(tx, adminId, userId, req.Offset, req.Size)
|
acmeUsers, err := acmemodels.SharedACMEUserDAO.ListACMEUsers(tx, adminId, userId, req.Offset, req.Size)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -134,7 +134,7 @@ func (this *ACMEUserService) FindEnabledACMEUser(ctx context.Context, req *pb.Fi
|
|||||||
tx := this.NullTx()
|
tx := this.NullTx()
|
||||||
|
|
||||||
// 检查是否有权限
|
// 检查是否有权限
|
||||||
b, err := models.SharedACMEUserDAO.CheckACMEUser(tx, req.AcmeUserId, adminId, userId)
|
b, err := acmemodels.SharedACMEUserDAO.CheckACMEUser(tx, req.AcmeUserId, adminId, userId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -142,7 +142,7 @@ func (this *ACMEUserService) FindEnabledACMEUser(ctx context.Context, req *pb.Fi
|
|||||||
return nil, this.PermissionError()
|
return nil, this.PermissionError()
|
||||||
}
|
}
|
||||||
|
|
||||||
acmeUser, err := models.SharedACMEUserDAO.FindEnabledACMEUser(tx, req.AcmeUserId)
|
acmeUser, err := acmemodels.SharedACMEUserDAO.FindEnabledACMEUser(tx, req.AcmeUserId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -167,7 +167,7 @@ func (this *ACMEUserService) FindAllACMEUsers(ctx context.Context, req *pb.FindA
|
|||||||
|
|
||||||
tx := this.NullTx()
|
tx := this.NullTx()
|
||||||
|
|
||||||
acmeUsers, err := models.SharedACMEUserDAO.FindAllACMEUsers(tx, adminId, userId)
|
acmeUsers, err := acmemodels.SharedACMEUserDAO.FindAllACMEUsers(tx, adminId, userId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
|
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
|
||||||
|
"github.com/TeaOSLab/EdgeAPI/internal/db/models/dns"
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/dnsclients"
|
"github.com/TeaOSLab/EdgeAPI/internal/dnsclients"
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/errors"
|
"github.com/TeaOSLab/EdgeAPI/internal/errors"
|
||||||
rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils"
|
rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils"
|
||||||
@@ -29,7 +30,7 @@ func (this *DNSDomainService) CreateDNSDomain(ctx context.Context, req *pb.Creat
|
|||||||
tx := this.NullTx()
|
tx := this.NullTx()
|
||||||
|
|
||||||
// 查询Provider
|
// 查询Provider
|
||||||
provider, err := models.SharedDNSProviderDAO.FindEnabledDNSProvider(tx, req.DnsProviderId)
|
provider, err := dns.SharedDNSProviderDAO.FindEnabledDNSProvider(tx, req.DnsProviderId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -41,7 +42,7 @@ func (this *DNSDomainService) CreateDNSDomain(ctx context.Context, req *pb.Creat
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
domainId, err := models.SharedDNSDomainDAO.CreateDomain(tx, adminId, userId, req.DnsProviderId, req.Name)
|
domainId, err := dns.SharedDNSDomainDAO.CreateDomain(tx, adminId, userId, req.DnsProviderId, req.Name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -67,7 +68,7 @@ func (this *DNSDomainService) CreateDNSDomain(ctx context.Context, req *pb.Creat
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
err = models.SharedDNSDomainDAO.UpdateDomainRoutes(tx, domainId, routesJSON)
|
err = dns.SharedDNSDomainDAO.UpdateDomainRoutes(tx, domainId, routesJSON)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -80,7 +81,7 @@ func (this *DNSDomainService) CreateDNSDomain(ctx context.Context, req *pb.Creat
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
err = models.SharedDNSDomainDAO.UpdateDomainRecords(tx, domainId, recordsJSON)
|
err = dns.SharedDNSDomainDAO.UpdateDomainRecords(tx, domainId, recordsJSON)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -99,7 +100,7 @@ func (this *DNSDomainService) UpdateDNSDomain(ctx context.Context, req *pb.Updat
|
|||||||
|
|
||||||
tx := this.NullTx()
|
tx := this.NullTx()
|
||||||
|
|
||||||
err = models.SharedDNSDomainDAO.UpdateDomain(tx, req.DnsDomainId, req.Name, req.IsOn)
|
err = dns.SharedDNSDomainDAO.UpdateDomain(tx, req.DnsDomainId, req.Name, req.IsOn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -116,7 +117,7 @@ func (this *DNSDomainService) DeleteDNSDomain(ctx context.Context, req *pb.Delet
|
|||||||
|
|
||||||
tx := this.NullTx()
|
tx := this.NullTx()
|
||||||
|
|
||||||
err = models.SharedDNSDomainDAO.DisableDNSDomain(tx, req.DnsDomainId)
|
err = dns.SharedDNSDomainDAO.DisableDNSDomain(tx, req.DnsDomainId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -133,7 +134,7 @@ func (this *DNSDomainService) FindEnabledDNSDomain(ctx context.Context, req *pb.
|
|||||||
|
|
||||||
tx := this.NullTx()
|
tx := this.NullTx()
|
||||||
|
|
||||||
domain, err := models.SharedDNSDomainDAO.FindEnabledDNSDomain(tx, req.DnsDomainId)
|
domain, err := dns.SharedDNSDomainDAO.FindEnabledDNSDomain(tx, req.DnsDomainId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -155,7 +156,7 @@ func (this *DNSDomainService) FindEnabledBasicDNSDomain(ctx context.Context, req
|
|||||||
|
|
||||||
tx := this.NullTx()
|
tx := this.NullTx()
|
||||||
|
|
||||||
domain, err := models.SharedDNSDomainDAO.FindEnabledDNSDomain(tx, req.DnsDomainId)
|
domain, err := dns.SharedDNSDomainDAO.FindEnabledDNSDomain(tx, req.DnsDomainId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -181,7 +182,7 @@ func (this *DNSDomainService) CountAllEnabledDNSDomainsWithDNSProviderId(ctx con
|
|||||||
|
|
||||||
tx := this.NullTx()
|
tx := this.NullTx()
|
||||||
|
|
||||||
count, err := models.SharedDNSDomainDAO.CountAllEnabledDomainsWithProviderId(tx, req.DnsProviderId)
|
count, err := dns.SharedDNSDomainDAO.CountAllEnabledDomainsWithProviderId(tx, req.DnsProviderId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -198,7 +199,7 @@ func (this *DNSDomainService) FindAllEnabledDNSDomainsWithDNSProviderId(ctx cont
|
|||||||
|
|
||||||
tx := this.NullTx()
|
tx := this.NullTx()
|
||||||
|
|
||||||
domains, err := models.SharedDNSDomainDAO.FindAllEnabledDomainsWithProviderId(tx, req.DnsProviderId)
|
domains, err := dns.SharedDNSDomainDAO.FindAllEnabledDomainsWithProviderId(tx, req.DnsProviderId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -225,7 +226,7 @@ func (this *DNSDomainService) FindAllEnabledBasicDNSDomainsWithDNSProviderId(ctx
|
|||||||
|
|
||||||
tx := this.NullTx()
|
tx := this.NullTx()
|
||||||
|
|
||||||
domains, err := models.SharedDNSDomainDAO.FindAllEnabledDomainsWithProviderId(tx, req.DnsProviderId)
|
domains, err := dns.SharedDNSDomainDAO.FindAllEnabledDomainsWithProviderId(tx, req.DnsProviderId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -262,7 +263,7 @@ func (this *DNSDomainService) FindAllDNSDomainRoutes(ctx context.Context, req *p
|
|||||||
|
|
||||||
tx := this.NullTx()
|
tx := this.NullTx()
|
||||||
|
|
||||||
routes, err := models.SharedDNSDomainDAO.FindDomainRoutes(tx, req.DnsDomainId)
|
routes, err := dns.SharedDNSDomainDAO.FindDomainRoutes(tx, req.DnsDomainId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -288,7 +289,7 @@ func (this *DNSDomainService) ExistAvailableDomains(ctx context.Context, req *pb
|
|||||||
|
|
||||||
tx := this.NullTx()
|
tx := this.NullTx()
|
||||||
|
|
||||||
exist, err := models.SharedDNSDomainDAO.ExistAvailableDomains(tx)
|
exist, err := dns.SharedDNSDomainDAO.ExistAvailableDomains(tx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -296,7 +297,7 @@ func (this *DNSDomainService) ExistAvailableDomains(ctx context.Context, req *pb
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 转换域名信息
|
// 转换域名信息
|
||||||
func (this *DNSDomainService) convertDomainToPB(domain *models.DNSDomain) (*pb.DNSDomain, error) {
|
func (this *DNSDomainService) convertDomainToPB(domain *dns.DNSDomain) (*pb.DNSDomain, error) {
|
||||||
domainId := int64(domain.Id)
|
domainId := int64(domain.Id)
|
||||||
|
|
||||||
records := []*dnsclients.Record{}
|
records := []*dnsclients.Record{}
|
||||||
@@ -547,7 +548,7 @@ func (this *DNSDomainService) syncClusterDNS(req *pb.SyncDNSDomainDataRequest) (
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 域名信息
|
// 域名信息
|
||||||
domain, err := models.SharedDNSDomainDAO.FindEnabledDNSDomain(tx, req.DnsDomainId)
|
domain, err := dns.SharedDNSDomainDAO.FindEnabledDNSDomain(tx, req.DnsDomainId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -558,7 +559,7 @@ func (this *DNSDomainService) syncClusterDNS(req *pb.SyncDNSDomainDataRequest) (
|
|||||||
domainName := domain.Name
|
domainName := domain.Name
|
||||||
|
|
||||||
// 服务商信息
|
// 服务商信息
|
||||||
provider, err := models.SharedDNSProviderDAO.FindEnabledDNSProvider(tx, int64(domain.ProviderId))
|
provider, err := dns.SharedDNSProviderDAO.FindEnabledDNSProvider(tx, int64(domain.ProviderId))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -592,7 +593,7 @@ func (this *DNSDomainService) syncClusterDNS(req *pb.SyncDNSDomainDataRequest) (
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
err = models.SharedDNSDomainDAO.UpdateDomainRoutes(tx, domainId, routesJSON)
|
err = dns.SharedDNSDomainDAO.UpdateDomainRoutes(tx, domainId, routesJSON)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -617,7 +618,7 @@ func (this *DNSDomainService) syncClusterDNS(req *pb.SyncDNSDomainDataRequest) (
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
err = models.SharedDNSDomainDAO.UpdateDomainRecords(tx, domainId, recordsJSON)
|
err = dns.SharedDNSDomainDAO.UpdateDomainRecords(tx, domainId, recordsJSON)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -665,7 +666,7 @@ func (this *DNSDomainService) syncClusterDNS(req *pb.SyncDNSDomainDataRequest) (
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
err = models.SharedDNSDomainDAO.UpdateDomainRecords(tx, domainId, recordsJSON)
|
err = dns.SharedDNSDomainDAO.UpdateDomainRecords(tx, domainId, recordsJSON)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -685,7 +686,7 @@ func (this *DNSDomainService) ExistDNSDomainRecord(ctx context.Context, req *pb.
|
|||||||
|
|
||||||
tx := this.NullTx()
|
tx := this.NullTx()
|
||||||
|
|
||||||
isOk, err := models.SharedDNSDomainDAO.ExistDomainRecord(tx, req.DnsDomainId, req.Name, req.Type, req.Route, req.Value)
|
isOk, err := dns.SharedDNSDomainDAO.ExistDomainRecord(tx, req.DnsDomainId, req.Name, req.Type, req.Route, req.Value)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ package services
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
|
"github.com/TeaOSLab/EdgeAPI/internal/db/models/dns"
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/dnsclients"
|
"github.com/TeaOSLab/EdgeAPI/internal/dnsclients"
|
||||||
rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils"
|
rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils"
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
||||||
@@ -23,7 +23,7 @@ func (this *DNSProviderService) CreateDNSProvider(ctx context.Context, req *pb.C
|
|||||||
|
|
||||||
tx := this.NullTx()
|
tx := this.NullTx()
|
||||||
|
|
||||||
providerId, err := models.SharedDNSProviderDAO.CreateDNSProvider(tx, adminId, userId, req.Type, req.Name, req.ApiParamsJSON)
|
providerId, err := dns.SharedDNSProviderDAO.CreateDNSProvider(tx, adminId, userId, req.Type, req.Name, req.ApiParamsJSON)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -43,7 +43,7 @@ func (this *DNSProviderService) UpdateDNSProvider(ctx context.Context, req *pb.U
|
|||||||
|
|
||||||
tx := this.NullTx()
|
tx := this.NullTx()
|
||||||
|
|
||||||
err = models.SharedDNSProviderDAO.UpdateDNSProvider(tx, req.DnsProviderId, req.Name, req.ApiParamsJSON)
|
err = dns.SharedDNSProviderDAO.UpdateDNSProvider(tx, req.DnsProviderId, req.Name, req.ApiParamsJSON)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -60,7 +60,7 @@ func (this *DNSProviderService) CountAllEnabledDNSProviders(ctx context.Context,
|
|||||||
|
|
||||||
tx := this.NullTx()
|
tx := this.NullTx()
|
||||||
|
|
||||||
count, err := models.SharedDNSProviderDAO.CountAllEnabledDNSProviders(tx, req.AdminId, req.UserId)
|
count, err := dns.SharedDNSProviderDAO.CountAllEnabledDNSProviders(tx, req.AdminId, req.UserId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -79,7 +79,7 @@ func (this *DNSProviderService) ListEnabledDNSProviders(ctx context.Context, req
|
|||||||
|
|
||||||
tx := this.NullTx()
|
tx := this.NullTx()
|
||||||
|
|
||||||
providers, err := models.SharedDNSProviderDAO.ListEnabledDNSProviders(tx, req.AdminId, req.UserId, req.Offset, req.Size)
|
providers, err := dns.SharedDNSProviderDAO.ListEnabledDNSProviders(tx, req.AdminId, req.UserId, req.Offset, req.Size)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -109,7 +109,7 @@ func (this *DNSProviderService) FindAllEnabledDNSProviders(ctx context.Context,
|
|||||||
|
|
||||||
tx := this.NullTx()
|
tx := this.NullTx()
|
||||||
|
|
||||||
providers, err := models.SharedDNSProviderDAO.FindAllEnabledDNSProviders(tx, req.AdminId, req.UserId)
|
providers, err := dns.SharedDNSProviderDAO.FindAllEnabledDNSProviders(tx, req.AdminId, req.UserId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -139,7 +139,7 @@ func (this *DNSProviderService) DeleteDNSProvider(ctx context.Context, req *pb.D
|
|||||||
|
|
||||||
tx := this.NullTx()
|
tx := this.NullTx()
|
||||||
|
|
||||||
err = models.SharedDNSProviderDAO.DisableDNSProvider(tx, req.DnsProviderId)
|
err = dns.SharedDNSProviderDAO.DisableDNSProvider(tx, req.DnsProviderId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -156,7 +156,7 @@ func (this *DNSProviderService) FindEnabledDNSProvider(ctx context.Context, req
|
|||||||
|
|
||||||
tx := this.NullTx()
|
tx := this.NullTx()
|
||||||
|
|
||||||
provider, err := models.SharedDNSProviderDAO.FindEnabledDNSProvider(tx, req.DnsProviderId)
|
provider, err := dns.SharedDNSProviderDAO.FindEnabledDNSProvider(tx, req.DnsProviderId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -202,7 +202,7 @@ func (this *DNSProviderService) FindAllEnabledDNSProvidersWithType(ctx context.C
|
|||||||
|
|
||||||
tx := this.NullTx()
|
tx := this.NullTx()
|
||||||
|
|
||||||
providers, err := models.SharedDNSProviderDAO.FindAllEnabledDNSProvidersWithType(tx, req.ProviderTypeCode)
|
providers, err := dns.SharedDNSProviderDAO.FindAllEnabledDNSProvidersWithType(tx, req.ProviderTypeCode)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package services
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
|
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
|
||||||
|
"github.com/TeaOSLab/EdgeAPI/internal/db/models/regions"
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/iplibrary"
|
"github.com/TeaOSLab/EdgeAPI/internal/iplibrary"
|
||||||
rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils"
|
rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils"
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
||||||
@@ -192,12 +193,12 @@ func (this *IPLibraryService) LookupIPRegion(ctx context.Context, req *pb.Lookup
|
|||||||
|
|
||||||
tx := this.NullTx()
|
tx := this.NullTx()
|
||||||
|
|
||||||
countryId, err := models.SharedRegionCountryDAO.FindCountryIdWithCountryName(tx, result.Country)
|
countryId, err := regions.SharedRegionCountryDAO.FindCountryIdWithNameCacheable(tx, result.Country)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
provinceId, err := models.SharedRegionProvinceDAO.FindProvinceIdWithProvinceName(tx, result.Province)
|
provinceId, err := regions.SharedRegionProvinceDAO.FindProvinceIdWithNameCacheable(tx, countryId, result.Province)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
|
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
|
||||||
|
"github.com/TeaOSLab/EdgeAPI/internal/db/models/dns"
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/dnsclients"
|
"github.com/TeaOSLab/EdgeAPI/internal/dnsclients"
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/errors"
|
"github.com/TeaOSLab/EdgeAPI/internal/errors"
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/events"
|
"github.com/TeaOSLab/EdgeAPI/internal/events"
|
||||||
@@ -179,7 +180,7 @@ func (this *NodeService) ListEnabledNodesMatch(ctx context.Context, req *pb.List
|
|||||||
if clusterDNS != nil {
|
if clusterDNS != nil {
|
||||||
dnsDomainId = int64(clusterDNS.DnsDomainId)
|
dnsDomainId = int64(clusterDNS.DnsDomainId)
|
||||||
if clusterDNS.DnsDomainId > 0 {
|
if clusterDNS.DnsDomainId > 0 {
|
||||||
domainRoutes, err = models.SharedDNSDomainDAO.FindDomainRoutes(tx, dnsDomainId)
|
domainRoutes, err = dns.SharedDNSDomainDAO.FindDomainRoutes(tx, dnsDomainId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -1086,7 +1087,7 @@ func (this *NodeService) FindAllEnabledNodesDNSWithClusterId(ctx context.Context
|
|||||||
}
|
}
|
||||||
dnsDomainId := int64(clusterDNS.DnsDomainId)
|
dnsDomainId := int64(clusterDNS.DnsDomainId)
|
||||||
|
|
||||||
routes, err := models.SharedDNSDomainDAO.FindDomainRoutes(tx, dnsDomainId)
|
routes, err := dns.SharedDNSDomainDAO.FindDomainRoutes(tx, dnsDomainId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -1164,7 +1165,7 @@ func (this *NodeService) FindEnabledNodeDNS(ctx context.Context, req *pb.FindEna
|
|||||||
}
|
}
|
||||||
|
|
||||||
dnsDomainId := int64(clusterDNS.DnsDomainId)
|
dnsDomainId := int64(clusterDNS.DnsDomainId)
|
||||||
dnsDomainName, err := models.SharedDNSDomainDAO.FindDNSDomainName(tx, dnsDomainId)
|
dnsDomainName, err := dns.SharedDNSDomainDAO.FindDNSDomainName(tx, dnsDomainId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -1177,7 +1178,7 @@ func (this *NodeService) FindEnabledNodeDNS(ctx context.Context, req *pb.FindEna
|
|||||||
}
|
}
|
||||||
|
|
||||||
for _, routeCode := range routeCodes {
|
for _, routeCode := range routeCodes {
|
||||||
routeName, err := models.SharedDNSDomainDAO.FindDomainRouteName(tx, dnsDomainId, routeCode)
|
routeName, err := dns.SharedDNSDomainDAO.FindDomainRouteName(tx, dnsDomainId, routeCode)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
|
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
|
||||||
|
"github.com/TeaOSLab/EdgeAPI/internal/db/models/dns"
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/dnsclients"
|
"github.com/TeaOSLab/EdgeAPI/internal/dnsclients"
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/errors"
|
"github.com/TeaOSLab/EdgeAPI/internal/errors"
|
||||||
rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils"
|
rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils"
|
||||||
@@ -412,7 +413,7 @@ func (this *NodeClusterService) FindEnabledNodeClusterDNS(ctx context.Context, r
|
|||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
domain, err := models.SharedDNSDomainDAO.FindEnabledDNSDomain(tx, int64(dnsInfo.DnsDomainId))
|
domain, err := dns.SharedDNSDomainDAO.FindEnabledDNSDomain(tx, int64(dnsInfo.DnsDomainId))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -429,7 +430,7 @@ func (this *NodeClusterService) FindEnabledNodeClusterDNS(ctx context.Context, r
|
|||||||
IsOn: domain.IsOn == 1,
|
IsOn: domain.IsOn == 1,
|
||||||
}
|
}
|
||||||
|
|
||||||
provider, err := models.SharedDNSProviderDAO.FindEnabledDNSProvider(tx, int64(domain.ProviderId))
|
provider, err := dns.SharedDNSProviderDAO.FindEnabledDNSProvider(tx, int64(domain.ProviderId))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -568,7 +569,7 @@ func (this *NodeClusterService) CheckNodeClusterDNSChanges(ctx context.Context,
|
|||||||
}
|
}
|
||||||
|
|
||||||
domainId := int64(cluster.DnsDomainId)
|
domainId := int64(cluster.DnsDomainId)
|
||||||
domain, err := models.SharedDNSDomainDAO.FindEnabledDNSDomain(tx, domainId)
|
domain, err := dns.SharedDNSDomainDAO.FindEnabledDNSDomain(tx, domainId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ package services
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
|
"github.com/TeaOSLab/EdgeAPI/internal/db/models/regions"
|
||||||
rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils"
|
rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils"
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
||||||
)
|
)
|
||||||
@@ -23,7 +23,7 @@ func (this *RegionCountryService) FindAllEnabledRegionCountries(ctx context.Cont
|
|||||||
|
|
||||||
tx := this.NullTx()
|
tx := this.NullTx()
|
||||||
|
|
||||||
countries, err := models.SharedRegionCountryDAO.FindAllEnabledCountriesOrderByPinyin(tx)
|
countries, err := regions.SharedRegionCountryDAO.FindAllEnabledCountriesOrderByPinyin(tx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -61,7 +61,7 @@ func (this *RegionCountryService) FindEnabledRegionCountry(ctx context.Context,
|
|||||||
|
|
||||||
tx := this.NullTx()
|
tx := this.NullTx()
|
||||||
|
|
||||||
country, err := models.SharedRegionCountryDAO.FindEnabledRegionCountry(tx, req.CountryId)
|
country, err := regions.SharedRegionCountryDAO.FindEnabledRegionCountry(tx, req.CountryId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ package services
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
|
"github.com/TeaOSLab/EdgeAPI/internal/db/models/regions"
|
||||||
rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils"
|
rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils"
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
||||||
)
|
)
|
||||||
@@ -22,7 +22,7 @@ func (this *RegionProvinceService) FindAllEnabledRegionProvincesWithCountryId(ct
|
|||||||
|
|
||||||
tx := this.NullTx()
|
tx := this.NullTx()
|
||||||
|
|
||||||
provinces, err := models.SharedRegionProvinceDAO.FindAllEnabledProvincesWithCountryId(tx, req.CountryId)
|
provinces, err := regions.SharedRegionProvinceDAO.FindAllEnabledProvincesWithCountryId(tx, req.CountryId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -50,7 +50,7 @@ func (this *RegionProvinceService) FindEnabledRegionProvince(ctx context.Context
|
|||||||
|
|
||||||
tx := this.NullTx()
|
tx := this.NullTx()
|
||||||
|
|
||||||
province, err := models.SharedRegionProvinceDAO.FindEnabledRegionProvince(tx, req.ProvinceId)
|
province, err := regions.SharedRegionProvinceDAO.FindEnabledRegionProvince(tx, req.ProvinceId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,10 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
|
"fmt"
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
|
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
|
||||||
|
"github.com/TeaOSLab/EdgeAPI/internal/db/models/dns"
|
||||||
|
"github.com/TeaOSLab/EdgeAPI/internal/db/models/regions"
|
||||||
rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils"
|
rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils"
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
|
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
|
||||||
@@ -1065,7 +1068,7 @@ func (this *ServerService) FindEnabledServerDNS(ctx context.Context, req *pb.Fin
|
|||||||
if clusterDNS != nil {
|
if clusterDNS != nil {
|
||||||
domainId := int64(clusterDNS.DnsDomainId)
|
domainId := int64(clusterDNS.DnsDomainId)
|
||||||
if domainId > 0 {
|
if domainId > 0 {
|
||||||
domain, err := models.SharedDNSDomainDAO.FindEnabledDNSDomain(tx, domainId)
|
domain, err := dns.SharedDNSDomainDAO.FindEnabledDNSDomain(tx, domainId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -1234,3 +1237,157 @@ func (this *ServerService) UpdateEnabledUserServerBasic(ctx context.Context, req
|
|||||||
|
|
||||||
return this.Success()
|
return this.Success()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 上传待统计数据
|
||||||
|
func (this *ServerService) UploadServerHTTPRequestStat(ctx context.Context, req *pb.UploadServerHTTPRequestStatRequest) (*pb.RPCSuccess, error) {
|
||||||
|
_, err := this.ValidateNode(ctx)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var tx = this.NullTx()
|
||||||
|
|
||||||
|
// 全局
|
||||||
|
month := req.Month
|
||||||
|
if len(month) != 6 {
|
||||||
|
return nil, errors.New("invalid month '" + month + "'")
|
||||||
|
}
|
||||||
|
|
||||||
|
// 区域
|
||||||
|
for _, result := range req.RegionCities {
|
||||||
|
// IP => 地理位置
|
||||||
|
err := func() error {
|
||||||
|
// 区域
|
||||||
|
if len(result.CountryName) > 0 {
|
||||||
|
countryId, err := regions.SharedRegionCountryDAO.FindCountryIdWithNameCacheable(tx, result.CountryName)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if countryId > 0 {
|
||||||
|
key := fmt.Sprintf("%d@%d@%s", result.ServerId, countryId, month)
|
||||||
|
serverStatLocker.Lock()
|
||||||
|
serverHTTPCountryStatMap[key] += result.Count
|
||||||
|
serverStatLocker.Unlock()
|
||||||
|
|
||||||
|
// 省份
|
||||||
|
if len(result.ProvinceName) > 0 {
|
||||||
|
provinceId, err := regions.SharedRegionProvinceDAO.FindProvinceIdWithNameCacheable(tx, countryId, result.ProvinceName)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if provinceId > 0 {
|
||||||
|
key := fmt.Sprintf("%d@%d@%s", result.ServerId, provinceId, month)
|
||||||
|
serverStatLocker.Lock()
|
||||||
|
serverHTTPProvinceStatMap[key] += result.Count
|
||||||
|
serverStatLocker.Unlock()
|
||||||
|
|
||||||
|
// 城市
|
||||||
|
if len(result.CityName) > 0 {
|
||||||
|
cityId, err := regions.SharedRegionCityDAO.FindCityIdWithNameCacheable(tx, provinceId, result.CityName)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if cityId > 0 {
|
||||||
|
key := fmt.Sprintf("%d@%d@%s", result.ServerId, cityId, month)
|
||||||
|
serverStatLocker.Lock()
|
||||||
|
serverHTTPCityStatMap[key] += result.Count
|
||||||
|
serverStatLocker.Unlock()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 运营商
|
||||||
|
for _, result := range req.RegionProviders {
|
||||||
|
// IP => 地理位置
|
||||||
|
err := func() error {
|
||||||
|
if len(result.Name) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
providerId, err := regions.SharedRegionProviderDAO.FindProviderIdWithNameCacheable(tx, result.Name)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if providerId > 0 {
|
||||||
|
key := fmt.Sprintf("%d@%d@%s", result.ServerId, providerId, month)
|
||||||
|
serverStatLocker.Lock()
|
||||||
|
serverHTTPProviderStatMap[key] += result.Count
|
||||||
|
serverStatLocker.Unlock()
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// OS
|
||||||
|
for _, result := range req.Systems {
|
||||||
|
err := func() error {
|
||||||
|
if len(result.Name) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
systemId, err := models.SharedClientSystemDAO.FindSystemIdWithNameCacheable(tx, result.Name)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if systemId == 0 {
|
||||||
|
// TODO 失败时,需要查询一次确认是否已添加
|
||||||
|
systemId, err = models.SharedClientSystemDAO.CreateSystem(tx, result.Name)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
key := fmt.Sprintf("%d@%d@%s@%s", result.ServerId, systemId, result.Version, month)
|
||||||
|
serverStatLocker.Lock()
|
||||||
|
serverHTTPSystemStatMap[key] += result.Count
|
||||||
|
serverStatLocker.Unlock()
|
||||||
|
return nil
|
||||||
|
}()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Browser
|
||||||
|
for _, result := range req.Browsers {
|
||||||
|
err := func() error {
|
||||||
|
if len(result.Name) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
browserId, err := models.SharedClientBrowserDAO.FindBrowserIdWithNameCacheable(tx, result.Name)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if browserId == 0 {
|
||||||
|
// TODO 失败时,需要查询一次确认是否已添加
|
||||||
|
browserId, err = models.SharedClientBrowserDAO.CreateBrowser(tx, result.Name)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
key := fmt.Sprintf("%d@%d@%s@%s", result.ServerId, browserId, result.Version, month)
|
||||||
|
serverStatLocker.Lock()
|
||||||
|
serverHTTPBrowserStatMap[key] += result.Count
|
||||||
|
serverStatLocker.Unlock()
|
||||||
|
return nil
|
||||||
|
}()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.Success()
|
||||||
|
}
|
||||||
|
|||||||
155
internal/rpc/services/service_server_.go
Normal file
155
internal/rpc/services/service_server_.go
Normal file
@@ -0,0 +1,155 @@
|
|||||||
|
package services
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/TeaOSLab/EdgeAPI/internal/db/models/stats"
|
||||||
|
"github.com/TeaOSLab/EdgeAPI/internal/remotelogs"
|
||||||
|
"github.com/iwind/TeaGo/Tea"
|
||||||
|
"github.com/iwind/TeaGo/dbs"
|
||||||
|
"github.com/iwind/TeaGo/types"
|
||||||
|
"strings"
|
||||||
|
"sync"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// HTTP请求统计缓存队列
|
||||||
|
var serverHTTPCountryStatMap = map[string]int64{} // serverId@countryId@month => count
|
||||||
|
var serverHTTPProvinceStatMap = map[string]int64{} // serverId@provinceId@month => count
|
||||||
|
var serverHTTPCityStatMap = map[string]int64{} // serverId@cityId@month => count
|
||||||
|
var serverHTTPProviderStatMap = map[string]int64{} // serverId@providerId@month => count
|
||||||
|
var serverHTTPSystemStatMap = map[string]int64{} // serverId@systemId@version@month => count
|
||||||
|
var serverHTTPBrowserStatMap = map[string]int64{} // serverId@browserId@version@month => count
|
||||||
|
var serverStatLocker = sync.Mutex{}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
var service = new(ServerService)
|
||||||
|
|
||||||
|
dbs.OnReadyDone(func() {
|
||||||
|
// 导入统计数据
|
||||||
|
go func() {
|
||||||
|
var duration = 30 * time.Minute
|
||||||
|
if Tea.IsTesting() {
|
||||||
|
// 测试条件下缩短时间,以便进行观察
|
||||||
|
duration = 1 * time.Minute
|
||||||
|
}
|
||||||
|
ticker := time.NewTicker(duration)
|
||||||
|
for range ticker.C {
|
||||||
|
err := service.dumpServerHTTPStats()
|
||||||
|
if err != nil {
|
||||||
|
remotelogs.Error("SERVER_SERVICE", err.Error())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *ServerService) dumpServerHTTPStats() error {
|
||||||
|
// 地区
|
||||||
|
{
|
||||||
|
serverStatLocker.Lock()
|
||||||
|
m := serverHTTPCountryStatMap
|
||||||
|
serverHTTPCountryStatMap = map[string]int64{}
|
||||||
|
serverStatLocker.Unlock()
|
||||||
|
for k, count := range m {
|
||||||
|
pieces := strings.Split(k, "@")
|
||||||
|
if len(pieces) != 3 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
err := stats.SharedServerRegionCountryMonthlyStatDAO.IncreaseMonthlyCount(nil, types.Int64(pieces[0]), types.Int64(pieces[1]), pieces[2], count)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 省份
|
||||||
|
{
|
||||||
|
serverStatLocker.Lock()
|
||||||
|
m := serverHTTPProvinceStatMap
|
||||||
|
serverHTTPProvinceStatMap = map[string]int64{}
|
||||||
|
serverStatLocker.Unlock()
|
||||||
|
for k, count := range m {
|
||||||
|
pieces := strings.Split(k, "@")
|
||||||
|
if len(pieces) != 3 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
err := stats.SharedServerRegionProvinceMonthlyStatDAO.IncreaseMonthlyCount(nil, types.Int64(pieces[0]), types.Int64(pieces[1]), pieces[2], count)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 城市
|
||||||
|
{
|
||||||
|
serverStatLocker.Lock()
|
||||||
|
m := serverHTTPCityStatMap
|
||||||
|
serverHTTPCityStatMap = map[string]int64{}
|
||||||
|
serverStatLocker.Unlock()
|
||||||
|
for k, count := range m {
|
||||||
|
pieces := strings.Split(k, "@")
|
||||||
|
if len(pieces) != 3 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
err := stats.SharedServerRegionCityMonthlyStatDAO.IncreaseMonthlyCount(nil, types.Int64(pieces[0]), types.Int64(pieces[1]), pieces[2], count)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 运营商
|
||||||
|
{
|
||||||
|
serverStatLocker.Lock()
|
||||||
|
m := serverHTTPProviderStatMap
|
||||||
|
serverHTTPProviderStatMap = map[string]int64{}
|
||||||
|
serverStatLocker.Unlock()
|
||||||
|
for k, count := range m {
|
||||||
|
pieces := strings.Split(k, "@")
|
||||||
|
if len(pieces) != 3 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
err := stats.SharedServerRegionProviderMonthlyStatDAO.IncreaseMonthlyCount(nil, types.Int64(pieces[0]), types.Int64(pieces[1]), pieces[2], count)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 操作系统
|
||||||
|
{
|
||||||
|
serverStatLocker.Lock()
|
||||||
|
m := serverHTTPSystemStatMap
|
||||||
|
serverHTTPSystemStatMap = map[string]int64{}
|
||||||
|
serverStatLocker.Unlock()
|
||||||
|
for k, count := range m {
|
||||||
|
pieces := strings.Split(k, "@")
|
||||||
|
if len(pieces) != 4 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
err := stats.SharedServerClientSystemMonthlyStatDAO.IncreaseMonthlyCount(nil, types.Int64(pieces[0]), types.Int64(pieces[1]), pieces[2], pieces[3], count)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 浏览器
|
||||||
|
{
|
||||||
|
serverStatLocker.Lock()
|
||||||
|
m := serverHTTPBrowserStatMap
|
||||||
|
serverHTTPBrowserStatMap = map[string]int64{}
|
||||||
|
serverStatLocker.Unlock()
|
||||||
|
for k, count := range m {
|
||||||
|
pieces := strings.Split(k, "@")
|
||||||
|
if len(pieces) != 4 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
err := stats.SharedServerClientBrowserMonthlyStatDAO.IncreaseMonthlyCount(nil, types.Int64(pieces[0]), types.Int64(pieces[1]), pieces[2], pieces[3], count)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
package services
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
|
||||||
|
"github.com/TeaOSLab/EdgeAPI/internal/db/models/stats"
|
||||||
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
||||||
|
)
|
||||||
|
|
||||||
|
// 操作系统统计
|
||||||
|
type ServerClientBrowserMonthlyStatService struct {
|
||||||
|
BaseService
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查找前N个操作系统
|
||||||
|
func (this *ServerClientBrowserMonthlyStatService) FindTopServerClientBrowserMonthlyStats(ctx context.Context, req *pb.FindTopServerClientBrowserMonthlyStatsRequest) (*pb.FindTopServerClientBrowserMonthlyStatsResponse, error) {
|
||||||
|
_, userId, err := this.ValidateAdminAndUser(ctx, 0, 0)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if userId > 0 {
|
||||||
|
err = models.SharedServerDAO.CheckUserServer(nil, userId, req.ServerId)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var tx = this.NullTx()
|
||||||
|
statList, err := stats.SharedServerClientBrowserMonthlyStatDAO.ListStats(tx, req.ServerId, req.Month, req.Offset, req.Size)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
pbStats := []*pb.FindTopServerClientBrowserMonthlyStatsResponse_Stat{}
|
||||||
|
for _, stat := range statList {
|
||||||
|
pbStat := &pb.FindTopServerClientBrowserMonthlyStatsResponse_Stat{
|
||||||
|
Count: int64(stat.Count),
|
||||||
|
Version: stat.Version,
|
||||||
|
}
|
||||||
|
browser, err := models.SharedClientBrowserDAO.FindEnabledClientBrowser(tx, int64(stat.BrowserId))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if browser == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
pbStat.ClientBrowser = &pb.ClientBrowser{
|
||||||
|
Id: int64(browser.Id),
|
||||||
|
Name: browser.Name,
|
||||||
|
}
|
||||||
|
|
||||||
|
pbStats = append(pbStats, pbStat)
|
||||||
|
}
|
||||||
|
return &pb.FindTopServerClientBrowserMonthlyStatsResponse{Stats: pbStats}, nil
|
||||||
|
}
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
package services
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
|
||||||
|
"github.com/TeaOSLab/EdgeAPI/internal/db/models/stats"
|
||||||
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
||||||
|
)
|
||||||
|
|
||||||
|
// 操作系统统计
|
||||||
|
type ServerClientSystemMonthlyStatService struct {
|
||||||
|
BaseService
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查找前N个操作系统
|
||||||
|
func (this *ServerClientSystemMonthlyStatService) FindTopServerClientSystemMonthlyStats(ctx context.Context, req *pb.FindTopServerClientSystemMonthlyStatsRequest) (*pb.FindTopServerClientSystemMonthlyStatsResponse, error) {
|
||||||
|
_, userId, err := this.ValidateAdminAndUser(ctx, 0, 0)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if userId > 0 {
|
||||||
|
err = models.SharedServerDAO.CheckUserServer(nil, userId, req.ServerId)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var tx = this.NullTx()
|
||||||
|
statList, err := stats.SharedServerClientSystemMonthlyStatDAO.ListStats(tx, req.ServerId, req.Month, req.Offset, req.Size)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
pbStats := []*pb.FindTopServerClientSystemMonthlyStatsResponse_Stat{}
|
||||||
|
for _, stat := range statList {
|
||||||
|
pbStat := &pb.FindTopServerClientSystemMonthlyStatsResponse_Stat{
|
||||||
|
Count: int64(stat.Count),
|
||||||
|
Version: stat.Version,
|
||||||
|
}
|
||||||
|
system, err := models.SharedClientSystemDAO.FindEnabledClientSystem(tx, int64(stat.SystemId))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if system == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
pbStat.ClientSystem = &pb.ClientSystem{
|
||||||
|
Id: int64(system.Id),
|
||||||
|
Name: system.Name,
|
||||||
|
}
|
||||||
|
pbStats = append(pbStats, pbStat)
|
||||||
|
}
|
||||||
|
return &pb.FindTopServerClientSystemMonthlyStatsResponse{Stats: pbStats}, nil
|
||||||
|
}
|
||||||
@@ -0,0 +1,79 @@
|
|||||||
|
package services
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
|
||||||
|
"github.com/TeaOSLab/EdgeAPI/internal/db/models/regions"
|
||||||
|
"github.com/TeaOSLab/EdgeAPI/internal/db/models/stats"
|
||||||
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
||||||
|
)
|
||||||
|
|
||||||
|
// 城市月份统计
|
||||||
|
type ServerRegionCityMonthlyStatService struct {
|
||||||
|
BaseService
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查找前N个城市
|
||||||
|
func (this *ServerRegionCityMonthlyStatService) FindTopServerRegionCityMonthlyStats(ctx context.Context, req *pb.FindTopServerRegionCityMonthlyStatsRequest) (*pb.FindTopServerRegionCityMonthlyStatsResponse, error) {
|
||||||
|
_, userId, err := this.ValidateAdminAndUser(ctx, 0, 0)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if userId > 0 {
|
||||||
|
err = models.SharedServerDAO.CheckUserServer(nil, userId, req.ServerId)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var tx = this.NullTx()
|
||||||
|
statList, err := stats.SharedServerRegionCityMonthlyStatDAO.ListStats(tx, req.ServerId, req.Month, req.CountryId, req.ProvinceId, req.Offset, req.Size)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
pbStats := []*pb.FindTopServerRegionCityMonthlyStatsResponse_Stat{}
|
||||||
|
for _, stat := range statList {
|
||||||
|
pbStat := &pb.FindTopServerRegionCityMonthlyStatsResponse_Stat{
|
||||||
|
Count: int64(stat.Count),
|
||||||
|
}
|
||||||
|
if stat.CityId == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
city, err := regions.SharedRegionCityDAO.FindEnabledRegionCity(tx, int64(stat.CityId))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if city == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
province, err := regions.SharedRegionProvinceDAO.FindEnabledRegionProvince(tx, int64(city.ProvinceId))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if province == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
country, err := regions.SharedRegionCountryDAO.FindEnabledRegionCountry(tx, int64(province.CountryId))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if country == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
pbStat.RegionCountry = &pb.RegionCountry{
|
||||||
|
Id: int64(country.Id),
|
||||||
|
Name: country.Name,
|
||||||
|
}
|
||||||
|
pbStat.RegionProvince = &pb.RegionProvince{
|
||||||
|
Id: int64(province.Id),
|
||||||
|
Name: province.Name,
|
||||||
|
}
|
||||||
|
pbStat.RegionCity = &pb.RegionCity{
|
||||||
|
Id: int64(city.Id),
|
||||||
|
Name: city.Name,
|
||||||
|
}
|
||||||
|
pbStats = append(pbStats, pbStat)
|
||||||
|
}
|
||||||
|
return &pb.FindTopServerRegionCityMonthlyStatsResponse{Stats: pbStats}, nil
|
||||||
|
}
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
package services
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
|
||||||
|
"github.com/TeaOSLab/EdgeAPI/internal/db/models/regions"
|
||||||
|
"github.com/TeaOSLab/EdgeAPI/internal/db/models/stats"
|
||||||
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
||||||
|
)
|
||||||
|
|
||||||
|
// 地区月份统计
|
||||||
|
type ServerRegionCountryMonthlyStatService struct {
|
||||||
|
BaseService
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查找前N个地区
|
||||||
|
func (this *ServerRegionCountryMonthlyStatService) FindTopServerRegionCountryMonthlyStats(ctx context.Context, req *pb.FindTopServerRegionCountryMonthlyStatsRequest) (*pb.FindTopServerRegionCountryMonthlyStatsResponse, error) {
|
||||||
|
_, userId, err := this.ValidateAdminAndUser(ctx, 0, 0)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if userId > 0 {
|
||||||
|
err = models.SharedServerDAO.CheckUserServer(nil, userId, req.ServerId)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var tx = this.NullTx()
|
||||||
|
statList, err := stats.SharedServerRegionCountryMonthlyStatDAO.ListStats(tx, req.ServerId, req.Month, req.Offset, req.Size)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
pbStats := []*pb.FindTopServerRegionCountryMonthlyStatsResponse_Stat{}
|
||||||
|
for _, stat := range statList {
|
||||||
|
pbStat := &pb.FindTopServerRegionCountryMonthlyStatsResponse_Stat{
|
||||||
|
Count: int64(stat.Count),
|
||||||
|
}
|
||||||
|
|
||||||
|
country, err := regions.SharedRegionCountryDAO.FindEnabledRegionCountry(tx, int64(stat.CountryId))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if country == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
pbStat.RegionCountry = &pb.RegionCountry{
|
||||||
|
Id: int64(country.Id),
|
||||||
|
Name: country.Name,
|
||||||
|
}
|
||||||
|
|
||||||
|
pbStats = append(pbStats, pbStat)
|
||||||
|
}
|
||||||
|
|
||||||
|
return &pb.FindTopServerRegionCountryMonthlyStatsResponse{Stats: pbStats}, nil
|
||||||
|
}
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
package services
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
|
||||||
|
"github.com/TeaOSLab/EdgeAPI/internal/db/models/regions"
|
||||||
|
"github.com/TeaOSLab/EdgeAPI/internal/db/models/stats"
|
||||||
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
||||||
|
)
|
||||||
|
|
||||||
|
// 运营商月份统计
|
||||||
|
type ServerRegionProviderMonthlyStatService struct {
|
||||||
|
BaseService
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查找前N个运营商
|
||||||
|
func (this *ServerRegionProviderMonthlyStatService) FindTopServerRegionProviderMonthlyStats(ctx context.Context, req *pb.FindTopServerRegionProviderMonthlyStatsRequest) (*pb.FindTopServerRegionProviderMonthlyStatsResponse, error) {
|
||||||
|
_, userId, err := this.ValidateAdminAndUser(ctx, 0, 0)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if userId > 0 {
|
||||||
|
err = models.SharedServerDAO.CheckUserServer(nil, userId, req.ServerId)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var tx = this.NullTx()
|
||||||
|
statList, err := stats.SharedServerRegionProviderMonthlyStatDAO.ListStats(tx, req.ServerId, req.Month, req.Offset, req.Size)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
pbStats := []*pb.FindTopServerRegionProviderMonthlyStatsResponse_Stat{}
|
||||||
|
for _, stat := range statList {
|
||||||
|
pbStat := &pb.FindTopServerRegionProviderMonthlyStatsResponse_Stat{
|
||||||
|
Count: int64(stat.Count),
|
||||||
|
}
|
||||||
|
provider, err := regions.SharedRegionProviderDAO.FindEnabledRegionProvider(tx, stat.ProviderId)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if provider == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
pbStat.RegionProvider = &pb.RegionProvider{
|
||||||
|
Id: int64(provider.Id),
|
||||||
|
Name: provider.Name,
|
||||||
|
}
|
||||||
|
pbStats = append(pbStats, pbStat)
|
||||||
|
}
|
||||||
|
return &pb.FindTopServerRegionProviderMonthlyStatsResponse{Stats: pbStats}, nil
|
||||||
|
}
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
package services
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
|
||||||
|
"github.com/TeaOSLab/EdgeAPI/internal/db/models/regions"
|
||||||
|
"github.com/TeaOSLab/EdgeAPI/internal/db/models/stats"
|
||||||
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
||||||
|
)
|
||||||
|
|
||||||
|
// 省份月份统计
|
||||||
|
type ServerRegionProvinceMonthlyStatService struct {
|
||||||
|
BaseService
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查找前N个省份
|
||||||
|
func (this *ServerRegionProvinceMonthlyStatService) FindTopServerRegionProvinceMonthlyStats(ctx context.Context, req *pb.FindTopServerRegionProvinceMonthlyStatsRequest) (*pb.FindTopServerRegionProvinceMonthlyStatsResponse, error) {
|
||||||
|
_, userId, err := this.ValidateAdminAndUser(ctx, 0, 0)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if userId > 0 {
|
||||||
|
err = models.SharedServerDAO.CheckUserServer(nil, userId, req.ServerId)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var tx = this.NullTx()
|
||||||
|
statList, err := stats.SharedServerRegionProvinceMonthlyStatDAO.ListStats(tx, req.ServerId, req.Month, req.CountryId, req.Offset, req.Size)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
pbStats := []*pb.FindTopServerRegionProvinceMonthlyStatsResponse_Stat{}
|
||||||
|
for _, stat := range statList {
|
||||||
|
pbStat := &pb.FindTopServerRegionProvinceMonthlyStatsResponse_Stat{
|
||||||
|
Count: int64(stat.Count),
|
||||||
|
}
|
||||||
|
province, err := regions.SharedRegionProvinceDAO.FindEnabledRegionProvince(tx, int64(stat.ProvinceId))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if province == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
country, err := regions.SharedRegionCountryDAO.FindEnabledRegionCountry(tx, int64(province.CountryId))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if country == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
pbStat.RegionCountry = &pb.RegionCountry{
|
||||||
|
Id: int64(country.Id),
|
||||||
|
Name: country.Name,
|
||||||
|
}
|
||||||
|
pbStat.RegionProvince = &pb.RegionProvince{
|
||||||
|
Id: int64(province.Id),
|
||||||
|
Name: province.Name,
|
||||||
|
}
|
||||||
|
pbStats = append(pbStats, pbStat)
|
||||||
|
}
|
||||||
|
return &pb.FindTopServerRegionProvinceMonthlyStatsResponse{Stats: pbStats}, nil
|
||||||
|
}
|
||||||
85
internal/rpc/services/service_server_test.go
Normal file
85
internal/rpc/services/service_server_test.go
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
package services
|
||||||
|
|
||||||
|
import (
|
||||||
|
rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils"
|
||||||
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
||||||
|
_ "github.com/iwind/TeaGo/bootstrap"
|
||||||
|
"github.com/iwind/TeaGo/dbs"
|
||||||
|
"github.com/iwind/TeaGo/logs"
|
||||||
|
timeutil "github.com/iwind/TeaGo/utils/time"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestServerService_UploadServerHTTPRequestStat(t *testing.T) {
|
||||||
|
dbs.NotifyReady()
|
||||||
|
|
||||||
|
service := new(ServerService)
|
||||||
|
_, err := service.UploadServerHTTPRequestStat(rpcutils.NewMockNodeContext(1), &pb.UploadServerHTTPRequestStatRequest{
|
||||||
|
Month: timeutil.Format("Ym"),
|
||||||
|
RegionCities: []*pb.UploadServerHTTPRequestStatRequest_RegionCity{
|
||||||
|
{
|
||||||
|
ServerId: 1,
|
||||||
|
CountryName: "中国",
|
||||||
|
ProvinceName: "安徽省",
|
||||||
|
CityName: "阜阳市",
|
||||||
|
Count: 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
RegionProviders: []*pb.UploadServerHTTPRequestStatRequest_RegionProvider{
|
||||||
|
{
|
||||||
|
ServerId: 1,
|
||||||
|
Name: "电信",
|
||||||
|
Count: 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Systems: []*pb.UploadServerHTTPRequestStatRequest_System{
|
||||||
|
{
|
||||||
|
ServerId: 1,
|
||||||
|
Name: "Mac OS X",
|
||||||
|
Count: 1,
|
||||||
|
Version: "20",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Browsers: []*pb.UploadServerHTTPRequestStatRequest_Browser{
|
||||||
|
{
|
||||||
|
ServerId: 1,
|
||||||
|
Name: "Chrome",
|
||||||
|
Count: 1,
|
||||||
|
Version: "70",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ServerId: 1,
|
||||||
|
Name: "Firefox",
|
||||||
|
Count: 1,
|
||||||
|
Version: "30",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
t.Log("===countries===")
|
||||||
|
logs.PrintAsJSON(serverHTTPCountryStatMap, t)
|
||||||
|
|
||||||
|
t.Log("===provinces===")
|
||||||
|
logs.PrintAsJSON(serverHTTPProvinceStatMap, t)
|
||||||
|
|
||||||
|
t.Log("===cities===")
|
||||||
|
logs.PrintAsJSON(serverHTTPCityStatMap, t)
|
||||||
|
|
||||||
|
t.Log("===providers===")
|
||||||
|
logs.PrintAsJSON(serverHTTPProviderStatMap, t)
|
||||||
|
|
||||||
|
t.Log("===systems===")
|
||||||
|
logs.PrintAsJSON(serverHTTPSystemStatMap, t)
|
||||||
|
|
||||||
|
t.Log("===browsers===")
|
||||||
|
logs.PrintAsJSON(serverHTTPBrowserStatMap, t)
|
||||||
|
|
||||||
|
err = service.dumpServerHTTPStats()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
t.Log("ok")
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user