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 }