# Historial de Revisiones

El historial de revisiones nos permite almacenar el contenido de un documento en otra colección dentro de la misma base de datos o idealmente en otra base de datos.

Es util por ejemplo si deseamos conocer el contenido de un documento que fue eliminado, e identificar la fecha y el usuario que lo realizó, o almacenar un documento antes de ser actualizado. Existen infinidad de situaciones, en nuestro caso JMoordb ofrece una implementación mediante RevisionHistory, RevisionHistoryServices

![](https://1490144122-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lc1Wg6bBVlJX-GjApa1%2F-Lc1WhtDA-TTmZ6My9OJ%2F-Lc1Ww9hxxUsO3ploIoo%2Frevision_history.png?generation=1554820623143764\&alt=media)

El usuario debe crear en su proyecto RevisionHistoryFacade e indicar la base de datos y colección donde se almacenarán los documentos.

## Historial de revisiones de eliminaciones

**En el Controller**

Agregar el Facade y el Services.

```
 @Inject
 RevisionHistoryFacade revisionHistoryFacade;

 @Inject
 RevisionHistoryServices revisionHistoryServices;
```

**En el método por ejemplo delete(), invocamos getRevisionHistory**

| Parámetro | Descripción                                                                   |
| --------- | ----------------------------------------------------------------------------- |
| 1         | El valor del campo llave del documento                                        |
| 2         | Username del usuario que realiza la operación                                 |
| 3         | La operación realizada por ejemplo(delete, update,etc)                        |
| 4         | El nombre de la colección donde se almacena el documento                      |
| 5         | Invocar el método toDocument() del Facade para convertir el Entity a un JSon. |

```
 revisionHistoryFacade.save(revisionHistoryServices.getRevisionHistory(agente.getCedula(), loginController.getUsername(),
                        "delete", "agente", agenteFacade.toDocument(agente).toString()));
```

**Ejemplo de uso**

```
@Override
    public String delete() {
        try {
            if (agenteFacade.delete("cedula", agente.getCedula())) {
                //Guarda el historial

                revisionHistoryFacade.save(revisionHistoryServices.getRevisionHistory(agente.getCedula(), loginController.getUsername(),
                        "delete", "agente", agenteFacade.toDocument(agente).toString()));

                JsfUtil.successMessage(rf.getAppMessage("info.delete"));
                agente = new Agente();
                found = false;
                reset();
            }
        } catch (Exception e) {
            JsfUtil.errorMessage("delete() " + e.getLocalizedMessage());
        }
        return "";
    }
```

En el Facade indicamos la base de datos y colección donde se almacenarán los datos

![](https://1490144122-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lc1Wg6bBVlJX-GjApa1%2F-Lc1WhtDA-TTmZ6My9OJ%2F-Lc1Ww9kxBuITomP-E7k%2Frevd.png?generation=1554820623100451\&alt=media)

Si eliminamos el documento, el contenido sera almacenado en la colección que definimos, y nos funcionara con fines de auditoria. Seria ideal que sea una base de datos diferente a la de producción.

![](https://1490144122-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lc1Wg6bBVlJX-GjApa1%2F-Lc1WhtDA-TTmZ6My9OJ%2F-Lc1Ww9me5fbLIcFImM-%2Fdc.png?generation=1554820624011822\&alt=media)

## Historial de Cambios en los documentos

En muchas ocasiones necesitamos realizar operaciones de audito para determinar los cambios realizados por un determinado usuario a un documento.

Mediante revisionhistory , podemos almacenar el valor del entity anterior y guardar otro documento con el documento con todos los cambios de esta manera podemos auditar fácilmente que cambios fueron realizados y cual fue el usuario que los ejecuto.

**Ejemplo:**

Tenemos un documento sobre el que realizamos actualizaciones.

![](https://1490144122-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lc1Wg6bBVlJX-GjApa1%2F-Lc1WhtDA-TTmZ6My9OJ%2F-Lc1Ww9oKYcxOixrWfit%2Fedit_2.png?generation=1554820624012170\&alt=media)

En revisionhistory, se almacena el documento anterior en description colocamos un mensaje descriptivo como beforeudate, que contendrá el documento con la información original y el siguiente documento en description con update podemos identificarlo como el actualizado y el contenido se almacena con los nuevos cambios. De esta manera en el ejemplo podemos observar que el documento bodega con id: bodega 3 , se modifico el teléfono y la dirección.

![](https://1490144122-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lc1Wg6bBVlJX-GjApa1%2F-Lc1WhtDA-TTmZ6My9OJ%2F-Lc1Ww9qrbtkHS1fJ4s-%2Fchange.png?generation=1554820624110879\&alt=media)

**Desde consola**&#x20;

`db.revisionhistory.find().pretty()`

![](https://1490144122-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lc1Wg6bBVlJX-GjApa1%2F-Lc1WhtDA-TTmZ6My9OJ%2F-Lc1Ww9sTi8Sqx73zTp3%2Feditconsole.png?generation=1554820624090599\&alt=media)

## **Implementación**

Creamos un documento nuevo mediante revisionHistoryFacade.save( revisionHistoryServices.getRevisionHistory()), del entity que contiene los valores iniciales en el ejemplo bodegaSelected, y luego creamos un nuevo documento con el entity con los datos actualizados.

**método edit()**

```
  @Override
    public String edit() {
        try {

            bodega.getUserInfo().add(userInfoServices.generateUserinfo(loginController.getUsername(),"editado"));          

            //guarda el contenido anterior
             revisionHistoryFacade.save( revisionHistoryServices.getRevisionHistory(bodegaSelected.getIdbodega(), loginController.getUsername(), 
                        "beforeupdate", "bodega", bodegaFacade.toDocument(bodegaSelected).toString()));

             //guarda el contenido actualizado
              revisionHistoryFacade.save( revisionHistoryServices.getRevisionHistory(bodega.getIdbodega(), loginController.getUsername(), 
                        "update", "bodega", bodegaFacade.toDocument(bodega).toString()));

            bodegaFacade.update(bodega);
            JsfUtil.successMessage(rf.getAppMessage("info.update"));
        } catch (Exception e) {
            JsfUtil.errorMessage("edit()" + e.getLocalizedMessage());
        }
        return "";
    }// </editor-fold>
```
