diff --git a/.env b/.env index 6dcd355..bc5aa8c 100644 --- a/.env +++ b/.env @@ -56,4 +56,5 @@ PDF_SERVER_URL=http://localhost:8000 FILE_MAAL_PL_USER=git_operator FILE_MAAL_PL_PASSWORD=1FnwqcEgIUjQHjt1 -IMAGE_PREFIX=https://www.naluconcept.com # remove prefix to serv them from same host as presta \ No newline at end of file +IMAGE_PREFIX=https://www.naluconcept.com # remove prefix to serv them from same host as presta +CORS_ORGIN=https://www.naluconcept.com \ No newline at end of file diff --git a/app/api/openapi.json b/app/api/openapi.json index 37420fe..b01e771 100644 --- a/app/api/openapi.json +++ b/app/api/openapi.json @@ -11,8 +11,8 @@ }, "servers": [ { - "url": "http://localhost:3000", - "description": "Development server" + "url": "/", + "description": "Development server on same host" } ], "tags": [ diff --git a/app/config/config.go b/app/config/config.go index e5be538..f68d2fd 100644 --- a/app/config/config.go +++ b/app/config/config.go @@ -23,6 +23,7 @@ type Config struct { Pdf PdfPrinter GoogleTranslate GoogleTranslateConfig Image ImageConfig + Cors CorsConfig } type I18n struct { @@ -33,6 +34,10 @@ type ServerConfig struct { Host string `env:"SERVER_HOST,0.0.0.0"` } +type CorsConfig struct { + Origins []string `env:"CORS_ORGIN"` +} + type ImageConfig struct { ImagePrefix string `env:"IMAGE_PREFIX"` } @@ -176,6 +181,11 @@ func load() *Config { if err != nil { slog.Error("not possible to load env variables for google translate : ", err.Error(), "") } + + err = loadEnv(&cfg.Cors) + if err != nil { + slog.Error("not possible to load env variables for google translate : ", err.Error(), "") + } return cfg } diff --git a/app/delivery/middleware/cors.go b/app/delivery/middleware/cors.go index e52024b..f876769 100644 --- a/app/delivery/middleware/cors.go +++ b/app/delivery/middleware/cors.go @@ -1,11 +1,23 @@ package middleware -import "github.com/gofiber/fiber/v3" +import ( + "strings" + + "git.ma-al.com/goc_daniel/b2b/app/config" + "github.com/gofiber/fiber/v3" +) // CORSMiddleware creates CORS middleware func CORSMiddleware() fiber.Handler { return func(c fiber.Ctx) error { - c.Set("Access-Control-Allow-Origin", "*") + + if strings.Contains(c.Get("Host"), "localhost") { + c.Set("Access-Control-Allow-Origin", c.Get("Host")) + } else { + origins := strings.Join(config.Get().Cors.Origins, ",") + c.Set("Access-Control-Allow-Origin", origins) + } + c.Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS") c.Set("Access-Control-Allow-Headers", "Content-Type, Authorization") diff --git a/app/delivery/web/api/restricted/listProducts.go b/app/delivery/web/api/restricted/listProducts.go index 2478cc5..5f7b868 100644 --- a/app/delivery/web/api/restricted/listProducts.go +++ b/app/delivery/web/api/restricted/listProducts.go @@ -1,6 +1,8 @@ package restricted import ( + "fmt" + "git.ma-al.com/goc_daniel/b2b/app/config" "git.ma-al.com/goc_daniel/b2b/app/service/listProductsService" "git.ma-al.com/goc_daniel/b2b/app/utils/i18n" @@ -36,6 +38,64 @@ func ListProductsHandlerRoutes(r fiber.Router) fiber.Router { return r } +// var columnMapping map[string]string = map[string]string{ +// "product_id": "id", +// "price": "price_taxed", +// "name": "name", +// "category_id": "category_id", +// "feature_id": "feature_id", +// "feature": "feature_name", +// "value_id": "value_id", +// "value": "value_name", +// "status": "active_sale", +// "stock": "in_stock", +// } + +// type FeatVal = map[uint][]uint + +// func featureValueFilters(feats FeatVal) filters.Filter { +// filt := func(db *gorm.DB) *gorm.DB { +// return db.Where("value_id IN ?", lo.Flatten(lo.Values(feats))).Group("id").Having("COUNT(id) = ?", len(lo.Keys(feats))) +// } +// return filters.NewFilter(filters.FEAT_VAL_PRODUCT_FILTER, filt) +// } + +// func ParseProductFilters(c fiber.Ctx) (find.Paging, *filters.FiltersList, error) { +// var p find.Paging +// fl := filters.NewFiltersList() +// productFilters := new(model.ProductFilters) +// fmt.Printf("fl: %v\n", fl) +// err := c.Bind().Query(productFilters) +// if err != nil { +// return p, &fl, err +// } + +// if productFilters.Name != "" { +// fl.Append(filters.Where("name LIKE ?", fmt.Sprintf("%%%s%%", productFilters.Name))) +// } + +// if productFilters.Sort != "" { +// ord, err := query_params.ParseOrdering[model.Product](c, columnMapping) +// if err != nil { +// return p, &fl, err +// } +// for _, o := range ord { +// fl.Append(filters.Order(o.Column, o.IsDesc)) +// } +// } + +// if len(productFilters.Features) > 0 { +// fl.Append(featureValueFilters(productFilters.Features)) +// } + +// fl.Append(query_params.ParseWhereScopes[model.Product](c, []string{"name"}, columnMapping)...) + +// pageNum, pageElems := query_params.ParsePagination(c) +// p = find.Paging{Page: pageNum, Elements: pageElems} + +// return p, &fl, nil +// } + func (h *ListProductsHandler) GetListing(c fiber.Ctx) error { paging, filters, err := ParseProductFilters(c) if err != nil { @@ -64,6 +124,8 @@ func ParseProductFilters(c fiber.Ctx) (find.Paging, *filters.FiltersList, error) var p find.Paging fl := filters.NewFiltersList() + fmt.Printf("fl: %v\n", fl.All()) + pageNum, pageElems := query_params.ParsePagination(c) p = find.Paging{Page: pageNum, Elements: pageElems} diff --git a/app/delivery/web/general/swagger.go b/app/delivery/web/general/swagger.go index 9e0876c..e0a5cc0 100644 --- a/app/delivery/web/general/swagger.go +++ b/app/delivery/web/general/swagger.go @@ -47,6 +47,11 @@ var swaggerHTML = ` url: "/openapi.json", dom_id: '#swagger-ui', deepLinking: true, + withCredentials: true, + "servers": [ + { "url": "http://localhost:3000" }, + { "url": "http://localhost:5173" } + ], presets: [ SwaggerUIBundle.presets.apis, SwaggerUIStandalonePreset