Skip to content

Strapi Queries

Función Find One

La función findOne recibe la colección y los parámetros que se necesitan para encontrar algún registro que estes buscando.

export async function findOne(
collection,
fields,
filters,
populate,
status?: Status
) {
try {
const entry = await strapi
.documents(collection)
.findFirst({ fields, filters, populate, status });
if (!entry || entry.length === 0) {
return Errors.NOT_FOUND;
} else {
return entry;
}
} catch (error) {
console.log(Errors.ERROR_FIND_ONE + error);
}
}

Si no se encuentra un registro que coincida con los criterios especificados, la función devuelve notFound, indicando que no se encontró el registro.

Ejemplo de uso.

const collection = "api::usuario.usuario";
const fields = ["nombre", "email"];
const filters = { id: 1 };
const populate = { profile: true };
const status = "published"; // opcional, puedes omitirlo
const usuario = await findOne(collection, fields, filters, populate, status);
if (usuario === Errors.NOT_FOUND) {
console.log("Usuario no encontrado");
} else {
console.log("Usuario encontrado:", usuario);
}

Función Find Many

La función findMany permite obtener múltiples registros desde una colección específica utilizando el nuevo Document Service API de Strapi. Puedes personalizar la consulta mediante los parámetros fields, filters, populate y status.

Si no se encuentran registros que coincidan con los criterios proporcionados, la función devuelve Errors.NOT_FOUND.

export async function findMany(
collection,
fields = null,
filters = null,
populate = null,
status?: Status
) {
try {
const entries = await strapi.documents(collection).findMany({
fields,
filters,
populate,
status,
});
if (!entries || entries.length === 0) {
return Errors.NOT_FOUND;
} else {
return entries;
}
} catch (error) {
console.log(Errors.ERROR_FIND_MANY_FILTERS + error);
}
}

Ejemplo de uso

const collection = "api::prueba.prueba";
const fields = ["titulo", "descripcion"];
const filters = { categoria: { $eq: "tecnologia" } };
const populate = { autor: true };
const status = "published";
const resultados = await findMany(
collection,
fields,
filters,
populate,
status
);
if (resultados === Errors.NOT_FOUND) {
console.log("No se encontraron registros.");
} else {
console.log("Registros encontrados:", resultados);
}

Función Update

La función update recibe la colección, el parámetro where, que es la condición para saber qué item es el que se va a modificar, los datos nuevos a actualizar y de manera opcional, el estado del collectionType. Si se proporciona un documentId, lo usa directamente; si no, busca el documento por los campos dados en where traves de la funcion findOne vista anteriormente. Luego aplica los datos nuevos (data) y opcionalmente un status. Devuelve el documento actualizado o un error si no se encuentra o falla la operación.

export async function update(collection, where, data, status?: Status) {
try {
let updated = "";
if (!where.documentId) {
const document = await findOne(collection, [documentId], where, []);
if (document === Errors.NOT_FOUND) return Errors.NOT_FOUND;
updated = await strapi.documents(collection).update({
documentId: document.documentId,
data: data,
...(status && { status }),
});
} else {
updated = await strapi.documents(collection).update({
documentId: where.documentId,
data: data,
...(status && { status }),
});
}
if (!updated || updated.length === 0) {
return Errors.NOT_FOUND;
} else {
return updated;
}
} catch (error) {
console.log(Errors.ERROR_UPDATE + error);
}
}

Ejemplo de uso sin status

const collection = "api::prueba.prueba";
const where = {
documentId: "abc123xyz",
};
const data = {
titulo: "Nuevo título del artículo",
};
await update(collection, where, data);

Ejemplo de uso con status

const collection = "api::prueba.prueba";
const where = {
documentId: "abc123xyz",
};
const data = {
titulo: "Nuevo título del artículo",
};
const status = "published";
await update(collection, where, data, status);

Funcion Create

La función create recibe como parametros la colección y los datos del nuevo item.

export async function create(collection, data) {
try {
await strapi.documents(collection).create(data);
} catch (error) {
console.log(errorCreate + error);
}
}

Ejemplo de uso

La implementación del if (!result.publishedAt) asegura que la entidad se cree solo una vez, ya que verifica si el contenido está en estado de borrador. Si es así, la creación de la entidad se realiza solo en modo draft (borrador). Una vez que el contenido se publica, la condición no se vuelve a cumplir y no se crea de nuevo. En este caso, se utiliza un ejemplo en un lifecycle hook debido a que, con la nueva versión de Strapi 5, se ha introducido la funcionalidad de publish y draft en el Content Manager para gestionar el contenido. Esto provoca que al crear una nueva entidad con la función create, esta se guarde dos veces: una como draft y otra como published. En el ejemplo se proporciona una solución para que solo se guarde una vez.

import { create } from "../../../../utils/strapi-queries";
module.exports = {
async afterCreate(event) {
const { result } = event;
if (!result.publishedAt) {
await create("api::blog.blog", {
name: `Welcome blog for ${result.name}`,
numpage: 1,
description: `This is the first blog for the user ${result.name}.`,
author: result.id,
});
}
},
};

La implementación del if (!result.publishedAt) asegura que la entidad se cree solo una vez, ya que verifica si el contenido está en estado de borrador. Si es así, la creación de la entidad se realiza solo en modo draft (borrador). Una vez que el contenido se publica, la condición no se vuelve a cumplir y no se crea de nuevo.

📨 Función sendEmail

Esta funcion es la encargada de enviar un email a un usuario especifico utilizando el plugin de Email.

export async function sendEmail(
email: string,
subject: string,
text: string,
html: string
) {
if (!email || !subject || (!text && !html)) {
return Errors.ERROR_EMAIL_MISSING_PARAMETERTS;
}
try {
return await strapi.plugins[USER_STRIPE_EMAIL_PLUGIN].services.email.send({
to: email,
subject,
text,
html,
});
} catch (error) {
console.error(Errors.ERROR_SEND_EMAIL + error);
return Errors.ERROR_SEND_EMAIL;
}
}

Ejemplo de uso

const lang = validateLang(body.lang);
const { subject, text, html } = EMAIL_CONTENT[lang].updated;
await sendEmail(email, subject, text(vertical), html(vertical));

La parte del lenguaje y llenado de datos verse al final de reset password.