csa-backend-test/app/controllers/admin.controller.js

113 lines
2.8 KiB
JavaScript

// ENVIRONMENT
require("dotenv").config();
// DATABASE
const { PrismaClient : CMSClient } = require("../../prisma/clients/cms");
const prisma = new CMSClient();
const { v4: uuidv4 } = require("uuid");
const jwt = require("jsonwebtoken");
const argon2 = require("argon2");
const { localTime } = require("../services/time.services.js");
// CONSTANTS
const { successResponse } = require("../res/responses.js");
const { errorResponse } = require("../res/responses.js");
const { notFoundResponse } = require("../res/responses.js");
const { badRequestResponse } = require("../res/responses.js");
// ENV
const { JWT_SECRET_KEY } = process.env;
// CONTROLLERS
exports.adminLogin = async (req, res) => {
try {
const { email, password } = req.body;
if (!email || !password) {
return badRequestResponse(
res,
"Email and password are required",
"Missing credentials"
);
}
const admin = await prisma.adminAccount.findFirst({
where: {
Email_AA: email,
},
});
if (!admin) {
return notFoundResponse(res, "Admin not found!");
}
if (await argon2.verify(admin.Password_AA, req.body.password)) {
const accessToken = jwt.sign({ userID: admin.UUID_AA }, JWT_SECRET_KEY, {
expiresIn: "1d",
});
await prisma.adminAccount.update({
where: {
UUID_AA: admin.UUID_AA,
},
data: {
UpdatedAt_AA: localTime(new Date()),
LastLogin_AA: localTime(new Date()),
},
});
return successResponse(res, "Authenticated!", {
admin: {
id: admin.UUID_AA,
name: admin.Username_AA,
email: admin.Email_AA,
},
token: accessToken,
});
} else {
return errorResponse(res, "Invalid email or password!");
}
} catch (err) {
return notFoundResponse(res, "Admin account not found", err);
}
};
exports.adminRegister = async (req, res) => {
try {
const { username, email, password } = req.body;
if (!username || !email || !password) {
return badRequestResponse(
res,
"Username, email, and password are required",
"Missing fields"
);
}
const hashedPassword = await argon2.hash(password);
const newAdmin = await prisma.adminAccount.create({
data: {
UUID_AA: uuidv4(),
Username_AA: username,
Email_AA: email,
Password_AA: hashedPassword,
CreatedAt_AA: localTime(new Date()),
},
});
return successResponse(res, "Admin registered successfully!", {
admin: {
id: newAdmin.UUID_AA,
name: newAdmin.Username_AA,
email: newAdmin.Email_AA,
},
});
} catch (err) {
return errorResponse(res, "Error registering admin", err);
}
};