mirror of
https://github.com/1Panel-dev/1Panel.git
synced 2026-11-07 00:05:14 +00:00
* fix(ai): persist model verification settings and reset lifecycle status * fix(ai): reset model verification before upgrade cutover
170 lines
4.8 KiB
Go
170 lines
4.8 KiB
Go
package repo
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"github.com/1Panel-dev/1Panel/agent/app/model"
|
|
"github.com/1Panel-dev/1Panel/agent/global"
|
|
"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
|
|
UpdateVerification(account *model.AgentAccount) error
|
|
ResetVerificationByAppInstallID(appInstallID uint) error
|
|
DeleteByID(id uint) error
|
|
List(opts ...DBOption) ([]model.AgentAccount, error)
|
|
Count() (int64, error)
|
|
CountTextByProviders(providers []string) (map[string]int64, error)
|
|
SaveWithModels(account *model.AgentAccount, models []model.AgentAccountModel) 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) UpdateVerification(account *model.AgentAccount) error {
|
|
result := getDb().Model(&model.AgentAccount{}).Where("id = ?", account.ID).Updates(map[string]interface{}{
|
|
"verified": account.Verified,
|
|
"verified_at": account.VerifiedAt,
|
|
"verify_error": account.VerifyError,
|
|
"verify_model": account.VerifyModel,
|
|
})
|
|
if result.Error != nil {
|
|
return result.Error
|
|
}
|
|
if result.RowsAffected == 0 {
|
|
return gorm.ErrRecordNotFound
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (a AgentAccountRepo) ResetVerificationByAppInstallID(appInstallID uint) error {
|
|
return getDb().Model(&model.AgentAccount{}).Where("app_install_id = ? AND validate_availability = ?", appInstallID, true).Updates(map[string]interface{}{
|
|
"verified": false,
|
|
"verified_at": nil,
|
|
"verify_error": "",
|
|
}).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) Count() (int64, error) {
|
|
var count int64
|
|
err := getDb().Model(&model.AgentAccount{}).Count(&count).Error
|
|
return count, err
|
|
}
|
|
|
|
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 (a AgentAccountRepo) SaveWithModels(account *model.AgentAccount, models []model.AgentAccountModel) error {
|
|
return global.DB.Transaction(func(tx *gorm.DB) error {
|
|
if err := tx.Save(account).Error; err != nil {
|
|
return err
|
|
}
|
|
if err := tx.Where("account_id = ?", account.ID).Delete(&model.AgentAccountModel{}).Error; err != nil {
|
|
return err
|
|
}
|
|
if len(models) == 0 {
|
|
return nil
|
|
}
|
|
for i := range models {
|
|
models[i].AccountID = account.ID
|
|
models[i].SortOrder = i + 1
|
|
}
|
|
return tx.Create(&models).Error
|
|
})
|
|
}
|
|
|
|
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
|
|
}
|