diff --git a/shoppingbasketapp/service/cart/entity.go b/domain/shoppingbasket/entity/entity.go similarity index 95% rename from shoppingbasketapp/service/cart/entity.go rename to domain/shoppingbasket/entity/entity.go index f3032daf..99cc6c96 100644 --- a/shoppingbasketapp/service/cart/entity.go +++ b/domain/shoppingbasket/entity/entity.go @@ -1,4 +1,4 @@ -package cart +package entity import ( "git.gocasts.ir/ebhomengo/niki/types" diff --git a/shoppingbasketapp/repository/cart.go b/domain/shoppingbasket/repository/cart.go similarity index 90% rename from shoppingbasketapp/repository/cart.go rename to domain/shoppingbasket/repository/cart.go index 7e45ce92..67b6c405 100644 --- a/shoppingbasketapp/repository/cart.go +++ b/domain/shoppingbasket/repository/cart.go @@ -4,8 +4,8 @@ import ( "context" "encoding/json" "fmt" + "git.gocasts.ir/ebhomengo/niki/domain/shoppingbasket/entity" richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error" - "git.gocasts.ir/ebhomengo/niki/shoppingbasketapp/service/cart" "git.gocasts.ir/ebhomengo/niki/types" "github.com/redis/go-redis/v9" "strconv" @@ -43,7 +43,7 @@ func (r Repo) itemKey(productID types.ID) string { return fmt.Sprintf("item:%d", productID) } -func (r Repo) AddItem(ctx context.Context, userID types.ID, item cart.Item) error { +func (r Repo) AddItem(ctx context.Context, userID types.ID, item entity.Item) error { const op = "shoppingbasketapp.repository.AddItem" cartKey := r.cartKey(userID) @@ -65,7 +65,7 @@ func (r Repo) AddItem(ctx context.Context, userID types.ID, item cart.Item) erro } else { existsItem, _ := r.client.HGet(ctx, cartKey, itemKey).Result() if existsItem != "" { - var i cart.Item + var i entity.Item if err := json.Unmarshal([]byte(existsItem), &i); err != nil { return richerror.New(op).WithKind(richerror.KindUnexpected).WithErr(err) } @@ -91,31 +91,31 @@ func parsInt(s string) int64 { return i } -func (r Repo) GetCart(ctx context.Context, userID types.ID) (cart.Cart, error) { +func (r Repo) GetCart(ctx context.Context, userID types.ID) (entity.Cart, error) { const op = "shoppingbasketapp.repository.GetCart" cartKey := r.cartKey(userID) exists, err := r.client.Exists(ctx, cartKey).Result() if err != nil { - return cart.Cart{}, richerror.New(op).WithKind(richerror.KindUnexpected).WithErr(err) + return entity.Cart{}, richerror.New(op).WithKind(richerror.KindUnexpected).WithErr(err) } if exists == 0 { - return cart.Cart{}, richerror.New(op).WithKind(richerror.KindNotFound).WithMessage("not found shopping basket") + return entity.Cart{}, richerror.New(op).WithKind(richerror.KindNotFound).WithMessage("not found shopping basket") } allCart, err := r.client.HGetAll(ctx, cartKey).Result() if err != nil { - return cart.Cart{}, richerror.New(op).WithKind(richerror.KindUnexpected).WithErr(err) + return entity.Cart{}, richerror.New(op).WithKind(richerror.KindUnexpected).WithErr(err) } - c := cart.Cart{Items: []cart.Item{}} + c := entity.Cart{Items: []entity.Item{}} for field, value := range allCart { if strings.HasPrefix(field, "item:") { - var i cart.Item + var i entity.Item if err := json.Unmarshal([]byte(value), &i); err != nil { - return cart.Cart{}, richerror.New(op).WithKind(richerror.KindUnexpected).WithErr(err) + return entity.Cart{}, richerror.New(op).WithKind(richerror.KindUnexpected).WithErr(err) } c.Items = append(c.Items, i) @@ -185,7 +185,7 @@ func (r Repo) UpdateQuantity(ctx context.Context, userID, productID types.ID, qu return richerror.New(op).WithKind(richerror.KindUnexpected).WithErr(err) } - var item cart.Item + var item entity.Item if err := json.Unmarshal([]byte(data), &item); err != nil { return richerror.New(op).WithKind(richerror.KindUnexpected).WithErr(err) } @@ -228,7 +228,7 @@ func (r Repo) updateTotalPrice(ctx context.Context, cartKey string) error { for field, value := range allFields { if strings.HasPrefix(field, "item:") { - var item cart.Item + var item entity.Item if err := json.Unmarshal([]byte(value), &item); err != nil { return richerror.New(op).WithKind(richerror.KindUnexpected).WithErr(err) diff --git a/shoppingbasketapp/service/cart/param.go b/domain/shoppingbasket/service/param.go similarity index 60% rename from shoppingbasketapp/service/cart/param.go rename to domain/shoppingbasket/service/param.go index 97d8a520..f8c589b9 100644 --- a/shoppingbasketapp/service/cart/param.go +++ b/domain/shoppingbasket/service/param.go @@ -1,6 +1,9 @@ -package cart +package service -import "git.gocasts.ir/ebhomengo/niki/types" +import ( + "git.gocasts.ir/ebhomengo/niki/domain/shoppingbasket/entity" + "git.gocasts.ir/ebhomengo/niki/types" +) type AddToCartRequest struct { UserID types.ID `json:"user_id"` @@ -11,11 +14,11 @@ type AddToCartRequest struct { } type GetCartResponse struct { - UserID types.ID `json:"user_id"` - Items []Item `json:"items"` - TotalPrice types.Price `json:"total_price"` - CreatedAt int64 `json:"created_at"` - ExpireAt int64 `json:"expire_at"` + UserID types.ID `json:"user_id"` + Items []entity.Item `json:"items"` + TotalPrice types.Price `json:"total_price"` + CreatedAt int64 `json:"created_at"` + ExpireAt int64 `json:"expire_at"` } type RemoveFromCartRequest struct { diff --git a/shoppingbasketapp/service/cart/service.go b/domain/shoppingbasket/service/service.go similarity index 91% rename from shoppingbasketapp/service/cart/service.go rename to domain/shoppingbasket/service/service.go index 1e2da37e..78a2dd1e 100644 --- a/shoppingbasketapp/service/cart/service.go +++ b/domain/shoppingbasket/service/service.go @@ -1,7 +1,8 @@ -package cart +package service import ( "context" + "git.gocasts.ir/ebhomengo/niki/domain/shoppingbasket/entity" "git.gocasts.ir/ebhomengo/niki/pkg/logger" richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error" "git.gocasts.ir/ebhomengo/niki/types" @@ -9,8 +10,8 @@ import ( ) type Repository interface { - AddItem(ctx context.Context, userID types.ID, item Item) error - GetCart(ctx context.Context, userID types.ID) (Cart, error) + AddItem(ctx context.Context, userID types.ID, item entity.Item) error + GetCart(ctx context.Context, userID types.ID) (entity.Cart, error) DeleteItem(ctx context.Context, userID, productID types.ID) error UpdateQuantity(ctx context.Context, userID, productID types.ID, quantity int) error DeleteCart(ctx context.Context, userID types.ID) error @@ -33,7 +34,7 @@ func (s Service) AddToBasket(ctx context.Context, req AddToCartRequest) error { return err } - return s.repo.AddItem(ctx, req.UserID, Item{ + return s.repo.AddItem(ctx, req.UserID, entity.Item{ ProductID: req.ProductID, Quantity: req.Quantity, Price: req.Price, diff --git a/shoppingbasketapp/service/cart/validator.go b/domain/shoppingbasket/service/validator.go similarity index 99% rename from shoppingbasketapp/service/cart/validator.go rename to domain/shoppingbasket/service/validator.go index 2ce4b2f7..8ab07773 100644 --- a/shoppingbasketapp/service/cart/validator.go +++ b/domain/shoppingbasket/service/validator.go @@ -1,4 +1,4 @@ -package cart +package service import ( richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error" diff --git a/shoppingbasketapp/app.go b/shoppingbasketapp/app.go index 2ce4df1e..6fca62d0 100644 --- a/shoppingbasketapp/app.go +++ b/shoppingbasketapp/app.go @@ -4,11 +4,12 @@ import ( "context" "fmt" "git.gocasts.ir/ebhomengo/niki/adapter/redis" + "git.gocasts.ir/ebhomengo/niki/domain/shoppingbasket/repository" + "git.gocasts.ir/ebhomengo/niki/domain/shoppingbasket/service" "git.gocasts.ir/ebhomengo/niki/pkg/httpserver" "git.gocasts.ir/ebhomengo/niki/pkg/logger" "git.gocasts.ir/ebhomengo/niki/shoppingbasketapp/delivery/http" - "git.gocasts.ir/ebhomengo/niki/shoppingbasketapp/repository" - "git.gocasts.ir/ebhomengo/niki/shoppingbasketapp/service/cart" + "git.gocasts.ir/ebhomengo/niki/shoppingbasketapp/delivery/http/cart" "os" "os/signal" "sync" @@ -17,8 +18,8 @@ import ( type Application struct { Repo repository.Repo - Service cart.Service - Handler http.Handler + Service service.Service + Handler cart.Handler Server http.Server Config Config } @@ -28,10 +29,10 @@ func Setup(ctx context.Context, cfg Config) (Application, error) { adapter := redis.New(cfg.Redis) repo := repository.New(adapter.Client(), cfg.Repo) - validator := cart.NewValidate() - svc := cart.New(validator, repo) + validator := service.NewValidate() + svc := service.New(validator, repo) - handler := http.NewHandler(svc) + handler := cart.NewHandler(svc) httpServer, err := httpserver.New(cfg.HTTPServer) if err != nil { diff --git a/shoppingbasketapp/delivery/http/handler.go b/shoppingbasketapp/delivery/http/cart/handler.go similarity index 90% rename from shoppingbasketapp/delivery/http/handler.go rename to shoppingbasketapp/delivery/http/cart/handler.go index f593c076..15e08310 100644 --- a/shoppingbasketapp/delivery/http/handler.go +++ b/shoppingbasketapp/delivery/http/cart/handler.go @@ -1,4 +1,4 @@ -package http +package cart import ( "git.gocasts.ir/ebhomengo/niki/pkg/claim" @@ -18,7 +18,7 @@ func NewHandler(svc cart.Service) Handler { return Handler{svc: svc} } -func (h Handler) addToBasket(c echo.Context) error { +func (h Handler) AddToBasket(c echo.Context) error { claims := claim.GetClaimsFromEchoContext(c) var req cart.AddToCartRequest @@ -37,7 +37,7 @@ func (h Handler) addToBasket(c echo.Context) error { return c.NoContent(http.StatusNoContent) } -func (h Handler) getCart(c echo.Context) error { +func (h Handler) GetCart(c echo.Context) error { claims := claim.GetClaimsFromEchoContext(c) res, err := h.svc.GetCart(c.Request().Context(), types.ID(claims.UserID)) @@ -49,7 +49,7 @@ func (h Handler) getCart(c echo.Context) error { return c.JSON(http.StatusOK, res) } -func (h Handler) removeCart(c echo.Context) error { +func (h Handler) RemoveCart(c echo.Context) error { claims := claim.GetClaimsFromEchoContext(c) if err := h.svc.ClearCart(c.Request().Context(), types.ID(claims.UserID)); err != nil { @@ -60,7 +60,7 @@ func (h Handler) removeCart(c echo.Context) error { return c.NoContent(http.StatusNoContent) } -func (h Handler) removeItem(c echo.Context) error { +func (h Handler) RemoveItem(c echo.Context) error { claims := claim.GetClaimsFromEchoContext(c) p := c.Param("productID") @@ -84,7 +84,7 @@ func (h Handler) removeItem(c echo.Context) error { return c.NoContent(http.StatusNoContent) } -func (h Handler) updateQuantity(c echo.Context) error { +func (h Handler) UpdateQuantity(c echo.Context) error { claims := claim.GetClaimsFromEchoContext(c) p := c.Param("productID") diff --git a/shoppingbasketapp/delivery/http/server.go b/shoppingbasketapp/delivery/http/server.go index cfe5fe8c..029d3789 100644 --- a/shoppingbasketapp/delivery/http/server.go +++ b/shoppingbasketapp/delivery/http/server.go @@ -3,14 +3,15 @@ package http import ( "context" "git.gocasts.ir/ebhomengo/niki/pkg/httpserver" + "git.gocasts.ir/ebhomengo/niki/shoppingbasketapp/delivery/http/cart" ) type Server struct { - handler Handler + handler cart.Handler HTTPServer *httpserver.Server } -func NewServer(handler Handler, hS *httpserver.Server) Server { +func NewServer(handler cart.Handler, hS *httpserver.Server) Server { return Server{handler: handler, HTTPServer: hS} } @@ -34,10 +35,10 @@ func (s Server) registerRoutes() { r := router.Group("shoppingbasket/cart") // Authentication is required - r.GET("/", s.handler.getCart) - r.DELETE("/", s.handler.removeCart) + r.GET("/", s.handler.GetCart) + r.DELETE("/", s.handler.RemoveCart) - r.POST("/items", s.handler.addToBasket) - r.DELETE("/items/:productID", s.handler.removeItem) - r.PUT("/items/:productID/:quantity", s.handler.updateQuantity) + r.POST("/items", s.handler.AddToBasket) + r.DELETE("/items/:productID", s.handler.RemoveItem) + r.PUT("/items/:productID/:quantity", s.handler.UpdateQuantity) }