// // Copyright (C) 2024 veypi // 2025-03-04 16:08:06 // Distributed under terms of the MIT license. // package providers import ( "github.com/veypi/vbase/cfg" "github.com/veypi/vbase/models" "github.com/veypi/vigo" ) // UpdateRequest 更新请求 type UpdateRequest struct { Code string `src:"path" desc:"提供商代码"` models.OAuthProvider } // update 更新 OAuth 提供商 func update(x *vigo.X, req *UpdateRequest) (*models.OAuthProvider, error) { db := cfg.DB() // 查找现有配置 var provider models.OAuthProvider if err := db.Where("code = ?", req.Code).First(&provider).Error; err != nil { return nil, vigo.ErrNotFound.WithError(err) } // 内置的不能修改 code if provider.IsBuiltIn && req.OAuthProvider.Code != req.Code { return nil, vigo.ErrForbidden.WithString("cannot change code of built-in provider") } // 更新字段(保留 id 和 is_built_in) req.ID = provider.ID req.IsBuiltIn = provider.IsBuiltIn // 如果提供了新的 ClientSecret,则加密;否则保留原值 if req.OAuthProvider.ClientSecret != "" { encrypted, err := cfg.Config.Key.Encrypt(req.OAuthProvider.ClientSecret) if err != nil { return nil, vigo.ErrInternalServer.WithString("failed to encrypt client secret") } req.OAuthProvider.ClientSecret = encrypted } else { req.OAuthProvider.ClientSecret = provider.ClientSecret } if err := db.Save(&req.OAuthProvider).Error; err != nil { return nil, vigo.ErrInternalServer.WithError(err) } return &req.OAuthProvider, nil }