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 }