110 lines
3.1 KiB
Go
110 lines
3.1 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 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
|
|
}
|