flamingo.me/flamingo-commerce/v3@v3.11.0/product/module.go (about)

     1  package product
     2  
     3  import (
     4  	"flamingo.me/dingo"
     5  	"flamingo.me/flamingo/v3/framework/flamingo"
     6  	"flamingo.me/flamingo/v3/framework/web"
     7  	"flamingo.me/graphql"
     8  
     9  	"flamingo.me/flamingo-commerce/v3/price"
    10  	"flamingo.me/flamingo-commerce/v3/product/domain"
    11  	"flamingo.me/flamingo-commerce/v3/product/infrastructure/fake"
    12  	"flamingo.me/flamingo-commerce/v3/product/interfaces/controller"
    13  	productgraphql "flamingo.me/flamingo-commerce/v3/product/interfaces/graphql"
    14  	"flamingo.me/flamingo-commerce/v3/product/interfaces/templatefunctions"
    15  	"flamingo.me/flamingo-commerce/v3/search"
    16  )
    17  
    18  // Module represents the product module
    19  type Module struct {
    20  	fakeService bool
    21  	api         bool
    22  }
    23  
    24  // Inject module configuration
    25  func (m *Module) Inject(
    26  	cfg *struct {
    27  		FakeService bool `inject:"config:commerce.product.fakeservice.enabled,optional"`
    28  		API         bool `inject:"config:commerce.product.api.enabled,optional"`
    29  	},
    30  ) *Module {
    31  	if cfg != nil {
    32  		m.api = cfg.API
    33  		m.fakeService = cfg.FakeService
    34  	}
    35  
    36  	return m
    37  }
    38  
    39  // Configure the product module
    40  func (m *Module) Configure(injector *dingo.Injector) {
    41  	flamingo.BindTemplateFunc(injector, "getProduct", new(templatefunctions.GetProduct))
    42  	flamingo.BindTemplateFunc(injector, "getProductUrl", new(templatefunctions.GetProductURL))
    43  	flamingo.BindTemplateFunc(injector, "findProducts", new(templatefunctions.FindProducts))
    44  
    45  	web.BindRoutes(injector, new(routes))
    46  	if m.api {
    47  		web.BindRoutes(injector, new(apiRoutes))
    48  	}
    49  
    50  	injector.BindMulti(new(graphql.Service)).To(new(productgraphql.Service))
    51  	if m.fakeService {
    52  		injector.Override((*domain.ProductService)(nil), "").To(fake.ProductService{}).In(dingo.ChildSingleton)
    53  		injector.Override((*domain.SearchService)(nil), "").To(fake.SearchService{}).In(dingo.ChildSingleton)
    54  	}
    55  
    56  }
    57  
    58  // Depends adds our dependencies
    59  func (*Module) Depends() []dingo.Module {
    60  	return []dingo.Module{
    61  		new(price.Module),
    62  		new(search.Module),
    63  	}
    64  }
    65  
    66  // CueConfig defines the product module configuration
    67  func (*Module) CueConfig() string {
    68  	// language=cue
    69  	return `
    70  commerce: {
    71  	product: {
    72  		view:  {
    73  			template: *"product/product" | !=""
    74  		}
    75  		priceIsGross: bool | *true
    76  		generateSlug: bool | *true
    77  		slugAttributeCode: string | *"urlSlug"
    78  		fakeservice: {
    79  			enabled: bool | *false
    80  			currency: *"EUR" | !=""
    81  			defaultProducts: bool | *true
    82  			if enabled {
    83  			  jsonTestDataFolder?: string & !=""
    84  			  jsonTestDataLiveSearch?: string & !=""
    85  			}
    86  			deliveryCodes: [...string] | *["testCode1", "testCode2"]
    87  		}
    88  		api: {
    89  			enabled: bool | *true
    90  		}
    91  		pagination: defaultPageSize: number | *commerce.pagination.defaultPageSize
    92  	}
    93  }`
    94  }
    95  
    96  type routes struct {
    97  	controller *controller.View
    98  }
    99  
   100  func (r *routes) Inject(controller *controller.View) {
   101  	r.controller = controller
   102  }
   103  
   104  func (r *routes) Routes(registry *web.RouterRegistry) {
   105  	registry.HandleGet("product.view", r.controller.Get)
   106  	h := registry.MustRoute("/product/:marketplacecode/:name.html", `product.view(marketplacecode, name, backurl?="")`)
   107  	h.Normalize("name")
   108  	h = registry.MustRoute("/product/:marketplacecode/:variantcode/:name.html", `product.view(marketplacecode, variantcode, name, backurl?="")`)
   109  	h.Normalize("name")
   110  }
   111  
   112  type apiRoutes struct {
   113  	apiController *controller.APIController
   114  }
   115  
   116  func (r *apiRoutes) Inject(apiController *controller.APIController) {
   117  	r.apiController = apiController
   118  }
   119  
   120  func (r *apiRoutes) Routes(registry *web.RouterRegistry) {
   121  	registry.MustRoute("/api/v1/products/:marketplacecode", "products.api.get")
   122  	registry.HandleGet("products.api.get", r.apiController.Get)
   123  }