Skip to content
Snippets Groups Projects
UserCotroller.ts 6.84 KiB
Newer Older
Ramiro's avatar
Ramiro committed
import { Request, Response, Router } from 'express';
Ramiro's avatar
Ramiro committed
import jwt from 'jsonwebtoken';
Ramiro's avatar
Ramiro committed
import { User } from '../models/users.model';
import Paginator from '../interfaces/paginator.interface';
import UserService from '../Services/UserService';
Ramiro's avatar
Ramiro committed
import { secret } from '../config/config';
import { authorized } from '../middlewares/token.middleware';
Ramiro's avatar
Ramiro committed

const router = Router();

const listUsers = async (req: Request, res: Response): Promise<Response> => {
Ramiro's avatar
Ramiro committed
  try {
    let users: Paginator<User>;
    if (req.query.type !== null) {
      if (req.query.type === 'pending') {
        users = await UserService
          .listPending(Number(req.query.limit), Number(req.query.offset), String(req.query.search));
      } else if (req.query.type === 'approved') {
        users = await UserService
          .listApproved(
            Number(req.query.limit), Number(req.query.offset), String(req.query.search),
          );
      } else if (req.query.type === 'clients') {
        users = await UserService
          .listClients(Number(req.query.limit), Number(req.query.offset), String(req.query.search));
      } else if (req.query.type === 'admins') {
        users = await UserService
          .listAdmins(Number(req.query.limit), Number(req.query.offset), String(req.query.search));
      } else {
        return res.status(400).json({ error: 'Invalid type' });
      }
    } else {
      users = await UserService
        .listAll(Number(req.query.limit), Number(req.query.offset));
    }
    return res.status(200).send(users);
  } catch (error) {
    const e = error as Error;
    return res.status(400).json({ error: e.message });
  }
};

Ramiro's avatar
Ramiro committed
const create = async (req: Request, res: Response): Promise<Response> => {
  try {
    const user: User = await UserService.create(req.body);
    return res.status(200).send(user);
  } catch (error) {
    const e = error as Error;
    console.log(e.message);
Ramiro's avatar
Ramiro committed
    return res.status(400).json({ error: e.message });
  }
};

const update = async (req: Request, res: Response): Promise<Response> => {
  try {
    const user: User = await UserService.update(Number(req.params.id), req.body);
    return res.status(200).send(user);
  } catch (error) {
    const e = error as Error;
    return res.status(400).json({ error: e.message });
  }
};

const password = async (req: Request, res: Response): Promise<Response> => {
  try {
    const user: User = await UserService.password(Number(req.params.id), req.body);
    return res.status(200).send(user);
  } catch (error) {
    const e = error as Error;
    return res.status(400).json({ error: e.message });
  }
};

const approve = async (req: Request, res: Response): Promise<Response> => {
  try {
Ignacio Otero's avatar
Ignacio Otero committed
    const user: User = await UserService.approve(Number(req.params.id));
    return res.status(200).send(user);
  } catch (error) {
    const e = error as Error;
    return res.status(400).json({ error: e.message });
  }
};

const cancel = async (req: Request, res: Response): Promise<Response> => {
  try {
    const user: User = await UserService.cancel(Number(req.params.id));
Ramiro's avatar
Ramiro committed
    return res.status(200).send(user);
  } catch (error) {
    const e = error as Error;
    return res.status(400).json({ error: e.message });
  }
};

const giveAdminPermission = async (req: Request, res: Response): Promise<Response> => {
  try {
    const user: User = await UserService.giveAdminPermission(Number(req.params.id));
    return res.status(200).send(user);
  } catch (error) {
    const e = error as Error;
    return res.status(400).json({ error: e.message });
  }
};

const removeAdminPermission = async (req: Request, res: Response): Promise<Response> => {
  try {
    const user: User = await UserService.removeAdminPermission(Number(req.params.id));
    return res.status(200).send(user);
  } catch (error) {
    const e = error as Error;
    return res.status(400).json({ error: e.message });
  }
};

Ramiro's avatar
Ramiro committed
const active = async (req: Request, res: Response): Promise<Response> => {
  try {
    const user: User = await UserService.active(Number(req.params.id));
    return res.status(200).send(user);
  } catch (error) {
    const e = error as Error;
    return res.status(400).json({ error: e.message });
  }
};

const login = async (req: Request, res: Response): Promise<Response> => {
  try {
    const logged: User = await UserService.login(req.body);
Ramiro's avatar
Ramiro committed
    const token = jwt.sign({
      user: logged.get('id'),
      role: logged.get('type'),
    }, secret.auth, {
      expiresIn: '2d',
    });
    return res.status(200).send({
      token,
      user: logged,
    });
  } catch (error) {
    const e = error as Error;
    console.log(e.message);
    return res.status(400).json({ error: e.message });
  }
};

const checkUser = async (req: any, res: Response): Promise<Response> => {
    return res.status(200).send(req.auth);
  } catch (error) {
    return res.status(400).send();
Renzo Beux's avatar
Renzo Beux committed
const validate = async (req: Request, res: Response): Promise<Response> => {
  const { token } = req.body;
  if (token) {
Renzo Beux's avatar
Renzo Beux committed
    jwt.verify(token, secret.auth, (error: Error, decoded: {user: number; role: number}) => {
Renzo Beux's avatar
Renzo Beux committed
      if (error) {
        const message = 'Invalid token';
        return res.status(401).send({ message });
      }
Renzo Beux's avatar
Renzo Beux committed
      const userId = decoded.user;
Renzo Beux's avatar
Renzo Beux committed
      return res.status(200).send({ userId });
    });
  } else {
    return res.status(400).send('auth token not supplied');
  }
  return res.status(500).send();
};

const listUsersById = async (req: Request, res: Response): Promise<Response> => {
  try {
    const { userIds } = req.body;
    const users = await UserService.listUsersById(userIds);
    return res.status(200).send(users);
  } catch (error) {
    const e = error as Error;
    return res.status(400).json({ error: e.message });
  }
};

const getUser = async (req: Request, res: Response): Promise<Response> => {
  try {
    const userId = Number(req.params.id);
    const user: User = await UserService.getUser(userId);
    return res.status(200).send(user);
  } catch (error) {
    const e = error as Error;
    return res.status(400).json({ error: e.message });
  }
};

Ramiro's avatar
Ramiro committed
router.route('/login')
  .post(login);

Ramiro's avatar
Ramiro committed
router.route('/')
  .post(create);

Renzo Beux's avatar
Renzo Beux committed
router.post('/validate', validate);
Renzo Beux's avatar
Renzo Beux committed

Ramiro's avatar
Ramiro committed
router.use('/', authorized);

router.route('/check-user')
  .post(checkUser);

Ramiro's avatar
Ramiro committed
router.route('/')
  .get(listUsers);
Ramiro's avatar
Ramiro committed
router.route('/:id')
Ramiro's avatar
Ramiro committed
  .put(update)
  .patch(active);

router.route('/:id/password')
  .put(password);

router.route('/:id/approve')
  .put(approve);

router.route('/:id/active')
  .patch(active);

Ignacio Otero's avatar
Ignacio Otero committed
router.route('/:id/cancel')
  .put(cancel);

router.route('/:id/admin')
  .put(giveAdminPermission);

router.route('/:id/client')
  .put(removeAdminPermission);

router.route('/usersById')
  .post(listUsersById);

Ramiro's avatar
Ramiro committed
export default router;