Class IntegrationsResource

Hierarchy

  • Resource
    • IntegrationsResource

Constructors

Methods

  • Conecta una integración nueva. Ocupa cupo del plan (error 1404 si no queda).

    El cuerpo depende del proveedor: {provider: "google_drive", code} para el OAuth, o el formulario de config_fields PLANO —no dentro de un config— para el resto. El config es lo que el servidor construye y devuelve, no lo que se manda.

    Una tienda con claves creadas a mano (con permiso de lectura) va igual; las claves se prueban contra la tienda antes de guardar nada, y una organización puede conectar varias tiendas.

    const integration = await pv.integrations.connect(orgId, {
    provider: "rss",
    url: "https://blog.example/feed",
    id_accounts: [accountId],
    });

    const store = await pv.integrations.connect(orgId, {
    provider: "woocommerce",
    url: "https://tienda.example.com",
    consumer_key: "ck_...",
    consumer_secret: "cs_...",
    });

    Parameters

    Returns Promise<
        {
            _id: string;
            config: {
                api_base?: "wp-json"
                | "rest_route";
                auth_mode?: "query" | "basic";
                auto_publish?: boolean;
                currency?: string;
                id_accounts?: string[];
                import_image?: boolean;
                key_ending?: string;
                last_checked?: string;
                publication_type?: string;
                seen_guids?: string[];
                tax_location_missing?: boolean;
                template?: string;
                url?: string;
            };
            connected: boolean;
            creation_date: string;
            enabled: boolean;
            error_code?: null
            | number;
            external_identifier?: string;
            id_client: string;
            id_organization: string;
            last_used_date?: string;
            name: string;
            provider: "google_drive" | "rss" | "woocommerce";
        },
    >

  • El enlace al que mandar al usuario, en los proveedores con connect_link. Sólo esos: pedirlo para el RSS devuelve el error 2201.

    • Google Drive: su pantalla de consentimiento. El proveedor devuelve al usuario al redirect_uri con un code en la query, y ese code es lo que se pasa a connect. Es de un solo uso.
    • WooCommerce: la pantalla de aprobar de SU tienda, así que lleva url. La tienda se comprueba YA y sin claves (https, un cortafuegos delante, que haya WooCommerce), para que lo que va a fallar falle con el usuario todavía delante. Tras aprobar, la tienda nos manda la clave directamente y el usuario vuelve con id_integration en la query. No te fíes de success: lee esa integración con get. Un 2200 es que la clave no llegó (canceló); error_code 2219, que se está comprobando (unos segundos: vuelve a leerla); otro código, lo que falló; ninguno, conectada. El enlace dura 15 minutos y vale una vez. Con enlaces permanentes "simples" la tienda no tiene botón (2216 plain_permalinks): conéctala con claves.

    Parameters

    Returns Promise<string>

  • Una integración.

    Parameters

    • idOrganization: string
    • idIntegration: string
    • options: RequestOptions = {}

    Returns Promise<
        {
            _id: string;
            config: {
                api_base?: "wp-json"
                | "rest_route";
                auth_mode?: "query" | "basic";
                auto_publish?: boolean;
                currency?: string;
                id_accounts?: string[];
                import_image?: boolean;
                key_ending?: string;
                last_checked?: string;
                publication_type?: string;
                seen_guids?: string[];
                tax_location_missing?: boolean;
                template?: string;
                url?: string;
            };
            connected: boolean;
            creation_date: string;
            enabled: boolean;
            error_code?: null
            | number;
            external_identifier?: string;
            id_client: string;
            id_organization: string;
            last_used_date?: string;
            name: string;
            provider: "google_drive" | "rss" | "woocommerce";
        },
    >

  • Las integraciones de la organización, encadenando páginas.

    Parameters

    Returns AsyncGenerator<
        {
            _id: string;
            config: {
                api_base?: "wp-json"
                | "rest_route";
                auth_mode?: "query" | "basic";
                auto_publish?: boolean;
                currency?: string;
                id_accounts?: string[];
                import_image?: boolean;
                key_ending?: string;
                last_checked?: string;
                publication_type?: string;
                seen_guids?: string[];
                tax_location_missing?: boolean;
                template?: string;
                url?: string;
            };
            connected: boolean;
            creation_date: string;
            enabled: boolean;
            error_code?: null
            | number;
            external_identifier?: string;
            id_client: string;
            id_organization: string;
            last_used_date?: string;
            name: string;
            provider: "google_drive" | "rss" | "woocommerce";
        },
    >

  • Las integraciones de la organización, de la más reciente a la más antigua.

    Sin limit no hay límite: vuelven todas. Es la única lista de esta API que se comporta así — las demás cortan en 10.

    Parameters

    Returns Promise<
        Paginated<
            {
                _id: string;
                config: {
                    api_base?: "wp-json"
                    | "rest_route";
                    auth_mode?: "query" | "basic";
                    auto_publish?: boolean;
                    currency?: string;
                    id_accounts?: string[];
                    import_image?: boolean;
                    key_ending?: string;
                    last_checked?: string;
                    publication_type?: string;
                    seen_guids?: string[];
                    tax_location_missing?: boolean;
                    template?: string;
                    url?: string;
                };
                connected: boolean;
                creation_date: string;
                enabled: boolean;
                error_code?: null
                | number;
                external_identifier?: string;
                id_client: string;
                id_organization: string;
                last_used_date?: string;
                name: string;
                provider: "google_drive" | "rss" | "woocommerce";
            },
        >,
    >

  • Lo que el navegador necesita para abrir el selector del proveedor. Sólo Google Drive: en cualquier otro devuelve el error 2201.

    Lleva un access_token VIVO y de vida corta. No lo guardes, no lo registres en un log y no lo mandes a ningún sitio que no sea el Picker; se pide justo antes de abrirlo.

    app_id es el NÚMERO del proyecto de Google Cloud, no su identificador de texto: con el scope drive.file el permiso sobre el fichero elegido se concede al proyecto que lo eligió, así que tiene que ser el mismo que el del cliente OAuth.

    Parameters

    • idOrganization: string
    • idIntegration: string
    • options: RequestOptions = {}

    Returns Promise<
        {
            access_token: string;
            app_id: string;
            developer_key: string;
            expires_in: string;
        },
    >

  • Una página del catálogo de una tienda conectada (un proveedor con catalog), para elegir los productos de un plan from_catalog: sus external_id son lo que va en source.products. En cualquier otro proveedor, error 2207; con la integración deshabilitada, 2209.

    Se lee EN VIVO de la tienda en cada llamada, y por eso no hay un iterateProducts: cada página es una petición al hosting del cliente, y recorrer diez mil productos para encontrar tres es trabajo de search.

    • Pagina por cursor opaco: next_cursor se devuelve tal cual en cursor, y sin él era la última página.
    • Lo que el público no ve no viene (borradores, privados, ocultos). Lo agotado SÍ viene, con available: false: se enseña marcado y no se deja elegir, o el plan da 2112.
    • price es texto para copiar literal. Ausente es "sin precio", y también lo es en los productos con impuesto de una tienda con config.tax_location_missing.
    • Una tienda que rechaza su clave (2211) queda marcada con ese error_code hasta reconectarla; un cortafuegos (2212) o una tienda que no contesta (2213), no.
    const page = await pv.integrations.products(orgId, storeId, { search: "taza" });
    const choosable = page.items.filter((product) => product.available);

    Parameters

    Returns Promise<
        {
            items: {
                available: boolean;
                description?: string;
                external_id: string;
                image_url?: string;
                name: string;
                permalink?: string;
                price?: string;
            }[];
            next_cursor?: string;
        },
    >

  • El catálogo de proveedores: cómo se conecta cada uno, qué aporta y qué campos lleva su formulario.

    Es la única fuente de verdad de esa información. No copies el formulario del RSS a tu código: config_fields lo describe, y cambia con el servidor.

    No lleva autenticación de organización: es una constante del despliegue.

    Parameters

    Returns Promise<
        {
            accepted_formats: string[];
            catalog: boolean;
            config_fields: {
                default?: unknown;
                name: string;
                options?: string[];
                required: boolean;
                type: | "boolean"
                | "text"
                | "textarea"
                | "url"
                | "select"
                | "accounts"
                | "secret";
            }[];
            connect_link: boolean;
            connect_link_fields: {
                default?: unknown;
                name: string;
                options?: string[];
                required: boolean;
                type: | "boolean"
                | "text"
                | "textarea"
                | "url"
                | "select"
                | "accounts"
                | "secret";
            }[];
            content_feed: boolean;
            file_import: boolean;
            provider: "google_drive"
            | "rss"
            | "woocommerce";
            requires_oauth: boolean;
        }[],
    >

  • Renueva las credenciales de una integración que ya existe —caducó el token, el usuario revocó el permiso— o revalida la configuración de un feed, sin cambiar de documento.

    Mismo cuerpo que connect, porque quien lo interpreta es el mismo código del proveedor. No vuelve a ocupar cupo y va por permiso de update, no de create.

    Parameters

    Returns Promise<
        {
            _id: string;
            config: {
                api_base?: "wp-json"
                | "rest_route";
                auth_mode?: "query" | "basic";
                auto_publish?: boolean;
                currency?: string;
                id_accounts?: string[];
                import_image?: boolean;
                key_ending?: string;
                last_checked?: string;
                publication_type?: string;
                seen_guids?: string[];
                tax_location_missing?: boolean;
                template?: string;
                url?: string;
            };
            connected: boolean;
            creation_date: string;
            enabled: boolean;
            error_code?: null
            | number;
            external_identifier?: string;
            id_client: string;
            id_organization: string;
            last_used_date?: string;
            name: string;
            provider: "google_drive" | "rss" | "woocommerce";
        },
    >

  • Borra la integración y revoca en el proveedor cuando éste sabe hacerlo.

    WooCommerce no sabe: una app no puede borrar su propia clave. Tras desconectar una tienda hay que decirle al usuario que la borre él en WooCommerce → Ajustes → Avanzado → API REST; es la que acaba en config.key_ending (léela ANTES de borrar la integración).

    Lo que ya se importó se queda: los ficheros son de la biblioteca de la organización, no de la integración.

    Parameters

    • idOrganization: string
    • idIntegration: string
    • options: RequestOptions = {}

    Returns Promise<void>

  • Cambia el nombre, la configuración o el interruptor.

    enabled: false la deja conectada pero fuera de juego: no la barre el job y deja de contar cupo. Es lo que hay que usar para pausar un feed en vez de borrarlo.

    Parameters

    • idOrganization: string
    • idIntegration: string
    • body: {
          config?: {
              auto_publish?: boolean;
              id_accounts?: string[];
              import_image?: boolean;
              last_checked?: string;
              publication_type?: string;
              seen_guids?: string[];
              template?: string;
              url?: string;
          };
          enabled?: boolean;
          name?: string;
      }
    • options: RequestOptions = {}

    Returns Promise<
        {
            _id: string;
            config: {
                api_base?: "wp-json"
                | "rest_route";
                auth_mode?: "query" | "basic";
                auto_publish?: boolean;
                currency?: string;
                id_accounts?: string[];
                import_image?: boolean;
                key_ending?: string;
                last_checked?: string;
                publication_type?: string;
                seen_guids?: string[];
                tax_location_missing?: boolean;
                template?: string;
                url?: string;
            };
            connected: boolean;
            creation_date: string;
            enabled: boolean;
            error_code?: null
            | number;
            external_identifier?: string;
            id_client: string;
            id_organization: string;
            last_used_date?: string;
            name: string;
            provider: "google_drive" | "rss" | "woocommerce";
        },
    >