const jwt = require('jsonwebtoken') const { expireBlockSuspensionIfNeeded, getBlockedAccountResponse } = require('../utils/blockSuspension') const { resolveActingUser } = require('../utils/subUserAuth') module.exports = async (req, res, next) => { try { if (!('authorization' in req.headers)) { return res.status(401).send({ status: 'error', code: 401, message: 'You are not authorized!' }) } const token = req.header('Authorization').split(' ')[1] if (!token) return res.status(401).send('Access Denied') const decodedToken = jwt.verify(token, process.env.APP_SECRET) if (!decodedToken) { return res.status(401).send({ status: 'error', code: 401, message: 'Your token is not valid!' }) } const resolved = await resolveActingUser(decodedToken.id) if (resolved.error === 'SUB_USER_DISABLED') { return res.status(401).send({ status: 'error', code: 401, message: 'این حساب کاربری غیرفعال شده است' }) } if (resolved.error) { return res.status(401).send({ status: 'error', code: 401, message: 'User not found!' }) } let user = resolved.user user = await expireBlockSuspensionIfNeeded(user) const blockResponse = getBlockedAccountResponse(user) if (blockResponse) { return res.status(403).send(blockResponse) } req.user = user req.actingSubUser = resolved.actingSubUser next() } catch (error) { console.error('Error in blockCheck middleware:', error) if ( error?.name === 'JsonWebTokenError' || error?.name === 'TokenExpiredError' ) { return res.status(401).send({ status: 'error', code: 401, message: 'Your token is not valid!' }) } res.status(500).send({ status: 'error', code: 500, message: 'Server error' }) } }