import { validationResult } from 'express-validator' import { Building, User } from '../db/index.js' import { getUserFromRequest, success, warning } from '../helpers/index.js' import { hashString } from '../utils/crypto.js' import { ResponseCode } from '../ENUMS.js' export const allowOrRevokeSharing = async (req, res) => { const validationErrors = validationResult(req) if (!validationErrors.isEmpty()) { return warning(res, { code: ResponseCode.ValidationError }) } const { accessor, role } = getUserFromRequest(req) const { id } = req.params const { sharingAllowed } = req.body if (accessor === id || role === 'administrator') { const result = await User.findOneAndUpdate({ _id: id, role: 'user' }, { sharingAllowed, updatedAt: Date.now() }, { new: true, runValidators: true }).select('_id sharingAllowed role') if (result) { return success(res, { code: ResponseCode.UpdateSuccess }) } return warning(res, { code: ResponseCode.NotFound }) } warning(res, { code: ResponseCode.NotAllowed }) } export const getUser = async (req, res) => { const validationErrors = validationResult(req) if (!validationErrors.isEmpty()) { return warning(res, { code: ResponseCode.ValidationError }) } const { id } = req.params const result = await User.findById(id).select('_id email username role sharingData createdAt updatedAt') if (result) { return success(res, { data: result }) } warning(res, { code: ResponseCode.NotFound }) } export const getUsers = async (req, res) => { const { accessor } = getUserFromRequest(req) const building = await Building.find({ owner: accessor }) if (building) { const buildingIds = building.map(element => element._id) const result = await User.find({ linkedTo: { $in: buildingIds } }).select('_id email username role sharingData createdAt updatedAt') if (result) { return success(res, { data: result }) } } warning(res, { code: ResponseCode }) } export const updatePassword = async (req, res) => { const validationErrors = validationResult(req) if (!validationErrors.isEmpty()) { return warning(res, { code: ResponseCode.ValidationError }) } const { id } = req.params const { newPassword } = req.body const result = await User.findOneAndUpdate({ _id: id }, { encryptedPassword: hashString(newPassword), updatedAt: Date.now() }, { new: true, runValidators: true }) if (result) { return success(res, { code: ResponseCode.UpdateSuccess }) } warning(res, { code: ResponseCode.NotFound }) } export const updateUser = async (req, res) => { const validationErrors = validationResult(req) if (!validationErrors.isEmpty()) { return warning(res, { code: ResponseCode.ValidationError }) } const { accessor, role } = getUserFromRequest(req) const { id } = req.params const { email } = req.body if (accessor === id || role === 'administrator') { const result = await User.findOneAndUpdate({ _id: id, role: 'user' }, { email, updatedAt: Date.now() }, { new: true, runValidators: true }).select('_id email role') if (result) { return success(res, { code: ResponseCode.UpdateSuccess }) } return warning(res, { code: ResponseCode.NotFound }) } warning(res, { code: ResponseCode.NotAllowed }) }