Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add user routes and refactor #3

Merged
merged 2 commits into from
Jun 8, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading