flamingo.me/flamingo-commerce/v3@v3.11.0/category/infrastructure/fake/helper.go (about)

     1  package fake
     2  
     3  import (
     4  	"embed"
     5  	"encoding/json"
     6  	"os"
     7  	"path/filepath"
     8  	"strings"
     9  
    10  	"flamingo.me/flamingo/v3/framework/flamingo"
    11  
    12  	"flamingo.me/flamingo-commerce/v3/category/domain"
    13  )
    14  
    15  //go:embed mock
    16  var mock embed.FS
    17  
    18  // LoadCategoryTree returns tree data from file
    19  func LoadCategoryTree(testDataFiles map[string]string, logger flamingo.Logger) []*domain.TreeData {
    20  	var tree []*domain.TreeData
    21  	if categoryTreeFile, ok := testDataFiles["categoryTree"]; ok {
    22  		data, err := os.ReadFile(categoryTreeFile)
    23  		if err != nil {
    24  			logger.Warn(err)
    25  			return tree
    26  		}
    27  		err = json.Unmarshal(data, &tree)
    28  		if err != nil {
    29  			logger.Warn(err)
    30  		}
    31  	} else {
    32  		jsonFile, err := mock.ReadFile("mock/categoryTree.json")
    33  		if err != nil {
    34  			logger.Warn(err)
    35  			return tree
    36  		}
    37  		err = json.Unmarshal(jsonFile, &tree)
    38  		if err != nil {
    39  			logger.Warn(err)
    40  		}
    41  	}
    42  	return tree
    43  }
    44  
    45  // LoadCategory returns category data from file
    46  func LoadCategory(categoryCode string, testDataFiles map[string]string, logger flamingo.Logger) domain.Category {
    47  	var categoryData *domain.CategoryData
    48  	if categoryTreeFile, ok := testDataFiles[categoryCode]; ok {
    49  		data, err := os.ReadFile(categoryTreeFile)
    50  		if err != nil {
    51  			logger.Warn(err)
    52  			return nil
    53  		}
    54  		categoryData, err = unmarshalCategoryData(data)
    55  		if err != nil {
    56  			logger.Warn(err)
    57  			return nil
    58  		}
    59  	} else {
    60  		jsonFile, err := mock.ReadFile("mock/" + categoryCode + ".json")
    61  		if err != nil {
    62  			logger.Warn(err)
    63  			return nil
    64  		}
    65  		categoryData, err = unmarshalCategoryData(jsonFile)
    66  		if err != nil {
    67  			logger.Warn(err)
    68  			return nil
    69  		}
    70  	}
    71  	return categoryData
    72  }
    73  
    74  type jsonCategoryData struct {
    75  	CategoryCode       string
    76  	CategoryName       string
    77  	CategoryPath       string
    78  	CategoryTypeCode   string
    79  	IsPromoted         bool
    80  	IsActive           bool
    81  	CategoryMedia      []domain.MediaData
    82  	CategoryAttributes map[string]domain.Attribute
    83  	Promotion          jsonCategoryPromotion
    84  }
    85  
    86  type jsonCategoryPromotion struct {
    87  	LinkType   string
    88  	LinkTarget string
    89  	Media      []domain.MediaData
    90  }
    91  
    92  func unmarshalCategoryData(jsonData []byte) (*domain.CategoryData, error) {
    93  	var categoryData *jsonCategoryData
    94  	if err := json.Unmarshal(jsonData, &categoryData); err != nil {
    95  		return nil, err
    96  	}
    97  
    98  	categoryMedia := make([]domain.Media, len(categoryData.CategoryMedia))
    99  	for i, media := range categoryData.CategoryMedia {
   100  		categoryMedia[i] = media
   101  	}
   102  
   103  	promotionMedia := make([]domain.Media, len(categoryData.Promotion.Media))
   104  	for i, media := range categoryData.Promotion.Media {
   105  		promotionMedia[i] = media
   106  	}
   107  
   108  	return &domain.CategoryData{
   109  		CategoryCode:       categoryData.CategoryCode,
   110  		CategoryName:       categoryData.CategoryName,
   111  		CategoryPath:       categoryData.CategoryPath,
   112  		IsPromoted:         categoryData.IsPromoted,
   113  		IsActive:           categoryData.IsActive,
   114  		CategoryMedia:      categoryMedia,
   115  		CategoryTypeCode:   categoryData.CategoryTypeCode,
   116  		CategoryAttributes: categoryData.CategoryAttributes,
   117  		Promotion: domain.Promotion{
   118  			LinkType:   categoryData.Promotion.LinkType,
   119  			LinkTarget: categoryData.Promotion.LinkTarget,
   120  			Media:      promotionMedia,
   121  		},
   122  	}, nil
   123  }
   124  
   125  // RegisterTestData returns files of given folder
   126  func RegisterTestData(folder string, logger flamingo.Logger) map[string]string {
   127  	testDataFiles := make(map[string]string)
   128  	files, err := os.ReadDir(folder)
   129  	if err != nil {
   130  		logger.Warn(err)
   131  		return testDataFiles
   132  	}
   133  	for _, file := range files {
   134  		if !file.IsDir() && strings.HasSuffix(file.Name(), ".json") {
   135  			base := filepath.Base(file.Name())[:len(file.Name())-len(".json")]
   136  			testDataFiles[base] = filepath.Join(folder, file.Name())
   137  		}
   138  	}
   139  	return testDataFiles
   140  }