package middleware import ( "context" "net/http" "strings" "5803025024/w04/internal/store" ) type contextKey string const UserIDKey contextKey = "user_id" func GetUserID(ctx context.Context) string { if val, ok := ctx.Value(UserIDKey).(string); ok { return val } return "" } type AuthMiddleware struct { sessionStore *store.SessionStore } func NewAuthMiddleware(sessionStore *store.SessionStore) *AuthMiddleware { return &AuthMiddleware{sessionStore: sessionStore} } func (m *AuthMiddleware) RequireAuth(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { authHeader := r.Header.Get("Authorization") if authHeader == "" { http.Error(w, "Unauthorized", http.StatusUnauthorized) return } token := authHeader if strings.HasPrefix(strings.ToLower(authHeader), "bearer ") { token = authHeader[7:] } token = strings.TrimSpace(token) if token == "" { http.Error(w, "Unauthorized", http.StatusUnauthorized) return } session, err := m.sessionStore.Get(r.Context(), token) if err != nil || session == nil { http.Error(w, "Unauthorized", http.StatusUnauthorized) return } ctx := context.WithValue(r.Context(), UserIDKey, session.UserID) next.ServeHTTP(w, r.WithContext(ctx)) }) } func (m *AuthMiddleware) RequireAuthFunc(next http.HandlerFunc) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { m.RequireAuth(next).ServeHTTP(w, r) } } func RequireAuth(sessionStore *store.SessionStore) func(http.Handler) http.Handler { return NewAuthMiddleware(sessionStore).RequireAuth }