From 0934534ac5206d334a19d297e73131955a4832fc Mon Sep 17 00:00:00 2001 From: ssongliu <73214554+ssongliu@users.noreply.github.com> Date: Wed, 9 Apr 2025 10:15:54 +0800 Subject: [PATCH] feat: Support user-defined description for backup (#8354) Refs #4735 --- agent/app/api/v2/backup.go | 21 ++++++ agent/app/dto/backup.go | 3 + agent/app/model/backup.go | 2 + agent/app/repo/backup.go | 5 ++ agent/app/service/backup_app.go | 1 + agent/app/service/backup_mysql.go | 1 + agent/app/service/backup_postgresql.go | 1 + agent/app/service/backup_record.go | 5 ++ agent/app/service/backup_redis.go | 1 + agent/app/service/backup_website.go | 1 + agent/app/service/device_clean.go | 28 ------- agent/init/migration/migrations/init.go | 2 +- agent/router/backup.go | 1 + frontend/src/api/modules/backup.ts | 3 + frontend/src/components/backup/index.vue | 75 +++++++++++-------- .../src/components/complex-table/index.vue | 1 + 16 files changed, 89 insertions(+), 62 deletions(-) diff --git a/agent/app/api/v2/backup.go b/agent/app/api/v2/backup.go index f15e9f7f7..0b41177fa 100644 --- a/agent/app/api/v2/backup.go +++ b/agent/app/api/v2/backup.go @@ -303,6 +303,27 @@ func (b *BaseApi) DownloadRecord(c *gin.Context) { helper.SuccessWithData(c, filePath) } +// @Tags Backup Account +// @Summary Update backup record description +// @Accept json +// @Param request body dto.UpdateDescription true "request" +// @Success 200 +// @Security ApiKeyAuth +// @Security Timestamp +// @Router /backup/record/description/update [post] +func (b *BaseApi) UpdateRecordDescription(c *gin.Context) { + var req dto.UpdateDescription + if err := helper.CheckBindAndValidate(&req, c); err != nil { + return + } + + if err := backupRecordService.UpdateDescription(req); err != nil { + helper.InternalServer(c, err) + return + } + helper.SuccessWithOutData(c) +} + // @Tags Backup Account // @Summary Delete backup record // @Accept json diff --git a/agent/app/dto/backup.go b/agent/app/dto/backup.go index be95bbe44..e8405188b 100644 --- a/agent/app/dto/backup.go +++ b/agent/app/dto/backup.go @@ -60,6 +60,8 @@ type CommonBackup struct { Secret string `json:"secret"` TaskID string `json:"taskID"` FileName string `json:"fileName"` + + Description string `json:"description"` } type CommonRecover struct { DownloadAccountID uint `json:"downloadAccountID" validate:"required"` @@ -92,6 +94,7 @@ type BackupRecords struct { DownloadAccountID uint `json:"downloadAccountID"` FileDir string `json:"fileDir"` FileName string `json:"fileName"` + Description string `json:"description"` } type DownloadRecord struct { diff --git a/agent/app/model/backup.go b/agent/app/model/backup.go index 5b41ced9b..ad69b46c3 100644 --- a/agent/app/model/backup.go +++ b/agent/app/model/backup.go @@ -26,4 +26,6 @@ type BackupRecord struct { DetailName string `json:"detailName"` FileDir string `json:"fileDir"` FileName string `json:"fileName"` + + Description string `json:"description"` } diff --git a/agent/app/repo/backup.go b/agent/app/repo/backup.go index cd8538ea3..80213446a 100644 --- a/agent/app/repo/backup.go +++ b/agent/app/repo/backup.go @@ -24,6 +24,7 @@ type IBackupRepo interface { CreateRecord(record *model.BackupRecord) error DeleteRecord(ctx context.Context, opts ...DBOption) error UpdateRecord(record *model.BackupRecord) error + UpdateRecordByMap(id uint, upMap map[string]interface{}) error WithByDetailName(detailName string) DBOption WithByFileName(fileName string) DBOption WithByCronID(cronjobID uint) DBOption @@ -144,6 +145,10 @@ func (u *BackupRepo) UpdateRecord(record *model.BackupRecord) error { return global.DB.Save(record).Error } +func (u *BackupRepo) UpdateRecordByMap(id uint, upMap map[string]interface{}) error { + return global.DB.Model(&model.BackupRecord{}).Where("id = ?", id).Updates(upMap).Error +} + func (u *BackupRepo) DeleteRecord(ctx context.Context, opts ...DBOption) error { return getTx(ctx, opts...).Delete(&model.BackupRecord{}).Error } diff --git a/agent/app/service/backup_app.go b/agent/app/service/backup_app.go index 4b8ee9972..8d5e3d15f 100644 --- a/agent/app/service/backup_app.go +++ b/agent/app/service/backup_app.go @@ -58,6 +58,7 @@ func (u *BackupService) AppBackup(req dto.CommonBackup) (*model.BackupRecord, er DownloadAccountID: 1, FileDir: itemDir, FileName: fileName, + Description: req.Description, } if err := backupRepo.CreateRecord(record); err != nil { global.LOG.Errorf("save backup record failed, err: %v", err) diff --git a/agent/app/service/backup_mysql.go b/agent/app/service/backup_mysql.go index 1dc0f65f1..b17526253 100644 --- a/agent/app/service/backup_mysql.go +++ b/agent/app/service/backup_mysql.go @@ -43,6 +43,7 @@ func (u *BackupService) MysqlBackup(req dto.CommonBackup) error { DownloadAccountID: 1, FileDir: itemDir, FileName: fileName, + Description: req.Description, } if err := backupRepo.CreateRecord(record); err != nil { global.LOG.Errorf("save backup record failed, err: %v", err) diff --git a/agent/app/service/backup_postgresql.go b/agent/app/service/backup_postgresql.go index 1138aa3db..a18734b1b 100644 --- a/agent/app/service/backup_postgresql.go +++ b/agent/app/service/backup_postgresql.go @@ -44,6 +44,7 @@ func (u *BackupService) PostgresqlBackup(req dto.CommonBackup) error { DownloadAccountID: 1, FileDir: itemDir, FileName: fileName, + Description: req.Description, } if err := backupRepo.CreateRecord(record); err != nil { global.LOG.Errorf("save backup record failed, err: %v", err) diff --git a/agent/app/service/backup_record.go b/agent/app/service/backup_record.go index 12526bba7..20f46195f 100644 --- a/agent/app/service/backup_record.go +++ b/agent/app/service/backup_record.go @@ -26,6 +26,7 @@ type IBackupRecordService interface { ListFiles(req dto.OperateByID) []string LoadRecordSize(req dto.SearchForSize) ([]dto.RecordFileSize, error) + UpdateDescription(req dto.UpdateDescription) error } func NewIBackupRecordService() IBackupRecordService { @@ -261,3 +262,7 @@ func (u *BackupRecordService) LoadRecordSize(req dto.SearchForSize) ([]dto.Recor wg.Wait() return datas, nil } + +func (u *BackupRecordService) UpdateDescription(req dto.UpdateDescription) error { + return backupRepo.UpdateRecordByMap(req.ID, map[string]interface{}{"description": req.Description}) +} diff --git a/agent/app/service/backup_redis.go b/agent/app/service/backup_redis.go index d6d25aa59..e05575c84 100644 --- a/agent/app/service/backup_redis.go +++ b/agent/app/service/backup_redis.go @@ -54,6 +54,7 @@ func (u *BackupService) RedisBackup(req dto.CommonBackup) error { DownloadAccountID: 1, FileDir: itemDir, FileName: fileName, + Description: req.Description, } if err := backupRepo.CreateRecord(record); err != nil { global.LOG.Errorf("save backup record failed, err: %v", err) diff --git a/agent/app/service/backup_website.go b/agent/app/service/backup_website.go index 11517363a..30ccfd7a9 100644 --- a/agent/app/service/backup_website.go +++ b/agent/app/service/backup_website.go @@ -51,6 +51,7 @@ func (u *BackupService) WebsiteBackup(req dto.CommonBackup) error { DownloadAccountID: 1, FileDir: itemDir, FileName: fileName, + Description: req.Description, } if err = backupRepo.CreateRecord(record); err != nil { global.LOG.Errorf("save backup record failed, err: %v", err) diff --git a/agent/app/service/device_clean.go b/agent/app/service/device_clean.go index 11fc30354..31559552c 100644 --- a/agent/app/service/device_clean.go +++ b/agent/app/service/device_clean.go @@ -741,31 +741,3 @@ func scanFile(pathItem string, size *int64, count *int) { } } } - -func loadRestorePath(upgradeDir string) (string, error) { - if _, err := os.Stat(upgradeDir); err != nil && os.IsNotExist(err) { - return "no such file", nil - } - files, err := os.ReadDir(upgradeDir) - if err != nil { - return "", err - } - type itemState struct { - Name string - CreateAt time.Time - } - var folders []itemState - for _, file := range files { - if file.IsDir() { - info, _ := file.Info() - folders = append(folders, itemState{Name: file.Name(), CreateAt: info.ModTime()}) - } - } - if len(folders) == 0 { - return "no such file", nil - } - sort.Slice(folders, func(i, j int) bool { - return folders[i].CreateAt.After(folders[j].CreateAt) - }) - return folders[0].Name, nil -} diff --git a/agent/init/migration/migrations/init.go b/agent/init/migration/migrations/init.go index 3d11431a5..9ace5d0b9 100644 --- a/agent/init/migration/migrations/init.go +++ b/agent/init/migration/migrations/init.go @@ -19,7 +19,7 @@ import ( ) var AddTable = &gormigrate.Migration{ - ID: "20250108-add-table", + ID: "20250408-add-table", Migrate: func(tx *gorm.DB) error { return tx.AutoMigrate( &model.AppDetail{}, diff --git a/agent/router/backup.go b/agent/router/backup.go index 16478a98e..6b1f6d8ea 100644 --- a/agent/router/backup.go +++ b/agent/router/backup.go @@ -32,5 +32,6 @@ func (s *BackupRouter) InitRouter(Router *gin.RouterGroup) { backupRouter.POST("/record/search/bycronjob", baseApi.SearchBackupRecordsByCronjob) backupRouter.POST("/record/download", baseApi.DownloadRecord) backupRouter.POST("/record/del", baseApi.DeleteBackupRecord) + backupRouter.POST("/record/description/update", baseApi.UpdateRecordDescription) } } diff --git a/frontend/src/api/modules/backup.ts b/frontend/src/api/modules/backup.ts index 54778eccb..b838fd62e 100644 --- a/frontend/src/api/modules/backup.ts +++ b/frontend/src/api/modules/backup.ts @@ -32,6 +32,9 @@ export const downloadBackupRecord = (params: Backup.RecordDownload) => { export const deleteBackupRecord = (params: { ids: number[] }) => { return http.post(`/backups/record/del`, params); }; +export const updateRecordDescription = (id: Number, description: String) => { + return http.post(`/backups/record/description/update`, { id: id, description: description }); +}; export const searchBackupRecords = (params: Backup.SearchBackupRecord) => { return http.post>(`/backups/record/search`, params, TimeoutEnum.T_5M); }; diff --git a/frontend/src/components/backup/index.vue b/frontend/src/components/backup/index.vue index f7ec0347f..045aaa241 100644 --- a/frontend/src/components/backup/index.vue +++ b/frontend/src/components/backup/index.vue @@ -4,27 +4,27 @@ :header="$t('commons.button.backup')" :resource="detailName ? name + ' [' + detailName + ']' : name" @close="handleClose" - size="large" + size="60%" > @@ -78,14 +89,16 @@ size="small" @close="handleBackupClose" > - - + + {{ $t('commons.msg.' + (isBackup ? 'backupHelper' : 'recoverHelper'), [name + '( ' + detailName + ' )']) }} + + + + + +