@@ -10,9 +10,9 @@ import (
1010 "time"
1111
1212 "auth/internal/config"
13+ "auth/internal/container"
1314 "auth/internal/handlers"
1415 "auth/internal/middleware"
15- "auth/internal/storage"
1616
1717 "github.com/joho/godotenv"
1818)
@@ -30,46 +30,70 @@ func methodHandler(method string, handler http.HandlerFunc) http.HandlerFunc {
3030}
3131
3232func main () {
33+ log .Println ("🚀 Starting Auth Service with Container Architecture..." )
34+
3335 // Load environment variables
3436 if err := godotenv .Load (); err != nil {
3537 log .Println ("No .env file found, using system environment variables" )
3638 }
3739
38- // Initialize Redis connection
39- storage .InitRedis ()
40-
41- // Initialize PostgreSQL connection
42- storage .InitPostgres ()
43-
44- // Validate required environment variables (using same names as scribbl_backend)
40+ // Validate required environment variables
4541 requiredEnvVars := []string {"SECRET_KEY_BASE" , "TWO_FACTOR_API_KEY" , "OTP_TEMPLATE_NAME" }
4642 for _ , envVar := range requiredEnvVars {
4743 if os .Getenv (envVar ) == "" {
48- log .Fatalf ("Required environment variable %s not set" , envVar )
44+ log .Fatalf ("❌ Required environment variable %s not set" , envVar )
4945 }
5046 }
5147
48+ // Create container with auto-detection (production vs test)
49+ appContainer , err := container .CreateAutoDetectedContainer ()
50+ if err != nil {
51+ log .Fatalf ("❌ Failed to create application container: %v" , err )
52+ }
53+ defer func () {
54+ log .Println ("🧹 Shutting down container..." )
55+ if err := appContainer .Shutdown (); err != nil {
56+ log .Printf ("⚠️ Error during container shutdown: %v" , err )
57+ }
58+ }()
59+
60+ log .Println ("✅ Container initialized successfully" )
61+
62+ // Create handlers from container
63+ appHandlers := handlers .NewHandlersFromContainer (appContainer )
64+
5265 // Get port from environment or use default
5366 port := os .Getenv ("PORT" )
5467 if port == "" {
5568 port = config .DefaultPort
5669 }
5770
58- // Setup HTTP routes
71+ // Setup HTTP routes with handlers
5972 mux := http .NewServeMux ()
60- mux .Handle ("/auth/request-otp" , middleware .CorsMiddleware (middleware .RateLimitMiddleware (http .HandlerFunc (handlers .RequestOTPHandler ))))
61- mux .Handle ("/auth/verify-otp" , middleware .CorsMiddleware (http .HandlerFunc (handlers .VerifyOTPHandler )))
6273
63- // Protected user endpoints
64- mux .Handle ("/auth/user" , middleware .CorsMiddleware (middleware .AuthMiddleware (methodHandler ("GET" , handlers .GetUserHandler ))))
65- mux .Handle ("/auth/user/update" , middleware .CorsMiddleware (middleware .AuthMiddleware (methodHandler ("PUT" , handlers .UpdateUserHandler ))))
74+ // Public auth endpoints (with middleware)
75+ mux .Handle ("/auth/request-otp" ,
76+ middleware .CorsMiddleware (
77+ middleware .RateLimitMiddleware (
78+ appHandlers .Auth .RequestOTPHandlerFunc ())))
79+
80+ mux .Handle ("/auth/verify-otp" ,
81+ middleware .CorsMiddleware (
82+ appHandlers .Auth .VerifyOTPHandlerFunc ()))
6683
67- // Add health check endpoint
68- mux .HandleFunc ("/health" , func (w http.ResponseWriter , r * http.Request ) {
69- w .Header ().Set ("Content-Type" , "application/json" )
70- w .WriteHeader (http .StatusOK )
71- w .Write ([]byte (`{"status":"ok","service":"auth"}` ))
72- })
84+ // Protected user endpoints (with auth middleware)
85+ mux .Handle ("/auth/user" ,
86+ middleware .CorsMiddleware (
87+ middleware .AuthMiddleware (
88+ methodHandler ("GET" , appHandlers .User .GetUserHandlerFunc ()))))
89+
90+ mux .Handle ("/auth/user/update" ,
91+ middleware .CorsMiddleware (
92+ middleware .AuthMiddleware (
93+ methodHandler ("PUT" , appHandlers .User .UpdateUserHandlerFunc ()))))
94+
95+ // Enhanced health check endpoint using container
96+ mux .HandleFunc ("/health" , handlers .NewHealthCheckHandler (appContainer ))
7397
7498 // Create HTTP server
7599 server := & http.Server {
@@ -82,25 +106,34 @@ func main() {
82106
83107 // Start server in a goroutine
84108 go func () {
85- log .Printf ("Auth service starting on port %s" , port )
109+ log .Printf ("🌐 Auth service starting on port %s" , port )
110+ log .Printf ("📍 Available endpoints:" )
111+ log .Printf (" POST /auth/request-otp - Request OTP for phone number" )
112+ log .Printf (" POST /auth/verify-otp - Verify OTP and authenticate" )
113+ log .Printf (" GET /auth/user - Get user profile (requires auth)" )
114+ log .Printf (" PUT /auth/user/update - Update user profile (requires auth)" )
115+ log .Printf (" GET /health - Service health check" )
116+
86117 if err := server .ListenAndServe (); err != nil && err != http .ErrServerClosed {
87- log .Fatalf ("Server failed to start: %v" , err )
118+ log .Fatalf ("❌ Server failed to start: %v" , err )
88119 }
89120 }()
90121
91122 // Wait for interrupt signal to gracefully shutdown the server
92123 quit := make (chan os.Signal , 1 )
93124 signal .Notify (quit , syscall .SIGINT , syscall .SIGTERM )
94125 <- quit
95- log .Println ("Shutting down server..." )
126+ log .Println ("🛑 Shutting down server..." )
96127
97128 // Give outstanding requests 30 seconds to complete
98129 ctx , cancel := context .WithTimeout (context .Background (), 30 * time .Second )
99130 defer cancel ()
100131
101132 if err := server .Shutdown (ctx ); err != nil {
102- log .Fatalf ("Server forced to shutdown: %v" , err )
133+ log .Printf ("⚠️ Server forced to shutdown: %v" , err )
134+ } else {
135+ log .Println ("✅ Server shut down gracefully" )
103136 }
104137
105- log .Println ("Server exited" )
138+ log .Println ("✅ Application exited cleanly " )
106139}
0 commit comments