diff --git a/api/dms/service/v1/data_export_workflow.go b/api/dms/service/v1/data_export_workflow.go index 2c39a3ef..2ecfaf1a 100644 --- a/api/dms/service/v1/data_export_workflow.go +++ b/api/dms/service/v1/data_export_workflow.go @@ -28,6 +28,10 @@ type DataExportWorkflow struct { // Required: true // example: [export_task_uid1,export_task_uid2] Tasks []Task `json:"tasks" validate:"required"` + // workflow template id from SQLE; omit or 0 to use project default data_export template + // Required: false + // example: 1 + WorkflowTemplateId uint `json:"workflow_template_id"` } // swagger:model AddDataExportWorkflowReply @@ -76,6 +80,9 @@ type ListDataExportWorkflowsReq struct { // filter fuzzy key word for id/name // in:query FuzzyKeyword string `json:"fuzzy_keyword" query:"fuzzy_keyword"` + // filter by workflow template id + // in:query + FilterWorkflowTemplateId uint `json:"filter_workflow_template_id" query:"filter_workflow_template_id"` } // swagger:parameters FilterGlobalDataExportWorkflowReq @@ -171,15 +178,17 @@ type ListDataExportWorkflowsReply struct { } type ListDataExportWorkflow struct { - ProjectUid string `json:"project_uid"` - ProjectName string `json:"project_name"` // 项目名称 - WorkflowID string `json:"workflow_uid"` // 数据导出工单ID - WorkflowName string `json:"workflow_name"` // 数据导出工单的名称 - Description string `json:"desc"` // 数据导出工单的描述 - Creater UidWithName `json:"creater"` // 数据导出工单的创建人 - CreatedAt time.Time `json:"created_at"` // 数据导出工单的创建时间 - ExportedAt time.Time `json:"exported_at"` // 执行数据导出工单的时间 - Status DataExportWorkflowStatus `json:"status"` // 数据导出工单的状态 + ProjectUid string `json:"project_uid"` + ProjectName string `json:"project_name"` // 项目名称 + WorkflowID string `json:"workflow_uid"` // 数据导出工单ID + WorkflowName string `json:"workflow_name"` // 数据导出工单的名称 + Description string `json:"desc"` // 数据导出工单的描述 + Creater UidWithName `json:"creater"` // 数据导出工单的创建人 + CreatedAt time.Time `json:"created_at"` // 数据导出工单的创建时间 + ExportedAt time.Time `json:"exported_at"` // 执行数据导出工单的时间 + Status DataExportWorkflowStatus `json:"status"` // 数据导出工单的状态 + WorkflowTemplateId uint `json:"workflow_template_id"` // 创建时关联的审批模板 ID(历史工单可为 0) + WorkflowTemplateName string `json:"workflow_template_name"` // 创建时冗余保存的审批模板名称 CurrentStepAssigneeUsers []UidWithName `json:"current_step_assignee_user_list"` // 工单待操作人 DBServiceInfos []*dmsCommonV1.DBServiceUidWithNameInfo `json:"db_service_info,omitempty"` // 所属数据源信息 @@ -233,12 +242,35 @@ type GetDataExportWorkflow struct { Desc string `json:"desc,omitempty"` CreateUser UidWithName `json:"create_user"` CreateTime *time.Time `json:"create_time"` + WorkflowTemplateId uint `json:"workflow_template_id"` + WorkflowTemplateName string `json:"workflow_template_name"` WorkflowRecord WorkflowRecord `json:"workflow_record"` WorkflowRecordHistory []WorkflowRecord `json:"workflow_record_history"` // UnmaskingWorkflow 关联的查看原文工单摘要;无关联时为 null UnmaskingWorkflow *DataExportRelatedUnmaskingWorkflow `json:"unmasking_workflow"` } +// swagger:parameters CheckDataExportWorkflowTemplateUsed +type CheckDataExportWorkflowTemplateUsedReq struct { + // project id + // Required: true + // in:path + ProjectUid string `param:"project_uid" json:"project_uid" validate:"required"` + // workflow template id + // Required: true + // in:query + WorkflowTemplateId uint `query:"workflow_template_id" json:"workflow_template_id" validate:"required"` +} + +// swagger:model CheckDataExportWorkflowTemplateUsedReply +type CheckDataExportWorkflowTemplateUsedReply struct { + Data struct { + IsUsed bool `json:"is_used"` + Count int64 `json:"count"` + } `json:"data"` + base.GenericResp +} + // swagger:model DataExportRelatedUnmaskingWorkflow // DataExportRelatedUnmaskingWorkflow 数据导出工单关联的查看原文工单(仅摘要字段) type DataExportRelatedUnmaskingWorkflow struct { diff --git a/internal/apiserver/service/dms_controller.go b/internal/apiserver/service/dms_controller.go index e8c0bcd1..f91f4856 100644 --- a/internal/apiserver/service/dms_controller.go +++ b/internal/apiserver/service/dms_controller.go @@ -3907,6 +3907,27 @@ func (ctl *DMSController) ListAllDataExportWorkflows(c echo.Context) error { return NewOkRespWithReply(c, reply) } +// swagger:route GET /v1/dms/projects/{project_uid}/data_export_workflows/workflow_template_used DataExportWorkflows CheckDataExportWorkflowTemplateUsed +// +// Check whether a data-export workflow template id is referenced by local workflows. +// Soft-deleted SQLE templates do not block already-created workflow runtime; this is a best-effort hint. +// +// responses: +// 200: body:CheckDataExportWorkflowTemplateUsedReply +// default: body:GenericResp +func (ctl *DMSController) CheckDataExportWorkflowTemplateUsed(c echo.Context) error { + req := new(aV1.CheckDataExportWorkflowTemplateUsedReq) + err := bindAndValidateReq(c, req) + if nil != err { + return NewErrResp(c, err, apiError.BadRequestErr) + } + reply, err := ctl.DMS.CheckDataExportWorkflowTemplateUsed(c.Request().Context(), req) + if nil != err { + return NewErrResp(c, err, apiError.DMSServiceErr) + } + return NewOkRespWithReply(c, reply) +} + // swagger:route GET /v1/dms/projects/{project_uid}/data_export_workflows/{data_export_workflow_uid} DataExportWorkflows GetDataExportWorkflow // // Get data_export workflow. diff --git a/internal/apiserver/service/router.go b/internal/apiserver/service/router.go index 1d285d25..9b1617b5 100644 --- a/internal/apiserver/service/router.go +++ b/internal/apiserver/service/router.go @@ -221,6 +221,8 @@ func (s *APIServer) initRouter() error { dataExportWorkflowsV1 := v1.Group("/dms/projects/:project_uid/data_export_workflows") dataExportWorkflowsV1.POST("", s.DMSController.AddDataExportWorkflow) dataExportWorkflowsV1.GET("", s.DMSController.ListDataExportWorkflows) + // 只读引用检查:供 SQLE 在跨库成本过高时查询本地冗余引用;软删模板不影响已建工单流转 + dataExportWorkflowsV1.GET("/workflow_template_used", s.DMSController.CheckDataExportWorkflowTemplateUsed) dataExportWorkflowsV1.GET("/:data_export_workflow_uid", s.DMSController.GetDataExportWorkflow) dataExportWorkflowsV1.POST("/:data_export_workflow_uid/approve", s.DMSController.ApproveDataExportWorkflow) dataExportWorkflowsV1.POST("/:data_export_workflow_uid/reject", s.DMSController.RejectDataExportWorkflow) diff --git a/internal/dms/biz/data_export_workflow.go b/internal/dms/biz/data_export_workflow.go index 2b46b2b8..2b698eda 100644 --- a/internal/dms/biz/data_export_workflow.go +++ b/internal/dms/biz/data_export_workflow.go @@ -61,17 +61,19 @@ func (et DataExportWorkflowEventAction) String() string { type Workflow struct { Base - UID string - Name string - ProjectUID string - WorkflowType string - Desc string - CreateTime time.Time - CreateUserUID string - Status string - WorkflowRecordUid string - Tasks []Task - TaskIds []string + UID string + Name string + ProjectUID string + WorkflowType string + Desc string + CreateTime time.Time + CreateUserUID string + Status string + WorkflowRecordUid string + WorkflowTemplateId uint + WorkflowTemplateName string + Tasks []Task + TaskIds []string WorkflowRecord *WorkflowRecord DBServiceInfos []*dmsCommonV1.DBServiceUidWithNameInfo // 所属数据源信息 @@ -125,6 +127,8 @@ type WorkflowRepo interface { DeleteDataExportWorkflowsByIds(ctx context.Context, dataExportWorkflowUid []string) error GetGlobalWorkflowsByParameterMap(ctx context.Context, data map[string]interface{}) ([]*Workflow, int64, error) AuditWorkflowAndAdvanceStep(ctx context.Context, workflowRecordUid string, step *WorkflowStep, nextStepId uint64, operateId, reason string) error + // CountDataExportWorkflowsByTemplateId 供 SQLE 跨库引用检查:模板软删不影响已建工单流转,仅统计本地冗余引用。 + CountDataExportWorkflowsByTemplateId(ctx context.Context, projectUID string, templateID uint) (int64, error) } type DataExportWorkflowUsecase struct { diff --git a/internal/dms/biz/data_export_workflow_ce.go b/internal/dms/biz/data_export_workflow_ce.go index f3116ab1..880b08b5 100644 --- a/internal/dms/biz/data_export_workflow_ce.go +++ b/internal/dms/biz/data_export_workflow_ce.go @@ -69,3 +69,7 @@ func (d *DataExportWorkflowUsecase) RecycleDataExportTaskFiles() {} func (d *DataExportWorkflowUsecase) GetGlobalWorkflowsList(ctx context.Context, req *dmsV1.FilterGlobalDataExportWorkflowReq, limit, offset int) ([]*Workflow, int64, error) { return nil, 0, errNotDataExportWorkflow } + +func (d *DataExportWorkflowUsecase) CheckDataExportWorkflowTemplateUsed(ctx context.Context, projectUID string, templateID uint) (bool, int64, error) { + return false, 0, errNotDataExportWorkflow +} diff --git a/internal/dms/biz/repo_fields.go b/internal/dms/biz/repo_fields.go index 861d048e..e4f4f5e6 100644 --- a/internal/dms/biz/repo_fields.go +++ b/internal/dms/biz/repo_fields.go @@ -364,15 +364,17 @@ const ( ) const ( - WorkflowFieldUID WorkflowField = "uid" - WorkflowFieldName WorkflowField = "name" - WorkflowFieldProjectUID WorkflowField = "project_uid" - WorkflowFieldWorkflowType WorkflowField = "workflow_type" - WorkflowFieldDesc WorkflowField = "desc" - WorkflowFieldCreateTime WorkflowField = "create_time" - WorkflowFieldCreateUserUID WorkflowField = "create_user_uid" - WorkflowFieldWorkflowRecordUid WorkflowField = "workflow_record_uid" - WorkflowFieldWorkflowRecord WorkflowField = "workflowrecord" + WorkflowFieldUID WorkflowField = "uid" + WorkflowFieldName WorkflowField = "name" + WorkflowFieldProjectUID WorkflowField = "project_uid" + WorkflowFieldWorkflowType WorkflowField = "workflow_type" + WorkflowFieldDesc WorkflowField = "desc" + WorkflowFieldCreateTime WorkflowField = "create_time" + WorkflowFieldCreateUserUID WorkflowField = "create_user_uid" + WorkflowFieldWorkflowRecordUid WorkflowField = "workflow_record_uid" + WorkflowFieldWorkflowTemplateId WorkflowField = "workflow_template_id" + WorkflowFieldWorkflowTemplateName WorkflowField = "workflow_template_name" + WorkflowFieldWorkflowRecord WorkflowField = "workflowrecord" ) const ( diff --git a/internal/dms/service/data_export_workflow.go b/internal/dms/service/data_export_workflow.go index c63e0b44..679afcc4 100644 --- a/internal/dms/service/data_export_workflow.go +++ b/internal/dms/service/data_export_workflow.go @@ -18,10 +18,11 @@ func (d *DMSService) AddDataExportWorkflow(ctx context.Context, req *dmsV1.AddDa tasks = append(tasks, biz.Task{UID: t.Uid}) } args := &biz.Workflow{ - Name: req.DataExportWorkflow.Name, - Desc: req.DataExportWorkflow.Desc, - Tasks: tasks, - ProjectUID: req.ProjectUid, + Name: req.DataExportWorkflow.Name, + Desc: req.DataExportWorkflow.Desc, + Tasks: tasks, + ProjectUID: req.ProjectUid, + WorkflowTemplateId: req.DataExportWorkflow.WorkflowTemplateId, } uid, err := d.DataExportWorkflowUsecase.AddDataExportWorkflow(ctx, currentUserUid, args) if err != nil { @@ -79,6 +80,14 @@ func (d *DMSService) ListDataExportWorkflow(ctx context.Context, req *dmsV1.List }) } + if req.FilterWorkflowTemplateId != 0 { + andConditions = append(andConditions, pkgConst.FilterCondition{ + Field: string(biz.WorkflowFieldWorkflowTemplateId), + Operator: pkgConst.FilterOperatorEqual, + Value: req.FilterWorkflowTemplateId, + }) + } + if len(andConditions) > 0 { filterByOptions.Groups = append(filterByOptions.Groups, pkgConst.NewConditionGroup(pkgConst.FilterLogicAnd, andConditions...)) } @@ -134,13 +143,15 @@ func (d *DMSService) ListDataExportWorkflow(ctx context.Context, req *dmsV1.List ret := make([]*dmsV1.ListDataExportWorkflow, len(workflows)) for i, w := range workflows { ret[i] = &dmsV1.ListDataExportWorkflow{ - ProjectUid: w.ProjectUID, - ProjectName: projectMap[w.ProjectUID], - WorkflowID: w.UID, - WorkflowName: w.Name, - Description: w.Desc, - CreatedAt: w.CreatedAt, - Status: dmsV1.DataExportWorkflowStatus(w.WorkflowRecord.Status), + ProjectUid: w.ProjectUID, + ProjectName: projectMap[w.ProjectUID], + WorkflowID: w.UID, + WorkflowName: w.Name, + Description: w.Desc, + CreatedAt: w.CreatedAt, + Status: dmsV1.DataExportWorkflowStatus(w.WorkflowRecord.Status), + WorkflowTemplateId: w.WorkflowTemplateId, + WorkflowTemplateName: w.WorkflowTemplateName, } creater := convertBizUidWithName(d.UserUsecase.GetBizUserWithNameByUids(ctx, []string{w.CreateUserUID})) if len(creater) > 0 { @@ -205,11 +216,13 @@ func (d *DMSService) GetDataExportWorkflow(ctx context.Context, req *dmsV1.GetDa } data := &dmsV1.GetDataExportWorkflow{ - Name: w.Name, - WorkflowID: w.UID, - Desc: w.Desc, - CreateUser: convertBizUidWithName(d.UserUsecase.GetBizUserWithNameByUids(ctx, []string{w.CreateUserUID}))[0], - CreateTime: &w.CreateTime, + Name: w.Name, + WorkflowID: w.UID, + Desc: w.Desc, + CreateUser: convertBizUidWithName(d.UserUsecase.GetBizUserWithNameByUids(ctx, []string{w.CreateUserUID}))[0], + CreateTime: &w.CreateTime, + WorkflowTemplateId: w.WorkflowTemplateId, + WorkflowTemplateName: w.WorkflowTemplateName, WorkflowRecord: dmsV1.WorkflowRecord{ CurrentStepNumber: uint(w.WorkflowRecord.CurrentWorkflowStepId), Status: dmsV1.DataExportWorkflowStatus(w.WorkflowRecord.Status), @@ -413,3 +426,14 @@ func isDataExportWorkflowTerminalStatus(status string) bool { return false } } + +func (d *DMSService) CheckDataExportWorkflowTemplateUsed(ctx context.Context, req *dmsV1.CheckDataExportWorkflowTemplateUsedReq) (*dmsV1.CheckDataExportWorkflowTemplateUsedReply, error) { + isUsed, count, err := d.DataExportWorkflowUsecase.CheckDataExportWorkflowTemplateUsed(ctx, req.ProjectUid, req.WorkflowTemplateId) + if err != nil { + return nil, err + } + reply := &dmsV1.CheckDataExportWorkflowTemplateUsedReply{} + reply.Data.IsUsed = isUsed + reply.Data.Count = count + return reply, nil +} diff --git a/internal/dms/storage/convert.go b/internal/dms/storage/convert.go index 6220c1e8..e2f92ced 100644 --- a/internal/dms/storage/convert.go +++ b/internal/dms/storage/convert.go @@ -178,17 +178,17 @@ func convertBizUser(u *biz.User) (*model.User, error) { Model: model.Model{ UID: u.UID, }, - TwoFactorEnabled: u.TwoFactorEnabled, - Name: u.Name, - ThirdPartyUserID: u.ThirdPartyUserID, - ThirdPartyUserInfo: u.ThirdPartyUserInfo, - Password: encrypted, - Email: u.Email, - Phone: u.Phone, - WeChatID: u.WxID, - Language: u.Language, - UserAuthenticationType: u.UserAuthenticationType.String(), - Stat: u.Stat.Uint(), + TwoFactorEnabled: u.TwoFactorEnabled, + Name: u.Name, + ThirdPartyUserID: u.ThirdPartyUserID, + ThirdPartyUserInfo: u.ThirdPartyUserInfo, + Password: encrypted, + Email: u.Email, + Phone: u.Phone, + WeChatID: u.WxID, + Language: u.Language, + UserAuthenticationType: u.UserAuthenticationType.String(), + Stat: u.Stat.Uint(), System: string(u.System), LastLoginAt: lastLoginAt, BusinessWritePermission: u.BusinessWritePermission, @@ -262,18 +262,18 @@ func convertModelUser(u *model.User) (*biz.User, error) { } return &biz.User{ - Base: convertBase(u.Model), - UID: u.UID, - ThirdPartyUserID: u.ThirdPartyUserID, - ThirdPartyUserInfo: u.ThirdPartyUserInfo, - Name: u.Name, - Email: u.Email, - Phone: u.Phone, - WxID: u.WeChatID, - Language: u.Language, - Projects: projects, - UserAuthenticationType: typ, - Stat: stat, + Base: convertBase(u.Model), + UID: u.UID, + ThirdPartyUserID: u.ThirdPartyUserID, + ThirdPartyUserInfo: u.ThirdPartyUserInfo, + Name: u.Name, + Email: u.Email, + Phone: u.Phone, + WxID: u.WeChatID, + Language: u.Language, + Projects: projects, + UserAuthenticationType: typ, + Stat: stat, TwoFactorEnabled: u.TwoFactorEnabled, System: biz.UserSystem(u.System), LastLoginAt: lastLoginAt, @@ -1042,13 +1042,15 @@ func convertBizWorkflow(b *biz.Workflow) *model.Workflow { Model: model.Model{ UID: b.UID, }, - Name: b.Name, - ProjectUID: b.ProjectUID, - WorkflowType: b.WorkflowType, - Desc: b.Desc, - CreateTime: &b.CreateTime, - CreateUserUID: b.CreateUserUID, - WorkflowRecordUid: b.WorkflowRecordUid, + Name: b.Name, + ProjectUID: b.ProjectUID, + WorkflowType: b.WorkflowType, + Desc: b.Desc, + CreateTime: &b.CreateTime, + CreateUserUID: b.CreateUserUID, + WorkflowRecordUid: b.WorkflowRecordUid, + WorkflowTemplateId: b.WorkflowTemplateId, + WorkflowTemplateName: b.WorkflowTemplateName, } if b.WorkflowRecord != nil { workflow.WorkflowRecord = convertBizWorkflowRecord(b.WorkflowRecord) @@ -1060,15 +1062,17 @@ func convertModelWorkflow(m *model.Workflow) (w *biz.Workflow, err error) { w = &biz.Workflow{ Base: convertBase(m.Model), - UID: m.UID, - Name: m.Name, - ProjectUID: m.ProjectUID, - WorkflowType: m.WorkflowType, - Desc: m.Desc, - CreateTime: *m.CreateTime, - CreateUserUID: m.CreateUserUID, - WorkflowRecordUid: m.WorkflowRecordUid, - TaskIds: m.GetTaskIds(), + UID: m.UID, + Name: m.Name, + ProjectUID: m.ProjectUID, + WorkflowType: m.WorkflowType, + Desc: m.Desc, + CreateTime: *m.CreateTime, + CreateUserUID: m.CreateUserUID, + WorkflowRecordUid: m.WorkflowRecordUid, + WorkflowTemplateId: m.WorkflowTemplateId, + WorkflowTemplateName: m.WorkflowTemplateName, + TaskIds: m.GetTaskIds(), } if m.WorkflowRecord != nil { w.WorkflowRecord, err = convertModelWorkflowRecord(m.WorkflowRecord) diff --git a/internal/dms/storage/model/model.go b/internal/dms/storage/model/model.go index 78de8e6b..ccd47e6c 100644 --- a/internal/dms/storage/model/model.go +++ b/internal/dms/storage/model/model.go @@ -307,7 +307,6 @@ type UserLoginSession struct { UserUID string `json:"user_uid" gorm:"size:32;column:user_uid;uniqueIndex"` SessionID string `json:"session_id" gorm:"size:32;column:session_id;not null"` } - // Oauth2Configuration store oauth2 server configuration. type Oauth2Configuration struct { Model @@ -483,13 +482,15 @@ type ClusterNodeInfo struct { } type Workflow struct { Model - Name string `json:"name" gorm:"size:255;not null;index:project_uid_name,unique" example:""` - ProjectUID string `json:"project_uid" gorm:"size:32;column:project_uid;index:project_uid_name,unique"` - WorkflowType string `json:"workflow_type" gorm:"size:64;column:workflow_type; not null" example:"export"` - Desc string `json:"desc" gorm:"column:desc" example:"this is a data transform export workflow"` - CreateTime *time.Time `json:"create_time" gorm:"column:create_time"` - CreateUserUID string `json:"create_user_uid" gorm:"size:32;column:create_user_uid"` - WorkflowRecordUid string `json:"workflow_record_uid" gorm:"size:32;column:workflow_record_uid"` + Name string `json:"name" gorm:"size:255;not null;index:project_uid_name,unique" example:""` + ProjectUID string `json:"project_uid" gorm:"size:32;column:project_uid;index:project_uid_name,unique"` + WorkflowType string `json:"workflow_type" gorm:"size:64;column:workflow_type; not null" example:"export"` + Desc string `json:"desc" gorm:"column:desc" example:"this is a data transform export workflow"` + CreateTime *time.Time `json:"create_time" gorm:"column:create_time"` + CreateUserUID string `json:"create_user_uid" gorm:"size:32;column:create_user_uid"` + WorkflowRecordUid string `json:"workflow_record_uid" gorm:"size:32;column:workflow_record_uid"` + WorkflowTemplateId uint `json:"workflow_template_id" gorm:"column:workflow_template_id;default:0;index" example:"1"` + WorkflowTemplateName string `json:"workflow_template_name" gorm:"size:255;column:workflow_template_name" example:""` WorkflowRecord *WorkflowRecord `gorm:"foreignkey:WorkflowUid"` } diff --git a/internal/dms/storage/workflow.go b/internal/dms/storage/workflow.go index 8982a58c..9cd78499 100644 --- a/internal/dms/storage/workflow.go +++ b/internal/dms/storage/workflow.go @@ -362,6 +362,31 @@ func (d *WorkflowRepo) GetDataExportWorkflowsByIds(ctx context.Context, ids []st return ret, nil } +func (d *WorkflowRepo) CountDataExportWorkflowsByTemplateId(ctx context.Context, projectUID string, templateID uint) (int64, error) { + var count int64 + unfinishedStatuses := []string{ + string(biz.DataExportWorkflowStatusWaitForApprove), + string(biz.DataExportWorkflowStatusWaitForExport), + string(biz.DataExportWorkflowStatusWaitForExporting), + } + if err := transaction(d.log, ctx, d.db, func(tx *gorm.DB) error { + db := tx.WithContext(ctx).Model(&model.Workflow{}). + Joins("LEFT JOIN workflow_records ON workflows.workflow_record_uid = workflow_records.uid"). + Where("workflows.workflow_type = ? AND workflows.workflow_template_id = ?", biz.DataExportWorkflowEventType.String(), templateID). + Where("workflow_records.status IN ?", unfinishedStatuses) + if projectUID != "" { + db = db.Where("workflows.project_uid = ?", projectUID) + } + if err := db.Count(&count).Error; err != nil { + return fmt.Errorf("failed to count workflows by template id: %v", err) + } + return nil + }); err != nil { + return 0, err + } + return count, nil +} + func (d *WorkflowRepo) DeleteDataExportWorkflowsByIds(ctx context.Context, dataExportWorkflowUids []string) error { if len(dataExportWorkflowUids) == 0 { return nil diff --git a/internal/dms/storage/workflow_template_fields_test.go b/internal/dms/storage/workflow_template_fields_test.go new file mode 100644 index 00000000..8ec7199e --- /dev/null +++ b/internal/dms/storage/workflow_template_fields_test.go @@ -0,0 +1,37 @@ +package storage + +import ( + "testing" + "time" + + "github.com/actiontech/dms/internal/dms/biz" + "github.com/stretchr/testify/assert" +) + +func TestConvertWorkflowTemplateFields(t *testing.T) { + now := time.Now() + b := &biz.Workflow{ + UID: "uid-1", + Name: "wf", + ProjectUID: "p1", + WorkflowType: "data_export", + CreateTime: now, + CreateUserUID: "u1", + WorkflowRecordUid: "r1", + WorkflowTemplateId: 15, + WorkflowTemplateName: "export-tmpl", + WorkflowRecord: &biz.WorkflowRecord{ + UID: "r1", + Status: biz.DataExportWorkflowStatusWaitForApprove, + Tasks: []biz.Task{{UID: "t1"}}, + }, + } + m := convertBizWorkflow(b) + assert.Equal(t, uint(15), m.WorkflowTemplateId) + assert.Equal(t, "export-tmpl", m.WorkflowTemplateName) + + got, err := convertModelWorkflow(m) + assert.NoError(t, err) + assert.Equal(t, uint(15), got.WorkflowTemplateId) + assert.Equal(t, "export-tmpl", got.WorkflowTemplateName) +}