Files
Welton Moura 936aad779b feat: RRBEC Local Server - Go backend with Django sync
- Implement local-first architecture with SQLite
- Add bidirectional sync with Django via ChangeLog
- JWT authentication with auto-refresh token
- REST API for products, orders, commands, payments
- Stock management with automatic deduction
2026-04-04 17:38:40 -03:00

79 lines
2.5 KiB
Go

package main
import (
"log"
"rrbec_server/internal/api"
"rrbec_server/internal/config"
"rrbec_server/internal/database"
"rrbec_server/internal/repository"
"rrbec_server/internal/service"
"rrbec_server/internal/sync"
"github.com/gin-gonic/gin"
)
func main() {
// 1. Load Configuration
config.LoadConfig()
// 2. Initialize Database
db := database.InitDB(config.AppConfig.DBName)
// 3. Initialize Dependency Injection
repo := repository.NewRepository(db)
svc := service.NewService(repo)
handler := api.NewHandler(svc)
// 4. Start Sync Worker
syncer := sync.NewSyncer(repo, config.AppConfig.DjangoBaseURL, config.AppConfig.DjangoMasterUser, config.AppConfig.DjangoMasterPassword)
syncer.Start()
// 4. Setup Gin Router
r := gin.Default()
// API Routes
v1 := r.Group("/api/v1")
{
// Public routes
v1.POST("/login", handler.Login)
v1.GET("/products", handler.GetProducts)
v1.GET("/mesas", handler.GetMesas)
v1.GET("/comandas", handler.GetComandas)
v1.GET("/comandas/:id", handler.GetComandaByID)
v1.GET("/categories", handler.GetCategories)
v1.GET("/payment-types", handler.GetTypePayments)
v1.GET("/clients", handler.GetClients)
v1.GET("/orders", handler.GetOrders)
v1.GET("/payments", handler.GetPayments)
// Protected routes
protected := v1.Group("/")
protected.Use(api.SimpleAuthMiddleware())
{
protected.POST("/products", handler.CreateProduct)
protected.PATCH("/products/:id", handler.UpdateProduct)
protected.POST("/categories", handler.CreateCategory)
protected.PATCH("/categories/:id", handler.UpdateCategory)
protected.POST("/comandas", handler.CreateComanda)
protected.POST("/items-comanda", handler.AddItemToComanda)
protected.DELETE("/items-comanda/:id", handler.DeleteItemFromComanda)
protected.POST("/comandas/:id/apagar", handler.ClearComanda)
protected.POST("/comandas/:id/pagar", handler.PagarComanda)
protected.PATCH("/comandas/:id", handler.UpdateComanda)
protected.POST("/orders", handler.CreateOrder)
protected.PATCH("/orders/:id", handler.UpdateOrder)
protected.POST("/orders/:id/preparing", handler.SetOrderPreparing)
protected.POST("/orders/:id/finish", handler.SetOrderFinished)
protected.POST("/orders/:id/deliver", handler.SetOrderDelivered)
protected.POST("/orders/:id/cancel", handler.SetOrderCanceled)
protected.GET("/me", handler.GetCurrentUser)
}
}
// 6. Run Server
log.Printf("Local server running on http://localhost:%s", config.AppConfig.Port)
if err := r.Run(":" + config.AppConfig.Port); err != nil {
log.Fatalf("failed to run server: %v", err)
}
}