myex-cli
Version:
Opinionated Express.js framework with CLI tools
204 lines (185 loc) • 5.51 kB
JavaScript
import { logger } from '../utils/logger.js';
import { userService } from '../services/user.service.js';
export const userController = {
/**
* Get all users (admin only)
* @param {import('express').Request} req - Express request object
* @param {import('express').Response} res - Express response object
*/
getAllUsers: async (req, res) => {
try {
const users = await userService.findAllUsers();
res.status(200).json({
status: 'success',
data: {
users: users.map(user => ({
id: user._id,
email: user.email,
name: user.name,
role: user.role,
createdAt: user.createdAt,
})),
},
});
} catch (error) {
logger.error(`Get all users error: ${error.message}`);
res.status(500).json({
status: 'error',
message: 'Failed to retrieve users',
});
}
},
/**
* Get current user profile
* @param {import('express').Request} req - Express request object
* @param {import('express').Response} res - Express response object
*/
getCurrentUser: async (req, res) => {
try {
const userId = req.user.id;
const user = await userService.findUserById(userId);
if (!user) {
return res.status(404).json({
status: 'error',
message: 'User not found',
});
}
res.status(200).json({
status: 'success',
data: {
user: {
id: user._id,
email: user.email,
name: user.name,
role: user.role,
createdAt: user.createdAt,
},
},
});
} catch (error) {
logger.error(`Get current user error: ${error.message}`);
res.status(500).json({
status: 'error',
message: 'Failed to retrieve user profile',
});
}
},
/**
* Get a user by ID
* @param {import('express').Request} req - Express request object
* @param {import('express').Response} res - Express response object
*/
getUserById: async (req, res) => {
try {
const { id } = req.params;
// Check if the user is trying to access their own profile or is an admin
if (req.user.id !== id && req.user.role !== 'admin') {
return res.status(403).json({
status: 'error',
message: 'Access denied: You can only view your own profile',
});
}
const user = await userService.findUserById(id);
if (!user) {
return res.status(404).json({
status: 'error',
message: 'User not found',
});
}
res.status(200).json({
status: 'success',
data: {
user: {
id: user._id,
email: user.email,
name: user.name,
role: user.role,
createdAt: user.createdAt,
},
},
});
} catch (error) {
logger.error(`Get user by ID error: ${error.message}`);
res.status(500).json({
status: 'error',
message: 'Failed to retrieve user',
});
}
},
/**
* Update a user
* @param {import('express').Request} req - Express request object
* @param {import('express').Response} res - Express response object
*/
updateUser: async (req, res) => {
try {
const { id } = req.params;
const { name, email } = req.body;
// Check if the user is trying to update their own profile or is an admin
if (req.user.id !== id && req.user.role !== 'admin') {
return res.status(403).json({
status: 'error',
message: 'Access denied: You can only update your own profile',
});
}
// Check if user exists
const user = await userService.findUserById(id);
if (!user) {
return res.status(404).json({
status: 'error',
message: 'User not found',
});
}
// Update user
const updatedUser = await userService.updateUser(id, { name, email });
res.status(200).json({
status: 'success',
message: 'User updated successfully',
data: {
user: {
id: updatedUser._id,
email: updatedUser.email,
name: updatedUser.name,
role: updatedUser.role,
},
},
});
} catch (error) {
logger.error(`Update user error: ${error.message}`);
res.status(500).json({
status: 'error',
message: 'Failed to update user',
});
}
},
/**
* Delete a user (admin only)
* @param {import('express').Request} req - Express request object
* @param {import('express').Response} res - Express response object
*/
deleteUser: async (req, res) => {
try {
const { id } = req.params;
// Check if user exists
const user = await userService.findUserById(id);
if (!user) {
return res.status(404).json({
status: 'error',
message: 'User not found',
});
}
// Delete user
await userService.deleteUser(id);
res.status(200).json({
status: 'success',
message: 'User deleted successfully',
});
} catch (error) {
logger.error(`Delete user error: ${error.message}`);
res.status(500).json({
status: 'error',
message: 'Failed to delete user',
});
}
},
};