Sistem-Pakar-Diagnosa-Penya.../backend/controller/authController.js

106 lines
3.5 KiB
JavaScript

const jwt = require('jsonwebtoken');
const argon2 = require('argon2');
const randomstring = require('randomstring');
const {User} = require('../models'); // Pastikan sesuai dengan struktur project
require('dotenv').config();
// Fungsi untuk membuat token JWT
const generateToken = (user) => {
return jwt.sign(
{ id: user.id, email: user.email, role: user.role }, // id bukan _id untuk Sequelize
process.env.JWT_SECRET,
{ expiresIn: process.env.JWT_EXPIRES_IN || '1d' }
);
};
// Menambahkan user baru dengan hashing Argon2
exports.register = async (req, res) => {
try {
const { name, email, password, alamat, nomorTelepon, role } = req.body;
// Cek apakah email sudah terdaftar
const existingUser = await User.findOne({ where: { email } });
if (existingUser) return res.status(400).json({ message: 'Email already exists' });
// Hash password menggunakan Argon2
const hashedPassword = await argon2.hash(password);
const newUser = await User.create({
name,
email,
password: hashedPassword,
alamat,
nomorTelepon,
role: 'user'
});
res.status(201).json({ message: 'User created successfully', user: newUser });
} catch (error) {
res.status(500).json({ message: 'Error creating user', error });
}
};
// Login
exports.login = async (req, res) => {
try {
const { email, password } = req.body;
// 🔹 Cek apakah user dengan email tersebut ada
const user = await User.findOne({ where: { email } });
if (!user) {
return res.status(401).json({ message: "Email atau password salah" });
}
// 🔹 Verifikasi password
const isPasswordValid = await argon2.verify(user.password, password);
if (!isPasswordValid) {
return res.status(401).json({ message: "Email atau password salah" });
}
// 🔹 Buat token JWT
const token = jwt.sign(
{ id: user.id, email: user.email, role: user.role },
process.env.JWT_SECRET,
{ expiresIn: process.env.JWT_EXPIRES_IN || '1d' }
);
// 🔹 Kirim response dengan token dan role
res.status(200).json({
message: "Login berhasil",
token,
role: user.role // Ini penting untuk Flutter agar bisa menentukan halaman tujuan
});
} catch (error) {
res.status(500).json({ message: "Terjadi kesalahan", error });
}
};
exports.forgotPassword = async (req, res) => {
try {
const { email, password } = req.body; // Gunakan 'password' sebagai field yang dikirim
// 🔹 Validasi input
if (!email || !password) {
return res.status(400).json({ message: "Email dan password baru harus diisi" });
}
// 🔹 Cek apakah user dengan email tersebut ada
const user = await User.findOne({ where: { email } });
if (!user) {
return res.status(404).json({ message: "User tidak ditemukan" });
}
// 🔹 Hash password baru dengan Argon2
const hashedPassword = await argon2.hash(password);
// 🔹 Update password user di database
await user.update({ password: hashedPassword });
res.status(200).json({ message: "Password berhasil diperbarui" });
} catch (error) {
console.error("Error pada forgotPassword:", error);
res.status(500).json({ message: "Terjadi kesalahan", error: error.message });
}
};