kontenhumas-be/app/module/approval_workflows/request/approval_workflows.request.go

358 lines
14 KiB
Go

package request
import (
"netidhub-saas-be/app/database/entity"
"netidhub-saas-be/utils/paginator"
"strconv"
"time"
)
type ApprovalWorkflowsGeneric interface {
ToEntity()
}
type ApprovalWorkflowsQueryRequest struct {
Name *string `json:"name"`
Description *string `json:"description"`
IsActive *bool `json:"isActive"`
IsDefault *bool `json:"isDefault"`
Pagination *paginator.Pagination `json:"pagination"`
}
type ApprovalWorkflowsCreateRequest struct {
Name string `json:"name" validate:"required"`
Description string `json:"description" validate:"required"`
IsActive *bool `json:"isActive"`
IsDefault *bool `json:"isDefault"`
RequiresApproval *bool `json:"requiresApproval"`
AutoPublish *bool `json:"autoPublish"`
Steps []ApprovalWorkflowStepRequest `json:"steps"`
}
func (req ApprovalWorkflowsCreateRequest) ToEntity() *entity.ApprovalWorkflows {
return &entity.ApprovalWorkflows{
Name: req.Name,
Description: &req.Description,
IsActive: req.IsActive,
IsDefault: req.IsDefault,
RequiresApproval: req.RequiresApproval,
AutoPublish: req.AutoPublish,
CreatedAt: time.Now(),
UpdatedAt: time.Now(),
}
}
func (req ApprovalWorkflowsCreateRequest) ToStepsEntity() []*entity.ApprovalWorkflowSteps {
steps := make([]*entity.ApprovalWorkflowSteps, len(req.Steps))
for i, stepReq := range req.Steps {
steps[i] = &entity.ApprovalWorkflowSteps{
StepOrder: stepReq.StepOrder,
StepName: stepReq.StepName,
RequiredUserLevelId: stepReq.RequiredUserLevelId,
CanSkip: stepReq.CanSkip,
AutoApproveAfterHours: stepReq.AutoApproveAfterHours,
IsActive: stepReq.IsActive,
CreatedAt: time.Now(),
UpdatedAt: time.Now(),
}
}
return steps
}
type ApprovalWorkflowsUpdateRequest struct {
Name string `json:"name" validate:"required"`
Description string `json:"description" validate:"required"`
IsActive *bool `json:"isActive"`
IsDefault *bool `json:"isDefault"`
RequiresApproval *bool `json:"requiresApproval"`
AutoPublish *bool `json:"autoPublish"`
}
func (req ApprovalWorkflowsUpdateRequest) ToEntity() *entity.ApprovalWorkflows {
return &entity.ApprovalWorkflows{
Name: req.Name,
Description: &req.Description,
IsActive: req.IsActive,
IsDefault: req.IsDefault,
RequiresApproval: req.RequiresApproval,
AutoPublish: req.AutoPublish,
UpdatedAt: time.Now(),
}
}
type ApprovalWorkflowStepRequest struct {
StepOrder int `json:"stepOrder" validate:"required"`
StepName string `json:"stepName" validate:"required"`
RequiredUserLevelId uint `json:"requiredUserLevelId" validate:"required"`
CanSkip *bool `json:"canSkip"`
AutoApproveAfterHours *int `json:"autoApproveAfterHours"`
IsActive *bool `json:"isActive"`
// Multi-branch support fields
ParentStepId *uint `json:"parentStepId"`
ConditionType *string `json:"conditionType"` // 'user_level', 'user_level_hierarchy', 'always', 'custom'
ConditionValue *string `json:"conditionValue"` // JSON string for conditions
IsParallel *bool `json:"isParallel"`
BranchName *string `json:"branchName"`
BranchOrder *int `json:"branchOrder"`
}
func (req ApprovalWorkflowStepRequest) ToEntity(workflowId uint) *entity.ApprovalWorkflowSteps {
return &entity.ApprovalWorkflowSteps{
WorkflowId: workflowId,
StepOrder: req.StepOrder,
StepName: req.StepName,
RequiredUserLevelId: req.RequiredUserLevelId,
CanSkip: req.CanSkip,
AutoApproveAfterHours: req.AutoApproveAfterHours,
IsActive: req.IsActive,
// Multi-branch support fields
ParentStepId: req.ParentStepId,
ConditionType: req.ConditionType,
ConditionValue: req.ConditionValue,
IsParallel: req.IsParallel,
BranchName: req.BranchName,
BranchOrder: req.BranchOrder,
CreatedAt: time.Now(),
UpdatedAt: time.Now(),
}
}
type ApprovalWorkflowsWithStepsCreateRequest struct {
Name string `json:"name" validate:"required"`
Description string `json:"description" validate:"required"`
IsActive *bool `json:"isActive"`
IsDefault *bool `json:"isDefault"`
RequiresApproval *bool `json:"requiresApproval"`
AutoPublish *bool `json:"autoPublish"`
Steps []ApprovalWorkflowStepRequest `json:"steps" validate:"required,min=1"`
}
func (req ApprovalWorkflowsWithStepsCreateRequest) ToEntity() *entity.ApprovalWorkflows {
return &entity.ApprovalWorkflows{
Name: req.Name,
Description: &req.Description,
IsActive: req.IsActive,
IsDefault: req.IsDefault,
RequiresApproval: req.RequiresApproval,
AutoPublish: req.AutoPublish,
CreatedAt: time.Now(),
UpdatedAt: time.Now(),
}
}
func (req ApprovalWorkflowsWithStepsCreateRequest) ToStepsEntity() []*entity.ApprovalWorkflowSteps {
steps := make([]*entity.ApprovalWorkflowSteps, len(req.Steps))
for i, stepReq := range req.Steps {
steps[i] = &entity.ApprovalWorkflowSteps{
StepOrder: stepReq.StepOrder,
StepName: stepReq.StepName,
RequiredUserLevelId: stepReq.RequiredUserLevelId,
CanSkip: stepReq.CanSkip,
AutoApproveAfterHours: stepReq.AutoApproveAfterHours,
IsActive: stepReq.IsActive,
// Multi-branch support fields
ParentStepId: stepReq.ParentStepId,
ConditionType: stepReq.ConditionType,
ConditionValue: stepReq.ConditionValue,
IsParallel: stepReq.IsParallel,
BranchName: stepReq.BranchName,
BranchOrder: stepReq.BranchOrder,
CreatedAt: time.Now(),
UpdatedAt: time.Now(),
}
}
return steps
}
type ApprovalWorkflowsWithStepsUpdateRequest struct {
Name string `json:"name" validate:"required"`
Description string `json:"description" validate:"required"`
IsActive *bool `json:"isActive"`
IsDefault *bool `json:"isDefault"`
RequiresApproval *bool `json:"requiresApproval"`
AutoPublish *bool `json:"autoPublish"`
Steps []ApprovalWorkflowStepRequest `json:"steps" validate:"required,min=1"`
}
type ApprovalWorkflowsQueryRequestContext struct {
Name string `json:"name"`
Description string `json:"description"`
IsActive string `json:"isActive"`
IsDefault string `json:"isDefault"`
}
// CreateApprovalWorkflowWithClientSettingsRequest - Comprehensive request for creating approval workflow with client settings
type CreateApprovalWorkflowWithClientSettingsRequest struct {
// Workflow details
Name string `json:"name" validate:"required"`
Description string `json:"description" validate:"required"`
IsActive *bool `json:"isActive"`
IsDefault *bool `json:"isDefault"`
RequiresApproval *bool `json:"requiresApproval"`
AutoPublish *bool `json:"autoPublish"`
Steps []ApprovalWorkflowStepRequest `json:"steps" validate:"required,min=1"`
// Client approval settings
ClientApprovalSettings ClientApprovalSettingsRequest `json:"clientApprovalSettings" validate:"required"`
}
type ClientApprovalSettingsRequest struct {
RequiresApproval *bool `json:"requiresApproval"`
AutoPublishArticles *bool `json:"autoPublishArticles"`
ApprovalExemptUsers []uint `json:"approvalExemptUsers"`
ApprovalExemptRoles []uint `json:"approvalExemptRoles"`
ApprovalExemptCategories []uint `json:"approvalExemptCategories"`
RequireApprovalFor []string `json:"requireApprovalFor"`
SkipApprovalFor []string `json:"skipApprovalFor"`
IsActive *bool `json:"isActive"`
}
func (req CreateApprovalWorkflowWithClientSettingsRequest) ToWorkflowEntity() *entity.ApprovalWorkflows {
return &entity.ApprovalWorkflows{
Name: req.Name,
Description: &req.Description,
IsActive: req.IsActive,
IsDefault: req.IsDefault,
RequiresApproval: req.RequiresApproval,
AutoPublish: req.AutoPublish,
CreatedAt: time.Now(),
UpdatedAt: time.Now(),
}
}
func (req CreateApprovalWorkflowWithClientSettingsRequest) ToStepsEntity() []*entity.ApprovalWorkflowSteps {
steps := make([]*entity.ApprovalWorkflowSteps, len(req.Steps))
for i, stepReq := range req.Steps {
steps[i] = &entity.ApprovalWorkflowSteps{
StepOrder: stepReq.StepOrder,
StepName: stepReq.StepName,
RequiredUserLevelId: stepReq.RequiredUserLevelId,
CanSkip: stepReq.CanSkip,
AutoApproveAfterHours: stepReq.AutoApproveAfterHours,
IsActive: stepReq.IsActive,
// Multi-branch support fields
ParentStepId: stepReq.ParentStepId,
ConditionType: stepReq.ConditionType,
ConditionValue: stepReq.ConditionValue,
IsParallel: stepReq.IsParallel,
BranchName: stepReq.BranchName,
BranchOrder: stepReq.BranchOrder,
CreatedAt: time.Now(),
UpdatedAt: time.Now(),
}
}
return steps
}
func (req CreateApprovalWorkflowWithClientSettingsRequest) ToClientApprovalSettingsEntity() *entity.ClientApprovalSettings {
return &entity.ClientApprovalSettings{
RequiresApproval: req.ClientApprovalSettings.RequiresApproval,
AutoPublishArticles: req.ClientApprovalSettings.AutoPublishArticles,
ApprovalExemptUsers: req.ClientApprovalSettings.ApprovalExemptUsers,
ApprovalExemptRoles: req.ClientApprovalSettings.ApprovalExemptRoles,
ApprovalExemptCategories: req.ClientApprovalSettings.ApprovalExemptCategories,
RequireApprovalFor: req.ClientApprovalSettings.RequireApprovalFor,
SkipApprovalFor: req.ClientApprovalSettings.SkipApprovalFor,
IsActive: req.ClientApprovalSettings.IsActive,
CreatedAt: time.Now(),
UpdatedAt: time.Now(),
}
}
func (req ApprovalWorkflowsQueryRequestContext) ToParamRequest() ApprovalWorkflowsQueryRequest {
var name *string
var description *string
var isActive *bool
var isDefault *bool
if req.Name != "" {
name = &req.Name
}
if req.Description != "" {
description = &req.Description
}
if req.IsActive != "" {
if parsedIsActive, err := strconv.ParseBool(req.IsActive); err == nil {
isActive = &parsedIsActive
}
}
if req.IsDefault != "" {
if parsedIsDefault, err := strconv.ParseBool(req.IsDefault); err == nil {
isDefault = &parsedIsDefault
}
}
return ApprovalWorkflowsQueryRequest{
Name: name,
Description: description,
IsActive: isActive,
IsDefault: isDefault,
}
}
// ComprehensiveWorkflowDetailRequest - Request for getting comprehensive workflow details
// Note: workflowId is now automatically determined from user's clientId
type ComprehensiveWorkflowDetailRequest struct {
// No parameters needed - workflow is determined from user's clientId
}
// UpdateApprovalWorkflowWithClientSettingsRequest - Request for updating approval workflow with client settings
type UpdateApprovalWorkflowWithClientSettingsRequest struct {
WorkflowId uint `json:"workflowId" validate:"required"`
// Workflow details
Name string `json:"name" validate:"required"`
Description string `json:"description"`
IsActive *bool `json:"isActive"`
IsDefault *bool `json:"isDefault"`
// Workflow steps
Steps []ApprovalWorkflowStepRequest `json:"steps" validate:"required"`
// Client approval settings
ClientSettings ClientApprovalSettingsRequest `json:"clientSettings"`
}
// ToWorkflowEntity converts UpdateApprovalWorkflowWithClientSettingsRequest to ApprovalWorkflows entity
func (req UpdateApprovalWorkflowWithClientSettingsRequest) ToWorkflowEntity() *entity.ApprovalWorkflows {
return &entity.ApprovalWorkflows{
Name: req.Name,
Description: &req.Description,
IsActive: req.IsActive,
IsDefault: req.IsDefault,
}
}
// ToStepsEntity converts UpdateApprovalWorkflowWithClientSettingsRequest to ApprovalWorkflowSteps entities
func (req UpdateApprovalWorkflowWithClientSettingsRequest) ToStepsEntity() []*entity.ApprovalWorkflowSteps {
steps := make([]*entity.ApprovalWorkflowSteps, len(req.Steps))
for i, stepReq := range req.Steps {
steps[i] = stepReq.ToEntity(req.WorkflowId)
}
return steps
}
// ToClientApprovalSettingsEntity converts UpdateApprovalWorkflowWithClientSettingsRequest to ClientApprovalSettings entity
func (req UpdateApprovalWorkflowWithClientSettingsRequest) ToClientApprovalSettingsEntity() *entity.ClientApprovalSettings {
return &entity.ClientApprovalSettings{
RequiresApproval: req.ClientSettings.RequiresApproval,
AutoPublishArticles: req.ClientSettings.AutoPublishArticles,
ApprovalExemptUsers: req.ClientSettings.ApprovalExemptUsers,
ApprovalExemptRoles: req.ClientSettings.ApprovalExemptRoles,
ApprovalExemptCategories: req.ClientSettings.ApprovalExemptCategories,
RequireApprovalFor: req.ClientSettings.RequireApprovalFor,
SkipApprovalFor: req.ClientSettings.SkipApprovalFor,
IsActive: req.ClientSettings.IsActive,
}
}