ÿØÿà JFIF ` ` ÿþ
|
Server : Apache System : Linux cloud.heroica.com.br 4.18.0-553.36.1.el8_10.x86_64 #1 SMP Wed Jan 22 03:07:54 EST 2025 x86_64 User : farolpborg ( 1053) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /var/www/node_services/sebraevisitas/src/services/websiteclientes/ |
Upload File : |
import prisma from '../../prisma'
import bcrypt from 'bcryptjs'
import { sign } from 'jsonwebtoken'
interface LoginRequestProps{
cnpj:string,
password:string
}
const UsersWebSite = class {
async login({cnpj,password}:LoginRequestProps){
// remove tudo que não for dígito
const cnpjClean = (cnpj || '').replace(/\D/g,'');
if(!cnpjClean || cnpjClean.length !== 14){
throw new Error('CNPJ inválido');
}
if(!password){
throw new Error('Senha é obrigatória');
}
const user = await prisma.userswebsiteclientes.findFirst({ where: { cnpj: cnpjClean } });
if(!user){
// Usuário não encontrado: sinaliza ao frontend para redirecionar ao fluxo de cadastro
return { redirectToRegister: true, reason: 'USER_NOT_FOUND', cnpj: cnpjClean } as any
}
if( !user.active){
throw new Error('Credenciais inválidas');
}
const ok = await bcrypt.compare(password, user.password);
if(!ok){
throw new Error('Credenciais inválidas');
}
const token = sign(
{ cnpj: user.cnpj },
process.env.JWT_HASH || 'secret',
{
subject: user.id,
expiresIn: '30d'
}
);
const { password: _pw, ...rest } = user as any;
return { ...rest, token };
}
async startRegister(cnpjRaw: string){
const cnpj = (cnpjRaw || '').replace(/\D/g,'');
if(!cnpj || cnpj.length !== 14){
throw new Error('CNPJ inválido');
}
// Verifica se já existe usuário para esse CNPJ
const existing = await prisma.userswebsiteclientes.findFirst({ where: { cnpj } });
if (existing) {
// sinaliza para o front redirecionar para login
return {
alreadyExists: true,
redirectToLogin: true,
cnpj
} as const;
}
// Senha padrão = próprio CNPJ (hash com bcrypt)
const hashed = await bcrypt.hash(cnpj, 10);
const created = await prisma.userswebsiteclientes.create({
data: {
cnpj,
password: hashed,
active: true
}
});
// Não retornar a senha
const { password: _pw, ...safe } = created as any;
return {
alreadyExists: false,
user: safe
} as const;
}
// Atualiza a senha do usuário de website (cliente)
// Regras:
// - cnpj é obrigatório (14 dígitos)
// - newPassword é obrigatória (mín. 6 caracteres)
// - Se oldPassword for informada, será validada contra a senha atual.
// - Se oldPassword NÃO for informada, apenas permitirá atualização caso a senha atual ainda seja a padrão (o próprio CNPJ).
async updatePassword(params: { cnpj: string; newPassword: string; oldPassword?: string }) {
const cnpj = (params?.cnpj || '').replace(/\D/g, '');
const newPassword = params?.newPassword || '';
const oldPassword = params?.oldPassword;
if (!cnpj || cnpj.length !== 14) {
throw new Error('CNPJ inválido');
}
if (!newPassword || newPassword.length < 6) {
throw new Error('Nova senha deve ter no mínimo 6 caracteres');
}
const user = await prisma.userswebsiteclientes.findFirst({ where: { cnpj } });
if (!user) {
return { redirectToRegister: true, reason: 'USER_NOT_FOUND', cnpj } as any;
}
if (!user.active) {
throw new Error('Usuário inativo');
}
// Verificação da senha atual
if (oldPassword) {
const ok = await bcrypt.compare(oldPassword, user.password);
if (!ok) {
throw new Error('Senha atual inválida');
}
} else {
// Sem oldPassword: só permite se ainda estiver com a senha padrão (igual ao CNPJ)
const isDefault = await bcrypt.compare(cnpj, user.password);
if (!isDefault) {
// exige a senha atual
throw new Error('Para alterar a senha, informe a senha atual');
}
}
const hashed = await bcrypt.hash(newPassword, 10);
const updated = await prisma.userswebsiteclientes.update({
where: { id: user.id },
data: { password: hashed }
});
const { password: _pw, ...safe } = updated as any;
return { success: true, user: safe } as const;
}
}
export default UsersWebSite