package middleware import ( "log" "net/http" "strings" ) // CheckCollaboratorReadOnly verifica se um colaborador está tentando fazer operações de escrita // Se sim, bloqueia com 403 func CheckCollaboratorReadOnly(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // Verificar agency_role do contexto agencyRole, ok := r.Context().Value("agency_role").(string) if !ok { // Se não houver agency_role no contexto, é um customer, deixa passar next.ServeHTTP(w, r) return } // Apenas colaboradores têm restrição de read-only if agencyRole != "collaborator" { next.ServeHTTP(w, r) return } // Verificar se é uma operação de escrita method := r.Method if method == http.MethodPost || method == http.MethodPut || method == http.MethodDelete { // Verificar a rota path := r.URL.Path // Bloquear operações de escrita em CRM if strings.Contains(path, "/api/crm/") { userID, _ := r.Context().Value(UserIDKey).(string) log.Printf("❌ COLLABORATOR WRITE BLOCKED: User %s (collaborator) tried %s %s", userID, method, path) http.Error(w, "Colaboradores têm acesso somente leitura", http.StatusForbidden) return } } next.ServeHTTP(w, r) }) }