package server import ( "database/sql" "log" "net/http" "github.com/gin-contrib/cors" "github.com/gin-gonic/gin" "github.com/spf13/viper" "simplycpq/controller" "simplycpq/repositories" "simplycpq/services" ) type HttpServer struct { config *viper.Viper router *gin.Engine dbHandler *sql.DB valueController *controller.ValueController productGroupController *controller.ProductGroupController productController *controller.ProductController bomController *controller.BOMController } func InitHttpServer(config *viper.Viper, dbHandler *sql.DB) HttpServer { // repository initialisation: valueRepository := repositories.NewValueRepository(dbHandler) productGroupRepository := repositories.NewProductGroupRepository(dbHandler, valueRepository) productRepository := repositories.NewProductRepository(dbHandler, productGroupRepository, valueRepository) importRepository := repositories.NewImportRepository(dbHandler, productGroupRepository, productRepository, valueRepository) bomRepository := repositories.NewBOMRepository(dbHandler, productRepository) // service initialisation: valueService := services.NewValueService(valueRepository) productGroupService := services.NewProductGroupService(productGroupRepository) productService := services.NewProductService(productRepository) importService := services.NewImportService(importRepository) bomService := services.NewBOMService(bomRepository) // controller initialisation: valueController := controller.NewValueController(valueService) productGroupController := controller.NewProductGroupController(productGroupService, valueService) productController := controller.NewProductController(productService, productGroupService, valueService) bomController := controller.NewBOMController(bomService) importController := controller.NewImportController(importService) // Service API router := gin.Default() router.Use(cors.Default()) router.GET("/test", Test) // Value centric routing router.POST("/createPropertyTypeGroup", valueController.CreatePropertyTypeGroup) // create PropertyTypeGroup router.PUT("/updatePropertyTypeGroup", valueController.UpdatePropertyTypeGroup) // update PropertyTypeGroup router.DELETE("/deletePropertyTypeGroup/:id", valueController.DeletePropertyTypeGroup) // delete PropertyTypeGroup router.GET("/getPropertyTypeGroup/:id", valueController.GetPropertyTypeGroup) // get PropertyTypeGroup by id router.GET("/getPropertyTypeGroupsByParentId/:parentId", valueController.GetPropertyTypeGroupsByParentId) // get all PropertyTypeGroups by parent ID router.DELETE("/deletePropertyTypeFromPropertyTypeGroupId/:propertyTypeGroupId", valueController.DeletePropertyTypeFromPropertyTypeGroupId) // delete PropertyType from PropertyTypeGroup by ID router.POST("/createPropertyType", valueController.CreatePropertyType) // create PropertyType router.PUT("/updatePropertyType", valueController.UpdatePropertyType) // update PropertyType router.DELETE("/deletePropertyType/:id", valueController.DeletePropertyType) // delete PropertyType router.GET("/getPropertyType/:id", valueController.GetPropertyType) // get PropertyType by id router.GET("/getPropertyTypesByGroupId/:groupId", valueController.GetPropertyTypesByGroupId) // get all PropertyTypes by group ID router.POST("/createValueForPropertyTypeId/:propertyTypeId", valueController.CreateValueForPropertyTypeId) // create Value for PropertyType by ID router.DELETE("/deleteValueFromPropertyTypeId/:propertyTypeId", valueController.DeleteValueFromPropertyTypeId) // delete Value from PropertyType by ID router.GET("/getValuesFromPropertyTypeId/:propertyTypeId", valueController.GetValuesFromPropertyTypeId) // get all Values from PropertyType by ID router.GET("/getValuesFromPropertyId/:propertyId", valueController.GetValuesFromPropertyId) // get all Values from Property by ID router.DELETE("/deleteValueFromPropertyId/:valueId/:propertyId", valueController.DeleteValueFromPropertyId) // delete Value from Property by ID router.GET("/getValue/:id", valueController.GetValue) router.POST("/SetTerminalValueForProperty/:propertyId/:value", valueController.SetTerminalValueForProperty) // set Terminal Value for Property // Product centric routing // ProductGroup router.POST("/createProductGroup", productGroupController.CreateProductGroup) // create ProductGroup router.PUT("/updateProductGroup", productGroupController.UpdateProductGroup) // update ProductGroup router.DELETE("/deleteProductGroup/:id", productGroupController.DeleteProductGroup) // delete ProductGroup router.GET("/getProductGroup/:id", productGroupController.GetProductGroup) // get ProductGroup by id router.GET("/getProductGroupsByParentId/:parentId", productGroupController.GetProductGroupsByParentId) // get all ProductGroups by parent ID router.DELETE("/deleteProductFromProductGroupId/:productId", productGroupController.DeleteProductFromProductGroupId) // delete Product from ProductGroup by ID router.POST("/getPropertiesFromProductGroupId/:productGroupId", productGroupController.GetPropertiesFromProductGroupId) // get Properties from ProductGroup by ID router.DELETE("/deletePropertyFromProductGroupId/:propertyId/:productGroupId", productGroupController.DeletePropertyFromProductGroupId) // delete Property from ProductGroup by ID router.GET("/createPropertyToProductGroupId/:propertyTypeId/:productGroupId", productGroupController.CreatePropertyToProductGroupId) // add Property to ProductGroup by ID router.POST("/createTerminalPropertyForProductGroupId/:productGroupId/:propertyTypeId/:value", valueController.CreateTerminalPropertyForProductGroupId) // create Terminal Property for ProductGroup by ID router.POST("/createTerminalPropertyForProductId/:productId/:propertyTypeId/:value", valueController.CreateTerminalPropertyForProductId) // create Terminal Property for Product by ID // Product router.POST("/createProduct", productController.CreateProduct) // create Product router.PUT("/updateProduct", productController.UpdateProduct) // update Product router.DELETE("/deleteProduct/:id", productController.DeleteProduct) // delete Product router.GET("/getProduct/:id", productController.GetProduct) // get Product by id router.GET("/getProductsByGroupId/:groupId", productController.GetProductsByGroupId) // get all Products by group ID router.GET("/getPropertiesFromProductId/:productId", productController.GetPropertiesFromProductId) // get Properties from ProductGroup by ID router.POST("/addPropertyToProductId/:productId", productController.AddPropertyToProductId) // add Property to Product by ID router.DELETE("/deletePropertyFromProductId/:productId", productController.DeletePropertyFromProductId) // delete Property from Product by ID // BOM centric routing router.POST("/createBillOfMaterial", bomController.CreateBillOfMaterial) router.PUT("/updateBillOfMaterial", bomController.UpdateBillOfMaterial) router.DELETE("/deleteBillOfMaterial/:id", bomController.DeleteBillOfMaterial) router.GET("/getBillOfMaterial/:id", bomController.GetBillOfMaterial) router.GET("/getBOMProductsByBOMId/:bomId", bomController.GetBOMProductsByBOMId) // get all BOMContents by BOM ID router.GET("/getBOMVariantNodesByBOMId/:bomId", bomController.GetBOMVariantNodesByBOMId) // get all VariantNodes by BOM ID router.POST("/createVariantNode/:bomId", bomController.CreateVariantNode) router.PUT("/updateVariantNode", bomController.UpdateVariantNode) router.DELETE("/deleteVariantNode/:id", bomController.DeleteVariantNode) router.GET("/getVariantNode/:id", bomController.GetVariantNode) router.GET("/getVariantNodeProductsByVariantNodeId/:variantNodeId", bomController.GetVariantNodeProductsByVariantNodeId) // Import functionality router.POST("/importPropertyTypeGroups", importController.ImportPropertyTypeGroups) // import PropertyTypeGroups router.POST("/importProductGroups", importController.ImportProductGroups) // import ProductGroups // router.POST("/importProducts", importController.ImportProducts) // import Products // server return HttpServer{ config: config, router: router, dbHandler: dbHandler, valueController: valueController, productGroupController: productGroupController, productController: productController, } } func (hs HttpServer) Start() { err := hs.router.Run(hs.config.GetString("http.server_address")) if err != nil { log.Fatalf("Error while starting HTTP server: %v", err) } } func Test(ctx *gin.Context) { ctx.JSON(http.StatusOK, gin.H{ "message": "Test", }) }