@ai-growth/n8n-nodes-wordpress
Version:
n8n node for WordPress integration with AI GROWTH - SEO WP plugin
367 lines • 16.7 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.WordPressValidator = void 0;
const n8n_workflow_1 = require("n8n-workflow");
/**
* Validador e formatador de parâmetros para o nó WordPress
*/
class WordPressValidator {
/**
* Valida uma URL
* @param url URL para validar
* @returns true se for válida, false caso contrário
*/
static isValidUrl(url) {
try {
new URL(url);
return true;
}
catch (error) {
return false;
}
}
/**
* Valida um slug
* @param slug Slug para validar
* @returns true se for válido, false caso contrário
*/
static isValidSlug(slug) {
// Slug deve conter apenas letras minúsculas, números, hífens e underscores
const slugRegex = /^[a-z0-9-_]+$/;
return slugRegex.test(slug);
}
/**
* Valida e formata os parâmetros para criar um post/página
* @param execFunctions Funções de execução do n8n
* @param i Índice do item atual
* @param resource Tipo de recurso (post ou page)
* @returns Parâmetros validados e formatados
*/
static getCreateParams(execFunctions, i, resource) {
var _a, _b, _c;
// Obter parâmetros básicos
const title = execFunctions.getNodeParameter('title', i);
const content = execFunctions.getNodeParameter('content', i);
const status = execFunctions.getNodeParameter('status', i);
// Verificar campos obrigatórios com mensagens detalhadas
if (!title) {
throw new n8n_workflow_1.NodeOperationError(execFunctions.getNode(), `Title is required for ${resource === 'post' ? 'a post' : 'a page'}`, { itemIndex: i });
}
if (!content) {
throw new n8n_workflow_1.NodeOperationError(execFunctions.getNode(), `Content is required for ${resource === 'post' ? 'a post' : 'a page'}`, { itemIndex: i });
}
// Parâmetros básicos
const params = {
title,
content,
status,
};
// Adicionar e validar campos opcionais se fornecidos
const excerpt = execFunctions.getNodeParameter('excerpt', i, '');
if (excerpt) {
params.excerpt = excerpt;
}
const slug = execFunctions.getNodeParameter('slug', i, '');
if (slug) {
// Validar formato do slug
if (!this.isValidSlug(slug)) {
throw new n8n_workflow_1.NodeOperationError(execFunctions.getNode(), 'Slug can only contain lowercase letters, numbers, hyphens and underscores', { itemIndex: i });
}
params.slug = slug;
}
const featuredImageUrl = execFunctions.getNodeParameter('featured_image_url', i, '');
if (featuredImageUrl) {
if (!this.isValidUrl(featuredImageUrl)) {
throw new n8n_workflow_1.NodeOperationError(execFunctions.getNode(), 'Featured image URL must be a valid URL', { itemIndex: i });
}
params.featured_image_url = featuredImageUrl;
}
// Adicionar categorias e tags apenas para posts
if (resource === 'post') {
const categories = execFunctions.getNodeParameter('categories', i, '');
if (categories) {
// Para criação/atualização, aceitar nomes e IDs - a conversão será feita pelo TaxonomyService
params.categories = categories.split(',').map(item => {
const trimmed = item.trim();
// Tentar converter para número, se falhar manter como string
const num = parseInt(trimmed, 10);
return isNaN(num) ? trimmed : num;
}).filter(item => item !== '' && item !== 0);
}
const tags = execFunctions.getNodeParameter('tags', i, '');
if (tags) {
// Para criação/atualização, aceitar nomes e IDs - a conversão será feita pelo TaxonomyService
params.tags = tags.split(',').map(item => {
const trimmed = item.trim();
// Tentar converter para número, se falhar manter como string
const num = parseInt(trimmed, 10);
return isNaN(num) ? trimmed : num;
}).filter(item => item !== '' && item !== 0);
}
}
// Verificar opções de SEO
const seoOptions = execFunctions.getNodeParameter('seoOptions', i, {});
// Processar metadados SEO
if ((_a = seoOptions.metadataValues) === null || _a === void 0 ? void 0 : _a.updateSeoMetadata) {
params.updateSeoMetadata = true;
const metaTitle = seoOptions.metadataValues.meta_title;
if (metaTitle !== undefined) {
// Verificar comprimento do meta title (recomendado: 50-60 caracteres)
if (metaTitle && metaTitle.length > 70) {
execFunctions.logger.warn(`Meta title is too long (${metaTitle.length} chars). Recommended: 50-60 chars`);
}
params.meta_title = metaTitle;
}
const metaDescription = seoOptions.metadataValues.meta_description;
if (metaDescription !== undefined) {
// Verificar comprimento da meta description (recomendado: 150-160 caracteres)
if (metaDescription && metaDescription.length > 160) {
execFunctions.logger.warn(`Meta description is too long (${metaDescription.length} chars). Recommended: 150-160 chars`);
}
params.meta_description = metaDescription;
}
const metaKeywords = seoOptions.metadataValues.meta_keywords;
if (metaKeywords !== undefined) {
params.meta_keywords = metaKeywords;
}
const ogTitle = seoOptions.metadataValues.og_title;
if (ogTitle !== undefined) {
params.og_title = ogTitle;
}
const ogDescription = seoOptions.metadataValues.og_description;
if (ogDescription !== undefined) {
params.og_description = ogDescription;
}
const twitterTitle = seoOptions.metadataValues.twitter_title;
if (twitterTitle !== undefined) {
params.twitter_title = twitterTitle;
}
const twitterDescription = seoOptions.metadataValues.twitter_description;
if (twitterDescription !== undefined) {
params.twitter_description = twitterDescription;
}
}
// Processar FAQs
if ((_b = seoOptions.faqValues) === null || _b === void 0 ? void 0 : _b.updateFaqs) {
params.updateFaqs = true;
const faqCollection = seoOptions.faqValues.faq;
if (faqCollection && faqCollection.faqValues) {
// Validar FAQs
const faqs = faqCollection.faqValues.map((item, index) => {
if (!item.question || !item.question.trim()) {
throw new n8n_workflow_1.NodeOperationError(execFunctions.getNode(), `FAQ #${index + 1} is missing a question`, { itemIndex: i });
}
if (!item.answer || !item.answer.trim()) {
throw new n8n_workflow_1.NodeOperationError(execFunctions.getNode(), `FAQ #${index + 1} is missing an answer`, { itemIndex: i });
}
return {
question: item.question.trim(),
answer: item.answer.trim(),
};
});
params.faq = faqs;
}
}
// Processar CTA
if ((_c = seoOptions.ctaValues) === null || _c === void 0 ? void 0 : _c.updateCta) {
params.updateCta = true;
const ctaText = seoOptions.ctaValues.text;
const ctaUrl = seoOptions.ctaValues.url;
if (ctaText || ctaUrl) {
// Validar URL do CTA
if (ctaUrl && !this.isValidUrl(ctaUrl)) {
throw new n8n_workflow_1.NodeOperationError(execFunctions.getNode(), `CTA URL is not valid: ${ctaUrl}`, { itemIndex: i });
}
params.cta = {
text: ctaText || '',
url: ctaUrl || '',
};
}
}
return params;
}
/**
* Valida e formata os parâmetros para atualizar um post/página
* @param execFunctions Funções de execução do n8n
* @param i Índice do item atual
* @param resource Tipo de recurso (post ou page)
* @returns Parâmetros validados e formatados
*/
static getUpdateParams(execFunctions, i, resource) {
// Obter ID do post/página
const id = execFunctions.getNodeParameter('id', i);
// Verificar ID
if (!id || id <= 0) {
throw new n8n_workflow_1.NodeOperationError(execFunctions.getNode(), `Invalid ${resource} ID: ${id}`, { itemIndex: i });
}
// Obter e validar outros parâmetros de criação
const createParams = this.getCreateParams(execFunctions, i, resource);
// Retornar parâmetros para atualização
return {
id,
...createParams,
};
}
/**
* Valida e formata os parâmetros para obter um post/página
* @param execFunctions Funções de execução do n8n
* @param i Índice do item atual
* @returns Parâmetros validados e formatados
*/
static getGetParams(execFunctions, i) {
var _a, _b, _c;
// Obter ID do post/página
const id = execFunctions.getNodeParameter('id', i);
// Verificar ID
if (!id || id <= 0) {
throw new n8n_workflow_1.NodeOperationError(execFunctions.getNode(), `Invalid ID: ${id}`, { itemIndex: i });
}
// Parâmetros básicos
const params = { id };
// Verificar opções de SEO
const seoOptions = execFunctions.getNodeParameter('seoOptions', i, {});
// Processar metadados SEO
if ((_a = seoOptions.metadataValues) === null || _a === void 0 ? void 0 : _a.includeSeoMetadata) {
params.includeSeoMetadata = true;
}
// Processar FAQs
if ((_b = seoOptions.faqValues) === null || _b === void 0 ? void 0 : _b.includeFaqs) {
params.includeFaqs = true;
}
// Processar CTA
if ((_c = seoOptions.ctaValues) === null || _c === void 0 ? void 0 : _c.includeCta) {
params.includeCta = true;
}
return params;
}
/**
* Valida e formata os parâmetros para obter múltiplos posts/páginas
* @param execFunctions Funções de execução do n8n
* @param i Índice do item atual
* @param resource Tipo de recurso (post ou page)
* @returns Parâmetros validados e formatados
*/
static getGetAllParams(execFunctions, i, resource) {
var _a, _b, _c;
// Verificar se deve retornar todos os resultados
const returnAll = execFunctions.getNodeParameter('returnAll', i);
// Parâmetros básicos
const params = {};
// Adicionar limite se não estiver retornando todos
if (!returnAll) {
const limit = execFunctions.getNodeParameter('limit', i, 10);
params.limit = limit;
}
// Adicionar página
params.page = 1;
// Adicionar termo de busca
const search = execFunctions.getNodeParameter('search', i, '');
if (search) {
params.search = search;
}
// Adicionar status
const status = execFunctions.getNodeParameter('status', i, 'publish');
if (status) {
params.status = status;
}
// Adicionar categorias e tags apenas para posts
if (resource === 'post') {
const categories = execFunctions.getNodeParameter('categories', i, '');
if (categories) {
// Para getAll, converter para IDs numéricos (filtros da API WordPress)
params.categories = categories.split(',')
.map(item => item.trim())
.filter(item => item.length > 0)
.map(item => {
const num = parseInt(item, 10);
if (isNaN(num)) {
throw new n8n_workflow_1.NodeOperationError(execFunctions.getNode(), `For filtering posts, categories must be numeric IDs. Invalid category ID: ${item}. Use category names only when creating/updating posts.`, { itemIndex: i });
}
return num;
});
}
const tags = execFunctions.getNodeParameter('tags', i, '');
if (tags) {
// Para getAll, converter para IDs numéricos (filtros da API WordPress)
params.tags = tags.split(',')
.map(item => item.trim())
.filter(item => item.length > 0)
.map(item => {
const num = parseInt(item, 10);
if (isNaN(num)) {
throw new n8n_workflow_1.NodeOperationError(execFunctions.getNode(), `For filtering posts, tags must be numeric IDs. Invalid tag ID: ${item}. Use tag names only when creating/updating posts.`, { itemIndex: i });
}
return num;
});
}
}
// Verificar opções de SEO
const seoOptions = execFunctions.getNodeParameter('seoOptions', i, {});
// Processar metadados SEO
if ((_a = seoOptions.metadataValues) === null || _a === void 0 ? void 0 : _a.includeSeoMetadata) {
params.includeSeoMetadata = true;
}
// Processar FAQs
if ((_b = seoOptions.faqValues) === null || _b === void 0 ? void 0 : _b.includeFaqs) {
params.includeFaqs = true;
}
// Processar CTA
if ((_c = seoOptions.ctaValues) === null || _c === void 0 ? void 0 : _c.includeCta) {
params.includeCta = true;
}
return params;
}
/**
* Valida e formata os parâmetros para excluir um post/página
* @param execFunctions Funções de execução do n8n
* @param i Índice do item atual
* @returns Parâmetros validados e formatados
*/
static getDeleteParams(execFunctions, i) {
// Obter ID do post/página
const id = execFunctions.getNodeParameter('id', i);
// Verificar ID
if (!id || id <= 0) {
throw new n8n_workflow_1.NodeOperationError(execFunctions.getNode(), `Invalid ID: ${id}. Please provide a valid ID greater than 0.`, { itemIndex: i });
}
// Parâmetros básicos
const params = { id };
// Verificar se deve forçar exclusão permanente
const force = execFunctions.getNodeParameter('force', i, false);
params.force = force;
// Adicionar aviso sobre exclusão permanente
if (force) {
execFunctions.logger.warn(`ID ${id} will be permanently deleted. This action cannot be undone.`);
}
else {
execFunctions.logger.info(`ID ${id} will be moved to trash. You can restore it later from the WordPress admin.`);
}
return params;
}
/**
* Valida e formata os parâmetros para qualquer operação
* @param execFunctions Funções de execução do n8n
* @param i Índice do item atual
* @param resource Tipo de recurso (post ou page)
* @param operation Operação a ser realizada
* @returns Parâmetros validados e formatados
*/
static getParams(execFunctions, i, resource, operation) {
switch (operation) {
case 'create':
return this.getCreateParams(execFunctions, i, resource);
case 'update':
return this.getUpdateParams(execFunctions, i, resource);
case 'get':
return this.getGetParams(execFunctions, i);
case 'getAll':
return this.getGetAllParams(execFunctions, i, resource);
case 'delete':
return this.getDeleteParams(execFunctions, i);
default:
throw new n8n_workflow_1.NodeOperationError(execFunctions.getNode(), `Unsupported operation: ${operation}`, { itemIndex: i });
}
}
}
exports.WordPressValidator = WordPressValidator;
//# sourceMappingURL=WordPressValidator.js.map