mirror of
https://github.com/VaalaCat/frp-panel.git
synced 2025-09-26 19:31:18 +08:00
273 lines
7.0 KiB
Go
273 lines
7.0 KiB
Go
package dao
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/VaalaCat/frp-panel/defs"
|
|
"github.com/VaalaCat/frp-panel/models"
|
|
"github.com/google/uuid"
|
|
"github.com/samber/lo"
|
|
)
|
|
|
|
func (q *queryImpl) InitDefaultServer(serverIP string) {
|
|
db := q.ctx.GetApp().GetDBManager().GetDefaultDB()
|
|
db.Where(&models.Server{
|
|
ServerEntity: &models.ServerEntity{
|
|
ServerID: defs.DefaultServerID,
|
|
},
|
|
}).Attrs(&models.Server{
|
|
ServerEntity: &models.ServerEntity{
|
|
ServerID: defs.DefaultServerID,
|
|
ServerIP: serverIP,
|
|
ConnectSecret: uuid.New().String(),
|
|
},
|
|
}).FirstOrCreate(&models.Server{})
|
|
}
|
|
|
|
func (q *queryImpl) GetDefaultServer() (*models.ServerEntity, error) {
|
|
db := q.ctx.GetApp().GetDBManager().GetDefaultDB()
|
|
c := &models.Server{}
|
|
err := db.
|
|
Where(&models.Server{ServerEntity: &models.ServerEntity{
|
|
ServerID: defs.DefaultServerID,
|
|
}}).
|
|
First(c).Error
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return c.ServerEntity, nil
|
|
}
|
|
|
|
func (q *queryImpl) UpdateDefaultServer(c *models.Server) error {
|
|
db := q.ctx.GetApp().GetDBManager().GetDefaultDB()
|
|
c.ServerID = defs.DefaultServerID
|
|
err := db.Where(&models.Server{
|
|
ServerEntity: &models.ServerEntity{
|
|
ServerID: defs.DefaultServerID,
|
|
}}).Save(c).Error
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (q *queryImpl) ValidateServerSecret(serverID string, secret string) (*models.ServerEntity, error) {
|
|
if serverID == "" || secret == "" {
|
|
return nil, fmt.Errorf("invalid request")
|
|
}
|
|
db := q.ctx.GetApp().GetDBManager().GetDefaultDB()
|
|
c := &models.Server{}
|
|
err := db.
|
|
Where(&models.Server{ServerEntity: &models.ServerEntity{
|
|
ServerID: serverID,
|
|
}}).
|
|
First(c).Error
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if c.ConnectSecret != secret {
|
|
return nil, fmt.Errorf("invalid secret")
|
|
}
|
|
return c.ServerEntity, nil
|
|
}
|
|
|
|
func (q *queryImpl) AdminGetServerByServerID(serverID string) (*models.ServerEntity, error) {
|
|
if serverID == "" {
|
|
return nil, fmt.Errorf("invalid server id")
|
|
}
|
|
db := q.ctx.GetApp().GetDBManager().GetDefaultDB()
|
|
c := &models.Server{}
|
|
err := db.
|
|
Where(&models.Server{ServerEntity: &models.ServerEntity{
|
|
ServerID: serverID,
|
|
}}).
|
|
First(c).Error
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return c.ServerEntity, nil
|
|
}
|
|
|
|
func (q *queryImpl) GetServerByServerID(userInfo models.UserInfo, serverID string) (*models.ServerEntity, error) {
|
|
if serverID == "" {
|
|
return nil, fmt.Errorf("invalid server id")
|
|
}
|
|
if userInfo.GetUserID() == defs.DefaultAdminUserID && serverID == defs.DefaultServerID {
|
|
return q.GetDefaultServer()
|
|
}
|
|
db := q.ctx.GetApp().GetDBManager().GetDefaultDB()
|
|
c := &models.Server{}
|
|
err := db.
|
|
Where(&models.Server{ServerEntity: &models.ServerEntity{
|
|
TenantID: userInfo.GetTenantID(),
|
|
UserID: userInfo.GetUserID(),
|
|
ServerID: serverID,
|
|
}}).
|
|
First(c).Error
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return c.ServerEntity, nil
|
|
}
|
|
|
|
func (q *queryImpl) CreateServer(userInfo models.UserInfo, server *models.ServerEntity) error {
|
|
server.UserID = userInfo.GetUserID()
|
|
server.TenantID = userInfo.GetTenantID()
|
|
c := &models.Server{
|
|
ServerEntity: server,
|
|
}
|
|
db := q.ctx.GetApp().GetDBManager().GetDefaultDB()
|
|
return db.Create(c).Error
|
|
}
|
|
|
|
func (q *queryImpl) DeleteServer(userInfo models.UserInfo, serverID string) error {
|
|
if serverID == "" {
|
|
return fmt.Errorf("invalid server id")
|
|
}
|
|
db := q.ctx.GetApp().GetDBManager().GetDefaultDB()
|
|
return db.Unscoped().Where(
|
|
&models.Server{
|
|
ServerEntity: &models.ServerEntity{
|
|
TenantID: userInfo.GetTenantID(),
|
|
UserID: userInfo.GetUserID(),
|
|
},
|
|
},
|
|
).Delete(&models.Server{
|
|
ServerEntity: &models.ServerEntity{
|
|
ServerID: serverID,
|
|
},
|
|
}).Error
|
|
}
|
|
|
|
func (q *queryImpl) UpdateServer(userInfo models.UserInfo, server *models.ServerEntity) error {
|
|
c := &models.Server{
|
|
ServerEntity: server,
|
|
}
|
|
if userInfo.GetUserID() == defs.DefaultAdminUserID && server.ServerID == defs.DefaultServerID {
|
|
return q.UpdateDefaultServer(c)
|
|
}
|
|
db := q.ctx.GetApp().GetDBManager().GetDefaultDB()
|
|
return db.Where(
|
|
&models.Server{
|
|
ServerEntity: &models.ServerEntity{
|
|
UserID: userInfo.GetUserID(),
|
|
TenantID: userInfo.GetTenantID(),
|
|
},
|
|
},
|
|
).Save(c).Error
|
|
}
|
|
|
|
func (q *queryImpl) ListServers(userInfo models.UserInfo, page, pageSize int) ([]*models.ServerEntity, error) {
|
|
if page < 1 || pageSize < 1 {
|
|
return nil, fmt.Errorf("invalid page or page size")
|
|
}
|
|
|
|
db := q.ctx.GetApp().GetDBManager().GetDefaultDB()
|
|
offset := (page - 1) * pageSize
|
|
|
|
var servers []*models.Server
|
|
err := db.Where(
|
|
&models.Server{
|
|
ServerEntity: &models.ServerEntity{
|
|
UserID: userInfo.GetUserID(),
|
|
TenantID: userInfo.GetTenantID(),
|
|
},
|
|
},
|
|
).Or(&models.Server{
|
|
ServerEntity: &models.ServerEntity{
|
|
ServerID: defs.DefaultServerID,
|
|
},
|
|
}).Offset(offset).Limit(pageSize).Find(&servers).Error
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return lo.Map(servers, func(c *models.Server, _ int) *models.ServerEntity {
|
|
return c.ServerEntity
|
|
}), nil
|
|
}
|
|
|
|
func (q *queryImpl) ListServersWithKeyword(userInfo models.UserInfo, page, pageSize int, keyword string) ([]*models.ServerEntity, error) {
|
|
if page < 1 || pageSize < 1 || len(keyword) == 0 {
|
|
return nil, fmt.Errorf("invalid page or page size or keyword")
|
|
}
|
|
|
|
db := q.ctx.GetApp().GetDBManager().GetDefaultDB()
|
|
offset := (page - 1) * pageSize
|
|
|
|
var servers []*models.Server
|
|
err := db.Where(
|
|
&models.Server{
|
|
ServerEntity: &models.ServerEntity{
|
|
UserID: userInfo.GetUserID(),
|
|
TenantID: userInfo.GetTenantID(),
|
|
},
|
|
},
|
|
).Where("server_id like ?", "%"+keyword+"%").
|
|
Offset(offset).Limit(pageSize).Find(&servers).Error
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return lo.Map(servers, func(c *models.Server, _ int) *models.ServerEntity {
|
|
return c.ServerEntity
|
|
}), nil
|
|
}
|
|
|
|
func (q *queryImpl) CountServers(userInfo models.UserInfo) (int64, error) {
|
|
db := q.ctx.GetApp().GetDBManager().GetDefaultDB()
|
|
var count int64
|
|
err := db.Model(&models.Server{}).Where(
|
|
&models.Server{
|
|
ServerEntity: &models.ServerEntity{
|
|
UserID: userInfo.GetUserID(),
|
|
TenantID: userInfo.GetTenantID(),
|
|
},
|
|
},
|
|
).Count(&count).Error
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
return count, nil
|
|
}
|
|
|
|
func (q *queryImpl) CountServersWithKeyword(userInfo models.UserInfo, keyword string) (int64, error) {
|
|
db := q.ctx.GetApp().GetDBManager().GetDefaultDB()
|
|
var count int64
|
|
err := db.Model(&models.Server{}).Where(
|
|
&models.Server{
|
|
ServerEntity: &models.ServerEntity{
|
|
UserID: userInfo.GetUserID(),
|
|
TenantID: userInfo.GetTenantID(),
|
|
},
|
|
},
|
|
).Where("server_id like ?", "%"+keyword+"%").Count(&count).Error
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
return count, nil
|
|
}
|
|
|
|
func (q *queryImpl) CountConfiguredServers(userInfo models.UserInfo) (int64, error) {
|
|
db := q.ctx.GetApp().GetDBManager().GetDefaultDB()
|
|
var count int64
|
|
err := db.Model(&models.Server{}).Where(
|
|
&models.Server{
|
|
ServerEntity: &models.ServerEntity{
|
|
UserID: userInfo.GetUserID(),
|
|
TenantID: userInfo.GetTenantID(),
|
|
},
|
|
},
|
|
).Not(
|
|
&models.Server{
|
|
ServerEntity: &models.ServerEntity{
|
|
ConfigContent: []byte{},
|
|
},
|
|
},
|
|
).Count(&count).Error
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
return count, nil
|
|
}
|