Skip to content
Snippets Groups Projects
Commit 85a1e2bb authored by jsk22's avatar jsk22
Browse files

Confirmation email implemented

 enter the commit message for your changes. Lines starting
parent a3d72e7d
No related branches found
No related tags found
2 merge requests!53Confirmation email implemented,!52Confirmation email implemented
......@@ -25,6 +25,7 @@ const EnvSchema = z.object({
AWS_SECRET_ACCESS_KEY: z.string(),
AWS_REGION: z.string(),
S3_BUCKET: z.string(),
URL: z.string(),
})
export type EnvSchema = z.infer<typeof EnvSchema>
......
......@@ -42,19 +42,27 @@ export const authRouter = new Hono().post(
zValidator('json', userSchemas.userInputSchema),
async (c) => {
try {
const input = c.req.valid('json')
const input = await c.req.valid('json');
console.log("Dados recebidos:", input);
const userStats = userStatsSchemas.dto.parse(await userStatsService.create())
input.user_stats_id = userStats.id
const user = userSchemas.userDtoSchema.parse(
await userService.create(input)
)
// Criando userStats
console.log("Criando userStats...");
const userStats = userStatsSchemas.dto.parse(await userStatsService.create());
console.log("UserStats criado:", userStats);
input.user_stats_id = userStats.id;
return c.json({ user, userStats })
const user = userSchemas.userDtoSchema.parse(await userService.create(input));
await authService.sendConfirmationEmail(user.email, "Confirmação de email", user.name, user.email);
return c.json({ user, userStats });
} catch (e) {
return c.text('could not create')
console.error("Erro no cadastro:", e);
return c.text('could not create', 500);
}
})
}
)
.post('/recoveryPassword/:id',
async (c) => {
try {
......@@ -153,5 +161,37 @@ export const authRouter = new Hono().post(
);
}
}
)
.get("/confirm-email", async (c) => {
try {
const emailArray = c.req.queries("email");
if ( !emailArray?.[0]) {
throw new Error("Invalid request: missing email or token");
}
const email = emailArray[0];
const user = await userService.findByEmail(email);
if (!user) {
throw new Error("User not found");
}
await authService.updateConfirmedAt(email);
return c.redirect("http://mecred.mec.gov.br");
} catch (e) {
return c.json(
createApexError({
status: "error",
message: "Impossible to verify email",
code: HttpStatus.BAD_REQUEST,
path: c.req.routePath,
suggestion: "Check the input and try again",
}),
HttpStatus.BAD_REQUEST
);
}
});
import { Inject, Service } from 'typedi'
import { UserService } from './user.service'
import { sign } from 'hono/jwt'
import env from '@/env'
import env from '../env.ts';
import {
authPayload,
verifyPassword,
......@@ -33,8 +33,99 @@ export class AuthService {
return token
}
async updateConfirmedAt(userEmail: string) {
const user = await this.userService.findByEmail(userEmail);
if (!user) {
throw new Error("Usuário não encontrado");
}
if (user.confirmed_at !== null) {
throw new Error("Usuário já foi confirmado");
}
user.confirmed_at = new Date().toISOString();
return await this.userService.update(user);
}
async sendConfirmationEmail(receiver: string, subject: string, userName: string, userEmail: string) {
const link: string = `${env.URL}/entrar`;
const text = `
<head>
<style>
.container {
display: block;
text-align: left;
background-color: rgb(240, 240, 240);
width: 90%;
margin: 0 auto;
padding: 30px 30px;
border-radius: 30%,
font-family: Arial, Helvetica, sans-serif;
}
button {
background-color: #00bacc;
color: white;
border: none;
border-radius: 5px;
padding: 10px;
font-size: 16px;
cursor: pointer;
}
.container_msg {
text-align: left;
padding: 0px 20px 0px 20px;
background-color: white;
}
button:hover {
background-color: rgb(7, 29, 65, 0.8);
}
span {
color: #e74c3c;
font-weight: bold;
}
</style>
</head>
<body>
<div class="container" >
<a href="${process.env["URL"]}"></a>
<h1 style="color:#00bacc; font-size: 30px; font-weight: 800; margin-top: 5px; margin-bottom: 5px">Recuperação de senha</h1>
<br>
<p>Olá, ${userName}!</p>
<p>Boas-vindas à Plataforma MEC RED!</p>
<p>Este e-mail foi enviado para confirmar que você é o proprietário do endereço de e-mail fornecido no cadastro da MECRED.
Essa etapa é importante para garantir a validade e segurança das informações enviadas.
</p>
<p>Para confirmar sua conta clique no botão abaixo</p>
<a href="${link}"><button>Confirme seu email</button></a>
</div>
</body>
`
try {
const response = await transporter.sendMail({
from: "Não responda <no-reply@c3sl.ufpr.br>",
to: receiver,
subject: subject,
html: text
});
console.log("E-mail enviado:", response);
console.log(userEmail)
} catch (error) {
console.error("Erro ao enviar e-mail:", error);
}
}
async passwordRecoveryEmail(resetTicket: string, receiver: string, subject: string, userEmail: string) {
const token_link: string = `http://mecreddev:3002/novaSenha?token=${resetTicket}&email=${userEmail}`;
const token_link: string = `${env.URL}novaSenha?token=${resetTicket}&email=${userEmail}`;
const text = `
<head>
<style>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment