Merge branch 'develop' into campaign

This commit is contained in:
hossein 2026-04-22 15:43:59 +00:00
commit b8a9460e69
10 changed files with 60 additions and 54 deletions

View File

@ -1,4 +1,4 @@
package cart
package entity
import (
"git.gocasts.ir/ebhomengo/niki/types"

View File

@ -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)

View File

@ -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"`
@ -12,7 +15,7 @@ type AddToCartRequest struct {
type GetCartResponse struct {
UserID types.ID `json:"user_id"`
Items []Item `json:"items"`
Items []entity.Item `json:"items"`
TotalPrice types.Price `json:"total_price"`
CreatedAt int64 `json:"created_at"`
ExpireAt int64 `json:"expire_at"`

View File

@ -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,

View File

@ -1,4 +1,4 @@
package cart
package service
import (
richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error"

View File

@ -3,10 +3,10 @@ package purchaseapp
import (
"context"
"fmt"
purchaseMysql "git.gocasts.ir/ebhomengo/niki/domain/purchase/repository/mysql"
purchaseMysql "git.gocasts.ir/ebhomengo/niki/domain/order/repository/mysql"
purchaseService "git.gocasts.ir/ebhomengo/niki/domain/order/service"
purchaseHTTP "git.gocasts.ir/ebhomengo/niki/purchaseapp/delivery/http"
purchaseHandler "git.gocasts.ir/ebhomengo/niki/purchaseapp/delivery/http/order"
purchaseService "git.gocasts.ir/ebhomengo/niki/purchaseapp/service/order"
"git.gocasts.ir/ebhomengo/niki/repository/mysql"
)

View File

@ -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 {

View File

@ -2,9 +2,9 @@ package shoppingbasketapp
import (
"git.gocasts.ir/ebhomengo/niki/adapter/redis"
"git.gocasts.ir/ebhomengo/niki/domain/shoppingbasket/repository"
"git.gocasts.ir/ebhomengo/niki/pkg/httpserver"
logger "git.gocasts.ir/ebhomengo/niki/pkg/logger"
"git.gocasts.ir/ebhomengo/niki/shoppingbasketapp/repository"
)
type Config struct {

View File

@ -1,9 +1,9 @@
package http
package cart
import (
"git.gocasts.ir/ebhomengo/niki/domain/shoppingbasket/service"
"git.gocasts.ir/ebhomengo/niki/pkg/claim"
httpmsg "git.gocasts.ir/ebhomengo/niki/pkg/http_msg"
"git.gocasts.ir/ebhomengo/niki/shoppingbasketapp/service/cart"
"git.gocasts.ir/ebhomengo/niki/types"
"github.com/labstack/echo/v4"
"net/http"
@ -11,17 +11,17 @@ import (
)
type Handler struct {
svc cart.Service
svc service.Service
}
func NewHandler(svc cart.Service) Handler {
func NewHandler(svc service.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
var req service.AddToCartRequest
if err := c.Bind(&req); err != nil {
return c.JSON(http.StatusBadRequest, map[string]string{
"error": "invalid request body",
@ -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")
@ -71,7 +71,7 @@ func (h Handler) removeItem(c echo.Context) error {
})
}
var req cart.RemoveFromCartRequest
var req service.RemoveFromCartRequest
req.UserID = types.ID(claims.UserID)
req.ProductID = types.ID(pID)
@ -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")
@ -103,7 +103,7 @@ func (h Handler) updateQuantity(c echo.Context) error {
})
}
var req cart.UpdateQuantityRequest
var req service.UpdateQuantityRequest
req.UserID = types.ID(claims.UserID)
req.ProductID = types.ID(pID)
req.Quantity = q

View File

@ -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)
}