mirror of
https://gitlab.com/mbugroup/lti-api.git
synced 2026-05-20 13:31:56 +00:00
125 lines
3.1 KiB
Go
125 lines
3.1 KiB
Go
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 {
|
|
Id uint `json:"id"`
|
|
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{
|
|
Id: e.Id,
|
|
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
|
|
}
|