diff --git a/api/base.go b/api/base.go index dd3b741..9234551 100644 --- a/api/base.go +++ b/api/base.go @@ -5,6 +5,7 @@ import ( "erp/api/response" "erp/api_errors" "erp/utils" + "fmt" "net/http" "github.com/pkg/errors" @@ -55,7 +56,7 @@ func (b *BaseController) ResponseList(c *gin.Context, message string, total *int } func (b *BaseController) ResponseError(c *gin.Context, err error) { - + fmt.Println(err.Error()) mas, ok := api_errors.MapErrorCodeMessage[err.Error()] var status int ginType := gin.ErrorTypePublic diff --git a/api/controllers/erp/product.go b/api/controllers/erp/product.go index 5c0e389..bac4664 100644 --- a/api/controllers/erp/product.go +++ b/api/controllers/erp/product.go @@ -27,7 +27,7 @@ func (b *ERPProductController) Create(c *gin.Context) { return } - req.StoreId = utils.GetStoreIDFromContext(c.Request.Context()) + //req.StoreId = utils.GetStoreIDFromContext(c.Request.Context()) res, err := b.productService.Create(c, req) if err != nil { @@ -83,5 +83,5 @@ func (b *ERPProductController) GetList(c *gin.Context) { b.ResponseError(c, err) return } - b.ResponseList(c, "success", total, res) + b.ResponseList(c, "success", &total, res) } diff --git a/api/middlewares/auth.go b/api/middlewares/auth.go index fe3f44d..ada2226 100644 --- a/api/middlewares/auth.go +++ b/api/middlewares/auth.go @@ -5,7 +5,6 @@ import ( "erp/api/response" "erp/api_errors" dto "erp/dto/auth" - "erp/models" "net/http" "strings" @@ -56,69 +55,69 @@ func (e *GinMiddleware) Auth(authorization bool) gin.HandlerFunc { return } - storeID := c.Request.Header.Get("x-store-id") - if storeID == "" { - c.Errors = append(c.Errors, &gin.Error{ - Err: errors.New(api_errors.ErrMissingXStoreID), - }) - - mas := api_errors.MapErrorCodeMessage[api_errors.ErrMissingXStoreID] - - c.AbortWithStatusJSON(mas.Status, response.ResponseError{ - Message: mas.Message, - Code: api_errors.ErrMissingXStoreID, - }) - return - } - c.Request = c.Request.WithContext(context.WithValue(c.Request.Context(), "x-store-id", storeID)) - - ur := new(models.UserRole) - if err = e.db.Model(models.UserRole{}).Where("user_id = ? AND store_id = ?", claims.Subject, storeID).First(ur).Error; err != nil { - c.Errors = append(c.Errors, &gin.Error{ - Err: errors.Wrap(err, "cannot find user role"), - }) - - mas := api_errors.MapErrorCodeMessage[api_errors.ErrUnauthorizedAccess] - - c.AbortWithStatusJSON(mas.Status, response.ResponseError{ - Message: mas.Message, - Code: api_errors.ErrUnauthorizedAccess, - }) - return - } - if ur.IsStoreOwner { - c.Next() - return - } - - role := new(models.Role) - if err = e.db.Model(models.Role{}).Where("id = ?", ur.RoleID).First(role).Error; err != nil { - c.Errors = append(c.Errors, &gin.Error{ - Err: errors.Wrap(err, "cannot find role"), - }) - - mas := api_errors.MapErrorCodeMessage[api_errors.ErrUnauthorizedAccess] - - c.AbortWithStatusJSON(mas.Status, response.ResponseError{ - Message: mas.Message, - Code: api_errors.ErrUnauthorizedAccess, - }) - return - } - up := new(models.Permission) - if err = e.db.Model(models.Permission{}).Where("role_id = ? AND route_path = ?", ur.RoleID, c.Request.URL.Path).First(up).Error; err != nil { - c.Errors = append(c.Errors, &gin.Error{ - Err: errors.Wrap(err, "cannot find permission"), - }) - - mas := api_errors.MapErrorCodeMessage[api_errors.ErrUnauthorizedAccess] - - c.AbortWithStatusJSON(mas.Status, response.ResponseError{ - Message: mas.Message, - Code: api_errors.ErrUnauthorizedAccess, - }) - return - } + //storeID := c.Request.Header.Get("x-store-id") + //if storeID == "" { + // c.Errors = append(c.Errors, &gin.Error{ + // Err: errors.New(api_errors.ErrMissingXStoreID), + // }) + // + // mas := api_errors.MapErrorCodeMessage[api_errors.ErrMissingXStoreID] + // + // c.AbortWithStatusJSON(mas.Status, response.ResponseError{ + // Message: mas.Message, + // Code: api_errors.ErrMissingXStoreID, + // }) + // return + //} + //c.Request = c.Request.WithContext(context.WithValue(c.Request.Context(), "x-store-id", storeID)) + + //ur := new(models.UserRole) + //if err = e.db.Model(models.UserRole{}).Where("user_id = ? AND store_id = ?", claims.Subject, storeID).First(ur).Error; err != nil { + // c.Errors = append(c.Errors, &gin.Error{ + // Err: errors.Wrap(err, "cannot find user role"), + // }) + // + // mas := api_errors.MapErrorCodeMessage[api_errors.ErrUnauthorizedAccess] + // + // c.AbortWithStatusJSON(mas.Status, response.ResponseError{ + // Message: mas.Message, + // Code: api_errors.ErrUnauthorizedAccess, + // }) + // return + //} + //if ur.IsStoreOwner { + // c.Next() + // return + //} + + //role := new(models.Role) + //if err = e.db.Model(models.Role{}).Where("id = ?", ur.RoleID).First(role).Error; err != nil { + // c.Errors = append(c.Errors, &gin.Error{ + // Err: errors.Wrap(err, "cannot find role"), + // }) + // + // mas := api_errors.MapErrorCodeMessage[api_errors.ErrUnauthorizedAccess] + // + // c.AbortWithStatusJSON(mas.Status, response.ResponseError{ + // Message: mas.Message, + // Code: api_errors.ErrUnauthorizedAccess, + // }) + // return + //} + //up := new(models.Permission) + //if err = e.db.Model(models.Permission{}).Where("role_id = ? AND route_path = ?", ur.RoleID, c.Request.URL.Path).First(up).Error; err != nil { + // c.Errors = append(c.Errors, &gin.Error{ + // Err: errors.Wrap(err, "cannot find permission"), + // }) + // + // mas := api_errors.MapErrorCodeMessage[api_errors.ErrUnauthorizedAccess] + // + // c.AbortWithStatusJSON(mas.Status, response.ResponseError{ + // Message: mas.Message, + // Code: api_errors.ErrUnauthorizedAccess, + // }) + // return + //} c.Next() } diff --git a/api/route/auth.go b/api/route/auth.go deleted file mode 100644 index 302e9f3..0000000 --- a/api/route/auth.go +++ /dev/null @@ -1,19 +0,0 @@ -package route - -import ( - controller "erp/api/controllers" - "erp/lib" -) - -type AuthRoutes struct { - handler *lib.Handler -} - -func NewAuthRoutes(handler *lib.Handler, controller *controller.AuthController) *AuthRoutes { - g := handler.Group("/auth") - g.POST("/register", controller.Register) - g.POST("/login", controller.Login) - return &AuthRoutes{ - handler: handler, - } -} diff --git a/api/route/erp/category.go b/api/route/erp/category.go deleted file mode 100644 index 55121f2..0000000 --- a/api/route/erp/category.go +++ /dev/null @@ -1,24 +0,0 @@ -package erproute - -import ( - erpcontroller "erp/api/controllers/erp" - "erp/api/middlewares" -) - -type CategoryRoutes struct { - handler *ERPHandler -} - -func NewCategoryRoutes(handler *ERPHandler, controller *erpcontroller.ERPCategoryController, middleware *middlewares.GinMiddleware) *CategoryRoutes { - g := handler.Group("/category") - - g.POST("/", middleware.Auth(true), controller.Create) - g.PUT("/", middleware.Auth(true), controller.Update) - g.GET("/", middleware.Auth(false), controller.GetList) - g.GET("/:id", middleware.Auth(false), controller.GetOne) - g.DELETE("/:id", middleware.Auth(true), controller.Delete) - - return &CategoryRoutes{ - handler: handler, - } -} diff --git a/api/route/erp/customer.go b/api/route/erp/customer.go deleted file mode 100644 index 703f1c8..0000000 --- a/api/route/erp/customer.go +++ /dev/null @@ -1,24 +0,0 @@ -package erproute - -import ( - erpcontroller "erp/api/controllers/erp" - "erp/api/middlewares" -) - -type CustomerRoutes struct { - handler *ERPHandler -} - -func NewCustomerRoutes(handler *ERPHandler, controller *erpcontroller.ERPCustomerController, middleware *middlewares.GinMiddleware) *CustomerRoutes { - g := handler.Group("/customer") - - g.GET("/", middleware.Auth(false), controller.ListCustomer) - g.GET("/:id", middleware.Auth(false), controller.CustomerDetail) - g.POST("/", middleware.Auth(false), controller.CreateCustomer) - g.PUT("/:id", middleware.Auth(false), controller.UpdateCustomer) - g.DELETE("/:id", middleware.Auth(false), controller.DeleteCustomer) - - return &CustomerRoutes{ - handler: handler, - } -} diff --git a/api/route/erp/employee_management.go b/api/route/erp/employee_management.go deleted file mode 100644 index 9147dea..0000000 --- a/api/route/erp/employee_management.go +++ /dev/null @@ -1,27 +0,0 @@ -package erproute - -import ( - erpcontroller "erp/api/controllers/erp" - "erp/api/middlewares" -) - -type employeeManagementRoutes struct { - handler *ERPHandler -} - -func NewEmployeeManagementRoutes(handler *ERPHandler, controller *erpcontroller.ERPEmployeeManagementController, middleware *middlewares.GinMiddleware) *employeeManagementRoutes { - g := handler.Group("/employee-management") - - p := g.Group("/permission") - p.GET("/", middleware.Auth(false), controller.ListPermission) - - r := g.Group("/role") - r.POST("/", middleware.Auth(true), controller.CreateRole) - - e := g.Group("/employee") - e.POST("/", middleware.Auth(true), controller.CreateEmployee) - - return &employeeManagementRoutes{ - handler: handler, - } -} diff --git a/api/route/erp/erp.go b/api/route/erp/erp.go deleted file mode 100644 index 6f42575..0000000 --- a/api/route/erp/erp.go +++ /dev/null @@ -1,17 +0,0 @@ -package erproute - -import ( - "erp/lib" - - "github.com/gin-gonic/gin" -) - -type ERPHandler struct { - *gin.RouterGroup -} - -func NewERPHandler(handler *lib.Handler) *ERPHandler { - return &ERPHandler{ - handler.Group("/erp"), - } -} diff --git a/api/route/erp/module.go b/api/route/erp/module.go deleted file mode 100644 index d1a9ac1..0000000 --- a/api/route/erp/module.go +++ /dev/null @@ -1,13 +0,0 @@ -package erproute - -import "go.uber.org/fx" - -var Module = fx.Options(fx.Provide(NewERPHandler), fx.Invoke( - NewEmployeeManagementRoutes, - NewStoreRoutes, - NewCategoryRoutes, - NewProductRoutes, - NewCustomerRoutes, - NewOrderRoutes, - NewPromoteRoutes, -)) diff --git a/api/route/erp/order.go b/api/route/erp/order.go deleted file mode 100644 index 2e09522..0000000 --- a/api/route/erp/order.go +++ /dev/null @@ -1,21 +0,0 @@ -package erproute - -import ( - erpcontroller "erp/api/controllers/erp" - "erp/api/middlewares" -) - -type OrderRoutes struct { - handler *ERPHandler -} - -func NewOrderRoutes(handler *ERPHandler, controller *erpcontroller.OrderController, middleware *middlewares.GinMiddleware) *OrderRoutes { - g := handler.Group("/orders") - - g.POST("/", middleware.Auth(true), controller.Create) - g.PUT("/", middleware.Auth(true), controller.Update) - - return &OrderRoutes{ - handler: handler, - } -} diff --git a/api/route/erp/product.go b/api/route/erp/product.go deleted file mode 100644 index 51c764f..0000000 --- a/api/route/erp/product.go +++ /dev/null @@ -1,24 +0,0 @@ -package erproute - -import ( - erpcontroller "erp/api/controllers/erp" - "erp/api/middlewares" -) - -type ProductRoutes struct { - handler *ERPHandler -} - -func NewProductRoutes(handler *ERPHandler, controller *erpcontroller.ERPProductController, middleware *middlewares.GinMiddleware) *ProductRoutes { - g := handler.Group("/products") - - g.POST("/", middleware.Auth(true), controller.Create) - g.PUT("/", middleware.Auth(true), controller.Update) - g.DELETE("/:id", middleware.Auth(true), controller.Delete) - g.GET("/:id", middleware.Auth(false), controller.GetOne) - g.GET("/", middleware.Auth(false), controller.GetList) - - return &ProductRoutes{ - handler: handler, - } -} diff --git a/api/route/erp/promote.go b/api/route/erp/promote.go deleted file mode 100644 index b86bf09..0000000 --- a/api/route/erp/promote.go +++ /dev/null @@ -1,20 +0,0 @@ -package erproute - -import ( - erpcontroller "erp/api/controllers/erp" - "erp/api/middlewares" -) - -type PromoteRoutes struct { - handler *ERPHandler -} - -func NewPromoteRoutes(handler *ERPHandler, controller *erpcontroller.PromoteController, middleware *middlewares.GinMiddleware) *PromoteRoutes { - g := handler.Group("/promote") - - g.POST("/", middleware.Auth(true), controller.Create) - - return &PromoteRoutes{ - handler: handler, - } -} diff --git a/api/route/erp/store.go b/api/route/erp/store.go deleted file mode 100644 index 7059562..0000000 --- a/api/route/erp/store.go +++ /dev/null @@ -1,23 +0,0 @@ -package erproute - -import ( - erpcontroller "erp/api/controllers/erp" - "erp/api/middlewares" -) - -type StoreRoutes struct { - handler *ERPHandler -} - -func NewStoreRoutes(handler *ERPHandler, controller *erpcontroller.ERPStoreController, middleware *middlewares.GinMiddleware) *StoreRoutes { - g := handler.Group("/store") - - g.POST("/", middleware.Auth(false), controller.CreateStore) - g.PUT("/", middleware.Auth(true), controller.UpdateStore) - g.GET("/", middleware.Auth(false), controller.ListStore) - g.DELETE("/", middleware.Auth(true), controller.DeleteStore) - - return &StoreRoutes{ - handler: handler, - } -} diff --git a/api/route/health.go b/api/route/health.go deleted file mode 100644 index ddf7b60..0000000 --- a/api/route/health.go +++ /dev/null @@ -1,20 +0,0 @@ -package route - -import ( - controller "erp/api/controllers" - "erp/lib" -) - -type HealthRoutes struct { - handler *lib.Handler -} - -func NewHealthRoutes(handler *lib.Handler, controller *controller.HealthController) *HealthRoutes { - g := handler.Group("/health") - - g.GET("/", controller.Health) - - return &HealthRoutes{ - handler: handler, - } -} diff --git a/api/route/module.go b/api/route/module.go deleted file mode 100644 index 3f55b01..0000000 --- a/api/route/module.go +++ /dev/null @@ -1,9 +0,0 @@ -package route - -import ( - erproute "erp/api/route/erp" - - "go.uber.org/fx" -) - -var Module = fx.Options(fx.Invoke(NewAuthRoutes, NewUserRoutes, NewHealthRoutes), erproute.Module) diff --git a/api/route/route.go b/api/route/route.go new file mode 100644 index 0000000..c89257b --- /dev/null +++ b/api/route/route.go @@ -0,0 +1,85 @@ +package route + +import ( + controller "erp/api/controllers" + erpcontroller "erp/api/controllers/erp" + "erp/api/middlewares" + "erp/lib" + "go.uber.org/fx" +) + +var Module = fx.Options(fx.Invoke( + NewRoute, +)) + +type Route struct { + handler *lib.Handler + categoryController *erpcontroller.ERPCategoryController + customerController *erpcontroller.ERPCustomerController + authController *controller.AuthController + employeeController *erpcontroller.ERPEmployeeManagementController + orderController *erpcontroller.OrderController + productController *erpcontroller.ERPProductController + promoteController *erpcontroller.PromoteController + storeController *erpcontroller.ERPStoreController + healthController *controller.HealthController + middleware *middlewares.GinMiddleware +} + +func NewRoute( + handler *lib.Handler, + categoryController *erpcontroller.ERPCategoryController, + customerController *erpcontroller.ERPCustomerController, + authController *controller.AuthController, + employeeController *erpcontroller.ERPEmployeeManagementController, + orderController *erpcontroller.OrderController, + productController *erpcontroller.ERPProductController, + promoteController *erpcontroller.PromoteController, + storeController *erpcontroller.ERPStoreController, + healthController *controller.HealthController, + middleware *middlewares.GinMiddleware, +) *Route { + + handler.POST("/v1/auth/register", authController.Register) + handler.POST("/v1/auth/login", authController.Login) + + handler.POST("/v1/product/", middleware.Auth(true), productController.Create) + handler.PUT("/v1/product/", middleware.Auth(true), productController.Update) + handler.DELETE("/v1/product/:id", middleware.Auth(true), productController.Delete) + handler.GET("/v1/product/:id", middleware.Auth(false), productController.GetOne) + handler.GET("/v1/product/", middleware.Auth(false), productController.GetList) + + handler.POST("/v1/category/", middleware.Auth(true), categoryController.Create) + handler.PUT("/v1/category/", middleware.Auth(true), categoryController.Update) + handler.GET("/v1/category/", middleware.Auth(false), categoryController.GetList) + handler.GET("/v1/category/:id", middleware.Auth(false), categoryController.GetOne) + handler.DELETE("/v1/category/:id", middleware.Auth(true), categoryController.Delete) + + handler.GET("/v1/customer/", middleware.Auth(false), customerController.ListCustomer) + handler.GET("/v1/customer/:id", middleware.Auth(false), customerController.CustomerDetail) + handler.POST("/v1/customer/", middleware.Auth(false), customerController.CreateCustomer) + handler.PUT("/v1/customer/:id", middleware.Auth(false), customerController.UpdateCustomer) + handler.DELETE("/v1/customer/:id", middleware.Auth(false), customerController.DeleteCustomer) + + handler.GET("/v1/permission/", middleware.Auth(false), employeeController.ListPermission) + + handler.POST("/v1/role/", middleware.Auth(true), employeeController.CreateRole) + + handler.POST("/v1/employee/", middleware.Auth(true), employeeController.CreateEmployee) + + handler.POST("/v1/order/", middleware.Auth(true), orderController.Create) + handler.PUT("/v1/order/", middleware.Auth(true), orderController.Update) + + handler.POST("/v1/promote/", middleware.Auth(true), promoteController.Create) + + handler.POST("/v1/store/", middleware.Auth(false), storeController.CreateStore) + handler.PUT("/v1/store/", middleware.Auth(true), storeController.UpdateStore) + handler.GET("/v1/store/", middleware.Auth(false), storeController.ListStore) + handler.DELETE("/v1/store/", middleware.Auth(true), storeController.DeleteStore) + + handler.GET("/v1/health/", healthController.Health) + + return &Route{ + handler: handler, + } +} diff --git a/api/route/user.go b/api/route/user.go deleted file mode 100644 index 1c33ef7..0000000 --- a/api/route/user.go +++ /dev/null @@ -1,14 +0,0 @@ -package route - -import "erp/lib" - -type UserRoutes struct { - handler *lib.Handler -} - -func NewUserRoutes(handler *lib.Handler) *UserRoutes { - _ = handler.Group("/user") - return &UserRoutes{ - handler: handler, - } -} diff --git a/api_errors/errors.go b/api_errors/errors.go index b407476..359bac2 100644 --- a/api_errors/errors.go +++ b/api_errors/errors.go @@ -37,6 +37,7 @@ var ( ErrPromoteCodeMaxUse = "10031" ErrPromoteCodeRequiredCustomer = "10032" ErrOrderStatus = "10033" + ErrRecordNotFound = "record not found" ) type MessageAndStatus struct { @@ -45,38 +46,17 @@ type MessageAndStatus struct { } var MapErrorCodeMessage = map[string]MessageAndStatus{ - ErrInternalServerError: {"Internal Server Error", http.StatusInternalServerError}, - ErrUnauthorizedAccess: {"Unauthorized Access", http.StatusUnauthorized}, - ErrTokenBadSignedMethod: {"Token Bad Signed Method", http.StatusUnauthorized}, - ErrTokenExpired: {"Token Expired", http.StatusUnauthorized}, - ErrTokenInvalid: {"Token Invalid", http.StatusUnauthorized}, - ErrTokenMalformed: {"Token Malformed", http.StatusUnauthorized}, - ErrUserNotFound: {"User Not Found", http.StatusNotFound}, - ErrProductNotFound: {"Product Not Found", http.StatusNotFound}, - ErrRequestTimeout: {"Request Timeout", http.StatusRequestTimeout}, - ErrTokenMissing: {"Token Missing", http.StatusUnauthorized}, - ErrValidation: {"Validation Error", http.StatusBadRequest}, - ErrInvalidUserID: {"Invalid User ID", http.StatusBadRequest}, - ErrMissingXStoreID: {"Missing x-store-id", http.StatusBadRequest}, - ErrPermissionDenied: {"Permission Denied", http.StatusForbidden}, - ErrInvalidPassword: {"Invalid Password", http.StatusBadRequest}, - ErrStoreNotFound: {"Store Not Found", http.StatusNotFound}, - ErrOrderItemRequired: {"Order Item Required", http.StatusBadRequest}, - ErrTypeInvalid: {"Only accept type 'percent' or 'amount'", http.StatusBadRequest}, - ErrNotFound: {"Status Not Found", http.StatusNotFound}, - ErrDateNotBetween: {"Date Not Between", http.StatusBadRequest}, - ErrTotalInvalid: {"Total request and calculated total are not matched", http.StatusBadRequest}, - ErrPaymentInvalid: {"Payment invalid", http.StatusBadRequest}, - ErrPromoteCodeExist: {"Promote code exist", http.StatusBadRequest}, - ErrDiscountPercentInvalid: {"Discount only accept 1 - 100 percent", http.StatusBadRequest}, - ErrDiscountAmountInvalid: {"Discount only accept > 0 and <= 100% value of order", http.StatusBadRequest}, - ErrDeliveryFeeInvalid: {"DeliveryFee is Invalid", http.StatusBadRequest}, - ErrOrderItemInvalid: {"OrderItem is invalid", http.StatusBadRequest}, - ErrPriceOfProductInvalid: {"Price of product is mismatched, please update price again", http.StatusBadRequest}, - ErrAmountIsNotMatched: {"Amount request and calculated amount are not matched", http.StatusBadRequest}, - ErrQuantityIsNotEnough: {"Quantity is not enough", http.StatusBadRequest}, - ErrProductInvalid: {"Product is invalid", http.StatusBadRequest}, - ErrPromoteCodeMaxUse: {"Promote code max used", http.StatusBadRequest}, - ErrPromoteCodeRequiredCustomer: {"Promote code is required customer", http.StatusBadRequest}, - ErrOrderStatus: {"Order status invalid", http.StatusBadRequest}, + ErrRecordNotFound: {"record not found", http.StatusNotFound}, + ErrRequestTimeout: {"Request Timeout", http.StatusRequestTimeout}, + ErrTokenMissing: {"Token Missing", http.StatusUnauthorized}, + ErrValidation: {"Validation Error", http.StatusBadRequest}, + ErrInvalidUserID: {"Invalid User ID", http.StatusBadRequest}, + ErrMissingXStoreID: {"Missing x-store-id", http.StatusBadRequest}, + ErrPermissionDenied: {"Permission Denied", http.StatusForbidden}, + ErrInvalidPassword: {"Invalid Password", http.StatusBadRequest}, + ErrStoreNotFound: {"Store Not Found", http.StatusNotFound}, + ErrOrderItemRequired: {"Order Item Required", http.StatusBadRequest}, + ErrTypeInvalid: {"Only accept type 'percent' or 'amount'", http.StatusBadRequest}, + ErrNotFound: {"Status Not Found", http.StatusNotFound}, + ErrDateNotBetween: {"Date Not Between", http.StatusBadRequest}, } diff --git a/dto/auth/login.go b/dto/auth/login.go index 2c1f824..c892291 100644 --- a/dto/auth/login.go +++ b/dto/auth/login.go @@ -3,9 +3,9 @@ package dto import uuid "github.com/satori/go.uuid" type LoginRequest struct { - Email string `json:"email" binding:"required" validate:"email"` - Password string `json:"password" binding:"required" validate:"min=6,max=20"` - RequestFrom string `json:"request_from" binding:"required" enums:"erp/,web,app"` + Email string `json:"email" binding:"required" validate:"email"` + Password string `json:"password" binding:"required" validate:"min=6,max=20"` + //RequestFrom string `json:"request_from" binding:"required" enums:"erp/,web,app"` } type LoginResponse struct { diff --git a/dto/auth/register.go b/dto/auth/register.go index 3a96e0a..8287d7b 100644 --- a/dto/auth/register.go +++ b/dto/auth/register.go @@ -1,9 +1,9 @@ package dto type RegisterRequest struct { - Email string `json:"email" binding:"required" validate:"email"` - Password string `json:"password" binding:"required" validate:"min=6,max=20"` - FirstName string `json:"first_name" binding:"required" validate:"min=1,max=50"` - LastName string `json:"last_name" binding:"required" validate:"min=1,max=50"` - RequestFrom string `json:"request_from" binding:"required" enums:"erp/,web,app"` + Email string `json:"email" binding:"required" validate:"email"` + Password string `json:"password" binding:"required" validate:"min=6,max=20"` + FirstName string `json:"first_name" binding:"required" validate:"min=1,max=50"` + LastName string `json:"last_name" binding:"required" validate:"min=1,max=50"` + //RequestFrom string `json:"request_from" binding:"required" enums:"erp/,web,app"` } diff --git a/dto/erp/product.go b/dto/erp/product.go index dfaae45..b953bdb 100644 --- a/dto/erp/product.go +++ b/dto/erp/product.go @@ -11,7 +11,7 @@ type CreateProductRequest struct { Description string `json:"description"` Image string `json:"image"` Price float64 `json:"price" binding:"required,numeric,gte=0"` // gte: greater than or equal - Status bool `json:"status"` + Status bool `json:"status"` // true: active, false: inactive Quantity *int `json:"quantity"` StoreId string } diff --git a/lib/server.go b/lib/server.go index e6869f4..52f7086 100644 --- a/lib/server.go +++ b/lib/server.go @@ -22,7 +22,7 @@ type Handler struct { func NewServerGroup(instance *gin.Engine) *Handler { return &Handler{ - instance.Group("/v1/api"), + instance.Group("/api/"), } } diff --git a/models/product.go b/models/product.go index e1f3b2a..1276aa6 100644 --- a/models/product.go +++ b/models/product.go @@ -1,18 +1,16 @@ package models -import uuid "github.com/satori/go.uuid" - type Product struct { BaseModel - Name string `json:"name" gorm:"column:name;type:varchar(50);not null"` - Description string `json:"description" gorm:"column:description;type:varchar(250);null"` - Image string `json:"image" gorm:"column:image;type:varchar(250);null"` - Price float64 `json:"price" gorm:"column:price;type:float;default:0;"` - Status bool `json:"status" gorm:"column:status;type:boolean;default:true;"` - Quantity *int `json:"quantity" gorm:"column:quantity;type:int;default:null;"` - StoreId uuid.UUID `json:"store_id" gorm:"column:store_id;type:uuid;not null"` - Sold int `json:"sold" gorm:"column:sold;type:int;default:0;"` - PromotePrice float64 `json:"promote_price" gorm:"column:promote_price;type:float;default:0;"` + Name string `json:"name" gorm:"column:name;type:varchar(50);not null"` + Description string `json:"description" gorm:"column:description;type:varchar(250);null"` + Image string `json:"image" gorm:"column:image;type:varchar(250);null"` + Price float64 `json:"price" gorm:"column:price;type:float;default:0;"` + Status bool `json:"status" gorm:"column:status;type:boolean;default:true;"` + Quantity *int `json:"quantity" gorm:"column:quantity;type:int;default:null;"` + //StoreId uuid.UUID `json:"store_id" gorm:"column:store_id;type:uuid;not null"` + Sold int `json:"sold" gorm:"column:sold;type:int;default:0;"` + PromotePrice float64 `json:"promote_price" gorm:"column:promote_price;type:float;default:0;"` } func (Product) TableName() string { diff --git a/repository/erp_product.go b/repository/erp_product.go index 58e3762..524514c 100644 --- a/repository/erp_product.go +++ b/repository/erp_product.go @@ -15,7 +15,7 @@ type ERPProductRepository interface { UpdateMulti(ctx context.Context, product []*models.Product) (err error) Delete(ctx context.Context, id string) (err error) GetOneByID(ctx context.Context, id string) (res *models.Product, err error) - GetList(ctx context.Context, product erpdto.GetListProductRequest) (res []*models.Product, total *int64, err error) + GetList(ctx context.Context, req erpdto.GetListProductRequest) (res []*models.Product, total int64, err error) GetListProductById(ctx context.Context, productIds []string, storeId string) (res []*models.Product, err error) } @@ -52,13 +52,13 @@ func (r *productRepo) Delete(ctx context.Context, id string) (err error) { func (r *productRepo) GetOneByID(ctx context.Context, id string) (res *models.Product, err error) { err = r.db.Where("id = ?", id).First(&res).Error - return res, errors.Wrap(err, "get product by id failed") + return res, err } -func (r *productRepo) GetList(ctx context.Context, req erpdto.GetListProductRequest) (res []*models.Product, total *int64, err error) { +func (r *productRepo) GetList(ctx context.Context, req erpdto.GetListProductRequest) (res []*models.Product, total int64, err error) { query := r.db.Model(&models.Product{}) if req.Search != "" { - query = query.Where("name like ?", "%"+req.Search+"%") + query = query.Where("name ilike ?", "%"+req.Search+"%") } switch req.Sort { @@ -66,8 +66,8 @@ func (r *productRepo) GetList(ctx context.Context, req erpdto.GetListProductRequ query = query.Order(req.Sort) } - if err = utils.QueryPagination(query, req.PageOptions, &res).Count(total).Error(); err != nil { - return nil, nil, errors.WithStack(err) + if err = utils.QueryPagination(query, req.PageOptions, &res).Count(&total).Error(); err != nil { + return nil, 0, errors.WithStack(err) } return res, total, err } diff --git a/service/auth.go b/service/auth.go index e9f12a3..3a447ff 100644 --- a/service/auth.go +++ b/service/auth.go @@ -4,7 +4,6 @@ import ( "context" "erp/api_errors" config "erp/config" - "erp/constants" dto "erp/dto/auth" models "erp/models" @@ -61,12 +60,12 @@ func (a *authService) Login(ctx context.Context, req dto.LoginRequest) (res *dto return nil, err } - if req.RequestFrom == string(constants.Erp) { - // account is not for erp will not have role id - if user.RoleID == nil { - return nil, errors.New(api_errors.ErrUnauthorizedAccess) - } - } + //if req.RequestFrom == string(constants.Erp) { + // // account is not for erp will not have role id + // if user.RoleID == nil { + // return nil, errors.New(api_errors.ErrUnauthorizedAccess) + // } + //} err = bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(req.Password)) diff --git a/service/erp/product.go b/service/erp/product.go index ccea8bb..90aad72 100644 --- a/service/erp/product.go +++ b/service/erp/product.go @@ -19,7 +19,7 @@ type ( UpdateMulti(tx *repository.TX, ctx context.Context, req []*models.Product) error Delete(ctx context.Context, id string) error GetOne(ctx context.Context, id string) (*models.Product, error) - GetList(ctx context.Context, req erpdto.GetListProductRequest) ([]*models.Product, *int64, error) + GetList(ctx context.Context, req erpdto.GetListProductRequest) ([]*models.Product, int64, error) GetListProductById(ctx context.Context, productIds []string, storeId string) ([]*models.Product, error) } productService struct { @@ -91,7 +91,7 @@ func (u *productService) GetOne(ctx context.Context, id string) (*models.Product return u.productRepo.GetOneByID(ctx, id) } -func (u *productService) GetList(ctx context.Context, req erpdto.GetListProductRequest) ([]*models.Product, *int64, error) { +func (u *productService) GetList(ctx context.Context, req erpdto.GetListProductRequest) ([]*models.Product, int64, error) { return u.productRepo.GetList(ctx, req) }