mirror of
https://gitlab.com/mbugroup/lti-api.git
synced 2026-05-23 06:45:43 +00:00
feat(BE): approval_workflow, adjusment project_flocks, common, and migration
This commit is contained in:
@@ -0,0 +1,122 @@
|
||||
package dto
|
||||
|
||||
import (
|
||||
"sort"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
entity "gitlab.com/mbugroup/lti-api.git/internal/entities"
|
||||
userDTO "gitlab.com/mbugroup/lti-api.git/internal/modules/users/dto"
|
||||
approvalutils "gitlab.com/mbugroup/lti-api.git/internal/utils/approvals"
|
||||
)
|
||||
|
||||
type ApprovalBaseDTO struct {
|
||||
StepNumber uint16 `json:"step_number"`
|
||||
StepName string `json:"step_name"`
|
||||
Action *string `json:"action"`
|
||||
Notes *string `json:"notes"`
|
||||
ActionBy userDTO.UserBaseDTO `json:"action_by"`
|
||||
ActionAt time.Time `json:"action_at"`
|
||||
}
|
||||
|
||||
type ApprovalGroupDTO struct {
|
||||
StepNumber uint16 `json:"step_number"`
|
||||
StepName string `json:"step_name"`
|
||||
Approvals []ApprovalBaseDTO `json:"approvals"`
|
||||
}
|
||||
|
||||
func ToApprovalDTO(e entity.Approval) ApprovalBaseDTO {
|
||||
dto := ApprovalBaseDTO{
|
||||
Notes: e.Notes,
|
||||
}
|
||||
|
||||
if e.StepNumber > 0 {
|
||||
stepCopy := uint16(e.StepNumber)
|
||||
dto.StepNumber = stepCopy
|
||||
}
|
||||
|
||||
stepName := strings.TrimSpace(e.StepName)
|
||||
if stepName == "" && e.ApprovableType != "" && e.StepNumber > 0 {
|
||||
if label, ok := approvalutils.ApprovalStepName(approvalutils.ApprovalWorkflowKey(e.ApprovableType), approvalutils.ApprovalStep(e.StepNumber)); ok {
|
||||
stepName = label
|
||||
}
|
||||
}
|
||||
dto.StepName = stepName
|
||||
|
||||
if e.Action != nil {
|
||||
value := strings.TrimSpace(string(*e.Action))
|
||||
if value != "" {
|
||||
valueCopy := value
|
||||
dto.Action = &valueCopy
|
||||
}
|
||||
}
|
||||
|
||||
if e.ActionUser != nil && e.ActionUser.Id != 0 {
|
||||
user := userDTO.ToUserBaseDTO(*e.ActionUser)
|
||||
dto.ActionBy = user
|
||||
} else if e.ActionBy != nil && *e.ActionBy != 0 {
|
||||
dto.ActionBy = userDTO.UserBaseDTO{
|
||||
Id: *e.ActionBy,
|
||||
IdUser: int64(*e.ActionBy),
|
||||
}
|
||||
}
|
||||
|
||||
if !e.ActionAt.IsZero() {
|
||||
at := e.ActionAt
|
||||
dto.ActionAt = at
|
||||
}
|
||||
|
||||
return dto
|
||||
}
|
||||
|
||||
func ToApprovalDTOs(items []entity.Approval) []ApprovalBaseDTO {
|
||||
result := make([]ApprovalBaseDTO, len(items))
|
||||
for i, item := range items {
|
||||
result[i] = ToApprovalDTO(item)
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func ToApprovalGroupDTOs(items []entity.Approval) []ApprovalGroupDTO {
|
||||
if len(items) == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
type groupAccumulator struct {
|
||||
StepName string
|
||||
Approvals []ApprovalBaseDTO
|
||||
}
|
||||
|
||||
groups := make(map[uint16]*groupAccumulator)
|
||||
order := make([]uint16, 0)
|
||||
for _, item := range items {
|
||||
step := item.StepNumber
|
||||
acc, exists := groups[step]
|
||||
if !exists {
|
||||
stepName := strings.TrimSpace(item.StepName)
|
||||
if stepName == "" && item.ApprovableType != "" && item.StepNumber > 0 {
|
||||
if label, ok := approvalutils.ApprovalStepName(approvalutils.ApprovalWorkflowKey(item.ApprovableType), approvalutils.ApprovalStep(item.StepNumber)); ok {
|
||||
stepName = label
|
||||
}
|
||||
}
|
||||
acc = &groupAccumulator{StepName: stepName}
|
||||
groups[step] = acc
|
||||
order = append(order, step)
|
||||
}
|
||||
acc.Approvals = append(acc.Approvals, ToApprovalDTO(item))
|
||||
}
|
||||
|
||||
sort.Slice(order, func(i, j int) bool { return order[i] < order[j] })
|
||||
|
||||
result := make([]ApprovalGroupDTO, len(order))
|
||||
for i, step := range order {
|
||||
acc := groups[step]
|
||||
result[i] = ApprovalGroupDTO{
|
||||
StepNumber: step,
|
||||
StepName: acc.StepName,
|
||||
Approvals: acc.Approvals,
|
||||
}
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
Reference in New Issue
Block a user