diff --git a/.github/labeler.yml b/.github/labeler.yml index b292ead..35e71ba 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -22,7 +22,7 @@ pkg: - pkg/**/* mocks: -- internal/app/mocks/* +- internal/mocks/* changelog: - CHANGELOG.md diff --git a/Makefile b/Makefile index a27f4ed..b766d2c 100644 --- a/Makefile +++ b/Makefile @@ -20,19 +20,19 @@ decrypt-gpg: @gpg -d .env.gpg mock-gen: - @mockgen -source=./internal/app/ports/auth_ports.go -destination=./internal/app/mocks/mocks_auth.go -package=mocks - @mockgen -source=./internal/app/ports/user_ports.go -destination=./internal/app/mocks/mocks_user.go -package=mocks + @mockgen -source=./internal/core/ports/auth_ports.go -destination=./internal/mocks/mocks_auth.go -package=mocks + @mockgen -source=./internal/core/ports/user_ports.go -destination=./internal/mocks/mocks_user.go -package=mocks changelog-gen: @auto-changelog # Target to apply migrations up: - @goose -dir=./database/migrations mysql "root@tcp(localhost:3306)/db_pos?parseTime=true" up + @goose -dir=./internal/database/migrations mysql "root@tcp(localhost:3306)/db_pos?parseTime=true" up # Target to reset migrations (if needed) down: - @goose -dir=./database/migrations mysql "root@tcp(localhost:3306)/db_pos?parseTime=true" reset + @goose -dir=./internal/database/migrations mysql "root@tcp(localhost:3306)/db_pos?parseTime=true" reset status: - @goose -dir=./database/migrations mysql "root@tcp(localhost:3306)/db_pos?parseTime=true" status + @goose -dir=./internal/database/migrations mysql "root@tcp(localhost:3306)/db_pos?parseTime=true" status diff --git a/README.md b/README.md index 6d031af..717041b 100644 --- a/README.md +++ b/README.md @@ -4,9 +4,17 @@ This project provides simple REST APIs for Point of Sale (POS) software. ## Built With - Go 1.21.3 - MySQL -- Fiber - JWT Authentication -- DB Migration Goose + +## Frameworks and Library +- Fiber: HTTP Framework +- Goose: Database Migrations +- SQLX: Database ORM +- Validator V10: Struct Validation +- Logrus: Application Logging +- Jaeger: Opentracing +- Cleanenv: Environment Configuration +- Mockgen: Mock Generation ## How to Run the Project diff --git a/cmd/main.go b/cmd/main.go index 042f209..6423c71 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -4,24 +4,21 @@ import ( "context" "os" "os/signal" - "sync" "syscall" "github.com/voltgizerz/POS-restaurant/config" - "github.com/voltgizerz/POS-restaurant/database" - "github.com/voltgizerz/POS-restaurant/internal/app/api" - "github.com/voltgizerz/POS-restaurant/internal/app/api/handler" - "github.com/voltgizerz/POS-restaurant/internal/app/api/middleware" - "github.com/voltgizerz/POS-restaurant/internal/app/auth" - "github.com/voltgizerz/POS-restaurant/internal/app/interactor" - "github.com/voltgizerz/POS-restaurant/internal/app/repository" - "github.com/voltgizerz/POS-restaurant/internal/app/service" + "github.com/voltgizerz/POS-restaurant/internal/adapters/api" + "github.com/voltgizerz/POS-restaurant/internal/adapters/api/handler" + "github.com/voltgizerz/POS-restaurant/internal/adapters/api/middleware" + "github.com/voltgizerz/POS-restaurant/internal/adapters/auth" + "github.com/voltgizerz/POS-restaurant/internal/adapters/repository" + "github.com/voltgizerz/POS-restaurant/internal/core/interactor" + "github.com/voltgizerz/POS-restaurant/internal/core/service" + "github.com/voltgizerz/POS-restaurant/internal/database" "github.com/voltgizerz/POS-restaurant/pkg/jeager" "github.com/voltgizerz/POS-restaurant/pkg/logger" ) -var wg sync.WaitGroup - func main() { logger.Init() @@ -48,8 +45,8 @@ func main() { } // Initialize Repositories + txRepo := repository.NewTxRepository(repoOpts) userRepo := repository.NewUserRepository(repoOpts) - menuRepo := repository.NewMenuRepository(repoOpts) // Initialize Services @@ -59,6 +56,7 @@ func main() { }) menuService := service.NewMenuService(interactor.MenuService{ + TxRepository: txRepo, MenuRepository: menuRepo, }) diff --git a/internal/app/api/handler/response.go b/internal/adapters/api/common/response.go similarity index 83% rename from internal/app/api/handler/response.go rename to internal/adapters/api/common/response.go index f2d7ee1..8c226d7 100644 --- a/internal/app/api/handler/response.go +++ b/internal/adapters/api/common/response.go @@ -1,18 +1,18 @@ -package handler +package common import ( "github.com/gofiber/fiber/v3" - "github.com/voltgizerz/POS-restaurant/internal/app/constants" + "github.com/voltgizerz/POS-restaurant/internal/constants" ) type ( - errorResponse struct { + ErrorResponse struct { Success bool `json:"success"` Message string `json:"message"` RequestID string `json:"request_id"` } - successResponse struct { + SuccessResponse struct { Success bool `json:"success"` Message string `json:"message"` Data interface{} `json:"data"` @@ -22,7 +22,7 @@ type ( // SendErrorResp generates and sends error response func SendErrorResp(c fiber.Ctx, statusCode int, errorMessage string) error { - response := errorResponse{ + response := ErrorResponse{ Success: false, Message: errorMessage, RequestID: c.Locals(constants.CTXKeyRequestID).(string), @@ -33,7 +33,7 @@ func SendErrorResp(c fiber.Ctx, statusCode int, errorMessage string) error { // SendSuccessResp generates and sends success response with dynamic data func SendSuccessResp(c fiber.Ctx, statusCode int, message string, data interface{}) error { - response := successResponse{ + response := SuccessResponse{ Success: true, Message: message, Data: data, diff --git a/internal/app/api/handler/auth_handler.go b/internal/adapters/api/handler/auth_handler.go similarity index 57% rename from internal/app/api/handler/auth_handler.go rename to internal/adapters/api/handler/auth_handler.go index 975735c..ddf4c13 100644 --- a/internal/app/api/handler/auth_handler.go +++ b/internal/adapters/api/handler/auth_handler.go @@ -7,10 +7,11 @@ import ( "github.com/gofiber/fiber/v3" "github.com/opentracing/opentracing-go" - "github.com/voltgizerz/POS-restaurant/internal/app/constants" - "github.com/voltgizerz/POS-restaurant/internal/app/entity" - "github.com/voltgizerz/POS-restaurant/internal/app/interactor" - "github.com/voltgizerz/POS-restaurant/internal/app/ports" + "github.com/voltgizerz/POS-restaurant/internal/adapters/api/common" + "github.com/voltgizerz/POS-restaurant/internal/constants" + "github.com/voltgizerz/POS-restaurant/internal/core/entity" + "github.com/voltgizerz/POS-restaurant/internal/core/interactor" + "github.com/voltgizerz/POS-restaurant/internal/core/ports" "github.com/voltgizerz/POS-restaurant/internal/utils" ) @@ -32,26 +33,26 @@ func (h *AuthHandler) Login(c fiber.Ctx) error { err := c.Bind().Body(req) if err != nil { - return SendErrorResp(c, fiber.StatusBadRequest, constants.ErrMsgInvalidUsernameAndPassword) + return common.SendErrorResp(c, fiber.StatusBadRequest, constants.ErrMsgInvalidUsernameAndPassword) } err = validator.New().StructCtx(ctx, req) if err != nil { err = utils.GetFirstValidatorError(err) - return SendErrorResp(c, fiber.StatusBadRequest, err.Error()) + return common.SendErrorResp(c, fiber.StatusBadRequest, err.Error()) } dataLogin, err := h.authService.Login(ctx, req.Username, req.Password) if err != nil { if err == sql.ErrNoRows { - return SendErrorResp(c, fiber.StatusUnauthorized, constants.ErrMsgUsernameNotFound) + return common.SendErrorResp(c, fiber.StatusUnauthorized, constants.ErrMsgUsernameNotFound) } - return SendErrorResp(c, fiber.StatusUnauthorized, constants.ErrMsgInvalidUsernameOrPassword) + return common.SendErrorResp(c, fiber.StatusUnauthorized, constants.ErrMsgInvalidUsernameOrPassword) } - return SendSuccessResp(c, fiber.StatusOK, "Success", dataLogin) + return common.SendSuccessResp(c, fiber.StatusOK, "Success", dataLogin) } func (h *AuthHandler) Register(c fiber.Ctx) error { @@ -62,18 +63,18 @@ func (h *AuthHandler) Register(c fiber.Ctx) error { err := c.Bind().Body(req) if err != nil { - return SendErrorResp(c, fiber.StatusBadRequest, "Invalid request body.") + return common.SendErrorResp(c, fiber.StatusBadRequest, "Invalid request body.") } err = validator.New().StructCtx(ctx, req) if err != nil { err = utils.GetFirstValidatorError(err) - return SendErrorResp(c, fiber.StatusBadRequest, err.Error()) + return common.SendErrorResp(c, fiber.StatusBadRequest, err.Error()) } if req.Password != req.ConfirmPassword { - return SendErrorResp(c, fiber.StatusBadRequest, "Password mismatch") + return common.SendErrorResp(c, fiber.StatusBadRequest, "Password mismatch") } userData := &entity.User{ @@ -85,12 +86,12 @@ func (h *AuthHandler) Register(c fiber.Ctx) error { result, err := h.authService.Register(ctx, *userData) if err != nil { - return SendErrorResp(c, fiber.StatusBadRequest, err.Error()) + return common.SendErrorResp(c, fiber.StatusBadRequest, err.Error()) } res := map[string]int64{ "user_id": result, } - return SendSuccessResp(c, fiber.StatusCreated, "Account created succesfully.", res) + return common.SendSuccessResp(c, fiber.StatusCreated, "Account created succesfully.", res) } diff --git a/internal/app/api/handler/auth_handler_test.go b/internal/adapters/api/handler/auth_handler_test.go similarity index 95% rename from internal/app/api/handler/auth_handler_test.go rename to internal/adapters/api/handler/auth_handler_test.go index 89c5220..832079a 100644 --- a/internal/app/api/handler/auth_handler_test.go +++ b/internal/adapters/api/handler/auth_handler_test.go @@ -9,9 +9,9 @@ import ( "github.com/bytedance/sonic" "github.com/gofiber/fiber/v3" "github.com/valyala/fasthttp" - "github.com/voltgizerz/POS-restaurant/internal/app/constants" - "github.com/voltgizerz/POS-restaurant/internal/app/entity" - "github.com/voltgizerz/POS-restaurant/internal/app/interactor" + "github.com/voltgizerz/POS-restaurant/internal/core/interactor" + "github.com/voltgizerz/POS-restaurant/internal/constants" + "github.com/voltgizerz/POS-restaurant/internal/core/entity" "go.uber.org/mock/gomock" ) diff --git a/internal/app/api/handler/init_test.go b/internal/adapters/api/handler/init_test.go similarity index 93% rename from internal/app/api/handler/init_test.go rename to internal/adapters/api/handler/init_test.go index a6b3408..e6a5331 100644 --- a/internal/app/api/handler/init_test.go +++ b/internal/adapters/api/handler/init_test.go @@ -6,7 +6,7 @@ import ( "go.uber.org/mock/gomock" - "github.com/voltgizerz/POS-restaurant/internal/app/mocks" + "github.com/voltgizerz/POS-restaurant/internal/mocks" "github.com/voltgizerz/POS-restaurant/pkg/logger" ) diff --git a/internal/app/api/handler/menu_handler.go b/internal/adapters/api/handler/menu_handler.go similarity index 62% rename from internal/app/api/handler/menu_handler.go rename to internal/adapters/api/handler/menu_handler.go index 493ba5a..f17736e 100644 --- a/internal/app/api/handler/menu_handler.go +++ b/internal/adapters/api/handler/menu_handler.go @@ -6,10 +6,11 @@ import ( "github.com/gofiber/fiber/v3" "github.com/opentracing/opentracing-go" - "github.com/voltgizerz/POS-restaurant/internal/app/constants" - "github.com/voltgizerz/POS-restaurant/internal/app/entity" - "github.com/voltgizerz/POS-restaurant/internal/app/interactor" - "github.com/voltgizerz/POS-restaurant/internal/app/ports" + "github.com/voltgizerz/POS-restaurant/internal/adapters/api/common" + "github.com/voltgizerz/POS-restaurant/internal/constants" + "github.com/voltgizerz/POS-restaurant/internal/core/entity" + "github.com/voltgizerz/POS-restaurant/internal/core/interactor" + "github.com/voltgizerz/POS-restaurant/internal/core/ports" ) type MenuHandler struct { @@ -30,12 +31,12 @@ func (h *MenuHandler) AddMenu(c fiber.Ctx) error { err := c.Bind().Body(req) if err != nil { - return SendErrorResp(c, fiber.StatusBadRequest, "Error data menu") + return common.SendErrorResp(c, fiber.StatusBadRequest, "Error data menu") } priceConvert, err := strconv.ParseFloat(req.Price, 64) if err != nil { - return SendErrorResp(c, fiber.StatusBadRequest, err.Error()) + return common.SendErrorResp(c, fiber.StatusBadRequest, err.Error()) } menuData := &entity.Menu{ @@ -48,14 +49,14 @@ func (h *MenuHandler) AddMenu(c fiber.Ctx) error { result, err := h.menuService.RegisterMenu(ctx, *menuData) if err != nil { - return SendErrorResp(c, fiber.StatusUnauthorized, err.Error()) + return common.SendErrorResp(c, fiber.StatusUnauthorized, err.Error()) } responseMsg := map[string]int64{ "menu_id": result, } - return SendSuccessResp(c, fiber.StatusOK, "Success", responseMsg) + return common.SendSuccessResp(c, fiber.StatusOK, "Success", responseMsg) } func (h *MenuHandler) GetMenuByUserID(c fiber.Ctx) error { @@ -65,15 +66,15 @@ func (h *MenuHandler) GetMenuByUserID(c fiber.Ctx) error { userID := c.Params("user_id") convertUserIDtoInt, err := strconv.Atoi(userID) if err != nil { - return SendErrorResp(c, fiber.StatusBadRequest, err.Error()) + return common.SendErrorResp(c, fiber.StatusBadRequest, err.Error()) } result, err := h.menuService.GetMenu(ctx, int64(convertUserIDtoInt)) if err != nil { - return SendErrorResp(c, fiber.StatusBadRequest, constants.ErrMsgMenuNotFound) + return common.SendErrorResp(c, fiber.StatusBadRequest, constants.ErrMsgMenuNotFound) } - return SendSuccessResp(c, fiber.StatusOK, "Success", result) + return common.SendSuccessResp(c, fiber.StatusOK, "Success", result) } func (h *MenuHandler) UpdateMenuByMenuID(c fiber.Ctx) error { @@ -83,18 +84,18 @@ func (h *MenuHandler) UpdateMenuByMenuID(c fiber.Ctx) error { req := &updateMenuRequest{} err := c.Bind().Body(req) if err != nil { - return SendErrorResp(c, fiber.StatusBadRequest, "Invalid request body.") + return common.SendErrorResp(c, fiber.StatusBadRequest, "Invalid request body.") } menuID := c.Params("menu_id") convertMenuIDtoInt, err := strconv.Atoi(menuID) if err != nil { - return SendErrorResp(c, fiber.StatusBadRequest, err.Error()) + return common.SendErrorResp(c, fiber.StatusBadRequest, err.Error()) } priceConvert, err := strconv.ParseFloat(req.Price, 64) if err != nil { - return SendErrorResp(c, fiber.StatusBadRequest, err.Error()) + return common.SendErrorResp(c, fiber.StatusBadRequest, err.Error()) } menuData := entity.Menu{ @@ -108,10 +109,10 @@ func (h *MenuHandler) UpdateMenuByMenuID(c fiber.Ctx) error { result, err := h.menuService.UpdateMenuID(ctx, menuData) if err != nil { - return SendErrorResp(c, fiber.StatusBadRequest, constants.ErrMsgFailedUpdateMenu) + return common.SendErrorResp(c, fiber.StatusBadRequest, constants.ErrMsgFailedUpdateMenu) } - return SendSuccessResp(c, fiber.StatusOK, "Success", result) + return common.SendSuccessResp(c, fiber.StatusOK, "Success", result) } func (h *MenuHandler) UpdateActiveMenuBatchByUserID(c fiber.Ctx) error { @@ -121,15 +122,15 @@ func (h *MenuHandler) UpdateActiveMenuBatchByUserID(c fiber.Ctx) error { userID := c.Params("user_id") convertUserIDtoInt, err := strconv.Atoi(userID) if err != nil { - return SendErrorResp(c, fiber.StatusBadRequest, err.Error()) + return common.SendErrorResp(c, fiber.StatusBadRequest, err.Error()) } result, err := h.menuService.UpdateActiveMenuBatchUserID(ctx, int64(convertUserIDtoInt)) if err != nil { - return SendErrorResp(c, fiber.StatusBadRequest, fmt.Sprintf(constants.ErrMsgFailedDeleteMenu, " delete batch by user id")) + return common.SendErrorResp(c, fiber.StatusBadRequest, fmt.Sprintf(constants.ErrMsgFailedDeleteMenu, " delete batch by user id")) } - return SendSuccessResp(c, fiber.StatusOK, "Success", result) + return common.SendSuccessResp(c, fiber.StatusOK, "Success", result) } func (h *MenuHandler) UpdateActiveMenuByMenuID(c fiber.Ctx) error { @@ -139,13 +140,13 @@ func (h *MenuHandler) UpdateActiveMenuByMenuID(c fiber.Ctx) error { menuID := c.Params("menu_id") convertMenuIDtoInt, err := strconv.Atoi(menuID) if err != nil { - return SendErrorResp(c, fiber.StatusBadRequest, err.Error()) + return common.SendErrorResp(c, fiber.StatusBadRequest, err.Error()) } result, err := h.menuService.UpdateActiveMenuID(ctx, int64(convertMenuIDtoInt)) if err != nil { - return SendErrorResp(c, fiber.StatusBadRequest, fmt.Sprintf(constants.ErrMsgFailedDeleteMenu, " delete by menu id")) + return common.SendErrorResp(c, fiber.StatusBadRequest, fmt.Sprintf(constants.ErrMsgFailedDeleteMenu, " delete by menu id")) } - return SendSuccessResp(c, fiber.StatusOK, "Success", result) + return common.SendSuccessResp(c, fiber.StatusOK, "Success", result) } diff --git a/internal/app/api/handler/menu_request.go b/internal/adapters/api/handler/menu_request.go similarity index 100% rename from internal/app/api/handler/menu_request.go rename to internal/adapters/api/handler/menu_request.go diff --git a/internal/app/api/init_test.go b/internal/adapters/api/init_test.go similarity index 91% rename from internal/app/api/init_test.go rename to internal/adapters/api/init_test.go index 6d2df17..7a2969b 100644 --- a/internal/app/api/init_test.go +++ b/internal/adapters/api/init_test.go @@ -4,7 +4,7 @@ import ( "os" "testing" - "github.com/voltgizerz/POS-restaurant/internal/app/mocks" + "github.com/voltgizerz/POS-restaurant/internal/mocks" "github.com/voltgizerz/POS-restaurant/pkg/logger" "go.uber.org/mock/gomock" ) diff --git a/internal/app/api/middleware/initialization.go b/internal/adapters/api/middleware/initialization.go similarity index 89% rename from internal/app/api/middleware/initialization.go rename to internal/adapters/api/middleware/initialization.go index bec8943..193dd2f 100644 --- a/internal/app/api/middleware/initialization.go +++ b/internal/adapters/api/middleware/initialization.go @@ -5,7 +5,7 @@ import ( "github.com/gofiber/fiber/v3" "github.com/google/uuid" - "github.com/voltgizerz/POS-restaurant/internal/app/constants" + "github.com/voltgizerz/POS-restaurant/internal/constants" ) // All request go here first diff --git a/internal/app/api/middleware/jwt_auth.go b/internal/adapters/api/middleware/jwt_auth.go similarity index 82% rename from internal/app/api/middleware/jwt_auth.go rename to internal/adapters/api/middleware/jwt_auth.go index 45195da..b6a5e70 100644 --- a/internal/app/api/middleware/jwt_auth.go +++ b/internal/adapters/api/middleware/jwt_auth.go @@ -7,9 +7,9 @@ import ( "github.com/gofiber/fiber/v3" "github.com/google/uuid" "github.com/opentracing/opentracing-go" - "github.com/voltgizerz/POS-restaurant/internal/app/api/handler" - "github.com/voltgizerz/POS-restaurant/internal/app/constants" - "github.com/voltgizerz/POS-restaurant/internal/app/ports" + "github.com/voltgizerz/POS-restaurant/internal/adapters/api/common" + "github.com/voltgizerz/POS-restaurant/internal/constants" + "github.com/voltgizerz/POS-restaurant/internal/core/ports" ) const ( @@ -34,19 +34,19 @@ func (m *JWTAuth) AuthorizeAccess() fiber.Handler { return func(c fiber.Ctx) error { authHeader := c.Get(headerAuthName) if authHeader == "" { - return handler.SendErrorResp(c, fiber.StatusUnauthorized, "Missing Authorization header") + return common.SendErrorResp(c, fiber.StatusUnauthorized, "Missing Authorization header") } // Check if the token type is Bearer tokenType, tokenValue, err := parseAuthHeader(authHeader) if err != nil || tokenType != tokenTypeJWT { - return handler.SendErrorResp(c, fiber.StatusUnauthorized, "Invalid authorization header format") + return common.SendErrorResp(c, fiber.StatusUnauthorized, "Invalid authorization header format") } // Verify JWT token using AuthService.VerifyToken _, claims, err := m.AuthService.VerifyToken(c.UserContext(), tokenValue) if err != nil { - return handler.SendErrorResp(c, fiber.StatusUnauthorized, "Invalid token") + return common.SendErrorResp(c, fiber.StatusUnauthorized, "Invalid token") } requestID := uuid.New().String() diff --git a/internal/app/api/middleware/jwt_auth_test.go b/internal/adapters/api/middleware/jwt_auth_test.go similarity index 100% rename from internal/app/api/middleware/jwt_auth_test.go rename to internal/adapters/api/middleware/jwt_auth_test.go diff --git a/internal/app/api/router.go b/internal/adapters/api/router.go similarity index 94% rename from internal/app/api/router.go rename to internal/adapters/api/router.go index c432335..212ffd7 100644 --- a/internal/app/api/router.go +++ b/internal/adapters/api/router.go @@ -4,7 +4,7 @@ import ( "github.com/bytedance/sonic" "github.com/gofiber/fiber/v3" fiberLogger "github.com/gofiber/fiber/v3/middleware/logger" - "github.com/voltgizerz/POS-restaurant/internal/app/api/middleware" + "github.com/voltgizerz/POS-restaurant/internal/adapters/api/middleware" "github.com/voltgizerz/POS-restaurant/pkg/logger" ) @@ -42,7 +42,7 @@ func (s *Server) initUserRoutes(group fiber.Router) { // initUserRoutes initializes user-related routes. func (s *Server) initMenuRoutes(group fiber.Router) { - menuRoutes := group.Group("/menus", ) + menuRoutes := group.Group("/menus") menuRoutes.Post("", s.menuHandler.AddMenu, s.jwtMiddleware.AuthorizeAccess()) menuRoutes.Delete("/user/:user_id", s.menuHandler.UpdateActiveMenuBatchByUserID, s.jwtMiddleware.AuthorizeAccess()) menuRoutes.Delete("/:menu_id", s.menuHandler.UpdateActiveMenuByMenuID, s.jwtMiddleware.AuthorizeAccess()) diff --git a/internal/app/api/router_test.go b/internal/adapters/api/router_test.go similarity index 100% rename from internal/app/api/router_test.go rename to internal/adapters/api/router_test.go diff --git a/internal/app/api/server.go b/internal/adapters/api/server.go similarity index 56% rename from internal/app/api/server.go rename to internal/adapters/api/server.go index 7806cf8..3c9aa1e 100644 --- a/internal/app/api/server.go +++ b/internal/adapters/api/server.go @@ -2,9 +2,9 @@ package api import ( "github.com/voltgizerz/POS-restaurant/config" - "github.com/voltgizerz/POS-restaurant/internal/app/api/middleware" - "github.com/voltgizerz/POS-restaurant/internal/app/interactor" - "github.com/voltgizerz/POS-restaurant/internal/app/ports" + "github.com/voltgizerz/POS-restaurant/internal/adapters/api/middleware" + "github.com/voltgizerz/POS-restaurant/internal/core/interactor" + "github.com/voltgizerz/POS-restaurant/internal/core/ports" "github.com/voltgizerz/POS-restaurant/pkg/logger" ) @@ -15,12 +15,12 @@ type Server struct { menuHandler ports.IMenuHandler } -func NewServer(interactor interactor.APInteractor, jwtMiddleware middleware.JWTAuth) *Server { +func NewServer(i interactor.APInteractor, jwtMiddleware middleware.JWTAuth) *Server { return &Server{ - cfgAPI: interactor.CfgAPI, + cfgAPI: i.CfgAPI, jwtMiddleware: jwtMiddleware, - authHandler: interactor.AuthHandler, - menuHandler: interactor.MenuHandler, + authHandler: i.AuthHandler, + menuHandler: i.MenuHandler, } } diff --git a/internal/app/api/server_test.go b/internal/adapters/api/server_test.go similarity index 80% rename from internal/app/api/server_test.go rename to internal/adapters/api/server_test.go index 1344558..47c20f9 100644 --- a/internal/app/api/server_test.go +++ b/internal/adapters/api/server_test.go @@ -4,8 +4,8 @@ import ( "reflect" "testing" - "github.com/voltgizerz/POS-restaurant/internal/app/api/middleware" - "github.com/voltgizerz/POS-restaurant/internal/app/interactor" + "github.com/voltgizerz/POS-restaurant/internal/adapters/api/middleware" + "github.com/voltgizerz/POS-restaurant/internal/core/interactor" ) func TestNewServer(t *testing.T) { diff --git a/internal/app/auth/auth.go b/internal/adapters/auth/auth.go similarity index 94% rename from internal/app/auth/auth.go rename to internal/adapters/auth/auth.go index f878d1f..2f0a9b8 100644 --- a/internal/app/auth/auth.go +++ b/internal/adapters/auth/auth.go @@ -4,7 +4,7 @@ import ( "context" "errors" - "github.com/voltgizerz/POS-restaurant/internal/app/constants" + "github.com/voltgizerz/POS-restaurant/internal/constants" ) type Auth struct { diff --git a/internal/app/auth/auth_test.go b/internal/adapters/auth/auth_test.go similarity index 98% rename from internal/app/auth/auth_test.go rename to internal/adapters/auth/auth_test.go index 19fa068..1668c48 100644 --- a/internal/app/auth/auth_test.go +++ b/internal/adapters/auth/auth_test.go @@ -5,7 +5,7 @@ import ( "reflect" "testing" - "github.com/voltgizerz/POS-restaurant/internal/app/constants" + "github.com/voltgizerz/POS-restaurant/internal/constants" ) func TestGetUserLoginFromCtx(t *testing.T) { diff --git a/internal/app/auth/jwt.go b/internal/adapters/auth/jwt.go similarity index 93% rename from internal/app/auth/jwt.go rename to internal/adapters/auth/jwt.go index c21a747..4731dc0 100644 --- a/internal/app/auth/jwt.go +++ b/internal/adapters/auth/jwt.go @@ -7,8 +7,8 @@ import ( "github.com/golang-jwt/jwt/v5" "github.com/opentracing/opentracing-go" - "github.com/voltgizerz/POS-restaurant/internal/app/entity" - "github.com/voltgizerz/POS-restaurant/internal/app/ports" + "github.com/voltgizerz/POS-restaurant/internal/core/ports" + "github.com/voltgizerz/POS-restaurant/internal/core/entity" ) const ( diff --git a/internal/app/auth/jwt_test.go b/internal/adapters/auth/jwt_test.go similarity index 97% rename from internal/app/auth/jwt_test.go rename to internal/adapters/auth/jwt_test.go index d07bcb8..1b06b76 100644 --- a/internal/app/auth/jwt_test.go +++ b/internal/adapters/auth/jwt_test.go @@ -6,7 +6,7 @@ import ( "testing" "github.com/golang-jwt/jwt/v5" - "github.com/voltgizerz/POS-restaurant/internal/app/entity" + "github.com/voltgizerz/POS-restaurant/internal/core/entity" ) func TestAuthJWT_CreateToken(t *testing.T) { diff --git a/internal/app/repository/init.go b/internal/adapters/repository/init.go similarity index 62% rename from internal/app/repository/init.go rename to internal/adapters/repository/init.go index b2685d7..948ed7d 100644 --- a/internal/app/repository/init.go +++ b/internal/adapters/repository/init.go @@ -1,7 +1,7 @@ package repository import ( - "github.com/voltgizerz/POS-restaurant/database" + "github.com/voltgizerz/POS-restaurant/internal/database" ) type RepositoryOpts struct { diff --git a/internal/app/repository/menu_repository.go b/internal/adapters/repository/menu_repository.go similarity index 63% rename from internal/app/repository/menu_repository.go rename to internal/adapters/repository/menu_repository.go index 1ded38b..081d886 100644 --- a/internal/app/repository/menu_repository.go +++ b/internal/adapters/repository/menu_repository.go @@ -2,21 +2,22 @@ package repository import ( "context" + "database/sql" "errors" "time" "github.com/jmoiron/sqlx" "github.com/opentracing/opentracing-go" - "github.com/voltgizerz/POS-restaurant/internal/app/entity" - "github.com/voltgizerz/POS-restaurant/internal/app/ports" + "github.com/voltgizerz/POS-restaurant/internal/core/ports" + "github.com/voltgizerz/POS-restaurant/internal/core/entity" ) const ( queryInsertMenu = `INSERT INTO food_menus (name,thumbnail,price,is_active,user_id) values (?,?,?,?,?)` - queryGetMenuByUserId = `SELECT id,name,price,thumbnail,is_active from food_menus where user_id = ? and is_active = 1` - queryUpdateActiveBatchMenuByUserId = `UPDATE food_menus set is_active = 0 , deleted_at = ? where user_id = ?` - queryUpdateMenuActiveByMenuId = `UPDATE food_menus set is_active = 0 , deleted_at = ? where id = ?` - queryUpdateMenuByMenuId = `UPDATE food_menus set name = ? ,price = ? , thumbnail = ? ,is_active = ? , user_id = ? , updated_at = ? where id = ?` + queryGetMenuByUserID = `SELECT id,name,price,thumbnail,is_active from food_menus where user_id = ? and is_active = 1` + queryUpdateActiveBatchMenuByUserID = `UPDATE food_menus set is_active = 0 , deleted_at = ? where user_id = ?` + queryUpdateMenuActiveByMenuID = `UPDATE food_menus set is_active = 0 , deleted_at = ? where id = ?` + queryUpdateMenuByMenuID = `UPDATE food_menus set name = ? ,price = ? , thumbnail = ? ,is_active = ? , user_id = ? , updated_at = ? where id = ?` ) type MenuRepository struct { @@ -29,12 +30,21 @@ func NewMenuRepository(opts RepositoryOpts) ports.IMenuRepository { } } -// DeleteMenuBatchUser implements ports.IMenuRepository. -func (m *MenuRepository) UpdateActiveMenuBatchUser(ctx context.Context, idUser int64) (int64, error) { +// execQuery executes a SQL query using the provided transaction or master DB. +func (m *MenuRepository) execQuery(ctx context.Context, tx *sql.Tx, query string, args ...interface{}) (sql.Result, error) { + if tx != nil { + return tx.ExecContext(ctx, query, args...) + } + + return m.MasterDB.ExecContext(ctx, query, args...) +} + +// UpdateActiveMenuBatchUser implements ports.IMenuRepository. +func (m *MenuRepository) UpdateActiveMenuBatchUser(ctx context.Context, tx *sql.Tx, userID int64) (int64, error) { span, ctx := opentracing.StartSpanFromContext(ctx, "repo.MenuRepository.UpdateActiveMenuBatchUser") defer span.Finish() - result, err := m.MasterDB.ExecContext(ctx, queryUpdateActiveBatchMenuByUserId, time.Now(), idUser) + result, err := m.execQuery(ctx, tx, queryUpdateActiveBatchMenuByUserID, time.Now(), userID) if err != nil { return 0, err } @@ -51,12 +61,12 @@ func (m *MenuRepository) UpdateActiveMenuBatchUser(ctx context.Context, idUser i return 1, nil } -// UpdateMenuByMenuID implements ports.IMenuRepository. -func (m *MenuRepository) UpdateActiveMenuByMenuID(ctx context.Context, menuID int64) (int64, error) { +// UpdateActiveMenuByMenuID implements ports.IMenuRepository. +func (m *MenuRepository) UpdateActiveMenuByMenuID(ctx context.Context, tx *sql.Tx, menuID int64) (int64, error) { span, ctx := opentracing.StartSpanFromContext(ctx, "repo.MenuRepository.UpdateActiveMenuByMenuID") defer span.Finish() - result, err := m.MasterDB.ExecContext(ctx, queryUpdateMenuActiveByMenuId, time.Now(), menuID) + result, err := m.execQuery(ctx, tx, queryUpdateMenuActiveByMenuID, time.Now(), menuID) if err != nil { return 0, err } @@ -74,11 +84,11 @@ func (m *MenuRepository) UpdateActiveMenuByMenuID(ctx context.Context, menuID in } // UpdateMenuByMenuID implements ports.IMenuRepository. -func (m *MenuRepository) UpdateMenuByMenuID(ctx context.Context, menuData *entity.MenuORM) (int64, error) { +func (m *MenuRepository) UpdateMenuByMenuID(ctx context.Context, tx *sql.Tx, menuData *entity.MenuORM) (int64, error) { span, ctx := opentracing.StartSpanFromContext(ctx, "repo.MenuRepository.UpdateMenuByMenuID") defer span.Finish() - result, err := m.MasterDB.ExecContext(ctx, queryUpdateMenuByMenuId, menuData.Name, menuData.Price, menuData.Thumbnail, menuData.IsActive, menuData.UserID, time.Now(), menuData.ID) + result, err := m.execQuery(ctx, tx, queryUpdateMenuByMenuID, menuData.Name, menuData.Price, menuData.Thumbnail, menuData.IsActive, menuData.UserID, time.Now(), menuData.ID) if err != nil { return 0, err } @@ -105,12 +115,12 @@ func (m *MenuRepository) AddMenu(ctx context.Context, menuData entity.MenuORM) ( return 0, err } - lastId, err := result.LastInsertId() + lastID, err := result.LastInsertId() if err != nil { return 0, err } - return lastId, nil + return lastID, nil } // FetchMenuById implements ports.IMenuRepository. @@ -118,12 +128,12 @@ func (m *MenuRepository) FetchMenuById(ctx context.Context, menuId int64) ([]*en span, ctx := opentracing.StartSpanFromContext(ctx, "repo.MenuRepository.FetchMenuById") defer span.Finish() - menu_data := []*entity.MenuORM{} + menuData := []*entity.MenuORM{} - err := m.MasterDB.SelectContext(ctx, &menu_data, queryGetMenuByUserId, menuId) + err := m.MasterDB.SelectContext(ctx, &menuData, queryGetMenuByUserID, menuId) if err != nil { return nil, err } - return menu_data, nil + return menuData, nil } diff --git a/internal/adapters/repository/transaction.go b/internal/adapters/repository/transaction.go new file mode 100644 index 0000000..49094b5 --- /dev/null +++ b/internal/adapters/repository/transaction.go @@ -0,0 +1,49 @@ +package repository + +import ( + "context" + "database/sql" + + "github.com/jmoiron/sqlx" + "github.com/opentracing/opentracing-go" + "github.com/voltgizerz/POS-restaurant/internal/core/ports" +) + +type TxRepository struct { + MasterDB *sqlx.DB +} + +func NewTxRepository(opts RepositoryOpts) ports.ITxRepository { + return &TxRepository{ + MasterDB: opts.Database.MasterDB, + } +} + +// StartTransaction starts a new transaction. +func (m *TxRepository) StartTransaction(ctx context.Context) (*sql.Tx, error) { + span, ctx := opentracing.StartSpanFromContext(ctx, "repo.TxRepository.StartTransaction") + defer span.Finish() + + tx, err := m.MasterDB.BeginTx(ctx, nil) + if err != nil { + return nil, err + } + + return tx, nil +} + +// CommitTransaction commits the given transaction. +func (m *TxRepository) CommitTransaction(ctx context.Context, tx *sql.Tx) error { + span, ctx := opentracing.StartSpanFromContext(ctx, "repo.TxRepository.CommitTransaction") + defer span.Finish() + + return tx.Commit() +} + +// RollbackTransaction rolls back the given transaction. +func (m *TxRepository) RollbackTransaction(ctx context.Context, tx *sql.Tx) error { + span, ctx := opentracing.StartSpanFromContext(ctx, "repo.TxRepository.RollbackTransaction") + defer span.Finish() + + return tx.Rollback() +} diff --git a/internal/app/repository/user_repository.go b/internal/adapters/repository/user_repository.go similarity index 95% rename from internal/app/repository/user_repository.go rename to internal/adapters/repository/user_repository.go index aa3ddd6..25ef61b 100644 --- a/internal/app/repository/user_repository.go +++ b/internal/adapters/repository/user_repository.go @@ -6,8 +6,8 @@ import ( "github.com/jmoiron/sqlx" "github.com/opentracing/opentracing-go" - "github.com/voltgizerz/POS-restaurant/internal/app/entity" - "github.com/voltgizerz/POS-restaurant/internal/app/ports" + "github.com/voltgizerz/POS-restaurant/internal/core/ports" + "github.com/voltgizerz/POS-restaurant/internal/core/entity" ) const ( diff --git a/internal/app/repository/user_repository_test.go b/internal/adapters/repository/user_repository_test.go similarity index 98% rename from internal/app/repository/user_repository_test.go rename to internal/adapters/repository/user_repository_test.go index 003a521..8ca6a37 100644 --- a/internal/app/repository/user_repository_test.go +++ b/internal/adapters/repository/user_repository_test.go @@ -9,7 +9,7 @@ import ( "github.com/DATA-DOG/go-sqlmock" "github.com/jmoiron/sqlx" - "github.com/voltgizerz/POS-restaurant/internal/app/entity" + "github.com/voltgizerz/POS-restaurant/internal/core/entity" ) func TestUserRepository_GetUserByEmail(t *testing.T) { diff --git a/internal/app/constants/context.go b/internal/constants/context.go similarity index 100% rename from internal/app/constants/context.go rename to internal/constants/context.go diff --git a/internal/app/constants/errors.go b/internal/constants/errors.go similarity index 100% rename from internal/app/constants/errors.go rename to internal/constants/errors.go diff --git a/internal/app/entity/auth_entity.go b/internal/core/entity/auth_entity.go similarity index 100% rename from internal/app/entity/auth_entity.go rename to internal/core/entity/auth_entity.go diff --git a/internal/app/entity/menu_entity.go b/internal/core/entity/menu_entity.go similarity index 100% rename from internal/app/entity/menu_entity.go rename to internal/core/entity/menu_entity.go diff --git a/internal/app/entity/user_entity.go b/internal/core/entity/user_entity.go similarity index 100% rename from internal/app/entity/user_entity.go rename to internal/core/entity/user_entity.go diff --git a/internal/app/interactor/interactor.go b/internal/core/interactor/interactor.go similarity index 83% rename from internal/app/interactor/interactor.go rename to internal/core/interactor/interactor.go index 7186946..f92dbf1 100644 --- a/internal/app/interactor/interactor.go +++ b/internal/core/interactor/interactor.go @@ -2,7 +2,7 @@ package interactor import ( "github.com/voltgizerz/POS-restaurant/config" - "github.com/voltgizerz/POS-restaurant/internal/app/ports" + "github.com/voltgizerz/POS-restaurant/internal/core/ports" ) type APInteractor struct { @@ -25,5 +25,6 @@ type MenuHandler struct { } type MenuService struct { + TxRepository ports.ITxRepository MenuRepository ports.IMenuRepository } diff --git a/internal/app/ports/auth_ports.go b/internal/core/ports/auth_ports.go similarity index 75% rename from internal/app/ports/auth_ports.go rename to internal/core/ports/auth_ports.go index 19002cf..fa52a0d 100644 --- a/internal/app/ports/auth_ports.go +++ b/internal/core/ports/auth_ports.go @@ -5,10 +5,10 @@ import ( "github.com/gofiber/fiber/v3" "github.com/golang-jwt/jwt/v5" - "github.com/voltgizerz/POS-restaurant/internal/app/entity" + "github.com/voltgizerz/POS-restaurant/internal/core/entity" ) -//go:generate mockgen -source=./internal/app/ports/auth_ports.go -destination=./internal/app/mocks/mocks_auth.go -package=mocks +//go:generate mockgen -source=./internal/adapters/ports/auth_ports.go -destination=./internal/mocks/mocks_auth.go -package=mocks type IJWTAuth interface { CreateToken(ctx context.Context, user entity.UserORM) (*entity.CreateTokenResponse, error) VerifyToken(ctx context.Context, tokenString string) (*jwt.Token, jwt.MapClaims, error) diff --git a/internal/app/ports/menu_ports.go b/internal/core/ports/menu_ports.go similarity index 64% rename from internal/app/ports/menu_ports.go rename to internal/core/ports/menu_ports.go index 21b87ee..085e6b2 100644 --- a/internal/app/ports/menu_ports.go +++ b/internal/core/ports/menu_ports.go @@ -2,12 +2,13 @@ package ports import ( "context" + "database/sql" "github.com/gofiber/fiber/v3" - "github.com/voltgizerz/POS-restaurant/internal/app/entity" + "github.com/voltgizerz/POS-restaurant/internal/core/entity" ) -//go:generate mockgen -source=./internal/app/ports/menu_ports.go -destination=./internal/app/mocks/mocks_menu.go -package=mocks +//go:generate mockgen -source=./internal/adapters/ports/menu_ports.go -destination=./internal/mocks/mocks_menu.go -package=mocks type IMenuHandler interface { AddMenu(c fiber.Ctx) error GetMenuByUserID(c fiber.Ctx) error @@ -27,7 +28,7 @@ type IMenuService interface { type IMenuRepository interface { FetchMenuById(ctx context.Context, userID int64) ([]*entity.MenuORM, error) AddMenu(ctx context.Context, menuData entity.MenuORM) (int64, error) - UpdateActiveMenuByMenuID(ctx context.Context, menuID int64) (int64, error) - UpdateActiveMenuBatchUser(ctx context.Context, userID int64) (int64, error) - UpdateMenuByMenuID(ctx context.Context, menuData *entity.MenuORM) (int64, error) + UpdateActiveMenuByMenuID(ctx context.Context, tx *sql.Tx, menuID int64) (int64, error) + UpdateActiveMenuBatchUser(ctx context.Context, tx *sql.Tx, userID int64) (int64, error) + UpdateMenuByMenuID(ctx context.Context, tx *sql.Tx, menuData *entity.MenuORM) (int64, error) } diff --git a/internal/core/ports/tx_ports.go b/internal/core/ports/tx_ports.go new file mode 100644 index 0000000..2dffbf7 --- /dev/null +++ b/internal/core/ports/tx_ports.go @@ -0,0 +1,15 @@ +package ports + +import ( + "context" + "database/sql" +) + +//go:generate mockgen -source=./internal/adapters/ports/tx_ports.go -destination=./internal/mocks/mocks_tx.go -package=mocks + +// IRepositoryTx defines the transaction methods. +type ITxRepository interface { + StartTransaction(ctx context.Context) (*sql.Tx, error) + CommitTransaction(ctx context.Context, tx *sql.Tx) error + RollbackTransaction(ctx context.Context, tx *sql.Tx) error +} diff --git a/internal/app/ports/user_ports.go b/internal/core/ports/user_ports.go similarity index 68% rename from internal/app/ports/user_ports.go rename to internal/core/ports/user_ports.go index a7def8b..1aa9402 100644 --- a/internal/app/ports/user_ports.go +++ b/internal/core/ports/user_ports.go @@ -3,10 +3,10 @@ package ports import ( "context" - "github.com/voltgizerz/POS-restaurant/internal/app/entity" + "github.com/voltgizerz/POS-restaurant/internal/core/entity" ) -//go:generate mockgen -source=./internal/app/ports/user_ports.go -destination=./internal/app/mocks/mocks_user.go -package=mocks +//go:generate mockgen -source=./internal/adapters/ports/user_ports.go -destination=./internal/mocks/mocks_user.go -package=mocks type IUserRepository interface { GetUserByUsernameAndPassword(ctx context.Context, username string, hashPassword string) (*entity.UserORM, error) GetUserByUsername(ctx context.Context, username string) (*entity.UserORM, error) diff --git a/internal/app/service/auth_service.go b/internal/core/service/auth_service.go similarity index 94% rename from internal/app/service/auth_service.go rename to internal/core/service/auth_service.go index 24baac8..5943ed1 100644 --- a/internal/app/service/auth_service.go +++ b/internal/core/service/auth_service.go @@ -6,9 +6,9 @@ import ( "github.com/opentracing/opentracing-go" "github.com/sirupsen/logrus" - "github.com/voltgizerz/POS-restaurant/internal/app/entity" - "github.com/voltgizerz/POS-restaurant/internal/app/interactor" - "github.com/voltgizerz/POS-restaurant/internal/app/ports" + "github.com/voltgizerz/POS-restaurant/internal/core/entity" + "github.com/voltgizerz/POS-restaurant/internal/core/interactor" + "github.com/voltgizerz/POS-restaurant/internal/core/ports" "github.com/voltgizerz/POS-restaurant/internal/utils" "github.com/voltgizerz/POS-restaurant/pkg/logger" ) diff --git a/internal/app/service/auth_service_test.go b/internal/core/service/auth_service_test.go similarity index 97% rename from internal/app/service/auth_service_test.go rename to internal/core/service/auth_service_test.go index a1f680a..87eafc2 100644 --- a/internal/app/service/auth_service_test.go +++ b/internal/core/service/auth_service_test.go @@ -8,8 +8,8 @@ import ( "go.uber.org/mock/gomock" - "github.com/voltgizerz/POS-restaurant/internal/app/entity" - "github.com/voltgizerz/POS-restaurant/internal/app/interactor" + "github.com/voltgizerz/POS-restaurant/internal/core/interactor" + "github.com/voltgizerz/POS-restaurant/internal/core/entity" ) func TestUserService_Login(t *testing.T) { diff --git a/internal/app/service/init_test.go b/internal/core/service/init_test.go similarity index 92% rename from internal/app/service/init_test.go rename to internal/core/service/init_test.go index a602439..f2fa4dd 100644 --- a/internal/app/service/init_test.go +++ b/internal/core/service/init_test.go @@ -4,7 +4,7 @@ import ( "os" "testing" - "github.com/voltgizerz/POS-restaurant/internal/app/mocks" + "github.com/voltgizerz/POS-restaurant/internal/mocks" "github.com/voltgizerz/POS-restaurant/pkg/logger" "go.uber.org/mock/gomock" ) diff --git a/internal/app/service/menu_service.go b/internal/core/service/menu_service.go similarity index 87% rename from internal/app/service/menu_service.go rename to internal/core/service/menu_service.go index 08f2fb1..e2ab92b 100644 --- a/internal/app/service/menu_service.go +++ b/internal/core/service/menu_service.go @@ -5,18 +5,20 @@ import ( "github.com/opentracing/opentracing-go" "github.com/sirupsen/logrus" - "github.com/voltgizerz/POS-restaurant/internal/app/entity" - "github.com/voltgizerz/POS-restaurant/internal/app/interactor" - "github.com/voltgizerz/POS-restaurant/internal/app/ports" + "github.com/voltgizerz/POS-restaurant/internal/core/entity" + "github.com/voltgizerz/POS-restaurant/internal/core/interactor" + "github.com/voltgizerz/POS-restaurant/internal/core/ports" "github.com/voltgizerz/POS-restaurant/pkg/logger" ) type MenuService struct { + txRepository ports.ITxRepository menuRepository ports.IMenuRepository } func NewMenuService(i interactor.MenuService) *MenuService { return &MenuService{ + txRepository: i.TxRepository, menuRepository: i.MenuRepository, } } @@ -76,7 +78,7 @@ func (s *MenuService) UpdateActiveMenuID(ctx context.Context, userID int64) (int span, ctx := opentracing.StartSpanFromContext(ctx, "service.MenuService.UpdateActiveMenuID") defer span.Finish() - _, err := s.menuRepository.UpdateActiveMenuByMenuID(ctx, userID) + _, err := s.menuRepository.UpdateActiveMenuByMenuID(ctx, nil, userID) if err != nil { logger.LogStdErr.WithFields(logrus.Fields{ "user_id": userID, @@ -92,7 +94,7 @@ func (s *MenuService) UpdateActiveMenuBatchUserID(ctx context.Context, userID in span, ctx := opentracing.StartSpanFromContext(ctx, "service.MenuService.UpdateActiveMenuBatchUserID") defer span.Finish() - _, err := s.menuRepository.UpdateActiveMenuBatchUser(ctx, userID) + _, err := s.menuRepository.UpdateActiveMenuBatchUser(ctx, nil, userID) if err != nil { logger.LogStdErr.WithFields(logrus.Fields{ "user_id": userID, @@ -117,7 +119,7 @@ func (s *MenuService) UpdateMenuID(ctx context.Context, menuData entity.Menu) (i IsActive: menuData.IsActive, } - result, err := s.menuRepository.UpdateMenuByMenuID(ctx, &menuOrm) + result, err := s.menuRepository.UpdateMenuByMenuID(ctx, nil, &menuOrm) if err != nil { logger.LogStdErr.WithFields(logrus.Fields{ "menu_id": menuData.ID, diff --git a/internal/app/service/menu_service_test.go b/internal/core/service/menu_service_test.go similarity index 95% rename from internal/app/service/menu_service_test.go rename to internal/core/service/menu_service_test.go index ac04ca2..3bf2e67 100644 --- a/internal/app/service/menu_service_test.go +++ b/internal/core/service/menu_service_test.go @@ -5,7 +5,7 @@ import ( "reflect" "testing" - "github.com/voltgizerz/POS-restaurant/internal/app/entity" + "github.com/voltgizerz/POS-restaurant/internal/core/entity" ) func TestMenuService_GetMenu(t *testing.T) { diff --git a/database/database.go b/internal/database/database.go similarity index 100% rename from database/database.go rename to internal/database/database.go diff --git a/database/database_test.go b/internal/database/database_test.go similarity index 100% rename from database/database_test.go rename to internal/database/database_test.go diff --git a/database/migrations/00001_food_menus_table.sql b/internal/database/migrations/00001_food_menus_table.sql similarity index 100% rename from database/migrations/00001_food_menus_table.sql rename to internal/database/migrations/00001_food_menus_table.sql diff --git a/database/migrations/20240622125106_add_users_table.sql b/internal/database/migrations/20240622125106_add_users_table.sql similarity index 100% rename from database/migrations/20240622125106_add_users_table.sql rename to internal/database/migrations/20240622125106_add_users_table.sql diff --git a/internal/mocks/init_test.go b/internal/mocks/init_test.go new file mode 100644 index 0000000..f726b26 --- /dev/null +++ b/internal/mocks/init_test.go @@ -0,0 +1 @@ +package mocks diff --git a/internal/app/mocks/mocks_auth.go b/internal/mocks/mocks_auth.go similarity index 96% rename from internal/app/mocks/mocks_auth.go rename to internal/mocks/mocks_auth.go index 4a76d6e..4202963 100644 --- a/internal/app/mocks/mocks_auth.go +++ b/internal/mocks/mocks_auth.go @@ -1,9 +1,9 @@ // Code generated by MockGen. DO NOT EDIT. -// Source: ./internal/app/ports/auth_ports.go +// Source: ./internal/adapters/ports/auth_ports.go // // Generated by this command: // -// mockgen -source=./internal/app/ports/auth_ports.go -destination=./internal/app/mocks/mocks_auth.go -package=mocks +// mockgen -source=./internal/adapters/ports/auth_ports.go -destination=./internal/mocks/mocks_auth.go -package=mocks // // Package mocks is a generated GoMock package. @@ -15,7 +15,7 @@ import ( fiber "github.com/gofiber/fiber/v3" jwt "github.com/golang-jwt/jwt/v5" - entity "github.com/voltgizerz/POS-restaurant/internal/app/entity" + entity "github.com/voltgizerz/POS-restaurant/internal/core/entity" gomock "go.uber.org/mock/gomock" ) diff --git a/internal/app/mocks/mocks_menu.go b/internal/mocks/mocks_menu.go similarity index 97% rename from internal/app/mocks/mocks_menu.go rename to internal/mocks/mocks_menu.go index 970fd07..5d822bb 100644 --- a/internal/app/mocks/mocks_menu.go +++ b/internal/mocks/mocks_menu.go @@ -1,9 +1,9 @@ // Code generated by MockGen. DO NOT EDIT. -// Source: ./internal/app/ports/menu_ports.go +// Source: ./internal/adapters/ports/menu_ports.go // // Generated by this command: // -// mockgen -source=./internal/app/ports/menu_ports.go -destination=./internal/app/mocks/mocks_menu.go -package=mocks +// mockgen -source=./internal/adapters/ports/menu_ports.go -destination=./internal/mocks/mocks_menu.go -package=mocks // // Package mocks is a generated GoMock package. @@ -14,7 +14,7 @@ import ( reflect "reflect" fiber "github.com/gofiber/fiber/v3" - entity "github.com/voltgizerz/POS-restaurant/internal/app/entity" + entity "github.com/voltgizerz/POS-restaurant/internal/core/entity" gomock "go.uber.org/mock/gomock" ) diff --git a/internal/mocks/mocks_tx.go b/internal/mocks/mocks_tx.go new file mode 100644 index 0000000..8415540 --- /dev/null +++ b/internal/mocks/mocks_tx.go @@ -0,0 +1,84 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: ./internal/adapters/ports/tx_ports.go +// +// Generated by this command: +// +// mockgen -source=./internal/adapters/ports/tx_ports.go -destination=./internal/mocks/mocks_tx.go -package=mocks +// + +// Package mocks is a generated GoMock package. +package mocks + +import ( + context "context" + sql "database/sql" + reflect "reflect" + + gomock "go.uber.org/mock/gomock" +) + +// MockITxRepository is a mock of ITxRepository interface. +type MockITxRepository struct { + ctrl *gomock.Controller + recorder *MockITxRepositoryMockRecorder +} + +// MockITxRepositoryMockRecorder is the mock recorder for MockITxRepository. +type MockITxRepositoryMockRecorder struct { + mock *MockITxRepository +} + +// NewMockITxRepository creates a new mock instance. +func NewMockITxRepository(ctrl *gomock.Controller) *MockITxRepository { + mock := &MockITxRepository{ctrl: ctrl} + mock.recorder = &MockITxRepositoryMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockITxRepository) EXPECT() *MockITxRepositoryMockRecorder { + return m.recorder +} + +// CommitTransaction mocks base method. +func (m *MockITxRepository) CommitTransaction(ctx context.Context, tx *sql.Tx) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CommitTransaction", ctx, tx) + ret0, _ := ret[0].(error) + return ret0 +} + +// CommitTransaction indicates an expected call of CommitTransaction. +func (mr *MockITxRepositoryMockRecorder) CommitTransaction(ctx, tx any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CommitTransaction", reflect.TypeOf((*MockITxRepository)(nil).CommitTransaction), ctx, tx) +} + +// RollbackTransaction mocks base method. +func (m *MockITxRepository) RollbackTransaction(ctx context.Context, tx *sql.Tx) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RollbackTransaction", ctx, tx) + ret0, _ := ret[0].(error) + return ret0 +} + +// RollbackTransaction indicates an expected call of RollbackTransaction. +func (mr *MockITxRepositoryMockRecorder) RollbackTransaction(ctx, tx any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RollbackTransaction", reflect.TypeOf((*MockITxRepository)(nil).RollbackTransaction), ctx, tx) +} + +// StartTransaction mocks base method. +func (m *MockITxRepository) StartTransaction(ctx context.Context) (*sql.Tx, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StartTransaction", ctx) + ret0, _ := ret[0].(*sql.Tx) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StartTransaction indicates an expected call of StartTransaction. +func (mr *MockITxRepositoryMockRecorder) StartTransaction(ctx any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StartTransaction", reflect.TypeOf((*MockITxRepository)(nil).StartTransaction), ctx) +} diff --git a/internal/app/mocks/mocks_user.go b/internal/mocks/mocks_user.go similarity index 93% rename from internal/app/mocks/mocks_user.go rename to internal/mocks/mocks_user.go index 4dad1e8..d80ef1f 100644 --- a/internal/app/mocks/mocks_user.go +++ b/internal/mocks/mocks_user.go @@ -1,9 +1,9 @@ // Code generated by MockGen. DO NOT EDIT. -// Source: ./internal/app/ports/user_ports.go +// Source: ./internal/adapters/ports/user_ports.go // // Generated by this command: // -// mockgen -source=./internal/app/ports/user_ports.go -destination=./internal/app/mocks/mocks_user.go -package=mocks +// mockgen -source=./internal/adapters/ports/user_ports.go -destination=./internal/mocks/mocks_user.go -package=mocks // // Package mocks is a generated GoMock package. @@ -13,7 +13,7 @@ import ( context "context" reflect "reflect" - entity "github.com/voltgizerz/POS-restaurant/internal/app/entity" + entity "github.com/voltgizerz/POS-restaurant/internal/core/entity" gomock "go.uber.org/mock/gomock" )