Files
frp-panel/services/dao/server.go
VaalaCat f07c03ce68 feat: fx
2025-04-26 10:52:21 +00:00

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
}