Home Reference Source Repository

src/modules/rules/index.js

import async from 'async'
import Mailer from './../mailer'

/**
 * Implementa a de validação de e-mail, execução de ações de acordo com o filtro definido
 * e deve ser extendida na criação de novas regras
 */
class Rule {
	/**
	 * @param {SpreadsheetRow[]} rows - Lista de linhas disponíveis para verificação
	 * @construct
	 */
	constructor (rows = []) {
		this.rows = rows
		this.ML = new Mailer()
		this.valid = false

		this._actions = []
	}

	/**
	 * Valida o e-mail presente na linha da planilha em análise
	 * @param {string[]} row - Linha da planilha contendo informações do participante
	 * @returns {Boolean} - retorna verdadeiro se e-mail for inválido,
	 * truque para ação ser executada filtro é inválido
	 * @abstract
	 */
	filter (row) {
		var re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
		if (re.test(row['e-mail'].trim())) {
			return false
		}
		return true
	}

	/**
	 * Executa ações previamente adicionadas na regra em execução
	 * @param {Spreadsheetrow[]} row - linha que será passada para as ações
	 * @param {Function} done2 - callback
	 * @abstract
	 */
	action (row, done2) {
		let that = this;
		async.eachSeries(that.getActions(), function(action, done) {
			that[action](row, done)
		}, done2)
	}

	/**
	 * Filtra todas as linhas da planilha e executa ação nas que passarem pelo filtro
	 * @param {Function} done2 - callback
	 * @public
	 */
	validate (done2) {
		let that = this
		that.addActions()
		async.eachSeries(that.rows, function (row, done) {
			if (that.filter(row)) {
				that.action(row, done)
			} else {
				that.valid = true
				done(null, row)
			}
		}, done2)
	}

	/**
	 * Marca linha da planilha como inválida
	 * @param {Spreadsheetrow[]} row - linha que será passada para as ações
	 * @param {Function} done2 - callback
	 * @protected
	 */
	invalidateSubscriber (row, done) {
		row.status = 'Inválida'
		row.save(function(err, results) {
			done('E-mail inválido encontrado: ' + row['e-mail'])
		})
	}

	/**
	 * Envia e-mail para organizador avisando que foi encontrado e-mail inválido na planilha
	 * @param {Spreadsheetrow[]} row - linha que será passada para as ações
	 * @param {Function} done2 - callback
	 * @protected
	 */
	warningOrganizer(row, done) {
		this.ML.send ('[email protected]', 'email inválido encontrado na planilha', 'conteúdo da planilha', done)
	}

	/**
	 * Adiciona ações a serem executadas para essa regra
	 * @abstract
	 */
	addActions() {
		this._actions.push('warningOrganizer')
		this._actions.push('invalidateSubscriber')
	}

	/**
	 * Retorna ações adicionadas
	 * @returns {string[]} - ações disponíveis
	 * @public
	 */
	getActions() {
		return this._actions
	}

	/**
	 * Configura módulo envio de e-mail
	 * @param {Mailer} mailer - Classe que implementa método send
	 */
	setMailer (mailer) {
		this.ML = mailer
	}

	/**
	 * Define conteúdo a ser usado como fonte de dados
	 * @param {Object[]} content - Conteúdo a ser usado nos filtros e ações
	 */
	setRows (content) {
		this.rows = content
	}
}

export default Rule