Framework IATE
1 - Translator.js
Similar ao Controller do padrão MVC. Responsável por receber os dados de request, decidir o serviço de comunicação com o Interactor e compilar a resposta para a API.
Na prática, o
Translatorserve para manter oserver.jsmais limpo e claro.
export default class Translator {
    constructor() {
        self.Interactor = require('./Interactor').default
    }
    post(request, response) {
        const interactor = new self.Interactor()
        let data = request.body || {}
        interactor.createUser(data)
                .then(data => response.send(200, data))
                .catch(data => response.send(500, data));
    }
    get()
}
2 - Interactor.js
Manipula os dados relevantes do Request Model e decide como os dados devem ser enviados para regra de negócio na Entity.
export default class Interactor {
    constructor() {
        self.Entity = require('./Entity').default
    }
    createUser(data) {
    	const entity = new self.Entity
    	return entity.validateMenorData(data)
    		.then(data => {
    		        entity.createMenor(data)
            	})
    		.catch(error => {
    	        	console.log(error)
    	        })
    }
}
3 - Entity.js
Camada que contém validação de dados e regras de negócio. Responsável por comunicar com o Adapter.
import Joi from 'joi'
export default class Entity {
	constructor {
		self.Adapter = require('./Adapter').default
	}
	validateMenorData(data) {
		return new Promise((resolve, reject) => {
			const schema = Joi.object().keys({
    			username: Joi.string().optional(),
    			email: Joi.string().email()
			})
			
			const result = Joi.validate(data, schema);
			if (result) {
				resolve(data)
			} else {
				reject('')
			}
		})
	}
	createMenor(data) {
		const adapter = new self.Adapter
		
		return adapter.save(data)
	}
}
4 - Adapter.js
Última camada da aplicação e faz a interface com o banco de dados.
export default class Adapter {
	constructor() {
		self.mongoose = require('mongoose')
		self.MenorModel = mongoose.model('Menor')
	}
	save(data) {
			const menor = new self.MenorModel(data)
			return menor.save().then((data) => {
				return data
			})
		}
}