flamingo.me/flamingo-commerce/v3@v3.11.0/category/infrastructure/fake/category_service.go (about) 1 package fake 2 3 import ( 4 "context" 5 6 "flamingo.me/flamingo/v3/framework/flamingo" 7 8 "flamingo.me/flamingo-commerce/v3/category/domain" 9 ) 10 11 // CategoryService returns category test data 12 type CategoryService struct { 13 testDataFiles map[string]string 14 logger flamingo.Logger 15 } 16 17 var _ domain.CategoryService = new(CategoryService) 18 19 // Inject dependencies 20 func (f *CategoryService) Inject(logger flamingo.Logger, config *struct { 21 TestDataFolder string `inject:"config:commerce.category.fakeService.testDataFolder,optional"` 22 }) { 23 f.logger = logger.WithField(flamingo.LogKeyModule, "category").WithField(flamingo.LogKeyCategory, "fakeService") 24 if config != nil { 25 if len(config.TestDataFolder) > 0 { 26 f.testDataFiles = RegisterTestData(config.TestDataFolder, f.logger) 27 } 28 } 29 } 30 31 // Tree returns the tree the given category belongs to 32 func (f CategoryService) Tree(_ context.Context, activeCategoryCode string) (domain.Tree, error) { 33 categoryTree := LoadCategoryTree(f.testDataFiles, f.logger) 34 if len(activeCategoryCode) == 0 { 35 return &domain.TreeData{ 36 IsActive: true, 37 SubTreesData: categoryTree, 38 }, nil 39 } 40 index := findTreeRootIndex(activeCategoryCode, categoryTree) 41 if index == -1 { 42 return nil, domain.ErrNotFound 43 } 44 return categoryTree[index], nil 45 } 46 47 // Get the category of the given category code 48 func (f CategoryService) Get(_ context.Context, categoryCode string) (domain.Category, error) { 49 category := LoadCategory(categoryCode, f.testDataFiles, f.logger) 50 if category == nil { 51 treeCategory := f.getCategoryByTree(categoryCode) 52 if treeCategory == nil { 53 return nil, domain.ErrNotFound 54 } 55 return &domain.CategoryData{ 56 CategoryCode: treeCategory.Code(), 57 CategoryName: treeCategory.Name(), 58 CategoryPath: treeCategory.Path(), 59 IsActive: treeCategory.Active(), 60 }, nil 61 } 62 return category, nil 63 } 64 65 func (f CategoryService) getCategoryByTree(categoryCode string) domain.Tree { 66 categoryTree := LoadCategoryTree(f.testDataFiles, f.logger) 67 tree := make([]domain.Tree, len(categoryTree)) 68 for i, data := range categoryTree { 69 tree[i] = data 70 } 71 return findCategoryInTreeByCode(categoryCode, tree) 72 } 73 74 func findTreeRootIndex(categoryCode string, trees []*domain.TreeData) int { 75 if len(trees) == 1 { 76 return 0 77 } 78 for i, currentTree := range trees { 79 if currentTree.Code() == categoryCode || findTreeRootIndexBySubTree(categoryCode, currentTree.SubTrees(), i) != -1 { 80 currentTree.IsActive = true 81 return i 82 } 83 } 84 return -1 85 } 86 87 func findTreeRootIndexBySubTree(categoryCode string, trees []domain.Tree, index int) int { 88 for _, currentTree := range trees { 89 if currentTree.Code() == categoryCode || findTreeRootIndexBySubTree(categoryCode, currentTree.SubTrees(), index) != -1 { 90 if data, ok := currentTree.(*domain.TreeData); ok { 91 data.IsActive = true 92 } 93 return index 94 } 95 } 96 return -1 97 } 98 99 func findCategoryInTreeByCode(categoryCode string, trees []domain.Tree) domain.Tree { 100 for _, currentTree := range trees { 101 if currentTree.Code() == categoryCode { 102 return currentTree 103 } 104 subTree := findCategoryInTreeByCode(categoryCode, currentTree.SubTrees()) 105 if subTree != nil { 106 return subTree 107 } 108 } 109 return nil 110 }