mirror of
https://github.com/1Panel-dev/1Panel.git
synced 2026-09-23 16:00:52 +00:00
* feat: Optimize application upgrade logic * feat: Optimize application upgrade logic * feat: Optimize application upgrade logic
116 lines
3.0 KiB
Go
116 lines
3.0 KiB
Go
package repo
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"github.com/1Panel-dev/1Panel/agent/app/model"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type AgentAccountRepo struct{}
|
|
|
|
type IAgentAccountRepo interface {
|
|
Page(page, size int, opts ...DBOption) (int64, []model.AgentAccount, error)
|
|
GetFirst(opts ...DBOption) (*model.AgentAccount, error)
|
|
WithByMasterAccountID(masterID uint) DBOption
|
|
Create(account *model.AgentAccount) error
|
|
Save(account *model.AgentAccount) error
|
|
DeleteByID(id uint) error
|
|
List(opts ...DBOption) ([]model.AgentAccount, error)
|
|
CountTextByProviders(providers []string) (map[string]int64, error)
|
|
}
|
|
|
|
func NewIAgentAccountRepo() IAgentAccountRepo {
|
|
return &AgentAccountRepo{}
|
|
}
|
|
|
|
func (a AgentAccountRepo) Page(page, size int, opts ...DBOption) (int64, []model.AgentAccount, error) {
|
|
var accounts []model.AgentAccount
|
|
db := getDb(opts...).Model(&model.AgentAccount{})
|
|
count := int64(0)
|
|
db = db.Count(&count)
|
|
err := db.Limit(size).Offset(size * (page - 1)).Find(&accounts).Error
|
|
return count, accounts, err
|
|
}
|
|
|
|
func (a AgentAccountRepo) GetFirst(opts ...DBOption) (*model.AgentAccount, error) {
|
|
var account model.AgentAccount
|
|
if err := getDb(opts...).First(&account).Error; err != nil {
|
|
return nil, err
|
|
}
|
|
return &account, nil
|
|
}
|
|
|
|
func (a AgentAccountRepo) WithByMasterAccountID(masterID uint) DBOption {
|
|
return func(g *gorm.DB) *gorm.DB {
|
|
return g.Where("master_account_id = ?", masterID)
|
|
}
|
|
}
|
|
|
|
func (a AgentAccountRepo) Create(account *model.AgentAccount) error {
|
|
return getDb().Create(account).Error
|
|
}
|
|
|
|
func (a AgentAccountRepo) Save(account *model.AgentAccount) error {
|
|
return getDb().Save(account).Error
|
|
}
|
|
|
|
func (a AgentAccountRepo) DeleteByID(id uint) error {
|
|
return getDb().Delete(&model.AgentAccount{}, id).Error
|
|
}
|
|
|
|
func (a AgentAccountRepo) List(opts ...DBOption) ([]model.AgentAccount, error) {
|
|
var accounts []model.AgentAccount
|
|
if err := getDb(opts...).Find(&accounts).Error; err != nil {
|
|
return nil, err
|
|
}
|
|
return accounts, nil
|
|
}
|
|
|
|
func (a AgentAccountRepo) CountTextByProviders(providers []string) (map[string]int64, error) {
|
|
normalizedProviders := normalizeProviders(providers)
|
|
counts := make(map[string]int64, len(normalizedProviders))
|
|
for _, provider := range normalizedProviders {
|
|
counts[provider] = 0
|
|
}
|
|
if len(normalizedProviders) == 0 {
|
|
return counts, nil
|
|
}
|
|
|
|
type providerCount struct {
|
|
Provider string
|
|
Count int64
|
|
}
|
|
var rows []providerCount
|
|
if err := getDb().
|
|
Model(&model.AgentAccount{}).
|
|
Select("provider, COUNT(*) as count").
|
|
Where("provider IN ?", normalizedProviders).
|
|
Scopes(WithTextAPIType()).
|
|
Group("provider").
|
|
Scan(&rows).Error; err != nil {
|
|
return nil, err
|
|
}
|
|
for _, row := range rows {
|
|
counts[row.Provider] = row.Count
|
|
}
|
|
return counts, nil
|
|
}
|
|
|
|
func normalizeProviders(providers []string) []string {
|
|
seen := make(map[string]struct{}, len(providers))
|
|
result := make([]string, 0, len(providers))
|
|
for _, provider := range providers {
|
|
provider = strings.TrimSpace(provider)
|
|
if provider == "" {
|
|
continue
|
|
}
|
|
if _, ok := seen[provider]; ok {
|
|
continue
|
|
}
|
|
seen[provider] = struct{}{}
|
|
result = append(result, provider)
|
|
}
|
|
return result
|
|
}
|