Rekordhandlingar med en inhemska revision
En åtgärd kan sätta audit till en textmall. Vid lyckad slutförning skickar ramverket en granskningspost till DEF.onAudit(name, data, context). Den automatiska posten använder sink-namnet actions och innehåller åtgärdens id. En åtgärd kan också uttryckligen anropa $.audit(message, type); det avger en egen post och kan bära en typ som info.
Exemplet ersätter granskningssinken med en insamlare i minnet för att undersöka dess kontrakt. Den spelar bara in namn, åtgärdens id, meddelande och typ. Ramverket förbereder också kontextdata och serialiserad förfrågningsdata: en riktig sink behöver en uttrycklig policy för hemligheter, lagring, åtkomst och fel. En granskningshändelse är inget bevis för att en affärstransaktion har bekräftats; åtgärden bör anropa sin framgångs-callback först efter att den avsedda skrivningen lyckats.
I den här versionen inträffar den automatiska revisionen efter den framgångsrika callbackvägen. det loggar inte automatiskt valideringsfel eller misslyckade åtgärder.
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); });
};