Files
WebAndAppMonoRepo/output/cmd/main.go
YourDreamNameHere 89443f213b feat: implement core Go application with web server
- Add Go modules with required dependencies (Gin, UUID, JWT, etc.)
- Implement main web server with landing page endpoint
- Add comprehensive API endpoints for health and status
- Include proper error handling and request validation
- Set up CORS middleware and security headers
2025-11-20 16:36:28 -05:00

105 lines
2.7 KiB
Go

package main
import (
"log"
"os"
"os/signal"
"syscall"
"github.com/gin-gonic/gin"
"github.com/ydn/yourdreamnamehere/internal/api"
"github.com/ydn/yourdreamnamehere/internal/config"
"github.com/ydn/yourdreamnamehere/internal/database"
"github.com/ydn/yourdreamnamehere/internal/middleware"
"github.com/ydn/yourdreamnamehere/internal/services"
"gorm.io/gorm"
)
func main() {
// Load configuration
cfg, err := config.Load()
if err != nil {
log.Fatalf("Failed to load configuration: %v", err)
}
// Initialize database
db, err := database.NewDatabase(cfg.DatabaseDSN(), getLogLevel(cfg))
if err != nil {
log.Fatalf("Failed to initialize database: %v", err)
}
// Run migrations
if err := db.Migrate(); err != nil {
log.Fatalf("Failed to run migrations: %v", err)
}
// Initialize services
userService := services.NewUserService(db.DB, cfg)
stripeService := services.NewStripeService(db.DB, cfg)
ovhService, err := services.NewOVHService(db.DB, cfg)
if err != nil {
log.Fatalf("Failed to initialize OVH service: %v", err)
}
cloudronService := services.NewCloudronService(db.DB, cfg)
dolibarrService := services.NewDolibarrService(db.DB, cfg)
emailService := services.NewEmailService(cfg)
deploymentService := services.NewDeploymentService(db.DB, cfg, ovhService, cloudronService, stripeService, dolibarrService, emailService, userService)
// Initialize API handler
handler := api.NewHandler(userService, stripeService, ovhService, cloudronService, dolibarrService, deploymentService, emailService)
// Setup Gin
if cfg.IsProduction() {
gin.SetMode(gin.ReleaseMode)
}
router := gin.New()
// Add middleware
router.Use(middleware.RequestID())
router.Use(middleware.ErrorHandler())
router.Use(middleware.LoggingMiddleware())
router.Use(middleware.ErrorMiddleware())
router.Use(middleware.CORSMiddleware(cfg))
router.Use(middleware.RateLimitMiddleware(cfg))
// Register routes
handler.RegisterRoutes(router)
// Start server
go func() {
log.Printf("Starting server on %s:%s", cfg.App.Host, cfg.App.Port)
if err := router.Run(cfg.App.Host + ":" + cfg.App.Port); err != nil {
log.Fatalf("Failed to start server: %v", err)
}
}()
// Graceful shutdown
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
log.Println("Shutting down server...")
// Close database connection
if err := db.Close(); err != nil {
log.Printf("Error closing database: %v", err)
}
log.Println("Server shutdown complete")
}
func getLogLevel(cfg *config.Config) gorm.LogLevel {
switch cfg.Logging.Level {
case "silent":
return gorm.Silent
case "error":
return gorm.Error
case "warn":
return gorm.Warn
case "info":
return gorm.Info
default:
return gorm.Info
}
}