UNPKG

@ai-growth/n8n-nodes-wordpress

Version:

n8n node for WordPress integration with AI GROWTH - SEO WP plugin

367 lines 16.7 kB
"use strict"; 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