Skip to content

Commit

Permalink
Merge pull request #3 from voltgizerz/develop
Browse files Browse the repository at this point in the history
Add user routes and refactor
  • Loading branch information
voltgizerz committed Jun 8, 2024
2 parents a0fc7f4 + 8fdeedd commit 46f7703
Show file tree
Hide file tree
Showing 12 changed files with 183 additions and 35 deletions.
69 changes: 48 additions & 21 deletions cmd/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,16 @@ import (
"context"
"os"
"os/signal"
"runtime"
"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/interactor"
"github.com/voltgizerz/POS-restaurant/internal/app/repository"
"github.com/voltgizerz/POS-restaurant/internal/app/service"
"github.com/voltgizerz/POS-restaurant/pkg/jeager"
"github.com/voltgizerz/POS-restaurant/pkg/logger"
)
Expand All @@ -24,39 +26,64 @@ func main() {
cfg := config.NewConfig()
defer handlePanic()

closer, err := jeager.NewJeager(cfg.App.Name)
if err != nil {
logger.LogStdErr.Errorf("[NewJeager] Error initializing Jaeger: %v\n", err)
}
defer closer.Close()
// Initialize Jaeger
initJaeger(cfg.App.Name)

ctx := context.Background()
ctx, cancel := context.WithCancel(context.Background())
defer cancel()

// Init database
// Initialize database
db := database.InitDatabase(ctx, cfg.Database)

repositoryOpts := repository.RepositoryOpts{
repoOpts := repository.RepositoryOpts{
Database: db,
}

_ = repository.NewUserRepository(repositoryOpts)
// Initialize Repositories
userRepo := repository.NewUserRepository(repoOpts)

// Initialize Services
userService := service.NewUserService(userRepo)

// Init API
go api.NewServer(cfg.API)
// Initialize Handlers
userHandler := handler.NewUserHandler(userService)

// Wait for a termination signal
sc := make(chan os.Signal, 1)
signal.Notify(sc, syscall.SIGINT, syscall.SIGTERM, os.Interrupt)
<-sc
interactoAPI := interactor.APInteractor{
Cfg: cfg.API,
UserHandler: userHandler,
}

// Start API server
go startAPIServer(interactoAPI)

// Wait for termination signal
waitForSignal()
}

logger.LogStdOut.Warnln("Application is exiting. Graceful shutdown in action...")
func initJaeger(serviceName string) {
closer, err := jeager.NewJeager(serviceName)
if err != nil {
logger.LogStdErr.Errorf("[NewJeager] Error initializing Jaeger: %v", err)
return
}
defer closer.Close()
}

func handlePanic() {
if r := recover(); r != nil {
// Log panic location
stack := make([]byte, 4096)
runtime.Stack(stack, false)
logger.LogStdErr.WithField("panic", r).WithField("stack_trace", string(stack)).Error("Panic occurred!")
logger.LogStdErr.Errorf("Panic occurred: %v", r)
}
}

func startAPIServer(interactor interactor.APInteractor) {
httpServer := api.NewServer(interactor)
httpServer.Initialize()
}

func waitForSignal() {
sigCh := make(chan os.Signal, 1)
signal.Notify(sigCh, syscall.SIGINT, syscall.SIGTERM)
<-sigCh

logger.Log.Warnln("Application is exiting. Graceful shutdown in action...")
}
26 changes: 26 additions & 0 deletions internal/app/api/handler/handler.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package handler

import (
"github.com/gofiber/fiber/v3"
"github.com/voltgizerz/POS-restaurant/internal/app/ports"
)

type UserHandler struct {
userService ports.IUserService
}

func NewUserHandler(userService ports.IUserService) *UserHandler {
return &UserHandler{
userService: userService,
}
}

func (h *UserHandler) Login(c fiber.Ctx) error {
// TODO
return nil
}

func (h *UserHandler) Register(c fiber.Ctx) error {
// TODO
return nil
}
41 changes: 41 additions & 0 deletions internal/app/api/router.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package api

import (
"github.com/gofiber/fiber/v3"
"github.com/voltgizerz/POS-restaurant/pkg/logger"
)

// InitRouter initializes routes for the API server.
func (s *Server) InitRouter() *fiber.App {
app := fiber.New()

v1 := app.Group("api/v1")
s.initUserRoutes(v1)
s.initPingRoute(v1)

// Print all routes when server starts
printRoutes(app)

return app
}

// initUserRoutes initializes user-related routes.
func (s *Server) initUserRoutes(group fiber.Router) {
userRoutes := group.Group("/user")
userRoutes.Post("/login", s.userHandler.Login)
userRoutes.Post("/register", s.userHandler.Register)
}

// initPingRoute initializes the ping route.
func (s *Server) initPingRoute(group fiber.Router) {
group.Get("/ping", func(c fiber.Ctx) error {
return c.SendString("Pong")
})
}

// printRoutes prints all registered routes.
func printRoutes(app *fiber.App) {
for _, route := range app.GetRoutes() {
logger.Log.Infof("[%s] %s", route.Method, route.Path)
}
}
26 changes: 19 additions & 7 deletions internal/app/api/server.go
Original file line number Diff line number Diff line change
@@ -1,17 +1,29 @@
package api

import (
"github.com/gofiber/fiber/v3"
"github.com/voltgizerz/POS-restaurant/config"
"github.com/voltgizerz/POS-restaurant/internal/app/interactor"
"github.com/voltgizerz/POS-restaurant/internal/app/ports"
"github.com/voltgizerz/POS-restaurant/pkg/logger"
)

func NewServer(cfg config.API) {
app := fiber.New()
type Server struct {
cfg config.API
userHandler ports.IUserHandler
}

func NewServer(interactor interactor.APInteractor) *Server {
return &Server{
cfg: interactor.Cfg,
userHandler: interactor.UserHandler,
}
}

app.Get("/ping", func(c fiber.Ctx) error {
return c.SendString("pong")
})
func (s *Server) Initialize() {
app := s.InitRouter()

logger.LogStdErr.Fatal(app.Listen(":" + cfg.PORT))
err := app.Listen(":" + s.cfg.PORT)
if err != nil {
logger.LogStdErr.Fatalf("[Initialize] error on: %s", err.Error())
}
}
7 changes: 7 additions & 0 deletions internal/app/interactor/interactor.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,11 @@
package interactor

import (
"github.com/voltgizerz/POS-restaurant/config"
"github.com/voltgizerz/POS-restaurant/internal/app/ports"
)

type APInteractor struct {
Cfg config.API
UserHandler ports.IUserHandler
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package interfaces
package ports

type IAuth interface {
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,20 @@
package interfaces
package ports

import (
"context"

"github.com/gofiber/fiber/v3"
"github.com/voltgizerz/POS-restaurant/internal/app/entity"
)

type IUserRepository interface {
GetUser(ctx context.Context, int64 int64) (*entity.User, error)
}

type IUserService interface {
}

type IUserHandler interface {
Login(c fiber.Ctx) error
Register(c fiber.Ctx) error
}
4 changes: 2 additions & 2 deletions internal/app/repository/user.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,15 @@ 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/interfaces"
"github.com/voltgizerz/POS-restaurant/internal/app/ports"
"github.com/voltgizerz/POS-restaurant/pkg/logger"
)

type UserRepository struct {
MasterDB *sqlx.DB
}

func NewUserRepository(opts RepositoryOpts) interfaces.IUserRepository {
func NewUserRepository(opts RepositoryOpts) ports.IUserRepository {
return &UserRepository{
MasterDB: opts.Database.MasterDB,
}
Expand Down
25 changes: 25 additions & 0 deletions internal/app/service/auth_service.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package service

import (
"github.com/voltgizerz/POS-restaurant/internal/app/ports"
)

type UserService struct {
userRepository ports.IUserRepository
}

func NewUserService(repository ports.IUserRepository) *UserService {
return &UserService{
userRepository: repository,
}
}

func (s *UserService) Login(email string, password string) error {
// TODO
return nil
}

func (s *UserService) Register(email string, password string, confirmPass string) error {
// TODO
return nil
}
1 change: 1 addition & 0 deletions internal/app/service/user_service.go
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
package service
2 changes: 1 addition & 1 deletion pkg/env/env.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ const (
// LoadENV - load env file.
func LoadENV() {
if err := godotenv.Load(); err != nil {
logger.LogStdOut.Warn("No .env file found")
logger.Log.Warn("No .env file found")
}
}

Expand Down
4 changes: 2 additions & 2 deletions pkg/logger/logger.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import (
//
//revive:disable:import-shadowing
var (
LogStdOut *logrus.Logger
Log *logrus.Logger
LogStdErr *logrus.Logger
)

Expand All @@ -23,7 +23,7 @@ func Init() {
HideKeys: false,
FieldsOrder: []string{"component", "category"},
})
LogStdOut = logStdOut
Log = logStdOut

logStdErr := logrus.New()
logStdErr.SetOutput(os.Stderr)
Expand Down

0 comments on commit 46f7703

Please sign in to comment.