import * as express from "express";
import * as bodyParser from "body-parser";
import * as nodemailer from "nodemailer";
import config from '../config/configs';
class App {
public app: express.Application;
constructor() {
this.app = express();
this.app.use(bodyParser.json());
this.routes();
}
routes() {
this.app.route("/").get((req, res) => {
res.send({ 'result': 'version 0.0.2' })
});
this.app.route("/").post((req, res) => {
const message = Object.assign({}, req.body);
let result = this.sendMail(message.to, message.subject, message.message);
res.status(200).json({ 'result': result })
});
}
sendMail(to?: string, subject?: string, message?: string) {
let mailOptions = {
from: "",
to: to,
subject: subject,
html: message
};
const transporter = nodemailer.createTransport({
host: config.host,
port: config.port,
secure: false,
auth: {
user: config.user,
pass: config.password
},
tls: { rejectUnauthorized: false }
});
transporter.sendMail(mailOptions, function (error, info) {
if (error) {
return error;
} else {
return "E-mail enviado com sucesso!";
}
});
}
}
export default new App();
Esse código esta funcionando, mas se analisarmos ele rapidamente, estamos passando algumas responsabilidades que não deveriam estar na classe App.
São elas:
- As rotas deveriam estar em um outro arquivo
- O método de envio de e-mail deveria estar em uma outra classe separada
Esse é um código simples, com alguns pequenos passos nós conseguimos deixar ele dentro do esperado pelo SRP. Para isso, siga os passos a seguir:
O primeiro passo será a criação de um novo arquivo chamado mail.ts, em seguida atualizar ele com o seguinte trecho de código:
mail.ts
import * as nodemailer from "nodemailer";
import config from './config/configs';
class Mail {
sendMail(to?: string, subject?: string, message?: string) {
let mailOptions = {
from: "",
to: to,
subject: subject,
html: message
};
const transporter = nodemailer.createTransport({
host: config.host,
port: config.port,
secure: false,
auth: {
user: config.user,
pass: config.password
},
tls: { rejectUnauthorized: false }
});
transporter.sendMail(mailOptions, function (error, info) {
if (error) {
return error;
} else {
return "E-mail enviado com sucesso!";
}
});
}
}
export default new Mail;
Nesse arquivo nós criamos uma nova classe chamada mail com um método chamado sendMail.
Agora irei criar um diretório chamado router e dentro dele dois arquivos: indexRouter.ts para rota default e um outro emailRouter.ts, em seguida irei atualizar eles com os seguintes trechos de código:
indexRouter.ts
import * as express from "express";
const indexRouter = express.Router();
indexRouter.route("/").get((req, res) => {
res.send({ 'result': 'version 0.0.3' })
});
export default indexRouter;
emailRouter.ts
import * as express from "express";
import mail from "../mail";
const emailRouter = express.Router();
emailRouter.route("/").post((req, res) => {
const message = Object.assign({}, req.body);
let result = mail.sendMail(message.to, message.subject, message.message);
res.status(200).json({ 're sult': result })
});
export default emailRouter;
E por fim atualizamos o arquivo app.ts com o seguinte trecho de código:
import * as express from "express";
import * as bodyParser from "body-parser";
import indexRouter from "../router/indexRouter";
import emailRouter from "../router/emailRouter";
class App {
public app: express.Application;
constructor() {
this.app = express();
this.app.use(bodyParser.json());
this.routes();
}
routes() {
this.app.use("/", indexRouter);
this.app.use("/", emailRouter);
}
}
export default new App();
Agora a nossa classe app.ts esta dentro do principio do SRP 😉
Bom, conforme passei acima esse foi um exemplo simples, espero que tenham gostado e até um próximo artigo pessoal 🙂
Gostou deste artigo? Comente abaixo!
Referência: https://programadriano.medium.com/princ%C3%ADpios-do-solid-com-typescript-1e585c6eeb5e