> ## Documentation Index
> Fetch the complete documentation index at: https://docs.basaltic.sh/llms.txt
> Use this file to discover all available pages before exploring further.

# Políticas de filtro

> Seleccione notificaciones por igualdad, prefijo, sufijo, exclusión, presencia y comparación numérica.

El filtro elige qué mensajes publicados generan una entrega para la suscripción. Coloque los valores de enrutamiento en el mapa `attributes`. Un campo `event` dentro del texto JSON de `message` no se convierte en atributo filtrable.

<span id="a-complete-example" />

## Un ejemplo completo

Esta política acepta pedidos de producción de valor mínimo 100 y menor que 1.000, salvo cuando hay un atributo `test`:

```json theme={null}
{
  "event": ["order.created", "order.paid"],
  "environment": ["production"],
  "amount": [{ "numeric": [">=", 100, "<", 1000] }],
  "test": [{ "exists": false }]
}
```

Estos atributos de publicación coinciden:

```json theme={null}
{
  "event": { "type": "String", "value": "order.paid" },
  "environment": { "type": "String", "value": "production" },
  "amount": { "type": "Number", "value": "149.50" }
}
```

Los valores de atributos son cadenas incluso con tipo `Number`. Los operandos numéricos del filtro son números JSON. Mantenga distintas ambas representaciones.

| Cambio en los atributos | Resultado | Motivo |
| - | - | - |
| Ninguno | Coincide | Todas las condiciones se cumplen. |
| `event` pasa a `order.refunded` | No coincide | Ninguna alternativa de evento coincide. |
| `amount` pasa a `1000` | No coincide | El límite superior es exclusivo. |
| Quitar `amount` | No coincide | Las comparaciones numéricas exigen presencia. |
| Añadir `test` con valor `false` | No coincide | `exists: false` comprueba ausencia, no valor. |
| Añadir atributo `customer` no relacionado | Coincide | Los atributos extra se ignoran. |

<span id="how-conditions-combine" />

## Cómo combinar condiciones

Todos los atributos nombrados deben coincidir: **AND entre nombres de atributos**. En la lista de un atributo, basta una alternativa: **OR entre alternativas**. Dentro de un único operador `numeric`, deben cumplirse todas las comparaciones.

Los nombres y comparaciones textuales distinguen mayúsculas. Una política vacía `{}` acepta todos los mensajes, incluso sin atributos. Todos los operadores excepto `exists: false` exigen presencia. Los atributos ausentes no coinciden con exclusiones como `anything-but`.

<span id="supported-matchers" />

## Comparaciones disponibles

Los ejemplos muestran la lista de alternativas de un atributo.

| Comparación | Ejemplo | Comportamiento |
| - | - | - |
| Cadena exacta | `["critical", "error"]` | Valor igual a una de las cadenas. |
| Prefijo | `[{"prefix": "order."}]` | Empieza por `order.`. |
| Sufijo | `[{"suffix": ".failed"}]` | Termina en `.failed`. |
| Exclusión | `[{"anything-but": ["debug", "trace"]}]` | Valor presente distinto de los elementos. También acepta una cadena o número. |
| Presencia | `[{"exists": true}]` | El atributo existe, incluso con cadena vacía. |
| Ausencia | `[{"exists": false}]` | Atributo ausente. |
| Intervalo numérico | `[{"numeric": [">=", 100, "<", 1000]}]` | Valor numérico que cumple ambas comparaciones. |
| Igualdad numérica | `[{"numeric": ["=", 100]}]` | Compara números: `100` y `100.0` coinciden. |

Operadores numéricos: `=`, `<`, `<=`, `>` y `>=`. Escriba operador y operando; repita pares para un intervalo. Los valores que no pueden interpretarse como números no coinciden. El evaluador actual interpreta el valor independientemente del tipo declarado; use `Number` en datos numéricos para mayor claridad.

Los números JSON simples también son alternativas exactas, pero comparan la representación textual. `[100]` coincide con `"100"`, no con `"100.0"`. Use `numeric` para igualdad matemática.

Los prefijos y sufijos comparan texto literal. No hay comodines, expresiones regulares, filtros anidados del cuerpo, atributos con arrays ni operadores que ignoren mayúsculas. No suponga compatibilidad con todos los operadores SNS.

<span id="combining-presence-and-exclusion" />

## Combinar presencia y exclusión

Para aceptar un valor distinto de `test`, incluso cuando falte el atributo, incluya ambas alternativas:

```json theme={null}
{
  "environment": [
    { "anything-but": "test" },
    { "exists": false }
  ]
}
```

Dos elementos en la lista no exigen prefijo y sufijo a la vez: significan OR. Publique un atributo de enrutamiento separado con la clasificación combinada cuando necesite esa condición.

<span id="set-or-clear-a-policy" />

## Definir o borrar una política

<Tabs>
  <Tab title="Console">
    Abra **Subscriptions** en el tema y seleccione **Subscribe**. Pegue un objeto JSON en **Filter policy** al crear. Déjelo vacío para recibir todo. El formulario comprueba la sintaxis; la API valida operadores y límites.

    Abra **Filter policy** en la suscripción existente para inspeccionar; use la API para sustituir o borrar.
  </Tab>

  <Tab title="API">
    Defina `filter_policy` al crear o sustituya con PATCH:

    ```http theme={null}
    PATCH /v1/topics/{topic_id}/subscriptions/{subscription_id}
    Content-Type: application/json
    ```

    ```json theme={null}
    {
      "filter_policy": {
        "severity": ["critical", "error"]
      }
    }
    ```

    PATCH sustituye toda la política, sin combinar nombres de atributos. Envíe `{"filter_policy": {}}` para eliminar el filtro. Omitir el campo conserva la política.
  </Tab>

  <Tab title="CLI">
    Guarde la solicitud JSON de la pestaña API como `request-1.json`. Defina `SUBSCRIPTION_ID`, `TOPIC_ID` con los UUID de los recursos. Use su cuenta y región configuradas.

    ```bash theme={null}
    basaltic notifications subscription update "$TOPIC_ID" "$SUBSCRIPTION_ID" --from-file request-1.json
    ```
  </Tab>

  <Tab title="Go">
    Guarde la solicitud JSON de la pestaña API como `request-1.json`. Defina `SUBSCRIPTION_ID`, `TOPIC_ID` con los UUID de los recursos. Configure credenciales, cuenta y región mediante las variables de entorno del SDK.

    ```go theme={null}
    package main

    import (
    	"context"
    	"encoding/json"
    	"fmt"
    	"os"

    	basaltic "github.com/basaltic-sh/sdk-go"
    	"github.com/basaltic-sh/sdk-go/notifications"
    )

    func readJSON(path string, value any) error {
    	data, err := os.ReadFile(path)
    	if err != nil {
    		return err
    	}
    	return json.Unmarshal(data, value)
    }

    func run() error {
    	ctx := context.Background()
    	cfg, err := basaltic.NewConfig(ctx)
    	if err != nil {
    		return err
    	}
    	client := notifications.New(cfg)
    	var request1 notifications.UpdateSubscriptionRequest
    	if err := readJSON("request-1.json", &request1); err != nil {
    		return err
    	}
    	result1, err := client.UpdateSubscription(ctx, os.Getenv("TOPIC_ID"), os.Getenv("SUBSCRIPTION_ID"), &request1)
    	if err != nil {
    		return err
    	}
    	fmt.Printf("%+v\n", result1)
    	return nil
    }

    func main() {
    	if err := run(); err != nil {
    		fmt.Fprintln(os.Stderr, err)
    		os.Exit(1)
    	}
    }
    ```
  </Tab>
</Tabs>

<span id="limits-and-validation" />

## Límites y validación

| Elemento | Límite |
| - | - |
| Nombres de atributos por filtro | 20 |
| Alternativas por atributo | 1–50 |
| Valores en `anything-but` | 1–50 |
| Atributos por mensaje publicado | 20 |
| Nombre del atributo publicado | 1–256 bytes |
| Valor del atributo publicado | Hasta 1.024 bytes |
| Tipos de atributo publicado | `String` o `Number` |

Cada objeto debe tener exactamente un operador. Los prefijos y sufijos no pueden estar vacíos. Las listas numéricas necesitan pares completos operador/número. Las alternativas vacías y operadores desconocidos no son válidos. Las políticas malformadas devuelven HTTP `400` con `NOTIFICATION_INVALID_FILTER_POLICY`.

Una suscripción filtrada no tiene registro de entrega ni intento fallido. Si hay menos entregas de las esperadas, compruebe confirmación, nombres y valores exactos y todas las condiciones. Los cambios afectan a decisiones de distribución posteriores; no crean ni eliminan registros existentes de forma retroactiva.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.