pcm-coordinator/internal/logic/core/deleteresourcespeclogic.go

77 lines
2.0 KiB
Go

package core
import (
"context"
"github.com/pkg/errors"
"gitlink.org.cn/JointCloud/pcm-coordinator/pkg/models"
"gorm.io/gorm"
"time"
"gitlink.org.cn/JointCloud/pcm-coordinator/internal/svc"
"gitlink.org.cn/JointCloud/pcm-coordinator/internal/types"
"github.com/zeromicro/go-zero/core/logx"
)
type DeleteResourceSpecLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewDeleteResourceSpecLogic(ctx context.Context, svcCtx *svc.ServiceContext) *DeleteResourceSpecLogic {
return &DeleteResourceSpecLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *DeleteResourceSpecLogic) DeleteResourceSpec(req *types.DeletePathId) (resp *types.CommonResp, err error) {
// 初始化事务
tx := l.svcCtx.DbEngin.Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
panic(r)
}
}()
// 1. 检查主资源规格是否存在
var mainSpec models.TResourceSpec
if err := tx.Where("id = ? AND deleted_at IS NULL", req.Id).
First(&mainSpec).
Error; err != nil {
tx.Rollback()
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, errors.Errorf("资源规格不存在 (ID: %s)", req.Id)
}
return nil, errors.Wrapf(err, "查询资源规格失败 (ID: %s)", req.Id)
}
// 2. 删除主资源规格(软删除)
if err := tx.Model(&models.TResourceSpec{}).
Where("id = ?", req.Id).
Update("deleted_at", time.Now()).
Error; err != nil {
tx.Rollback()
return nil, errors.Wrapf(err, "删除主资源规格失败 (ID: %s)", req.Id)
}
// 3. 删除关联的基础资源规格(软删除)
if err := tx.Model(&models.TBaseResourceSpec{}).
Where("resource_spec_id = ?", req.Id).
Update("deleted_at", time.Now()).
Error; err != nil {
tx.Rollback()
return nil, errors.Wrapf(err, "删除基础资源规格失败 (ID: %s)", req.Id)
}
// 提交事务
if err := tx.Commit().Error; err != nil {
return nil, errors.Wrap(err, "提交事务失败")
}
return resp, nil
}