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  }