--- /dev/null
+/**
+ * @file User controller for handling user-related API requests
+ */
+
+const db = require('../models');
+const createError = require('http-errors');
+const logger = global.logger;
+
+/**
+ * User controller
+ * @type {Object}
+ */
+module.exports = {
+ /**
+ * Create a new user
+ * @param {Object} req - Express request object
+ * @param {Object} res - Express response object
+ * @param {Function} next - Express next middleware function
+ * @returns {Promise<void>}
+ */
+ async create(req, res, next) {
+ try {
+ const user_data = req.body;
+ const user = await db.user.create(user_data);
+ res.status(200).send(user.to_safe_json());
+ } catch (error) {
+ logger.error(`Create user error: ${error.message}`);
+ next(createError(error.status || 400, error.message));
+ }
+ },
+
+ /**
+ * Find one user by ID
+ * @param {Object} req - Express request object
+ * @param {Object} res - Express response object
+ * @param {Function} next - Express next middleware function
+ * @returns {Promise<void>}
+ */
+ async show(req, res, next) {
+ try {
+ const { id } = req.params;
+ const user = await db.user.find_one({ id: parseInt(id) });
+ if (!user) return next(createError(404, 'User not found'));
+ res.status(200).send(user.to_safe_json());
+ } catch (error) {
+ logger.error(`Show user error: ${error.message}`);
+ next(createError(error.status || 500, error.message));
+ }
+ },
+
+ /**
+ * Find many users
+ * @param {Object} req - Express request object
+ * @param {Object} res - Express response object
+ * @param {Function} next - Express next middleware function
+ * @returns {Promise<void>}
+ */
+ async index(req, res, next) {
+ try {
+ const { limit = 100, offset = 0, ...where } = req.query;
+ const users = await db.user.find_many(where, [], null, parseInt(limit), parseInt(offset));
+ if (!users.length) return next(createError(404, 'No users found'));
+ res.status(200).send(users.map(u => u.to_safe_json()));
+ } catch (error) {
+ logger.error(`Index users error: ${error.message}`);
+ next(createError(error.status || 500, error.message));
+ }
+ },
+
+ /**
+ * Find user by email
+ * @param {Object} req - Express request object
+ * @param {Object} res - Express response object
+ * @param {Function} next - Express next middleware function
+ * @returns {Promise<void>}
+ */
+ async find_by_email(req, res, next) {
+ try {
+ const { email } = req.params;
+ const user = await db.user.find_by_email(email);
+ if (!user) return next(createError(404, 'User not found'));
+ res.status(200).send(user.to_safe_json());
+ } catch (error) {
+ logger.error(`Find user by email error: ${error.message}`);
+ next(createError(error.status || 500, error.message));
+ }
+ },
+
+ /**
+ * Find user by nickname
+ * @param {Object} req - Express request object
+ * @param {Object} res - Express response object
+ * @param {Function} next - Express next middleware function
+ * @returns {Promise<void>}
+ */
+ async find_by_nickname(req, res, next) {
+ try {
+ const { nickname } = req.params;
+ const user = await db.user.find_by_nickname(nickname);
+ if (!user) return next(createError(404, 'User not found'));
+ res.status(200).send(user.to_safe_json());
+ } catch (error) {
+ logger.error(`Find user by nickname error: ${error.message}`);
+ next(createError(error.status || 500, error.message));
+ }
+ },
+
+ /**
+ * Update a user
+ * @param {Object} req - Express request object
+ * @param {Object} res - Express response object
+ * @param {Function} next - Express next middleware function
+ * @returns {Promise<void>}
+ */
+ async update(req, res, next) {
+ try {
+ const { id } = req.params;
+ const user_data = req.body;
+ const user = await db.user.instance().find_one({ id: parseInt(id) });
+ if (!user) return next(createError(404, 'User not found'));
+ const updated_user = await user.update(user_data);
+ res.status(200).send(updated_user.to_safe_json());
+ } catch (error) {
+ logger.error(`Update user error: ${error.message}`);
+ next(createError(error.status || 400, error.message));
+ }
+ },
+
+ /**
+ * Deactivate a user
+ * @param {Object} req - Express request object
+ * @param {Object} res - Express response object
+ * @param {Function} next - Express next middleware function
+ * @returns {Promise<void>}
+ */
+ async deactivate(req, res, next) {
+ try {
+ const { id } = req.params;
+ const { deactivated_by_id } = req.body;
+ const user = await db.user.instance().find_one({ id: parseInt(id) });
+ if (!user) return next(createError(404, 'User not found'));
+ const deactivated_user = await user.deactivate(deactivated_by_id);
+ res.status(200).send(deactivated_user.to_safe_json());
+ } catch (error) {
+ logger.error(`Deactivate user error: ${error.message}`);
+ next(createError(error.status || 400, error.message));
+ }
+ },
+
+ /**
+ * Reactivate a user
+ * @param {Object} req - Express request object
+ * @param {Object} res - Express response object
+ * @param {Function} next - Express next middleware function
+ * @returns {Promise<void>}
+ */
+ async reactivate(req, res, next) {
+ try {
+ const { id } = req.params;
+ const user = await db.user.instance().find_one({ id: parseInt(id) });
+ if (!user) return next(createError(404, 'User not found'));
+ const reactivated_user = await user.reactivate();
+ res.status(200).send(reactivated_user.to_safe_json());
+ } catch (error) {
+ logger.error(`Reactivate user error: ${error.message}`);
+ next(createError(error.status || 400, error.message));
+ }
+ },
+
+ /**
+ * Soft delete a user
+ * @param {Object} req - Express request object
+ * @param {Object} res - Express response object
+ * @param {Function} next - Express next middleware function
+ * @returns {Promise<void>}
+ */
+ async soft_delete(req, res, next) {
+ try {
+ const { id } = req.params;
+ const { deleted_by_id } = req.body;
+ const user = await db.user.instance().find_one({ id: parseInt(id) });
+ if (!user) return next(createError(404, 'User not found'));
+ const deleted_user = await user.soft_delete(deleted_by_id);
+ res.status(200).send(deleted_user.to_safe_json());
+ } catch (error) {
+ logger.error(`Soft delete user error: ${error.message}`);
+ next(createError(error.status || 400, error.message));
+ }
+ }
+};
\ No newline at end of file