# User Management

## Setup

Para trabajar con UM tenga presente que utilizara SQLite y que esta DB se guardara en el directorio \~/db.

Para inicializar el sistema debe tenerlo habilitado en los .env&#x20;

```properties
ENABLE_USERMANAGEMENT=true
```

Luego de ello, inicialice el mismo ejecutando

```bash
npm run setup:um
```

Esto inicializara la base de datos y le entregara las credenciales para poder iniciar sesion por consola:

```

Se creo la cuenta Admin de User Management 

Nombre de Usuario: administrator
Contrase;a: dec826ce993b83568e22698aa3cc459d

```

Con este, podra iniciar sesion y podra crear usuarios especificandoles premisos para poder trabajar en sus endpoints.&#x20;

## Modo de Uso

Para poder trabajar con este modulo, en su endpoint debe tener `fun['userManagement'].authenticateToken` en la cabecera de su ruta para que esta tenga validaciones de Token y vigencia.\
\
Por otro lado, puede obtener los datos de la session como Nombre del Usuario, Apellido, Token vinculante a la DB (unico por sesion y vinculante al JWT), userID en DB y los permisos.

{% code lineNumbers="true" fullWidth="false" %}

```json
"user": {
    "userid": 1,
    "name": "administrator",
    "lastname": "",
    "token": "8afc05f3-8e64-4b58-bb2f-f4b213f8a7a6",
    "permissions": {
        "createUsers": true
    },
    "iat": 1704295913,
    "exp": 1704299513
}
```

{% endcode %}

* Estos datos, son visibles desde la variable req.user de cada ruta.&#x20;
* La vigencia de los JWT es de 365 dias por default, pero puede modificarlo en las .env indicando `SYSTEMUSER_EXPIRE` en true y `SYSTEMUSER_EXPIRETIME` con el tiempo que quiera, por ejemplo 30m para media hora, o 7d para una semana o 2h30m para dos horas y media.&#x20;
* Puede ver mas informacion aqui: <https://jwt.io/introduction>
* Los token JWT de Session deven viajar en Authorization: Bearer para poder ser reconocidos por monoIntegrator

Un ejemplo de implementacion es el siguiente

{% code lineNumbers="true" fullWidth="false" %}

```javascript
router.all("/privada", fun['userManagement'].authenticateToken, (req, res) => {
    const { id, ip, uri, method } = trx(req);
    try {
      res.status(200).json({ id, ip, uri, method, user: req.user });
    } catch (err) {
      log("error", `Existe un inconveniente - ${id} :: ${ip} :: ${uri} :: ${method} :: ${err}`, "userManagement");
      res.status(500).json({ msg: "Existe un inconveniente en la solicitud", id });
    }
});
module.exports = router;
```

{% endcode %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://agustin-fernandez.gitbook.io/monointegrator/primeros-pasos/user-management.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
