106 lines
3.5 KiB
JavaScript
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 });
|
|
}
|
|
};
|