Skip to content

Commit d1c2a69

Browse files
authored
pref: Optimize backup account code structure (#11261)
1 parent 3a1b9fe commit d1c2a69

File tree

36 files changed

+324
-3619
lines changed

36 files changed

+324
-3619
lines changed

agent/app/api/v2/backup.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,23 @@ func (b *BaseApi) CheckBackupUsed(c *gin.Context) {
2525
helper.Success(c)
2626
}
2727

28+
// @Tags Backup Account
29+
// @Summary Check backup account
30+
// @Accept json
31+
// @Param request body dto.BackupOperate true "request"
32+
// @Success 200
33+
// @Security ApiKeyAuth
34+
// @Security Timestamp
35+
// @Router /backups/check [post]
36+
func (b *BaseApi) CheckBackup(c *gin.Context) {
37+
var req dto.BackupOperate
38+
if err := helper.CheckBindAndValidate(&req, c); err != nil {
39+
return
40+
}
41+
42+
helper.SuccessWithData(c, backupService.CheckConn(req))
43+
}
44+
2845
// @Tags Backup Account
2946
// @Summary Create backup account
3047
// @Accept json

agent/app/dto/backup.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,12 @@ type BackupInfo struct {
3333
RememberAuth bool `json:"rememberAuth"`
3434
}
3535

36+
type BackupCheckRes struct {
37+
IsOk bool `json:"isOk"`
38+
Msg string `json:"msg"`
39+
Token string `json:"token"`
40+
}
41+
3642
type ForBuckets struct {
3743
Type string `json:"type" validate:"required"`
3844
AccessKey string `json:"accessKey"`

agent/app/service/backup.go

Lines changed: 50 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ type IBackupService interface {
3434
LoadBackupOptions() ([]dto.BackupOption, error)
3535
SearchWithPage(search dto.SearchPageWithType) (int64, interface{}, error)
3636
Create(backupDto dto.BackupOperate) error
37+
CheckConn(req dto.BackupOperate) dto.BackupCheckRes
3738
GetBuckets(backupDto dto.ForBuckets) ([]interface{}, error)
3839
Update(req dto.BackupOperate) error
3940
Delete(id uint) error
@@ -123,6 +124,43 @@ func (u *BackupService) SearchWithPage(req dto.SearchPageWithType) (int64, inter
123124
return count, data, nil
124125
}
125126

127+
func (u *BackupService) CheckConn(req dto.BackupOperate) dto.BackupCheckRes {
128+
var res dto.BackupCheckRes
129+
var backup model.BackupAccount
130+
if err := copier.Copy(&backup, &req); err != nil {
131+
res.Msg = i18n.GetMsgWithDetail("ErrStructTransform", err.Error())
132+
return res
133+
}
134+
itemAccessKey, err := base64.StdEncoding.DecodeString(backup.AccessKey)
135+
if err != nil {
136+
res.Msg = err.Error()
137+
return res
138+
}
139+
backup.AccessKey = string(itemAccessKey)
140+
itemCredential, err := base64.StdEncoding.DecodeString(backup.Credential)
141+
if err != nil {
142+
res.Msg = err.Error()
143+
return res
144+
}
145+
backup.Credential = string(itemCredential)
146+
147+
if req.Type == constant.OneDrive || req.Type == constant.GoogleDrive {
148+
refreshToken, err := loadRefreshTokenByCode(&backup)
149+
if err != nil {
150+
res.Msg = err.Error()
151+
return res
152+
}
153+
res.Token = base64.StdEncoding.EncodeToString([]byte(refreshToken))
154+
}
155+
isOk, err := u.checkBackupConn(&backup)
156+
if err != nil {
157+
res.Msg = err.Error()
158+
return res
159+
}
160+
res.IsOk = isOk
161+
return res
162+
}
163+
126164
func (u *BackupService) Create(req dto.BackupOperate) error {
127165
if req.Type == constant.Local {
128166
return buserr.New("ErrBackupLocalCreate")
@@ -147,19 +185,6 @@ func (u *BackupService) Create(req dto.BackupOperate) error {
147185
return err
148186
}
149187
backup.Credential = string(itemCredential)
150-
151-
if req.Type == constant.OneDrive || req.Type == constant.GoogleDrive || req.Type == constant.ALIYUN {
152-
if err := loadRefreshTokenByCode(&backup); err != nil {
153-
return err
154-
}
155-
}
156-
if req.Type != constant.Local {
157-
isOk, err := u.checkBackupConn(&backup)
158-
if err != nil || !isOk {
159-
return buserr.WithMap("ErrBackupCheck", map[string]interface{}{"err": err.Error()}, err)
160-
}
161-
}
162-
163188
backup.AccessKey, err = encrypt.StringEncrypt(backup.AccessKey)
164189
if err != nil {
165190
return err
@@ -248,16 +273,7 @@ func (u *BackupService) Update(req dto.BackupOperate) error {
248273
global.Dir.LocalBackupDir = newBackup.BackupPath
249274
}
250275

251-
if newBackup.Type == constant.OneDrive || newBackup.Type == constant.GoogleDrive || newBackup.Type == constant.ALIYUN {
252-
if err := loadRefreshTokenByCode(&newBackup); err != nil {
253-
return err
254-
}
255-
}
256276
if backup.Type != constant.Local {
257-
isOk, err := u.checkBackupConn(&newBackup)
258-
if err != nil || !isOk {
259-
return buserr.WithMap("ErrBackupCheck", map[string]interface{}{"err": err.Error()}, err)
260-
}
261277
newBackup.AccessKey, err = encrypt.StringEncrypt(newBackup.AccessKey)
262278
if err != nil {
263279
return err
@@ -514,37 +530,34 @@ func newClient(account *model.BackupAccount, isEncrypt bool) (cloud_storage.Clou
514530
return client, nil
515531
}
516532

517-
func loadRefreshTokenByCode(backup *model.BackupAccount) error {
533+
func loadRefreshTokenByCode(backup *model.BackupAccount) (string, error) {
518534
varMap := make(map[string]interface{})
519535
if err := json.Unmarshal([]byte(backup.Vars), &varMap); err != nil {
520-
return fmt.Errorf("unmarshal backup vars failed, err: %v", err)
536+
return "", fmt.Errorf("unmarshal backup vars failed, err: %v", err)
537+
}
538+
if _, ok := varMap["refresh_token"]; ok {
539+
return "", nil
521540
}
522541
refreshToken := ""
523542
var err error
524-
if backup.Type == constant.GoogleDrive {
543+
switch backup.Type {
544+
case constant.GoogleDrive:
525545
refreshToken, err = client.RefreshGoogleToken("authorization_code", "refreshToken", varMap)
526546
if err != nil {
527-
return err
547+
return "", err
528548
}
529-
}
530-
if backup.Type == constant.OneDrive {
549+
case constant.OneDrive:
531550
refreshToken, err = client.RefreshToken("authorization_code", "refreshToken", varMap)
532551
if err != nil {
533-
return err
552+
return "", err
534553
}
535554
}
536555
if backup.Type != constant.ALIYUN {
537-
delete(varMap, "code")
538556
varMap["refresh_token"] = refreshToken
539557
}
540-
varMap["refresh_status"] = constant.StatusSuccess
541-
varMap["refresh_time"] = time.Now().Format(constant.DateTimeLayout)
542-
itemVars, err := json.Marshal(varMap)
543-
if err != nil {
544-
return fmt.Errorf("json marshal var map failed, err: %v", err)
545-
}
558+
itemVars, _ := json.Marshal(varMap)
546559
backup.Vars = string(itemVars)
547-
return nil
560+
return refreshToken, nil
548561
}
549562

550563
func loadBackupNamesByID(accountIDs string, downloadID uint) ([]string, string, error) {

agent/router/backup.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,13 @@ func (s *BackupRouter) InitRouter(Router *gin.RouterGroup) {
1919
backupRouter.POST("/refresh/token", baseApi.RefreshToken)
2020
backupRouter.POST("/buckets", baseApi.ListBuckets)
2121
backupRouter.POST("", baseApi.CreateBackup)
22+
backupRouter.POST("/conn/check", baseApi.CheckBackup)
2223
backupRouter.POST("/del", baseApi.DeleteBackup)
2324
backupRouter.POST("/update", baseApi.UpdateBackup)
24-
backupRouter.POST("/upload", baseApi.UploadForRecover)
2525

2626
backupRouter.POST("/backup", baseApi.Backup)
2727
backupRouter.POST("/recover", baseApi.Recover)
28+
backupRouter.POST("/upload", baseApi.UploadForRecover)
2829
backupRouter.POST("/recover/byupload", baseApi.RecoverByUpload)
2930
backupRouter.POST("/search/files", baseApi.LoadFilesFromBackup)
3031
backupRouter.POST("/record/search", baseApi.SearchBackupRecords)

core/app/api/v2/backup.go

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -50,28 +50,6 @@ func (b *BaseApi) RefreshToken(c *gin.Context) {
5050
helper.Success(c)
5151
}
5252

53-
// @Tags Backup Account
54-
// @Summary List buckets
55-
// @Accept json
56-
// @Param request body dto.ForBuckets true "request"
57-
// @Success 200 {array} string
58-
// @Security ApiKeyAuth
59-
// @Security Timestamp
60-
// @Router /core/backups/buckets [post]
61-
func (b *BaseApi) ListBuckets(c *gin.Context) {
62-
var req dto.ForBuckets
63-
if err := helper.CheckBindAndValidate(&req, c); err != nil {
64-
return
65-
}
66-
67-
buckets, err := backupService.GetBuckets(req)
68-
if err != nil {
69-
helper.InternalServer(c, err)
70-
return
71-
}
72-
helper.SuccessWithData(c, buckets)
73-
}
74-
7553
// @Tags Backup Account
7654
// @Summary Load backup account base info
7755
// @Accept json

0 commit comments

Comments
 (0)