docker will default to 8080 and can be adjusted via the docker compose, or passing the same env over it will change it as well.
144 lines
3.9 KiB
Go
144 lines
3.9 KiB
Go
// @title My Awesome API
|
|
// @version 1.0
|
|
// @description This is a sample server for a pet store.
|
|
// @termsOfService http://swagger.io/terms/
|
|
|
|
// @contact.name API Support
|
|
// @contact.url http://www.swagger.io/support
|
|
// @contact.email support@swagger.io
|
|
|
|
// @license.name Apache 2.0
|
|
// @license.url http://www.apache.org/licenses/LICENSE-2.0.html
|
|
|
|
// @host localhost:8080
|
|
// @BasePath /api/v1
|
|
package main
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
|
|
"net/http"
|
|
"os"
|
|
|
|
"github.com/gin-contrib/cors"
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/joho/godotenv"
|
|
"lst.net/cmd/services/logging"
|
|
"lst.net/cmd/services/system/config"
|
|
_ "lst.net/docs"
|
|
"lst.net/utils/db"
|
|
)
|
|
|
|
func main() {
|
|
log := logging.New()
|
|
// Load .env only in dev (not Docker/production)
|
|
if os.Getenv("RUNNING_IN_DOCKER") != "true" {
|
|
err := godotenv.Load("../.env")
|
|
if err != nil {
|
|
log.Info("Warning: .env file not found (ok in Docker/production)", "system", map[string]interface{}{})
|
|
}
|
|
}
|
|
|
|
// Initialize DB
|
|
if err := db.InitDB(); err != nil {
|
|
log.Panic("Database intialize failed", "db", map[string]interface{}{
|
|
"error": err.Error(),
|
|
"casue": errors.Unwrap(err),
|
|
"timeout": "30s",
|
|
"details": fmt.Sprintf("%+v", err), // Full stack trace if available
|
|
})
|
|
}
|
|
defer func() {
|
|
if r := recover(); r != nil {
|
|
sqlDB, _ := db.DB.DB()
|
|
sqlDB.Close()
|
|
log.Error("Recovered from panic during DB shutdown", "db", map[string]interface{}{
|
|
"panic": r,
|
|
})
|
|
}
|
|
}()
|
|
|
|
// Set basePath dynamically
|
|
basePath := "/"
|
|
|
|
if os.Getenv("APP_ENV") != "production" {
|
|
basePath = "/lst" // Dev only
|
|
}
|
|
|
|
// fmt.Println(name)
|
|
fmt.Println("Welcome to lst backend where all the fun happens.")
|
|
r := gin.Default()
|
|
|
|
if os.Getenv("APP_ENV") == "production" {
|
|
gin.SetMode(gin.ReleaseMode)
|
|
}
|
|
|
|
// Enable CORS (adjust origins as needed)
|
|
r.Use(cors.New(cors.Config{
|
|
AllowOrigins: []string{"*"}, // Allow all origins (change in production)
|
|
AllowMethods: []string{"GET", "OPTIONS", "POST", "DELETE", "PATCH", "CONNECT"},
|
|
AllowHeaders: []string{"Origin", "Cache-Control", "Content-Type"},
|
|
ExposeHeaders: []string{"Content-Length"},
|
|
AllowCredentials: true,
|
|
AllowWebSockets: true,
|
|
}))
|
|
|
|
// // --- Add Redirects Here ---
|
|
// // Redirect root ("/") to "/app" or "/lst/app"
|
|
// r.GET("/", func(c *gin.Context) {
|
|
// c.Redirect(http.StatusMovedPermanently, basePath+"/app")
|
|
// })
|
|
|
|
// // Redirect "/lst" (if applicable) to "/lst/app"
|
|
// if basePath == "/lst" {
|
|
// r.GET("/lst", func(c *gin.Context) {
|
|
// c.Redirect(http.StatusMovedPermanently, basePath+"/app")
|
|
// })
|
|
// }
|
|
|
|
// Serve Docusaurus static files
|
|
r.StaticFS(basePath+"/docs", http.Dir("docs"))
|
|
r.StaticFS(basePath+"/app", http.Dir("frontend"))
|
|
|
|
r.GET(basePath+"/api/ping", func(c *gin.Context) {
|
|
log.Info("Checking if the server is up", "system", map[string]interface{}{
|
|
"endpoint": "/api/ping",
|
|
"client_ip": c.ClientIP(),
|
|
"user_agent": c.Request.UserAgent(),
|
|
})
|
|
c.JSON(200, gin.H{"message": "pong"})
|
|
})
|
|
|
|
logging.RegisterLoggerRoutes(r, basePath)
|
|
config.RegisterConfigRoutes(r, basePath)
|
|
|
|
r.Any(basePath+"/api", errorApiLoc)
|
|
|
|
// get the server port
|
|
port := "8080"
|
|
if os.Getenv("VITE_SERVER_PORT") != "" {
|
|
port = os.Getenv("VITE_SERVER_PORT")
|
|
}
|
|
r.Run(":" + port)
|
|
}
|
|
|
|
// func serveViteApp(c *gin.Context) {
|
|
// // Set proper Content-Type for HTML
|
|
// c.Header("Content-Type", "text/html")
|
|
// c.File("./dist/index.html")
|
|
// }
|
|
|
|
// func errorLoc(c *gin.Context) {
|
|
// c.JSON(http.StatusBadRequest, gin.H{"message": "welcome to lst system you might have just encountered an incorrect area of the app"})
|
|
// }
|
|
func errorApiLoc(c *gin.Context) {
|
|
log := logging.New()
|
|
log.Info("Api endpoint hit that dose not exist", "system", map[string]interface{}{
|
|
"endpoint": "/api",
|
|
"client_ip": c.ClientIP(),
|
|
"user_agent": c.Request.UserAgent(),
|
|
})
|
|
c.JSON(http.StatusBadRequest, gin.H{"message": "looks like you have encountered an api route that dose not exist"})
|
|
}
|