mirror of
https://github.com/1Panel-dev/1Panel.git
synced 2025-01-31 14:08:06 +08:00
feat: 备份账号删除时,查询使用情况 (#670)
This commit is contained in:
parent
76b3cf4d2b
commit
5e887bd00c
@ -104,9 +104,9 @@ func (b *BaseApi) ListBuckets(c *gin.Context) {
|
|||||||
// @Success 200
|
// @Success 200
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Router /settings/backup/del [post]
|
// @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) {
|
func (b *BaseApi) DeleteBackup(c *gin.Context) {
|
||||||
var req dto.BatchDeleteReq
|
var req dto.OperateByID
|
||||||
if err := c.ShouldBindJSON(&req); err != nil {
|
if err := c.ShouldBindJSON(&req); err != nil {
|
||||||
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
|
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
|
||||||
return
|
return
|
||||||
@ -116,7 +116,7 @@ func (b *BaseApi) DeleteBackup(c *gin.Context) {
|
|||||||
return
|
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)
|
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -20,6 +20,7 @@ type ICronjobRepo interface {
|
|||||||
Page(limit, offset int, opts ...DBOption) (int64, []model.Cronjob, error)
|
Page(limit, offset int, opts ...DBOption) (int64, []model.Cronjob, error)
|
||||||
Create(cronjob *model.Cronjob) error
|
Create(cronjob *model.Cronjob) error
|
||||||
WithByJobID(id int) DBOption
|
WithByJobID(id int) DBOption
|
||||||
|
WithByBackupID(id uint) DBOption
|
||||||
WithByRecordDropID(id int) DBOption
|
WithByRecordDropID(id int) DBOption
|
||||||
Save(id uint, cronjob model.Cronjob) error
|
Save(id uint, cronjob model.Cronjob) error
|
||||||
Update(id uint, vars map[string]interface{}) 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 {
|
func (c *CronjobRepo) WithByRecordDropID(id int) DBOption {
|
||||||
return func(g *gorm.DB) *gorm.DB {
|
return func(g *gorm.DB) *gorm.DB {
|
||||||
return g.Where("id < ?", id)
|
return g.Where("id < ?", id)
|
||||||
|
@ -9,6 +9,7 @@ import (
|
|||||||
|
|
||||||
"github.com/1Panel-dev/1Panel/backend/app/dto"
|
"github.com/1Panel-dev/1Panel/backend/app/dto"
|
||||||
"github.com/1Panel-dev/1Panel/backend/app/model"
|
"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/constant"
|
||||||
"github.com/1Panel-dev/1Panel/backend/global"
|
"github.com/1Panel-dev/1Panel/backend/global"
|
||||||
"github.com/1Panel-dev/1Panel/backend/utils/cloud_storage"
|
"github.com/1Panel-dev/1Panel/backend/utils/cloud_storage"
|
||||||
@ -26,7 +27,7 @@ type IBackupService interface {
|
|||||||
Create(backupDto dto.BackupOperate) error
|
Create(backupDto dto.BackupOperate) error
|
||||||
GetBuckets(backupDto dto.ForBuckets) ([]interface{}, error)
|
GetBuckets(backupDto dto.ForBuckets) ([]interface{}, error)
|
||||||
Update(ireq dto.BackupOperate) error
|
Update(ireq dto.BackupOperate) error
|
||||||
BatchDelete(ids []uint) error
|
Delete(id uint) error
|
||||||
BatchDeleteRecord(ids []uint) error
|
BatchDeleteRecord(ids []uint) error
|
||||||
NewClient(backup *model.BackupAccount) (cloud_storage.CloudStorageClient, 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()
|
return client.ListBuckets()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (u *BackupService) BatchDelete(ids []uint) error {
|
func (u *BackupService) Delete(id uint) error {
|
||||||
return backupRepo.Delete(commonRepo.WithIdsIn(ids))
|
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 {
|
func (u *BackupService) BatchDeleteRecord(ids []uint) error {
|
||||||
|
@ -114,3 +114,7 @@ var (
|
|||||||
ErrImageExist = "ErrImageExist"
|
ErrImageExist = "ErrImageExist"
|
||||||
ErrDelWithWebsite = "ErrDelWithWebsite"
|
ErrDelWithWebsite = "ErrDelWithWebsite"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
ErrBackupInUsed = "ErrBackupInUsed"
|
||||||
|
)
|
||||||
|
@ -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!"
|
ErrFileNotExist: "{{ .detail }} file does not exist! Please check source file integrity!"
|
||||||
ErrImageBuildErr: "Image build failed"
|
ErrImageBuildErr: "Image build failed"
|
||||||
ErrImageExist: "Image is already exist!"
|
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."
|
@ -67,4 +67,7 @@ ErrDirNotFound: "build 文件夹不存在!请检查文件完整性!"
|
|||||||
ErrFileNotExist: "{{ .detail }} 文件不存在!请检查源文件完整性!"
|
ErrFileNotExist: "{{ .detail }} 文件不存在!请检查源文件完整性!"
|
||||||
ErrImageBuildErr: "镜像 build 失败"
|
ErrImageBuildErr: "镜像 build 失败"
|
||||||
ErrImageExist: "镜像已存在!"
|
ErrImageExist: "镜像已存在!"
|
||||||
ErrDelWithWebsite: "运行环境已经关联网站,无法删除"
|
ErrDelWithWebsite: "运行环境已经关联网站,无法删除"
|
||||||
|
|
||||||
|
#setting
|
||||||
|
ErrBackupInUsed: "该备份账号已在计划任务中使用,无法删除"
|
||||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -98,7 +98,7 @@ export const editBackup = (params: Backup.BackupOperate) => {
|
|||||||
}
|
}
|
||||||
return http.post(`/settings/backup/update`, reqest);
|
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);
|
return http.post(`/settings/backup/del`, params);
|
||||||
};
|
};
|
||||||
export const listBucket = (params: Backup.ForBucket) => {
|
export const listBucket = (params: Backup.ForBucket) => {
|
||||||
|
@ -50,7 +50,7 @@
|
|||||||
>
|
>
|
||||||
{{ $t('commons.button.edit') }}
|
{{ $t('commons.button.edit') }}
|
||||||
</el-button>
|
</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') }}
|
{{ $t('commons.button.delete') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
</div>
|
</div>
|
||||||
@ -88,7 +88,7 @@
|
|||||||
>
|
>
|
||||||
{{ $t('commons.button.edit') }}
|
{{ $t('commons.button.edit') }}
|
||||||
</el-button>
|
</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') }}
|
{{ $t('commons.button.delete') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
</div>
|
</div>
|
||||||
@ -126,7 +126,7 @@
|
|||||||
>
|
>
|
||||||
{{ $t('commons.button.edit') }}
|
{{ $t('commons.button.edit') }}
|
||||||
</el-button>
|
</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') }}
|
{{ $t('commons.button.delete') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
</div>
|
</div>
|
||||||
@ -161,7 +161,7 @@
|
|||||||
>
|
>
|
||||||
{{ $t('commons.button.edit') }}
|
{{ $t('commons.button.edit') }}
|
||||||
</el-button>
|
</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') }}
|
{{ $t('commons.button.delete') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
</div>
|
</div>
|
||||||
@ -199,7 +199,7 @@
|
|||||||
>
|
>
|
||||||
{{ $t('commons.button.edit') }}
|
{{ $t('commons.button.edit') }}
|
||||||
</el-button>
|
</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') }}
|
{{ $t('commons.button.delete') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
</div>
|
</div>
|
||||||
@ -235,7 +235,7 @@
|
|||||||
>
|
>
|
||||||
{{ $t('commons.button.edit') }}
|
{{ $t('commons.button.edit') }}
|
||||||
</el-button>
|
</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') }}
|
{{ $t('commons.button.delete') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
</div>
|
</div>
|
||||||
@ -401,10 +401,8 @@ const search = async () => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const onBatchDelete = async (row: Backup.BackupInfo | null) => {
|
const onDelete = async (row: Backup.BackupInfo) => {
|
||||||
let ids: Array<number> = [];
|
await useDeleteData(deleteBackup, { id: row.id }, 'commons.msg.delete');
|
||||||
ids.push(row.id);
|
|
||||||
await useDeleteData(deleteBackup, { ids: ids }, 'commons.msg.delete');
|
|
||||||
search();
|
search();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user