Browse Source

feat: 备份账号删除时,查询使用情况 (#670)

pull/676/head
ssongliu 2 years ago committed by GitHub
parent
commit
5e887bd00c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 6
      backend/app/api/v1/backup.go
  2. 7
      backend/app/repo/cronjob.go
  3. 11
      backend/app/service/backup.go
  4. 4
      backend/constant/errs.go
  5. 5
      backend/i18n/lang/en.yaml
  6. 5
      backend/i18n/lang/zh.yaml
  7. 372
      cmd/server/docs/docs.go
  8. 301
      cmd/server/docs/swagger.json
  9. 298
      cmd/server/docs/swagger.yaml
  10. 2
      frontend/src/api/modules/setting.ts
  11. 18
      frontend/src/views/setting/backup-account/index.vue

6
backend/app/api/v1/backup.go

@ -104,9 +104,9 @@ func (b *BaseApi) ListBuckets(c *gin.Context) {
// @Success 200
// @Security ApiKeyAuth
// @Router /settings/backup/del [post]
// @x-panel-log {"bodyKeys":["ids"],"paramKeys":[],"BeforeFuntions":[{"input_colume":"id","input_value":"ids","isList":true,"db":"backup_accounts","output_colume":"type","output_value":"types"}],"formatZH":"删除备份账号 [types]","formatEN":"delete backup account [types]"}
// @x-panel-log {"bodyKeys":["id"],"paramKeys":[],"BeforeFuntions":[{"input_colume":"id","input_value":"id","isList":true,"db":"backup_accounts","output_colume":"type","output_value":"types"}],"formatZH":"删除备份账号 [types]","formatEN":"delete backup account [types]"}
func (b *BaseApi) DeleteBackup(c *gin.Context) {
var req dto.BatchDeleteReq
var req dto.OperateByID
if err := c.ShouldBindJSON(&req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
return
@ -116,7 +116,7 @@ func (b *BaseApi) DeleteBackup(c *gin.Context) {
return
}
if err := backupService.BatchDelete(req.Ids); err != nil {
if err := backupService.Delete(req.ID); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
return
}

7
backend/app/repo/cronjob.go

@ -20,6 +20,7 @@ type ICronjobRepo interface {
Page(limit, offset int, opts ...DBOption) (int64, []model.Cronjob, error)
Create(cronjob *model.Cronjob) error
WithByJobID(id int) DBOption
WithByBackupID(id uint) DBOption
WithByRecordDropID(id int) DBOption
Save(id uint, cronjob model.Cronjob) error
Update(id uint, vars map[string]interface{}) error
@ -114,6 +115,12 @@ func (c *CronjobRepo) WithByJobID(id int) DBOption {
}
}
func (c *CronjobRepo) WithByBackupID(id uint) DBOption {
return func(g *gorm.DB) *gorm.DB {
return g.Where("target_dir_id = ?", id)
}
}
func (c *CronjobRepo) WithByRecordDropID(id int) DBOption {
return func(g *gorm.DB) *gorm.DB {
return g.Where("id < ?", id)

11
backend/app/service/backup.go

@ -9,6 +9,7 @@ import (
"github.com/1Panel-dev/1Panel/backend/app/dto"
"github.com/1Panel-dev/1Panel/backend/app/model"
"github.com/1Panel-dev/1Panel/backend/buserr"
"github.com/1Panel-dev/1Panel/backend/constant"
"github.com/1Panel-dev/1Panel/backend/global"
"github.com/1Panel-dev/1Panel/backend/utils/cloud_storage"
@ -26,7 +27,7 @@ type IBackupService interface {
Create(backupDto dto.BackupOperate) error
GetBuckets(backupDto dto.ForBuckets) ([]interface{}, error)
Update(ireq dto.BackupOperate) error
BatchDelete(ids []uint) error
Delete(id uint) error
BatchDeleteRecord(ids []uint) error
NewClient(backup *model.BackupAccount) (cloud_storage.CloudStorageClient, error)
@ -159,8 +160,12 @@ func (u *BackupService) GetBuckets(backupDto dto.ForBuckets) ([]interface{}, err
return client.ListBuckets()
}
func (u *BackupService) BatchDelete(ids []uint) error {
return backupRepo.Delete(commonRepo.WithIdsIn(ids))
func (u *BackupService) Delete(id uint) error {
cronjobs, _ := cronjobRepo.List(cronjobRepo.WithByBackupID(id))
if len(cronjobs) != 0 {
return buserr.New(constant.ErrBackupInUsed)
}
return backupRepo.Delete(commonRepo.WithByID(id))
}
func (u *BackupService) BatchDeleteRecord(ids []uint) error {

4
backend/constant/errs.go

@ -114,3 +114,7 @@ var (
ErrImageExist = "ErrImageExist"
ErrDelWithWebsite = "ErrDelWithWebsite"
)
var (
ErrBackupInUsed = "ErrBackupInUsed"
)

5
backend/i18n/lang/en.yaml

@ -67,4 +67,7 @@ ErrDirNotFound: "The build folder does not exist! Please check file integrity!
ErrFileNotExist: "{{ .detail }} file does not exist! Please check source file integrity!"
ErrImageBuildErr: "Image build failed"
ErrImageExist: "Image is already exist!"
ErrDelWithWebsite: "The operating environment has been associated with a website and cannot be deleted"
ErrDelWithWebsite: "The operating environment has been associated with a website and cannot be deleted"
#setting
ErrBackupInUsed: "The backup account is already being used in a cronjob and cannot be deleted."

5
backend/i18n/lang/zh.yaml

@ -67,4 +67,7 @@ ErrDirNotFound: "build 文件夹不存在!请检查文件完整性!"
ErrFileNotExist: "{{ .detail }} 文件不存在!请检查源文件完整性!"
ErrImageBuildErr: "镜像 build 失败"
ErrImageExist: "镜像已存在!"
ErrDelWithWebsite: "运行环境已经关联网站,无法删除"
ErrDelWithWebsite: "运行环境已经关联网站,无法删除"
#setting
ErrBackupInUsed: "该备份账号已在计划任务中使用,无法删除"

372
cmd/server/docs/docs.go

File diff suppressed because it is too large Load Diff

301
cmd/server/docs/swagger.json

File diff suppressed because it is too large Load Diff

298
cmd/server/docs/swagger.yaml

File diff suppressed because it is too large Load Diff

2
frontend/src/api/modules/setting.ts

@ -98,7 +98,7 @@ export const editBackup = (params: Backup.BackupOperate) => {
}
return http.post(`/settings/backup/update`, reqest);
};
export const deleteBackup = (params: { ids: number[] }) => {
export const deleteBackup = (params: { id: number }) => {
return http.post(`/settings/backup/del`, params);
};
export const listBucket = (params: Backup.ForBucket) => {

18
frontend/src/views/setting/backup-account/index.vue

@ -50,7 +50,7 @@
>
{{ $t('commons.button.edit') }}
</el-button>
<el-button round :disabled="s3Data.id === 0" @click="onBatchDelete(s3Data)">
<el-button round :disabled="s3Data.id === 0" @click="onDelete(s3Data)">
{{ $t('commons.button.delete') }}
</el-button>
</div>
@ -88,7 +88,7 @@
>
{{ $t('commons.button.edit') }}
</el-button>
<el-button round :disabled="ossData.id === 0" @click="onBatchDelete(ossData)">
<el-button round :disabled="ossData.id === 0" @click="onDelete(ossData)">
{{ $t('commons.button.delete') }}
</el-button>
</div>
@ -126,7 +126,7 @@
>
{{ $t('commons.button.edit') }}
</el-button>
<el-button round :disabled="cosData.id === 0" @click="onBatchDelete(cosData)">
<el-button round :disabled="cosData.id === 0" @click="onDelete(cosData)">
{{ $t('commons.button.delete') }}
</el-button>
</div>
@ -161,7 +161,7 @@
>
{{ $t('commons.button.edit') }}
</el-button>
<el-button round :disabled="kodoData.id === 0" @click="onBatchDelete(kodoData)">
<el-button round :disabled="kodoData.id === 0" @click="onDelete(kodoData)">
{{ $t('commons.button.delete') }}
</el-button>
</div>
@ -199,7 +199,7 @@
>
{{ $t('commons.button.edit') }}
</el-button>
<el-button :disabled="minioData.id === 0" round @click="onBatchDelete(minioData)">
<el-button :disabled="minioData.id === 0" round @click="onDelete(minioData)">
{{ $t('commons.button.delete') }}
</el-button>
</div>
@ -235,7 +235,7 @@
>
{{ $t('commons.button.edit') }}
</el-button>
<el-button round :disabled="sftpData.id === 0" @click="onBatchDelete(sftpData)">
<el-button round :disabled="sftpData.id === 0" @click="onDelete(sftpData)">
{{ $t('commons.button.delete') }}
</el-button>
</div>
@ -401,10 +401,8 @@ const search = async () => {
}
};
const onBatchDelete = async (row: Backup.BackupInfo | null) => {
let ids: Array<number> = [];
ids.push(row.id);
await useDeleteData(deleteBackup, { ids: ids }, 'commons.msg.delete');
const onDelete = async (row: Backup.BackupInfo) => {
await useDeleteData(deleteBackup, { id: row.id }, 'commons.msg.delete');
search();
};

Loading…
Cancel
Save