routes/access/users.js

/**
 * Created by eliwinkelman on 8/14/20.
 */


const express = require('express');
const router = express.Router();
const secured = require('../../lib/middleware/secured');
const {wrapAsync}  = require('../../lib/middleware/middleware');
const Auth0UserManager = require('../../database/models/user');


/**
 *  @swagger
 *  /access/users/reset-password/}:
 *      post:
 *          description: Sends a email for the requesting user to reset their password.
 *          tags:
 *              - access
 *              - users
 *
 */
router.post('/reset-password', secured, wrapAsync(async (req, res, next) => {

    await Auth0UserManager.resetUserPassword(req.apiUser);
    res.sendStatus(200)
}));


router.get('/my-id', secured, wrapAsync(async (req, res) => {
    res.send(req.apiUser._id);
}));

/**
 *  @swagger
 *  /access/users/search/{query}}:
 *      get:
 *          description: Searches auth0 users with a query.
 *          tags:
 *              - access
 *              - users
 *          parameters:
 *              - in: path
 *                name: query
 *                schema:
 *                  type: string
 *                required: true
 *                description: A search query.
 */
router.get('/search/:query', secured, wrapAsync(async (req, res, next) => {

    const users = await Auth0UserManager.searchAuth0Users(req.params.query);
    console.log(users);

    const usersWithSpoolIds = await Promise.all(users.map(async (user) => {
        let spoolUser = await Auth0UserManager.getByAuth0Id(user.user_id);

        let spoolUserId;
        if (spoolUser === undefined) {
            // create a user
            spoolUserId = await Auth0UserManager.create(user.user_id);

        }
        else {
            spoolUserId = spoolUser._id;
        }
        return {...user, _id: spoolUserId}
    }));

    console.log("users");
    console.log(usersWithSpoolIds);

    res.send(usersWithSpoolIds);

}));

/**
 *  @swagger
 *  /access/users/info/{user}:
 *      get:
 *          description: Gets auth0 user info (username and email) for a user in the Spool database.
 *          tags:
 *              - access
 *              - users
 *          parameters:
 *              - in: path
 *                name: user
 *                schema:
 *                  type: string
 *                required: true
 *                description: The id (in the spool database) of the user to get auth0 info for.
 */
router.get('/info/:user', secured, wrapAsync(async (req, res, next) => {
    const user = await Auth0UserManager.get(req.params.user);

    const auth0User = await Auth0UserManager.getAuth0User(user);

    res.send({username: auth0User.username, email: auth0User.email});
}));

module.exports = router;