diff --git a/cmd/mercadona.go b/cmd/mercadona.go new file mode 100644 index 0000000..de97f41 --- /dev/null +++ b/cmd/mercadona.go @@ -0,0 +1,61 @@ +package cmd + +import ( + "flag" + "net/http" + "os" + "os/signal" + "syscall" + + "github.com/julienschmidt/httprouter" + + "git.espin.casa/albert/logger" + "git.espin.casa/albert/mercadona/internal/client" + "git.espin.casa/albert/mercadona/internal/routes" +) + +func Run() error { + // setup flags + apiAddr := flag.String("api-addr", "localhost:3000", "REST API server address") + logLevel := flag.String("level", "debug", "Log level") + flag.Parse() + // logfields + logFields := logger.LogFields{} + + // setup logger + log := logger.New(os.Stdout, *logLevel) + // create router + router := httprouter.New() + client := client.NewClient() + routes.CreateRoutes(router, client) + // start http server + go func() { + http.ListenAndServe(*apiAddr, router) + }() + // info banner + log.Info("started Mercadona api service", logFields) + // wait signal to finish + signal := WaitSignal() + log.Info("signal received", logFields.Add(logger.LogFields{ + "signal": signal, + })) + return nil +} + +// WaitSignal catching exit signal +func WaitSignal() os.Signal { + ch := make(chan os.Signal, 2) + signal.Notify( + ch, + syscall.SIGINT, + syscall.SIGQUIT, + syscall.SIGTERM, + ) + for { + sig := <-ch + switch sig { + case syscall.SIGINT, syscall.SIGQUIT, syscall.SIGTERM: + return sig + } + } +} diff --git a/go.mod b/go.mod index 02afd6d..8a7006e 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,13 @@ module git.espin.casa/albert/mercadona go 1.24.0 + +require ( + git.espin.casa/albert/logger v1.0.0 + github.com/julienschmidt/httprouter v1.3.0 +) + +require ( + github.com/sirupsen/logrus v1.9.3 // indirect + golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..4714dc2 --- /dev/null +++ b/go.sum @@ -0,0 +1,19 @@ +git.espin.casa/albert/logger v1.0.0 h1:DF+SwwkptiZBiB1HUIPcKRRoLuUC7fVUfnF/I9p5Cj4= +git.espin.casa/albert/logger v1.0.0/go.mod h1:TXbZ7mayDtJvcs+DucVbs2klio9jq5k1eWFZ2wxgRGM= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 h1:0A+M6Uqn+Eje4kHMK80dtF3JCXC4ykBgQG4Fe06QRhQ= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/internal/client/client.go b/internal/client/client.go new file mode 100644 index 0000000..9391d82 --- /dev/null +++ b/internal/client/client.go @@ -0,0 +1,56 @@ +package client + +import ( + "context" + "encoding/json" + "fmt" + "io" + "net/http" + + "git.espin.casa/albert/mercadona/pkg/types/mercadona" +) + +const ( + BaseURL string = "https://tienda.mercadona.es" +) + +type IMercadona interface { + // Get Mercadona products based on barcode scanned id + GetMercadonaProduct(ctx context.Context, id string) (*mercadona.Product, error) +} + +type client struct{ url string } + +// GetMercadonaProduct implements IMercadona. +func (c client) GetMercadonaProduct(ctx context.Context, id string) (*mercadona.Product, error) { + // product holder + product := &mercadona.Product{} + // crate url endpoint + url := fmt.Sprintf("%s/api/products/%s/xselling/?lang=es&wh=bcn1&exclude=", BaseURL, id) + // create http Get Request + resp, err := http.Get(url) + // check if error + if err != nil { + return nil, err + } + // close body response + defer resp.Body.Close() + // read body response + body, err := io.ReadAll(resp.Body) + // check if error on read body + if err != nil { + return nil, err + } + // unmarshal json body response + if err := json.Unmarshal(body, product); err != nil { + return nil, err + } + return product, nil +} + +func NewClient() IMercadona { + url := BaseURL + return client{ + url: url, + } +} diff --git a/internal/handlers/product.go b/internal/handlers/product.go new file mode 100644 index 0000000..44db980 --- /dev/null +++ b/internal/handlers/product.go @@ -0,0 +1,14 @@ +package handlers + +import ( + "net/http" + + "git.espin.casa/albert/mercadona/internal/client" + "github.com/julienschmidt/httprouter" +) + +func GetMercadonaProduct(client client.IMercadona) httprouter.Handle { + return func(w http.ResponseWriter, r *http.Request, p httprouter.Params) { + + } +} diff --git a/internal/routes/routes.go b/internal/routes/routes.go new file mode 100644 index 0000000..fa6e722 --- /dev/null +++ b/internal/routes/routes.go @@ -0,0 +1,11 @@ +package routes + +import ( + "git.espin.casa/albert/mercadona/internal/client" + "git.espin.casa/albert/mercadona/internal/handlers" + "github.com/julienschmidt/httprouter" +) + +func CreateRoutes(r *httprouter.Router, client client.IMercadona) { + r.GET("/mercadona/product/:id", handlers.GetMercadonaProduct(client)) +} diff --git a/main.go b/main.go new file mode 100644 index 0000000..5f3f9f8 --- /dev/null +++ b/main.go @@ -0,0 +1,13 @@ +package main + +import ( + "os" + + "git.espin.casa/albert/mercadona/cmd" +) + +func main() { + if err := cmd.Run(); err != nil { + os.Exit(1) + } +} diff --git a/pkg/types/mercadona/categories.go b/pkg/types/mercadona/category.go similarity index 100% rename from pkg/types/mercadona/categories.go rename to pkg/types/mercadona/category.go