import { HttpCodes } from '../config/errors';
import { Request, Response, NextFunction } from 'express';
import { ErrorResponse, SuccessResponse } from '../utils/response';
import User, { UserD } from '../models/userModel';
import Logger from '../utils/logger';
import generateToken from '../utils/jwt';
import { RequestWithUser } from '../types/Express';
/**
* @desc Authenticates an admin and sets token
* @route POST /admin/login
* @access public
*/
export const loginAdmin = async (
req: Request,
res: Response,
next: NextFunction
) => {
const { email, password } = req.body;
try {
const user: UserD = await User.findOne({ email }).select('+password');
if (user) {
//verifier pass
const isPasswordMatch = await user.matchPasswords(password);
if (isPasswordMatch) {
generateToken(res, { _id: user._id.toString() });
Logger.info(
`User ${user.lastName} ${user.firstName} has logged in successfully.`
);
return SuccessResponse(
res,
HttpCodes.Accepted.code,
user.Optimize(),
`User ${user.lastName} ${user.firstName} has logged in successfully.`
);
} else {
Logger.error(`Failed to login password incorrect ${email}.`);
return ErrorResponse(
res,
HttpCodes.BadRequest.code,
`Failed to login password incorrect.`
);
}
}
Logger.error(`Failed to login user doesn't exist ${email}.`);
return ErrorResponse(
res,
HttpCodes.BadRequest.code,
`Failed to login user doesn't exist ${email}.`
);
} catch (err) {
Logger.error(`Error occurred while login ${email} : ${err}`);
return ErrorResponse(
res,
HttpCodes.InternalServerError.code,
'Failed to login. Please try again!'
);
}
};
/**
* @desc Register admin
* @route POST /admin/register
* @access private - superAdmin
*/
export const registerAdmin = async (
req: Request,
res: Response,
next: NextFunction
) => {
const { email, password, firstName, lastName, role } = req.body;
try {
const userExists: UserD | null = await User.findOne({ email });
if (userExists) {
Logger.error(
`Error occurred while creating user ${email} : User already exists`
);
return ErrorResponse(
res,
HttpCodes.Unauthorized.code,
'User already exists'
);
}
const user: UserD = await User.create({
firstName,
lastName,
email,
password,
role,
});
if (user) {
// generateToken(res, { _id: user._id.toString() });
Logger.info(`User ${lastName} ${firstName} has created in successfully.`);
return SuccessResponse(
res,
HttpCodes.Accepted.code,
user.Optimize(),
'User created successfully.'
);
}
Logger.error(`Error occurred while creating user ${email}`);
return ErrorResponse(
res,
HttpCodes.BadRequest.code,
'Failed to create user. Please try again!'
);
} catch (err) {
Logger.error(`Error occurred while creating user ${email} : ${err}`);
return ErrorResponse(
res,
HttpCodes.InternalServerError.code,
'Failed to create user. Please try again!'
);
}
};
/**
* @desc Logout
* @route POST /admin/logout
* @access private
*/
export const logoutAdmin = async (
req: RequestWithUser,
res: Response,
next: NextFunction
) => {
const firstName = req.user?.firstName;
const lastName = req.user?.lastName;
res.cookie('token', '', {
sameSite: 'none',
httpOnly: true,
expires: new Date(0),
secure : true,
});
Logger.info(
`User ${firstName} ${lastName} has logged out successfully.`
);
SuccessResponse(
res,
HttpCodes.OK.code,
null,
`logged out successfully.`
);
};
/**
* @desc Get admin profile
* @route GET /admin/profile
* @access private - superAdmin
*/
export const getProfile = async (
req: RequestWithUser,
res: Response,
next: NextFunction
) => {
const user = req.user as UserD;
Logger.info(
`User ${user.lastName} ${user.firstName} has logged back successfully.`
);
return SuccessResponse(
res,
HttpCodes.Accepted.code,
user.Optimize(),
`User ${user.lastName} ${user.firstName} has logged back successfully.`
);
};
/**
* @desc update admin profile
* @route PUT /admin/profile
* @access private - superAdmin
*/
export const updateProfile = async (
req: RequestWithUser,
res: Response,
next: NextFunction
) => {
const { userId, firstName, lastName, email, role, password } = req.body;
try {
const user = await User.findById(userId).select('+password');
if (!user) {
Logger.error(
`Failed to update profile information to ${userId} - User not found.`
);
return ErrorResponse(
res,
HttpCodes.InternalServerError.code,
`Failed to update profile information to ${userId} - User not found.`
);
}
if (firstName) user.firstName = firstName;
if (lastName) user.lastName = lastName;
if (email) user.email = email;
if (role) user.role = role;
if (password) user.password = password;
await user.save();
Logger.info(
`User ${user.lastName} ${user.firstName} has updated his profile successfully.`
);
return SuccessResponse(
res,
HttpCodes.Accepted.code,
user.Optimize(),
`User ${user.lastName} ${user.firstName} has updated his profile successfully.`
);
} catch (err) {
Logger.error(`Failed to update profile information to ${userId}.`);
return ErrorResponse(
res,
HttpCodes.InternalServerError.code,
`Failed to update profile information to ${userId}.`,
err
);
}
};
/**
* @desc update admin password
* @route PUT /admin/password
* @access private - Admin
*/
export const resetPassword = async (
req: RequestWithUser,
res: Response,
next: NextFunction
) => {
const { userId, password } = req.body;
try {
const user = await User.findById(userId).select('+password');
if (!user) {
Logger.error(
`Failed to update password information to ${userId} - User not found.`
);
return ErrorResponse(
res,
HttpCodes.InternalServerError.code,
`Failed to update password information to ${userId} - User not found.`
);
}
if (password) user.password = password;
await user.save();
Logger.info(
`User ${user.lastName} ${user.firstName} has updated his password successfully.`
);
return SuccessResponse(
res,
HttpCodes.Accepted.code,
user.Optimize(),
`User ${user.lastName} ${user.firstName} has updated his password successfully.`
);
} catch (err) {
Logger.error(`Failed to update password information to ${userId}.`);
return ErrorResponse(
res,
HttpCodes.InternalServerError.code,
`Failed to update password information to ${userId}.`,
err
);
}
};
/**
* @desc delete admin
* @route DELETE /admin/delete
* @access private - superAdmin
*/
export const deleteAdmin = async (
req: RequestWithUser,
res: Response,
next: NextFunction
) => {
const {userId} = req.body;
try {
const user = await User.findById(userId);
if (user) {
await User.deleteOne({ _id: userId });
Logger.info(
`User ${user.lastName} ${user.firstName} has deleted successfully.`
);
return SuccessResponse(
res,
HttpCodes.Accepted.code,
null,
`User ${user.lastName} ${user.firstName} has deleted successfully.`
);
} else {
Logger.error(`Failed to delete user ${userId} - User not found.`);
return ErrorResponse(
res,
HttpCodes.InternalServerError.code,
`Failed to delete user ${userId} - User not found.`
);
}
} catch (error) {
Logger.error(`Failed to delete user ${userId}.`);
return ErrorResponse(
res,
HttpCodes.InternalServerError.code,
`Failed to delete user ${userId}.`
);
}
};
/**
* @desc get all users
* @route get /admin/users
* @access private - superAdmin
*/
export const getAllUsers = async (
req: RequestWithUser,
res: Response,
next: NextFunction
) => {
try {
const users = await User.find({ _id: { $ne: req.user?._id } });
Logger.info(`Users has fetched successfully.`);
return SuccessResponse(
res,
HttpCodes.Accepted.code,
users,
`Users has fetched successfully.`
);
} catch (error) {
Logger.error(`Failed to fetch users.`);
return ErrorResponse(
res,
HttpCodes.InternalServerError.code,
`Failed to fetch users.`
);
}
}