import { z } from "zod";
import { strapiClient } from "../services/strapi-client.js";
export const batchDeleteToolSchema = z.object({
contentType: z
.string()
.describe('Nombre PLURAL del content type (ej: "products", "articles")'),
documentIds: z
.array(z.string())
.min(1)
.describe(
"Array de documentIds de las entradas a eliminar. Ejemplo: ['abc123xyz', '2f8a9c1b']"
),
continueOnError: z
.boolean()
.optional()
.default(true)
.describe(
"Continuar eliminando otras entradas si alguna falla (default: true)"
),
});
export const batchDeleteToolHandler = async (params: {
contentType: string;
documentIds: string[];
continueOnError?: boolean;
}) => {
try {
console.error(
`[BATCH DELETE TOOL] Deleting ${params.documentIds.length} entries from ${params.contentType}`
);
const results = {
total: params.documentIds.length,
successful: 0,
failed: 0,
entries: [] as Array<{
index: number;
documentId: string;
success: boolean;
deleted?: boolean;
error?: string;
}>,
};
// Procesar en paralelo
const promises = params.documentIds.map((documentId, index) =>
(async () => {
try {
console.error(
`[BATCH DELETE TOOL] Deleting entry ${index + 1}/${
params.documentIds.length
} (${documentId})`
);
const deleteResult = await strapiClient.delete({
contentType: params.contentType,
documentId,
});
results.successful++;
results.entries.push({
index,
documentId,
success: true,
deleted: deleteResult.data?.deleted === true,
});
console.error(
`[BATCH DELETE TOOL] Entry ${index + 1} deleted successfully: ${documentId}`
);
} catch (error) {
results.failed++;
const errorMessage =
error instanceof Error ? error.message : "Unknown error";
results.entries.push({
index,
documentId,
success: false,
deleted: false,
error: errorMessage,
});
console.error(
`[BATCH DELETE TOOL ERROR] Entry ${index + 1} (${documentId}) failed: ${errorMessage}`
);
// Si continueOnError es false, relanzar el error
if (!params.continueOnError) {
throw error;
}
}
})()
);
// Esperar a que todas las promesas se completen
await Promise.all(promises);
const summary =
results.successful === params.documentIds.length
? "✅ All entries deleted successfully"
: `⚠️ Deleted ${results.successful}/${params.documentIds.length} entries (${results.failed} failed)`;
return {
content: [
{
type: "text" as const,
text: `${summary}\n\n${JSON.stringify(results, null, 2)}`,
},
],
structuredContent: results,
};
} catch (error) {
const errorMessage =
error instanceof Error ? error.message : "Unknown error";
console.error(`[BATCH DELETE TOOL ERROR] ${errorMessage}`);
return {
content: [
{
type: "text" as const,
text: `Error in batch delete operation for ${params.contentType}:\n\n${errorMessage}`,
},
],
isError: true,
};
}
};