@@ -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+
126164func (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
550563func loadBackupNamesByID (accountIDs string , downloadID uint ) ([]string , string , error ) {
0 commit comments