Skip to content

Commit 2afd98b

Browse files
committed
feat: complete auth service refactoring to clean architecture
1 parent 7eecdcd commit 2afd98b

36 files changed

+4780
-1497
lines changed

auth/README.md

Lines changed: 443 additions & 35 deletions
Large diffs are not rendered by default.

auth/cmd/auth/main.go

Lines changed: 59 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -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

3232
func 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

Comments
 (0)