kra-oa/internal/biz/dictionary.go

116 lines
3.3 KiB
Go

package biz
import (
"context"
"time"
)
type DictionaryDetail struct {
ID uint
CreatedAt time.Time
UpdatedAt time.Time
Label string
Value string
Extend string
Status bool
Sort int
DictionaryID uint
ParentID *uint
Level int
Path string
Children []*DictionaryDetail
}
type DictionaryDetailFilter struct {
DictionaryID uint
Label string
Value string
Status *bool
ParentID *uint
Level *int
}
type DictionaryDetailRepo interface {
CreateDictionaryDetail(context.Context, *DictionaryDetail) error
UpdateDictionaryDetail(context.Context, *DictionaryDetail) error
DeleteDictionaryDetail(context.Context, uint) error
FindDictionaryDetail(context.Context, uint) (*DictionaryDetail, error)
ListDictionaryDetails(context.Context, int, int, DictionaryDetailFilter) ([]*DictionaryDetail, int64, error)
DictionaryDetailTree(context.Context, uint, string) ([]*DictionaryDetail, error)
}
type Dictionary struct {
ID uint
CreatedAt time.Time
UpdatedAt time.Time
Name string
Type string
Status bool
Desc string
ParentID *uint
Children []*Dictionary
Details []*DictionaryDetail
}
type DictionaryRepo interface {
DictionaryMetadataRepo
DictionaryDetailRepo
}
type DictionaryUsecase struct{ DictionaryRepo }
func NewDictionaryUsecase(repo DictionaryRepo) *DictionaryUsecase {
return &DictionaryUsecase{DictionaryRepo: repo}
}
type DictionaryMetadataRepo interface {
CreateDictionary(context.Context, *Dictionary) error
ImportDictionary(context.Context, *Dictionary, []*DictionaryDetail) error
UpdateDictionary(context.Context, *Dictionary) error
DeleteDictionary(context.Context, uint) error
FindDictionary(context.Context, uint, string, *bool, bool) (*Dictionary, error)
ExportDictionary(context.Context, uint) (*Dictionary, error)
ListDictionaries(context.Context, int, int, string, string, bool) ([]*Dictionary, int64, error)
}
func (uc *DictionaryUsecase) ImportDictionary(ctx context.Context, dictionary *Dictionary, details []*DictionaryDetail) error {
return uc.DictionaryRepo.ImportDictionary(ctx, dictionary, details)
}
func (uc *DictionaryUsecase) DictionaryDetailsByParent(ctx context.Context, dictionaryID uint, parentID *uint, includeChildren bool) ([]*DictionaryDetail, error) {
items, _, err := uc.ListDictionaryDetails(ctx, 0, 0, DictionaryDetailFilter{DictionaryID: dictionaryID})
if err != nil {
return nil, err
}
direct := make([]*DictionaryDetail, 0)
for _, item := range items {
if (parentID == nil && item.ParentID == nil) || (parentID != nil && item.ParentID != nil && *item.ParentID == *parentID) {
direct = append(direct, item)
}
}
if !includeChildren {
return direct, nil
}
children := make(map[uint][]*DictionaryDetail)
for _, item := range items {
item.Children = []*DictionaryDetail{}
if item.ParentID != nil {
children[*item.ParentID] = append(children[*item.ParentID], item)
}
}
var attach func(*DictionaryDetail)
attach = func(item *DictionaryDetail) {
item.Children = children[item.ID]
if item.Children == nil {
item.Children = []*DictionaryDetail{}
}
for _, child := range item.Children {
attach(child)
}
}
for _, item := range direct {
attach(item)
}
return direct, nil
}