Registre eventos de auditoría de acciones con un receptor de auditoría nativo
Una acción puede definir audit como una plantilla de texto. Al completarse con éxito, el framework envía un registro de auditoría a DEF.onAudit(name, data, context). El registro automático usa el nombre de sumidero actions e incluye el id de la acción. Una acción también puede llamar explícitamente a $.audit(message, type); esto emite su propio registro y puede llevar un tipo como info.
El ejemplo sustituye el sumidero de auditoría por un recolector en memoria para inspeccionar su contrato. Registra solo el nombre, el id de la acción, el mensaje y el tipo. El framework también prepara datos de contexto y datos de la petición serializados: un sumidero real necesita una política explícita sobre secretos, retención, acceso y fallos. Un evento de auditoría no es una prueba de que una transacción de negocio se haya confirmado; la acción solo debe llamar a su callback de éxito después de que la escritura prevista haya tenido éxito.
En esta versión, el evento de auditoría automática ocurre después de la ruta de llamamiento de acción exitosa. no registra automáticamente fallos de validación o acciones fallidas.
MAIN.auditEvents = [];
DEF.onAudit = function(name, data) {
MAIN.auditEvents.push({ sink: name || null, action: data.action, message: data.message || '', type: data.type || null });
};
NEWACTION('AuditExample|save', {
input: '*name:String',
audit: 'Saved the example',
action: function($) {
$.callback({ ok: true });
}
});
NEWACTION('AuditExample|explicit', {
action: function($) {
$.audit('Explicit example event', 'info');
$.success();
}
});
NEWACTION('AuditExample|fail', {
audit: 'This must not become a success event',
action: function($) {
$.invalid(409);
}
});exports.install = function() {
ROUTE('POST /save/ --> *AuditExample|save');
ROUTE('POST /explicit/ --> *AuditExample|explicit');
ROUTE('POST /fail/ --> *AuditExample|fail');
ROUTE('GET /events/', function($) { $.json(MAIN.auditEvents); });
};