From 60003d64d5e5ade6565e1da8a0fc3c00253c0f3a Mon Sep 17 00:00:00 2001 From: garrettmills Date: Wed, 28 Oct 2020 19:13:13 -0500 Subject: [PATCH] Add front-end error logging --- app/assets/error-log.js | 35 +++++++++++++++++++++++++++++ app/controllers/Home.controller.js | 6 +++++ app/models/FrontEndError.model.js | 29 ++++++++++++++++++++++++ app/routing/routers/index.routes.js | 4 ++++ app/views/theme/base.pug | 1 + 5 files changed, 75 insertions(+) create mode 100644 app/assets/error-log.js create mode 100644 app/models/FrontEndError.model.js diff --git a/app/assets/error-log.js b/app/assets/error-log.js new file mode 100644 index 0000000..4257b3f --- /dev/null +++ b/app/assets/error-log.js @@ -0,0 +1,35 @@ +window.COREID_ERROR_LOG_URL = window.COREID_ERROR_LOG_URL || '/api/v1/log-error' + +async function logError(error) { + try { + await fetch(window.COREID_ERROR_LOG_URL, { + method: 'POST', + cache: 'no-cache', + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + full_url: window.location.href, + trace: [ + error.name + ': ' + error.message, + error.stack, + ].join('\n') + }), + }) + } catch (e) {} +} + +;(function() { + var old_onerror = window.onerror + + window.onerror = function(msg, src, line, col, error) { + logError(error).then(function() { + if ( typeof old_onerror === 'function' ) { + try { + old_onerror(msg, src, line, col, error) + } catch(e) {} + } + }) + } +})() diff --git a/app/controllers/Home.controller.js b/app/controllers/Home.controller.js index b8cbc87..02fd37d 100644 --- a/app/controllers/Home.controller.js +++ b/app/controllers/Home.controller.js @@ -29,6 +29,12 @@ class Home extends Controller { async tmpl(req, res) { return res.page('tmpl', {...this.Vue.data(), ...this.Vue.session(req)}) } + + async log_front_end_error(req, res, next) { + const FrontEndError = this.models.get('FrontEndError') + await FrontEndError.log(req) + return res.api() + } } module.exports = Home diff --git a/app/models/FrontEndError.model.js b/app/models/FrontEndError.model.js new file mode 100644 index 0000000..031b879 --- /dev/null +++ b/app/models/FrontEndError.model.js @@ -0,0 +1,29 @@ +const { Model } = require('flitter-orm') + +class FrontEndErrorModel extends Model { + static get schema() { + return { + user_agent: String, + logged_at: { type: Date, default: () => new Date }, + user_id: String, + session_id: String, + full_url: String, + trace: String, + } + } + + static async log(request) { + const err = new this({ + user_agent: request.get('user-agent'), + user_id: request?.user?.id, + session_id: request.sessionID, + full_url: request.body.full_url, + trace: request.body.trace, + }) + + await err.save() + return err + } +} + +module.exports = exports = FrontEndErrorModel diff --git a/app/routing/routers/index.routes.js b/app/routing/routers/index.routes.js index 949bdf2..1cd9b92 100644 --- a/app/routing/routers/index.routes.js +++ b/app/routing/routers/index.routes.js @@ -59,6 +59,10 @@ const index = { 'middleware::auth:GuestOnly', 'controller::api:v1:Password.request_reset', ], + + '/api/v1/log-error': [ + 'controller::Home.log_front_end_error' + ], }, } diff --git a/app/views/theme/base.pug b/app/views/theme/base.pug index 7ae7b90..0a9a09f 100644 --- a/app/views/theme/base.pug +++ b/app/views/theme/base.pug @@ -15,6 +15,7 @@ html(lang='en') .app-container block app block script + script(src='/assets/error-log.js') script(src='/assets/lib/axios/axios.min.js') script(src='/assets/lib/jquery/jquery-3.4.1.slim.min.js') script(src='/assets/lib/popper/popper-1.16.0.min.js')