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 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 *SettingsUsecase) ImportDictionary(ctx context.Context, dictionary *Dictionary, details []*DictionaryDetail) error { return uc.SettingsRepo.ImportDictionary(ctx, dictionary, details) } func (uc *SettingsUsecase) 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 }