@@ -5,18 +5,14 @@ import (
55 "fmt"
66 "os"
77 "path"
8- "sort"
9- "strings"
108 "sync"
119
1210 "github.com/1Panel-dev/1Panel/agent/app/dto"
1311 "github.com/1Panel-dev/1Panel/agent/app/model"
1412 "github.com/1Panel-dev/1Panel/agent/app/repo"
1513 "github.com/1Panel-dev/1Panel/agent/constant"
1614 "github.com/1Panel-dev/1Panel/agent/global"
17- "github.com/1Panel-dev/1Panel/agent/utils/cloud_storage"
1815 "github.com/jinzhu/copier"
19- "github.com/pkg/errors"
2016)
2117
2218type BackupRecordService struct {}
@@ -30,6 +26,7 @@ type IBackupRecordService interface {
3026 ListAppRecords (name , detailName , fileName string ) ([]model.BackupRecord , error )
3127
3228 ListFiles (req dto.OperateByID ) []string
29+ LoadRecordSize (req dto.SearchForSize ) ([]dto.RecordFileSize , error )
3330}
3431
3532func NewIBackupRecordService () IBackupRecordService {
@@ -47,15 +44,15 @@ func (u *BackupRecordService) SearchRecordsWithPage(search dto.RecordSearch) (in
4744 if err != nil {
4845 return 0 , nil , err
4946 }
50-
51- if total == 0 {
52- return 0 , nil , nil
47+ var data []dto.BackupRecords
48+ for _ , account := range records {
49+ var item dto.BackupRecords
50+ if err := copier .Copy (& item , & account ); err != nil {
51+ global .LOG .Errorf ("copy backup account to dto backup info failed, err: %v" , err )
52+ }
53+ data = append (data , item )
5354 }
54- datas , err := u .loadRecordSize (records )
55- sort .Slice (datas , func (i , j int ) bool {
56- return datas [i ].CreatedAt .After (datas [j ].CreatedAt )
57- })
58- return total , datas , err
55+ return total , data , err
5956}
6057
6158func (u * BackupRecordService ) SearchRecordsByCronjobWithPage (search dto.RecordSearchByCronjob ) (int64 , []dto.BackupRecords , error ) {
@@ -67,15 +64,15 @@ func (u *BackupRecordService) SearchRecordsByCronjobWithPage(search dto.RecordSe
6764 if err != nil {
6865 return 0 , nil , err
6966 }
70-
71- if total == 0 {
72- return 0 , nil , nil
67+ var data []dto.BackupRecords
68+ for _ , account := range records {
69+ var item dto.BackupRecords
70+ if err := copier .Copy (& item , & account ); err != nil {
71+ global .LOG .Errorf ("copy backup account to dto backup info failed, err: %v" , err )
72+ }
73+ data = append (data , item )
7374 }
74- datas , err := u .loadRecordSize (records )
75- sort .Slice (datas , func (i , j int ) bool {
76- return datas [i ].CreatedAt .After (datas [j ].CreatedAt )
77- })
78- return total , datas , err
75+ return total , data , err
7976}
8077
8178func (u * BackupRecordService ) DownloadRecord (info dto.DownloadRecord ) (string , error ) {
@@ -94,7 +91,7 @@ func (u *BackupRecordService) DownloadRecord(info dto.DownloadRecord) (string, e
9491 }
9592 srcPath := fmt .Sprintf ("%s/%s" , info .FileDir , info .FileName )
9693 if len (account .BackupPath ) != 0 {
97- srcPath = path .Join (strings . TrimPrefix ( account .BackupPath , "/" ) , srcPath )
94+ srcPath = path .Join (account .BackupPath , srcPath )
9895 }
9996 if exist , _ := client .Exist (srcPath ); exist {
10097 isOK , err := client .Download (srcPath , targetPath )
@@ -181,36 +178,67 @@ func (u *BackupRecordService) ListFiles(req dto.OperateByID) []string {
181178 return datas
182179}
183180
184- func (u * BackupRecordService ) loadRecordSize (records []model.BackupRecord ) ([]dto.BackupRecords , error ) {
181+ type backupSizeHelper struct {
182+ ID uint `json:"id"`
183+ DownloadID uint `json:"downloadID"`
184+ FilePath string `json:"filePath"`
185+ Size uint `json:"size"`
186+ }
187+
188+ func (u * BackupRecordService ) LoadRecordSize (req dto.SearchForSize ) ([]dto.RecordFileSize , error ) {
189+ var list []backupSizeHelper
190+ switch req .Type {
191+ case "snapshot" :
192+ _ , records , err := snapshotRepo .Page (req .Page , req .PageSize , repo .WithByLikeName (req .Info ))
193+ if err != nil {
194+ return nil , err
195+ }
196+ for _ , item := range records {
197+ list = append (list , backupSizeHelper {ID : item .ID , DownloadID : item .DownloadAccountID , FilePath : fmt .Sprintf ("system_snapshot/%s.tar.gz" , item .Name )})
198+ }
199+ case "cronjob" :
200+ _ , records , err := backupRepo .PageRecord (req .Page , req .PageSize , backupRepo .WithByCronID (req .CronjobID ))
201+ if err != nil {
202+ return nil , err
203+ }
204+ for _ , item := range records {
205+ list = append (list , backupSizeHelper {ID : item .ID , DownloadID : item .DownloadAccountID , FilePath : path .Join (item .FileDir , item .FileName )})
206+ }
207+ default :
208+ _ , records , err := backupRepo .PageRecord (
209+ req .Page , req .PageSize ,
210+ repo .WithByName (req .Name ),
211+ repo .WithByType (req .Type ),
212+ repo .WithByDetailName (req .DetailName ),
213+ )
214+ if err != nil {
215+ return nil , err
216+ }
217+ for _ , item := range records {
218+ list = append (list , backupSizeHelper {ID : item .ID , DownloadID : item .DownloadAccountID , FilePath : path .Join (item .FileDir , item .FileName )})
219+ }
220+ }
185221 recordMap := make (map [uint ]struct {})
186222 var recordIds []string
187- for _ , record := range records {
188- if _ , ok := recordMap [record .DownloadAccountID ]; ! ok {
189- recordMap [record .DownloadAccountID ] = struct {}{}
190- recordIds = append (recordIds , fmt .Sprintf ("%v" , record .DownloadAccountID ))
223+ for _ , record := range list {
224+ if _ , ok := recordMap [record .DownloadID ]; ! ok {
225+ recordMap [record .DownloadID ] = struct {}{}
226+ recordIds = append (recordIds , fmt .Sprintf ("%v" , record .DownloadID ))
191227 }
192228 }
193229 clientMap , err := NewBackupClientMap (recordIds )
194230 if err != nil {
195231 return nil , err
196232 }
197233
198- var datas []dto.BackupRecords
234+ var datas []dto.RecordFileSize
199235 var wg sync.WaitGroup
200- for i := 0 ; i < len (records ); i ++ {
201- var item dto.BackupRecords
202- if err := copier .Copy (& item , & records [i ]); err != nil {
203- return nil , errors .WithMessage (constant .ErrStructTransform , err .Error ())
204- }
205-
206- itemPath := path .Join (records [i ].FileDir , records [i ].FileName )
207- if val , ok := clientMap [fmt .Sprintf ("%v" , records [i ].DownloadAccountID )]; ok {
208- item .AccountName = val .name
209- item .AccountType = val .accountType
210- item .DownloadAccountID = val .id
236+ for i := 0 ; i < len (list ); i ++ {
237+ item := dto.RecordFileSize {ID : list [i ].ID }
238+ if val , ok := clientMap [fmt .Sprintf ("%v" , list [i ].DownloadID )]; ok {
211239 wg .Add (1 )
212240 go func (index int ) {
213- item .Size , _ = val .client .Size (path .Join (strings . TrimLeft ( val .backupPath , "/" ), itemPath ))
241+ item .Size , _ = val .client .Size (path .Join (val .backupPath , list [ i ]. FilePath ))
214242 datas = append (datas , item )
215243 wg .Done ()
216244 }(i )
@@ -221,10 +249,3 @@ func (u *BackupRecordService) loadRecordSize(records []model.BackupRecord) ([]dt
221249 wg .Wait ()
222250 return datas , nil
223251}
224-
225- type loadSizeHelper struct {
226- isOk bool
227- backupName string
228- backupPath string
229- client cloud_storage.CloudStorageClient
230- }
0 commit comments