Referencia de la API

A continuación, se muestra una descripción general de las especificaciones de la API de Bundle Builder, incluidas las definiciones de TypeScript y descripciones detalladas.

Interfaz de paquete de documentos

La especificación para un documento único dentro de la colección configurada:

type BundleDocument = {
  // A list of document IDs to serve in the bundle.
  docs?: Array<string>;
  // A map containing individual named queries and their definitions.
  queries?: Map<string, QueryDefinition[]>;
  // A map of parameters and their definitions, which can be provided to a query definition.
  params?: Map<string, ParamDefinition>;
  // Specifies how long to keep the bundle in the client's cache, in seconds. If not defined, client-side cache is disabled.
  clientCache?: string;
  // Only used in combination with Firebase Hosting. Specifies how long to keep the bundle in Firebase Hosting CDN cache, in seconds.
  serverCache: string;
  // Specifies how long (in seconds) to keep the bundle in a Cloud Storage bucket, in seconds. If not defined, Cloud Storage bucket is not accessed.
  fileCache?: string;
  // If a 'File Cache' is specified, bundles created before this timestamp will not be file cached.
  notBefore?: Timestamp;
};

Interfaz de definición de parámetros

La especificación de un solo parámetro definido en un BundleDocument.

type ParamDefinition = {
  // Whether this parameter is required. If not provided as a query string, an error will be thrown.
  required: boolean;
  // The type of value which will be parsed, defaults to 'string'.
  type?:
    | "string"
    | "integer"
    | "float"
    | "boolean"
    | "string-array"
    | "integer-array"
    | "float-array";
};

Por ejemplo, con el siguiente parámetro:

params: {
  name: {
    required: true,
    type: 'string',
  }
}

Cuando se realiza una solicitud al extremo HTTP del paquete, el parámetro se puede proporcionar a través de un parámetro de consulta, por ejemplo, ?name=david. El parámetro se puede usar dentro de QueryDefinition (consulta a continuación) ($name) para crear paquetes de forma dinámica.

Interfaz de definición de consulta

Se usa una definición de consulta para crear consultas con nombre en el paquete. Cada objeto dentro del mapa de queries creará una nueva consulta con nombre y usará la clave del objeto como nombre. Cada consulta debe especificar una colección y, opcionalmente, una lista de condiciones para cumplir.

type QueryDefinition = {
  // The collection to perform the query on.
  collection: string;
  // An optional list of conditions to perform on the specified collection.
  conditions?: QueryCondition[];
};

El parámetro conditions puede contener un array de interfaces de QueryCondition. Cada elemento del array debe incluir solo una condición.

type QueryCondition = {
  // Performs a `where` filter on the collection on a given FieldPath, operator and value.
  where?: [
    string,
    (
      | "<"
      | "<="
      | "=="
      | ">="
      | ">"
      | "!="
      | "array-contains"
      | "in"
      | "not-in"
      | "array-contains-any"
    ),
    any
  ];
  orderBy?: [string, ("asc" | "desc")?];
  limit?: number;
  limitToLast?: number;
  offset?: number;
  startAt?: string;
  startAfter?: string;
  endAt?: string;
  endBefore?: string;
};

Por ejemplo, para crear una consulta llamada "products" en una colección de products con una condición de "where" y "limit", el resultado de la estructura de datos debe coincidir con lo siguiente:

queries: {
  products: {
    collection: 'products',
    conditions: [
      { where: ['type', '==', 'featured'] },
      { limit: 10 },
    ],
  }
}

Cuando proporcionas valores de array a los filtros in, not-in o array-contains-any, debes proporcionar un valor separado por comas, ya que los valores de array anidados no son compatibles con Firestore. Por ejemplo:

{ where: ['category', 'in', 'womens,shorts'] }, // ['womens', 'shorts']

Cualquier valor numérico se analizará como un número; sin embargo, si se requiere un valor numérico de string, este último debe estar entre paréntesis:

{ where: ['price', 'in', '1,2.5'] }, // [1, 2.5]
{ where: ['price', 'in', '"1","2.5"'] }, // ['1', '2.5']

Las condiciones también se pueden usar junto con los parámetros. Por ejemplo, si se define un parámetro de type (consulta la sección anterior), este se puede proporcionar a un valor de condición para proporcionar paquetes de datos dinámicos mediante la sintaxis $:

// ?type=featured


    conditions: [
      { where: ['type', '==', '$type'] },