From 8b7f539427fe6387242e556d2aaf0b92eb41e9ea Mon Sep 17 00:00:00 2001 From: Matteo Cominetti Date: Wed, 6 Apr 2022 13:58:05 +0100 Subject: [PATCH] feat: removes matomo & changes some CI/CD settings (#670) --- .eslintignore | 1 + .pre-commit-config.yaml | 6 +- packages/frontend/package.json | 1 - packages/frontend/src/embed/embedApp.js | 7 - packages/frontend/src/main/app.js | 9 - .../onboarding/GettingStartedSteps.vue | 5 - .../main/components/stream/WebhookForm.vue | 3 - .../stream/globals/GlobalsBuilder.vue | 1 - .../main/components/user/AppEditDialog.vue | 1 - .../src/main/components/user/AppNewDialog.vue | 1 - .../user/ListItemPersonalAccessToken.vue | 1 - .../main/components/user/ListItemUserApp.vue | 1 - .../src/main/components/user/TokenDialog.vue | 1 - .../components/user/UserAuthorisedApps.vue | 1 - .../main/components/user/UserDeleteCard.vue | 1 - .../src/main/components/user/UserInfoCard.vue | 1 - .../src/main/dialogs/BranchEditDialog.vue | 2 - .../frontend/src/main/dialogs/CommitEdit.vue | 2 - .../frontend/src/main/dialogs/NewBranch.vue | 1 - .../frontend/src/main/dialogs/NewStream.vue | 1 - .../src/main/dialogs/ServerInvites.vue | 2 - .../src/main/dialogs/StreamInviteDialog.vue | 2 - .../frontend/src/main/pages/admin/Invites.vue | 1 - .../main/pages/stream/TheCollaborators.vue | 2 - .../src/main/pages/stream/TheGlobals.vue | 1 - .../src/main/pages/stream/TheSettings.vue | 2 - packages/preview-service/bin/www | 20 +- packages/server/app.js | 2 - packages/server/logging/apolloPlugin.js | 6 - packages/server/logging/matomoHelper.js | 46 -- packages/server/modules/auth/rest/index.js | 6 +- .../server/modules/core/rest/diffDownload.js | 105 +++-- .../server/modules/core/rest/diffUpload.js | 69 ++- packages/server/modules/core/rest/download.js | 3 - packages/server/modules/core/rest/upload.js | 405 +++++++++--------- packages/server/modules/fileuploads/index.js | 93 ++-- packages/server/modules/previews/index.js | 60 ++- packages/server/package.json | 1 - workspace.code-workspace | 10 +- 39 files changed, 366 insertions(+), 517 deletions(-) create mode 100644 .eslintignore delete mode 100644 packages/server/logging/matomoHelper.js diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 000000000..256f57cf9 --- /dev/null +++ b/.eslintignore @@ -0,0 +1 @@ +!.mocharc.js \ No newline at end of file diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index ff50865af..bcf4f4d42 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -3,8 +3,10 @@ repos: rev: 'v8.11.0' # Use the sha / tag you want to point at hooks: - id: eslint - # files: \.[jt]sx?$ # *.js, *.jsx, *.ts and *.tsx - # types: [file] + types: [file] + files: \.[jt]s$|vue$ # *.js, *.ts and vue + args: + - '--max-warnings=0' additional_dependencies: - eslint@8.11.0 - eslint-config-prettier@8.5.0 diff --git a/packages/frontend/package.json b/packages/frontend/package.json index 921b449fd..3941621d3 100644 --- a/packages/frontend/package.json +++ b/packages/frontend/package.json @@ -29,7 +29,6 @@ "vue-apollo": "^3.0.5", "vue-histogram-slider": "^0.3.8", "vue-infinite-loading": "^2.4.5", - "vue-matomo": "^3.14.0-0", "vue-mixpanel": "1.0.7", "vue-router": "^3.4.9", "vue-timeago": "^5.1.2", diff --git a/packages/frontend/src/embed/embedApp.js b/packages/frontend/src/embed/embedApp.js index 8be17847b..6c6ab347e 100644 --- a/packages/frontend/src/embed/embedApp.js +++ b/packages/frontend/src/embed/embedApp.js @@ -4,13 +4,6 @@ import vuetify from './embedVuetify' import router from './embedRouter' Vue.config.productionTip = false -import VueMatomo from 'vue-matomo' -Vue.use(VueMatomo, { - host: 'https://speckle.matomo.cloud', - siteId: 4, - router -}) - import VueMixpanel from 'vue-mixpanel' Vue.use(VueMixpanel, { token: 'acd87c5a50b56df91a795e999812a3a4', diff --git a/packages/frontend/src/main/app.js b/packages/frontend/src/main/app.js index 69779ea33..f5095cf1d 100644 --- a/packages/frontend/src/main/app.js +++ b/packages/frontend/src/main/app.js @@ -35,15 +35,6 @@ Vue.use(PerfectScrollbar) import VTooltip from 'v-tooltip' Vue.use(VTooltip, { defaultDelay: 300, defaultBoundariesElement: document.body }) -import VueMatomo from 'vue-matomo' - -Vue.use(VueMatomo, { - host: 'https://speckle.matomo.cloud', - siteId: 4, - router, - userId: localStorage.getItem('suuid') -}) - import VueMixpanel from 'vue-mixpanel' Vue.use(VueMixpanel, { token: 'acd87c5a50b56df91a795e999812a3a4', diff --git a/packages/frontend/src/main/components/onboarding/GettingStartedSteps.vue b/packages/frontend/src/main/components/onboarding/GettingStartedSteps.vue index 0d4516160..2c41f1d37 100644 --- a/packages/frontend/src/main/components/onboarding/GettingStartedSteps.vue +++ b/packages/frontend/src/main/components/onboarding/GettingStartedSteps.vue @@ -349,7 +349,6 @@ export default { }), computed: {}, mounted() { - this.$matomo && this.$matomo.trackEvent('onboarding', 'start') this.$mixpanel.track('Web Onboarding', { step: this.onboarding, type: 'action' @@ -357,18 +356,15 @@ export default { }, methods: { skip() { - this.$matomo && this.$matomo.trackPageView(`onboarding/skip`) localStorage.setItem('onboarding', 'skipped') this.$router.push('/') }, finish() { - this.$matomo && this.$matomo.trackPageView(`onboarding/done`) localStorage.setItem('onboarding', 'complete') this.$router.push('/') }, prev() { this.onboarding-- - this.$matomo && this.$matomo.trackPageView(`onboarding/step-${this.onboarding}`) this.$mixpanel.track('Web Onboarding', { step: this.onboarding, type: 'action' @@ -379,7 +375,6 @@ export default { this.finish() } this.onboarding++ - this.$matomo && this.$matomo.trackPageView(`onboarding/step-${this.onboarding}`) this.$mixpanel.track('Web Onboarding', { step: this.onboarding, type: 'action' diff --git a/packages/frontend/src/main/components/stream/WebhookForm.vue b/packages/frontend/src/main/components/stream/WebhookForm.vue index 7283cae84..e93b1fd54 100644 --- a/packages/frontend/src/main/components/stream/WebhookForm.vue +++ b/packages/frontend/src/main/components/stream/WebhookForm.vue @@ -165,7 +165,6 @@ export default { methods: { async saveChanges() { this.$emit('update:loading', true) - this.$matomo && this.$matomo.trackPageView('stream/webhook/update') this.$mixpanel.track('Webhook Action', { type: 'action', name: 'update' }) const params = { @@ -194,7 +193,6 @@ export default { }, async addWebhook() { this.$emit('update:loading', true) - this.$matomo && this.$matomo.trackPageView('stream/webhook/create') this.$mixpanel.track('Webhook Action', { type: 'action', name: 'create' }) await this.$apollo.mutate({ @@ -221,7 +219,6 @@ export default { }, async deleteWebhook() { this.$emit('update:loading', true) - this.$matomo && this.$matomo.trackPageView('stream/webhook/delete') this.$mixpanel.track('Webhook Action', { type: 'action', name: 'delete' }) await this.$apollo.mutate({ diff --git a/packages/frontend/src/main/components/stream/globals/GlobalsBuilder.vue b/packages/frontend/src/main/components/stream/globals/GlobalsBuilder.vue index 48a441c60..467cd5a04 100644 --- a/packages/frontend/src/main/components/stream/globals/GlobalsBuilder.vue +++ b/packages/frontend/src/main/components/stream/globals/GlobalsBuilder.vue @@ -199,7 +199,6 @@ export default { try { this.loading = true - this.$matomo && this.$matomo.trackPageView('globals/save') this.$mixpanel.track('Globals Action', { type: 'action', name: 'update' }) const res = await this.$apollo.mutate({ mutation: gql` diff --git a/packages/frontend/src/main/components/user/AppEditDialog.vue b/packages/frontend/src/main/components/user/AppEditDialog.vue index f021c1736..73e9dbef9 100644 --- a/packages/frontend/src/main/components/user/AppEditDialog.vue +++ b/packages/frontend/src/main/components/user/AppEditDialog.vue @@ -221,7 +221,6 @@ export default { async editApp() { if (!this.$refs.form.validate()) return this.$mixpanel.track('App Action', { type: 'action', name: 'update' }) - this.$matomo && this.$matomo.trackPageView('user/app/update') try { const res = await this.$apollo.mutate({ mutation: gql` diff --git a/packages/frontend/src/main/components/user/AppNewDialog.vue b/packages/frontend/src/main/components/user/AppNewDialog.vue index 5f98c3e2a..125f92cae 100644 --- a/packages/frontend/src/main/components/user/AppNewDialog.vue +++ b/packages/frontend/src/main/components/user/AppNewDialog.vue @@ -174,7 +174,6 @@ export default { async createApp() { if (!this.$refs.form.validate()) return - this.$matomo && this.$matomo.trackPageView('user/app/create') this.$mixpanel.track('App Action', { type: 'action', name: 'create' }) try { diff --git a/packages/frontend/src/main/components/user/ListItemPersonalAccessToken.vue b/packages/frontend/src/main/components/user/ListItemPersonalAccessToken.vue index b8b1add76..bde7b9aea 100644 --- a/packages/frontend/src/main/components/user/ListItemPersonalAccessToken.vue +++ b/packages/frontend/src/main/components/user/ListItemPersonalAccessToken.vue @@ -56,7 +56,6 @@ export default { methods: { async revokeToken() { this.$mixpanel.track('Token Action', { type: 'action', name: 'delete' }) - this.$matomo && this.$matomo.trackPageView('user/token/revoke') try { await this.$apollo.mutate({ mutation: gql` diff --git a/packages/frontend/src/main/components/user/ListItemUserApp.vue b/packages/frontend/src/main/components/user/ListItemUserApp.vue index 0f65ee3fe..377668ddd 100644 --- a/packages/frontend/src/main/components/user/ListItemUserApp.vue +++ b/packages/frontend/src/main/components/user/ListItemUserApp.vue @@ -121,7 +121,6 @@ export default { methods: { async deleteApp() { this.$mixpanel.track('App Action', { type: 'action', name: 'delete' }) - this.$matomo && this.$matomo.trackPageView('user/app/revoke') try { await this.$apollo.mutate({ mutation: gql` diff --git a/packages/frontend/src/main/components/user/TokenDialog.vue b/packages/frontend/src/main/components/user/TokenDialog.vue index 19ce06fdd..cda90fd8d 100644 --- a/packages/frontend/src/main/components/user/TokenDialog.vue +++ b/packages/frontend/src/main/components/user/TokenDialog.vue @@ -111,7 +111,6 @@ export default { async createToken() { if (!this.$refs.form.validate()) return - this.$matomo && this.$matomo.trackPageView('user/token/create') this.$mixpanel.track('Token Action', { type: 'action', name: 'create' }) try { const res = await this.$apollo.mutate({ diff --git a/packages/frontend/src/main/components/user/UserAuthorisedApps.vue b/packages/frontend/src/main/components/user/UserAuthorisedApps.vue index 5278e433c..d85a2640a 100644 --- a/packages/frontend/src/main/components/user/UserAuthorisedApps.vue +++ b/packages/frontend/src/main/components/user/UserAuthorisedApps.vue @@ -116,7 +116,6 @@ export default { async revokeAccess() { this.showRevokeDialog = false this.$mixpanel.track('App Action', { type: 'action', name: 'revoke' }) - this.$matomo && this.$matomo.trackPageView('user/app/revoke') await this.$apollo.mutate({ mutation: gql` mutation{ appRevokeAccess(appId: "${this.appToRevoke.id}")} diff --git a/packages/frontend/src/main/components/user/UserDeleteCard.vue b/packages/frontend/src/main/components/user/UserDeleteCard.vue index 937691690..687936a77 100644 --- a/packages/frontend/src/main/components/user/UserDeleteCard.vue +++ b/packages/frontend/src/main/components/user/UserDeleteCard.vue @@ -51,7 +51,6 @@ export default { if (!dialog.result) return this.$mixpanel.track('User Action', { type: 'action', name: 'delete' }) - this.$matomo && this.$matomo.trackPageView('user/delete') this.isLoading = true this.$apollo diff --git a/packages/frontend/src/main/components/user/UserInfoCard.vue b/packages/frontend/src/main/components/user/UserInfoCard.vue index 9291cbbc7..35be198de 100644 --- a/packages/frontend/src/main/components/user/UserInfoCard.vue +++ b/packages/frontend/src/main/components/user/UserInfoCard.vue @@ -165,7 +165,6 @@ export default { this.$refs.userDialog.open(this.user).then((dialog) => { if (!dialog.result) return - this.$matomo && this.$matomo.trackPageView('user/update') this.$mixpanel.track('User Action', { type: 'action', name: 'update' }) this.isLoading = true diff --git a/packages/frontend/src/main/dialogs/BranchEditDialog.vue b/packages/frontend/src/main/dialogs/BranchEditDialog.vue index d217e3a57..c24ea43cd 100644 --- a/packages/frontend/src/main/dialogs/BranchEditDialog.vue +++ b/packages/frontend/src/main/dialogs/BranchEditDialog.vue @@ -154,7 +154,6 @@ export default { async deleteBranch() { this.loading = true this.error = null - this.$matomo && this.$matomo.trackPageView('branch/delete') this.$mixpanel.track('Branch Action', { type: 'action', name: 'delete' }) try { const res = await this.$apollo.mutate({ @@ -189,7 +188,6 @@ export default { throw new Error('Branch already exists. Please choose a different name.') this.loading = true - this.$matomo && this.$matomo.trackPageView('branch/update') this.$mixpanel.track('Branch Action', { type: 'action', name: 'update' }) const res = await this.$apollo.mutate({ mutation: gql` diff --git a/packages/frontend/src/main/dialogs/CommitEdit.vue b/packages/frontend/src/main/dialogs/CommitEdit.vue index 4f679a45b..9d16c5023 100644 --- a/packages/frontend/src/main/dialogs/CommitEdit.vue +++ b/packages/frontend/src/main/dialogs/CommitEdit.vue @@ -105,7 +105,6 @@ export default { mounted() {}, methods: { async editCommit() { - this.$matomo && this.$matomo.trackPageView('commit/update') this.$mixpanel.track('Commit Action', { type: 'action', name: 'update' }) this.loading = true try { @@ -132,7 +131,6 @@ export default { this.$emit('close') }, async deleteCommit() { - this.$matomo && this.$matomo.trackPageView('commit/delete') this.$mixpanel.track('Commit Action', { type: 'action', name: 'delete' }) const commitBranch = this.stream.commit.branchName try { diff --git a/packages/frontend/src/main/dialogs/NewBranch.vue b/packages/frontend/src/main/dialogs/NewBranch.vue index 1b91d5b1c..2c0391deb 100644 --- a/packages/frontend/src/main/dialogs/NewBranch.vue +++ b/packages/frontend/src/main/dialogs/NewBranch.vue @@ -72,7 +72,6 @@ export default { if (!this.$refs.form.validate()) return this.loading = true - this.$matomo && this.$matomo.trackPageView('branch/create') this.$mixpanel.track('Branch Action', { type: 'action', name: 'create' }) try { await this.$apollo.mutate({ diff --git a/packages/frontend/src/main/dialogs/NewStream.vue b/packages/frontend/src/main/dialogs/NewStream.vue index 078f291b8..22d878aae 100644 --- a/packages/frontend/src/main/dialogs/NewStream.vue +++ b/packages/frontend/src/main/dialogs/NewStream.vue @@ -196,7 +196,6 @@ export default { if (!this.$refs.form.validate()) return this.isLoading = true - this.$matomo && this.$matomo.trackPageView('stream/create') this.$mixpanel.track('Stream Action', { type: 'action', name: 'create' }) try { const res = await this.$apollo.mutate({ diff --git a/packages/frontend/src/main/dialogs/ServerInvites.vue b/packages/frontend/src/main/dialogs/ServerInvites.vue index cb71adab3..949c56ba8 100644 --- a/packages/frontend/src/main/dialogs/ServerInvites.vue +++ b/packages/frontend/src/main/dialogs/ServerInvites.vue @@ -88,8 +88,6 @@ export default { async sendInvite() { if (!this.$refs.form.validate()) return - this.$matomo && this.$matomo.trackPageView('invite/create') - this.$matomo && this.$matomo.trackEvent('invite', 'server') this.$mixpanel.track('Invite Send', { type: 'action', source: 'server' }) try { await this.$apollo.mutate({ diff --git a/packages/frontend/src/main/dialogs/StreamInviteDialog.vue b/packages/frontend/src/main/dialogs/StreamInviteDialog.vue index 550e6864d..f55b771e6 100644 --- a/packages/frontend/src/main/dialogs/StreamInviteDialog.vue +++ b/packages/frontend/src/main/dialogs/StreamInviteDialog.vue @@ -116,8 +116,6 @@ export default { async sendInvite() { if (!this.$refs.form.validate()) return - this.$matomo && this.$matomo.trackPageView('invite/stream/create') - this.$matomo && this.$matomo.trackEvent('invite', 'stream') this.$mixpanel.track('Invite Send', { type: 'action', source: 'stream' }) try { await this.$apollo.mutate({ diff --git a/packages/frontend/src/main/pages/admin/Invites.vue b/packages/frontend/src/main/pages/admin/Invites.vue index 8b06a39c3..95c6b0394 100644 --- a/packages/frontend/src/main/pages/admin/Invites.vue +++ b/packages/frontend/src/main/pages/admin/Invites.vue @@ -232,7 +232,6 @@ export default { } }) - this.$matomo && this.$matomo.trackEvent('invite', 'server') this.$mixpanel.track('Invite Send', { type: 'action', source: streamId ? 'stream' : 'server' diff --git a/packages/frontend/src/main/pages/stream/TheCollaborators.vue b/packages/frontend/src/main/pages/stream/TheCollaborators.vue index f14716b12..b60b11279 100644 --- a/packages/frontend/src/main/pages/stream/TheCollaborators.vue +++ b/packages/frontend/src/main/pages/stream/TheCollaborators.vue @@ -328,7 +328,6 @@ export default { }, async removeUser(user) { this.loading = true - this.$matomo && this.$matomo.trackPageView('stream/remove-collaborator') this.$mixpanel.track('Permission Action', { type: 'action', name: 'remove' }) try { await this.$apollo.mutate({ @@ -380,7 +379,6 @@ export default { }, async grantPermissionUser(user) { this.$mixpanel.track('Permission Action', { type: 'action', name: 'add' }) - this.$matomo && this.$matomo.trackPageView('stream/add-collaborator') try { await this.$apollo.mutate({ mutation: gql` diff --git a/packages/frontend/src/main/pages/stream/TheGlobals.vue b/packages/frontend/src/main/pages/stream/TheGlobals.vue index 1047ead82..5f99fc8c5 100644 --- a/packages/frontend/src/main/pages/stream/TheGlobals.vue +++ b/packages/frontend/src/main/pages/stream/TheGlobals.vue @@ -215,7 +215,6 @@ export default { async createGlobals() { if (!this.branch) { this.loading = true - this.$matomo && this.$matomo.trackPageView('globals/branch/create') this.$mixpanel.track('Globals Action', { type: 'action', name: 'create' }) await this.$apollo.mutate({ mutation: gql` diff --git a/packages/frontend/src/main/pages/stream/TheSettings.vue b/packages/frontend/src/main/pages/stream/TheSettings.vue index 534b6dc99..6d1b1f6aa 100644 --- a/packages/frontend/src/main/pages/stream/TheSettings.vue +++ b/packages/frontend/src/main/pages/stream/TheSettings.vue @@ -221,7 +221,6 @@ export default { methods: { async save() { this.loading = true - this.$matomo && this.$matomo.trackPageView('stream/update') this.$mixpanel.track('Stream Action', { type: 'action', name: 'update' }) try { await this.$apollo.mutate({ @@ -252,7 +251,6 @@ export default { this.loading = false }, async deleteStream() { - this.$matomo && this.$matomo.trackPageView('stream/delete') this.$mixpanel.track('Stream Action', { type: 'action', name: 'delete' }) this.loadingDelete = true try { diff --git a/packages/preview-service/bin/www b/packages/preview-service/bin/www index d63c3f7e2..2af055ab1 100755 --- a/packages/preview-service/bin/www +++ b/packages/preview-service/bin/www @@ -4,23 +4,23 @@ * Module dependencies. */ -let app = require('../app') -let debug = require('debug')('preview-service:server') -let http = require('http') -let { startPreviewService } = require('../bg_service') +const app = require('../app') +const debug = require('debug')('preview-service:server') +const http = require('http') +const { startPreviewService } = require('../bg_service') /** * Get port from environment and store in Express. */ -let port = normalizePort(process.env.PORT || '3001') +const port = normalizePort(process.env.PORT || '3001') app.set('port', port) /** * Create HTTP server. */ -let server = http.createServer(app) +const server = http.createServer(app) /** * Listen on provided port, on all network interfaces. @@ -35,7 +35,7 @@ server.on('listening', onListening) */ function normalizePort(val) { - let port = parseInt(val, 10) + const port = parseInt(val, 10) if (isNaN(port)) { // named pipe @@ -59,7 +59,7 @@ function onError(error) { throw error } - let bind = typeof port === 'string' ? 'Pipe ' + port : 'Port ' + port + const bind = typeof port === 'string' ? 'Pipe ' + port : 'Port ' + port // handle specific listen errors with friendly messages switch (error.code) { @@ -81,8 +81,8 @@ function onError(error) { */ function onListening() { - let addr = server.address() - let bind = typeof addr === 'string' ? 'pipe ' + addr : 'port ' + addr.port + const addr = server.address() + const bind = typeof addr === 'string' ? 'pipe ' + addr : 'port ' + addr.port debug('Listening on ' + bind) startPreviewService() diff --git a/packages/server/app.js b/packages/server/app.js index 8ece88647..40796b69f 100644 --- a/packages/server/app.js +++ b/packages/server/app.js @@ -15,7 +15,6 @@ const { createTerminus } = require('@godaddy/terminus') const Sentry = require('@sentry/node') const Logging = require(`${appRoot}/logging`) -const { startup: MatStartup } = require(`${appRoot}/logging/matomoHelper`) const { errorLoggingMiddleware } = require(`${appRoot}/logging/errorLogging`) const prometheusClient = require('prom-client') @@ -96,7 +95,6 @@ exports.init = async () => { const app = express() Logging(app) - MatStartup() // Moves things along automatically on restart. // Should perhaps be done manually? diff --git a/packages/server/logging/apolloPlugin.js b/packages/server/logging/apolloPlugin.js index 911fb18f7..c2aee9019 100644 --- a/packages/server/logging/apolloPlugin.js +++ b/packages/server/logging/apolloPlugin.js @@ -1,7 +1,6 @@ /* istanbul ignore file */ const Sentry = require('@sentry/node') const { ApolloError } = require('apollo-server-express') -const { apolloHelper } = require('./matomoHelper') const prometheusClient = require('prom-client') const metricCallCount = new prometheusClient.Counter({ @@ -27,12 +26,7 @@ module.exports = { try { const actionName = `${ctx.operation.operation} ${ctx.operation.selectionSet.selections[0].name.value}` metricCallCount.labels(actionName).inc() - // console.log( actionName ) - // Filter out subscription ops - if (!ctx.operation.operation.toLowerCase().includes('subscription')) { - apolloHelper(actionName) - } } catch (e) { Sentry.captureException(e) } diff --git a/packages/server/logging/matomoHelper.js b/packages/server/logging/matomoHelper.js deleted file mode 100644 index f3b3aa464..000000000 --- a/packages/server/logging/matomoHelper.js +++ /dev/null @@ -1,46 +0,0 @@ -/* eslint-disable camelcase */ -const Matomo = require('matomo-tracker') -const { machineIdSync } = require('node-machine-id') - -const id = machineIdSync() -const mat = new Matomo(7, 'https://speckle.matomo.cloud/matomo.php') - -module.exports = { - startup() { - if (process.env.DISABLE_TRACKING !== 'true') { - mat.track({ - url: 'http://speckle.server', - action_name: 'startup', - uid: id, - cip: id, - token_auth: '8402f0bdd767c74cce86f710fe830a2c' - }) - } - }, - apolloHelper(actionName) { - if (process.env.DISABLE_TRACKING !== 'true') { - mat.track({ - url: 'http://speckle.server/gql', - action_name: actionName || 'gql api call', - cip: id, - uid: id, - token_auth: '8402f0bdd767c74cce86f710fe830a2c' - }) - } - }, - matomoMiddleware(req, res, next) { - if (process.env.DISABLE_TRACKING !== 'true') { - mat.track({ - url: req.url, - action_name: 'api call', - cip: id, - uid: id, - cvar: JSON.stringify({ - 1: ['HTTP method', req.method] - }), - token_auth: '8402f0bdd767c74cce86f710fe830a2c' - }) - } - next() - } -} diff --git a/packages/server/modules/auth/rest/index.js b/packages/server/modules/auth/rest/index.js index c444970bd..3b5704c35 100644 --- a/packages/server/modules/auth/rest/index.js +++ b/packages/server/modules/auth/rest/index.js @@ -3,7 +3,7 @@ const debug = require('debug') const cors = require('cors') const sentry = require(`@/logging/sentryHelper`) -const { matomoMiddleware } = require(`@/logging/matomoHelper`) + const { getApp, createAuthorizationCode, @@ -49,7 +49,7 @@ module.exports = (app) => { Generates a new api token: (1) either via a valid refresh token or (2) via a valid access token */ app.options('/auth/token', cors()) - app.post('/auth/token', cors(), matomoMiddleware, async (req, res) => { + app.post('/auth/token', cors(), async (req, res) => { try { // Token refresh if (req.body.refreshToken) { @@ -89,7 +89,7 @@ module.exports = (app) => { /* Ensures a user is logged out by invalidating their token and refresh token. */ - app.post('/auth/logout', matomoMiddleware, async (req, res) => { + app.post('/auth/logout', async (req, res) => { try { const token = req.body.token const refreshToken = req.body.refreshToken diff --git a/packages/server/modules/core/rest/diffDownload.js b/packages/server/modules/core/rest/diffDownload.js index 754a11a04..b430f71a3 100644 --- a/packages/server/modules/core/rest/diffDownload.js +++ b/packages/server/modules/core/rest/diffDownload.js @@ -4,7 +4,6 @@ const debug = require('debug') const appRoot = require('app-root-path') const cors = require('cors') -const { matomoMiddleware } = require(`${appRoot}/logging/matomoHelper`) const { contextMiddleware } = require(`${appRoot}/modules/shared`) const { validatePermissionsReadStream } = require('./authUtils') const { SpeckleObjectsStream } = require('./speckleObjectsStream') @@ -15,60 +14,54 @@ const { pipeline, PassThrough } = require('stream') module.exports = (app) => { app.options('/api/getobjects/:streamId', cors()) - app.post( - '/api/getobjects/:streamId', - cors(), - contextMiddleware, - matomoMiddleware, - async (req, res) => { - const hasStreamAccess = await validatePermissionsReadStream( - req.params.streamId, - req - ) - if (!hasStreamAccess.result) { - return res.status(hasStreamAccess.status).end() - } - - const childrenList = JSON.parse(req.body.objects) - - const simpleText = req.headers.accept === 'text/plain' - - res.writeHead(200, { - 'Content-Encoding': 'gzip', - 'Content-Type': simpleText ? 'text/plain; charset=UTF-8' : 'application/json' - }) - - const dbStream = await getObjectsStream({ - streamId: req.params.streamId, - objectIds: childrenList - }) - const speckleObjStream = new SpeckleObjectsStream(simpleText) - const gzipStream = zlib.createGzip() - - pipeline( - dbStream, - speckleObjStream, - gzipStream, - new PassThrough({ highWaterMark: 16384 * 31 }), - res, - (err) => { - if (err) { - debug('speckle:error')( - `[User ${ - req.context.userId || '-' - }] Error streaming objects from stream ${req.params.streamId}: ${err}` - ) - } else { - debug('speckle:info')( - `[User ${req.context.userId || '-'}] Streamed ${ - childrenList.length - } objects from stream ${req.params.streamId} (size: ${ - gzipStream.bytesWritten / 1000000 - } MB)` - ) - } - } - ) + app.post('/api/getobjects/:streamId', cors(), contextMiddleware, async (req, res) => { + const hasStreamAccess = await validatePermissionsReadStream( + req.params.streamId, + req + ) + if (!hasStreamAccess.result) { + return res.status(hasStreamAccess.status).end() } - ) + + const childrenList = JSON.parse(req.body.objects) + + const simpleText = req.headers.accept === 'text/plain' + + res.writeHead(200, { + 'Content-Encoding': 'gzip', + 'Content-Type': simpleText ? 'text/plain; charset=UTF-8' : 'application/json' + }) + + const dbStream = await getObjectsStream({ + streamId: req.params.streamId, + objectIds: childrenList + }) + const speckleObjStream = new SpeckleObjectsStream(simpleText) + const gzipStream = zlib.createGzip() + + pipeline( + dbStream, + speckleObjStream, + gzipStream, + new PassThrough({ highWaterMark: 16384 * 31 }), + res, + (err) => { + if (err) { + debug('speckle:error')( + `[User ${req.context.userId || '-'}] Error streaming objects from stream ${ + req.params.streamId + }: ${err}` + ) + } else { + debug('speckle:info')( + `[User ${req.context.userId || '-'}] Streamed ${ + childrenList.length + } objects from stream ${req.params.streamId} (size: ${ + gzipStream.bytesWritten / 1000000 + } MB)` + ) + } + } + ) + }) } diff --git a/packages/server/modules/core/rest/diffUpload.js b/packages/server/modules/core/rest/diffUpload.js index 7478ccb02..d0cabdc04 100644 --- a/packages/server/modules/core/rest/diffUpload.js +++ b/packages/server/modules/core/rest/diffUpload.js @@ -4,7 +4,6 @@ const cors = require('cors') const debug = require('debug') const appRoot = require('app-root-path') -const { matomoMiddleware } = require(`${appRoot}/logging/matomoHelper`) const { contextMiddleware } = require(`${appRoot}/modules/shared`) const { validatePermissionsWriteStream } = require('./authUtils') @@ -13,42 +12,36 @@ const { hasObjects } = require('../services/objects') module.exports = (app) => { app.options('/api/diff/:streamId', cors()) - app.post( - '/api/diff/:streamId', - cors(), - contextMiddleware, - matomoMiddleware, - async (req, res) => { - const hasStreamAccess = await validatePermissionsWriteStream( - req.params.streamId, - req - ) - if (!hasStreamAccess.result) { - return res.status(hasStreamAccess.status).end() - } - - const objectList = JSON.parse(req.body.objects) - - debug('speckle:info')( - `[User ${req.context.userId || '-'}] Diffing ${ - objectList.length - } objects for stream ${req.params.streamId}` - ) - - const response = await hasObjects({ - streamId: req.params.streamId, - objectIds: objectList - }) - // console.log(response) - res.writeHead(200, { - 'Content-Encoding': 'gzip', - 'Content-Type': 'application/json' - }) - const gzip = zlib.createGzip() - gzip.write(JSON.stringify(response)) - gzip.flush() - gzip.end() - gzip.pipe(res) + app.post('/api/diff/:streamId', cors(), contextMiddleware, async (req, res) => { + const hasStreamAccess = await validatePermissionsWriteStream( + req.params.streamId, + req + ) + if (!hasStreamAccess.result) { + return res.status(hasStreamAccess.status).end() } - ) + + const objectList = JSON.parse(req.body.objects) + + debug('speckle:info')( + `[User ${req.context.userId || '-'}] Diffing ${ + objectList.length + } objects for stream ${req.params.streamId}` + ) + + const response = await hasObjects({ + streamId: req.params.streamId, + objectIds: objectList + }) + // console.log(response) + res.writeHead(200, { + 'Content-Encoding': 'gzip', + 'Content-Type': 'application/json' + }) + const gzip = zlib.createGzip() + gzip.write(JSON.stringify(response)) + gzip.flush() + gzip.end() + gzip.pipe(res) + }) } diff --git a/packages/server/modules/core/rest/download.js b/packages/server/modules/core/rest/download.js index a463a6cac..a865fae8b 100644 --- a/packages/server/modules/core/rest/download.js +++ b/packages/server/modules/core/rest/download.js @@ -4,7 +4,6 @@ const debug = require('debug') const appRoot = require('app-root-path') const cors = require('cors') -const { matomoMiddleware } = require(`${appRoot}/logging/matomoHelper`) const { contextMiddleware } = require(`${appRoot}/modules/shared`) const { validatePermissionsReadStream } = require('./authUtils') @@ -19,7 +18,6 @@ module.exports = (app) => { '/objects/:streamId/:objectId', cors(), contextMiddleware, - matomoMiddleware, async (req, res) => { const hasStreamAccess = await validatePermissionsReadStream( req.params.streamId, @@ -87,7 +85,6 @@ module.exports = (app) => { '/objects/:streamId/:objectId/single', cors(), contextMiddleware, - matomoMiddleware, async (req, res) => { const hasStreamAccess = await validatePermissionsReadStream( req.params.streamId, diff --git a/packages/server/modules/core/rest/upload.js b/packages/server/modules/core/rest/upload.js index 4b68b1bdc..8983dbe0b 100644 --- a/packages/server/modules/core/rest/upload.js +++ b/packages/server/modules/core/rest/upload.js @@ -5,7 +5,6 @@ const Busboy = require('busboy') const debug = require('debug') const appRoot = require('app-root-path') -const { matomoMiddleware } = require(`${appRoot}/logging/matomoHelper`) const { contextMiddleware } = require(`${appRoot}/modules/shared`) const { validatePermissionsWriteStream } = require('./authUtils') @@ -16,237 +15,223 @@ const MAX_FILE_SIZE = 50 * 1024 * 1024 module.exports = (app) => { app.options('/objects/:streamId', cors()) - app.post( - '/objects/:streamId', - cors(), - contextMiddleware, - matomoMiddleware, - async (req, res) => { - const hasStreamAccess = await validatePermissionsWriteStream( - req.params.streamId, - req - ) - if (!hasStreamAccess.result) { - return res.status(hasStreamAccess.status).end() - } + app.post('/objects/:streamId', cors(), contextMiddleware, async (req, res) => { + const hasStreamAccess = await validatePermissionsWriteStream( + req.params.streamId, + req + ) + if (!hasStreamAccess.result) { + return res.status(hasStreamAccess.status).end() + } - const busboy = Busboy({ headers: req.headers }) - let totalProcessed = 0 - // let last = {} + const busboy = Busboy({ headers: req.headers }) + let totalProcessed = 0 + // let last = {} - const promises = [] - let requestDropped = false + const promises = [] + let requestDropped = false - busboy.on('file', (name, file, info) => { - const { mimeType } = info + busboy.on('file', (name, file, info) => { + const { mimeType } = info - if (requestDropped) return + if (requestDropped) return - if (mimeType === 'application/gzip') { - const buffer = [] + if (mimeType === 'application/gzip') { + const buffer = [] - file.on('data', (data) => { - if (data) buffer.push(data) - }) + file.on('data', (data) => { + if (data) buffer.push(data) + }) - file.on('end', async () => { - if (requestDropped) return - const t0 = Date.now() - let objs = [] + file.on('end', async () => { + if (requestDropped) return + const t0 = Date.now() + let objs = [] - const gzippedBuffer = Buffer.concat(buffer) - if (gzippedBuffer.length > MAX_FILE_SIZE) { - debug('speckle:error')( - `[User ${ - req.context.userId || '-' - }] Upload error: Batch size too large (${ - gzippedBuffer.length - } > ${MAX_FILE_SIZE})` - ) - if (!requestDropped) - res - .status(400) - .send( - `File size too large (${gzippedBuffer.length} > ${MAX_FILE_SIZE})` - ) - requestDropped = true - } - - const gunzippedBuffer = zlib.gunzipSync(gzippedBuffer).toString() - if (gunzippedBuffer.length > MAX_FILE_SIZE) { - debug('speckle:error')( - `[User ${ - req.context.userId || '-' - }] Upload error: Batch size too large (${ - gunzippedBuffer.length - } > ${MAX_FILE_SIZE})` - ) - if (!requestDropped) - res - .status(400) - .send( - `File size too large (${gunzippedBuffer.length} > ${MAX_FILE_SIZE})` - ) - requestDropped = true - } - - try { - objs = JSON.parse(gunzippedBuffer) - } catch (e) { - debug('speckle:error')( - `[User ${ - req.context.userId || '-' - }] Upload error: Batch not in JSON format` - ) - if (!requestDropped) res.status(400).send('Failed to parse data.') - requestDropped = true - } - - // last = objs[objs.length - 1] - totalProcessed += objs.length - - const promise = createObjectsBatched(req.params.streamId, objs).catch( - (e) => { - debug('speckle:error')( - `[User ${req.context.userId || '-'}] Upload error: ${e.message}` + const gzippedBuffer = Buffer.concat(buffer) + if (gzippedBuffer.length > MAX_FILE_SIZE) { + debug('speckle:error')( + `[User ${ + req.context.userId || '-' + }] Upload error: Batch size too large (${ + gzippedBuffer.length + } > ${MAX_FILE_SIZE})` + ) + if (!requestDropped) + res + .status(400) + .send( + `File size too large (${gzippedBuffer.length} > ${MAX_FILE_SIZE})` ) - if (!requestDropped) - res - .status(400) - .send( - 'Error inserting object in the database. Check server logs for details' - ) - requestDropped = true - } + requestDropped = true + } + + const gunzippedBuffer = zlib.gunzipSync(gzippedBuffer).toString() + if (gunzippedBuffer.length > MAX_FILE_SIZE) { + debug('speckle:error')( + `[User ${ + req.context.userId || '-' + }] Upload error: Batch size too large (${ + gunzippedBuffer.length + } > ${MAX_FILE_SIZE})` ) - promises.push(promise) - - await promise - - debug('speckle:info')( - `[User ${req.context.userId || '-'}] Uploaded batch of ${ - objs.length - } objects to stream ${req.params.streamId} (size: ${ - gunzippedBuffer.length / 1000000 - } MB, duration: ${(Date.now() - t0) / 1000}s, crtMemUsage: ${ - process.memoryUsage().heapUsed / 1024 / 1024 - } MB, dropped=${requestDropped})` - ) - }) - } else if ( - mimeType === 'text/plain' || - mimeType === 'application/json' || - mimeType === 'application/octet-stream' - ) { - let buffer = '' - - file.on('data', (data) => { - if (data) buffer += data - }) - - file.on('end', async () => { - if (requestDropped) return - const t0 = Date.now() - let objs = [] - - if (buffer.length > MAX_FILE_SIZE) { - debug('speckle:error')( - `[User ${ - req.context.userId || '-' - }] Upload error: Batch size too large (${ - buffer.length - } > ${MAX_FILE_SIZE})` - ) - if (!requestDropped) - res - .status(400) - .send(`File size too large (${buffer.length} > ${MAX_FILE_SIZE})`) - requestDropped = true - } - - try { - objs = JSON.parse(buffer) - } catch (e) { - debug('speckle:error')( - `[User ${ - req.context.userId || '-' - }] Upload error: Batch not in JSON format` - ) - if (!requestDropped) res.status(400).send('Failed to parse data.') - requestDropped = true - } - // last = objs[objs.length - 1] - totalProcessed += objs.length - - const promise = createObjectsBatched(req.params.streamId, objs).catch( - (e) => { - debug('speckle:error')( - `[User ${req.context.userId || '-'}] Upload error: ${e.message}` + if (!requestDropped) + res + .status(400) + .send( + `File size too large (${gunzippedBuffer.length} > ${MAX_FILE_SIZE})` ) - if (!requestDropped) - res - .status(400) - .send( - 'Error inserting object in the database. Check server logs for details' - ) - requestDropped = true - } - ) - promises.push(promise) + requestDropped = true + } - await promise - debug('speckle:info')( - `[User ${req.context.userId || '-'}] Uploaded batch of ${ - objs.length - } objects to stream ${req.params.streamId} (size: ${ - buffer.length / 1000000 - } MB, duration: ${(Date.now() - t0) / 1000}s, crtMemUsage: ${ - process.memoryUsage().heapUsed / 1024 / 1024 - } MB, dropped=${requestDropped})` + try { + objs = JSON.parse(gunzippedBuffer) + } catch (e) { + debug('speckle:error')( + `[User ${ + req.context.userId || '-' + }] Upload error: Batch not in JSON format` ) + if (!requestDropped) res.status(400).send('Failed to parse data.') + requestDropped = true + } + + // last = objs[objs.length - 1] + totalProcessed += objs.length + + const promise = createObjectsBatched(req.params.streamId, objs).catch((e) => { + debug('speckle:error')( + `[User ${req.context.userId || '-'}] Upload error: ${e.message}` + ) + if (!requestDropped) + res + .status(400) + .send( + 'Error inserting object in the database. Check server logs for details' + ) + requestDropped = true }) - } else { - debug('speckle:error')( - `[User ${ - req.context.userId || '-' - }] Invalid ContentType header: ${mimeType}` + promises.push(promise) + + await promise + + debug('speckle:info')( + `[User ${req.context.userId || '-'}] Uploaded batch of ${ + objs.length + } objects to stream ${req.params.streamId} (size: ${ + gunzippedBuffer.length / 1000000 + } MB, duration: ${(Date.now() - t0) / 1000}s, crtMemUsage: ${ + process.memoryUsage().heapUsed / 1024 / 1024 + } MB, dropped=${requestDropped})` ) - if (!requestDropped) - res - .status(400) - .send( - 'Invalid ContentType header. This route only accepts "application/gzip", "text/plain" or "application/json".' - ) - requestDropped = true - } - }) + }) + } else if ( + mimeType === 'text/plain' || + mimeType === 'application/json' || + mimeType === 'application/octet-stream' + ) { + let buffer = '' - busboy.on('finish', async () => { - if (requestDropped) return + file.on('data', (data) => { + if (data) buffer += data + }) - debug('speckle:upload-endpoint')( - `[User ${ - req.context.userId || '-' - }] Upload finished: ${totalProcessed} objs, ${ - process.memoryUsage().heapUsed / 1024 / 1024 - } MB mem` - ) + file.on('end', async () => { + if (requestDropped) return + const t0 = Date.now() + let objs = [] - await Promise.all(promises) + if (buffer.length > MAX_FILE_SIZE) { + debug('speckle:error')( + `[User ${ + req.context.userId || '-' + }] Upload error: Batch size too large (${ + buffer.length + } > ${MAX_FILE_SIZE})` + ) + if (!requestDropped) + res + .status(400) + .send(`File size too large (${buffer.length} > ${MAX_FILE_SIZE})`) + requestDropped = true + } - res.status(201).end() - }) + try { + objs = JSON.parse(buffer) + } catch (e) { + debug('speckle:error')( + `[User ${ + req.context.userId || '-' + }] Upload error: Batch not in JSON format` + ) + if (!requestDropped) res.status(400).send('Failed to parse data.') + requestDropped = true + } + // last = objs[objs.length - 1] + totalProcessed += objs.length - busboy.on('error', async (err) => { - debug('speckle:upload-endpoint')( - `[User ${req.context.userId || '-'}] Upload error: ${err}` + const promise = createObjectsBatched(req.params.streamId, objs).catch((e) => { + debug('speckle:error')( + `[User ${req.context.userId || '-'}] Upload error: ${e.message}` + ) + if (!requestDropped) + res + .status(400) + .send( + 'Error inserting object in the database. Check server logs for details' + ) + requestDropped = true + }) + promises.push(promise) + + await promise + debug('speckle:info')( + `[User ${req.context.userId || '-'}] Uploaded batch of ${ + objs.length + } objects to stream ${req.params.streamId} (size: ${ + buffer.length / 1000000 + } MB, duration: ${(Date.now() - t0) / 1000}s, crtMemUsage: ${ + process.memoryUsage().heapUsed / 1024 / 1024 + } MB, dropped=${requestDropped})` + ) + }) + } else { + debug('speckle:error')( + `[User ${req.context.userId || '-'}] Invalid ContentType header: ${mimeType}` ) if (!requestDropped) - res.status(400).end('Upload request error. The server logs have more details') + res + .status(400) + .send( + 'Invalid ContentType header. This route only accepts "application/gzip", "text/plain" or "application/json".' + ) requestDropped = true - }) + } + }) - req.pipe(busboy) - } - ) + busboy.on('finish', async () => { + if (requestDropped) return + + debug('speckle:upload-endpoint')( + `[User ${req.context.userId || '-'}] Upload finished: ${totalProcessed} objs, ${ + process.memoryUsage().heapUsed / 1024 / 1024 + } MB mem` + ) + + await Promise.all(promises) + + res.status(201).end() + }) + + busboy.on('error', async (err) => { + debug('speckle:upload-endpoint')( + `[User ${req.context.userId || '-'}] Upload error: ${err}` + ) + if (!requestDropped) + res.status(400).end('Upload request error. The server logs have more details') + requestDropped = true + }) + + req.pipe(busboy) + }) } diff --git a/packages/server/modules/fileuploads/index.js b/packages/server/modules/fileuploads/index.js index 30327d252..ddc31f4de 100644 --- a/packages/server/modules/fileuploads/index.js +++ b/packages/server/modules/fileuploads/index.js @@ -5,7 +5,6 @@ const debug = require('debug') const appRoot = require('app-root-path') const Busboy = require('busboy') -const { matomoMiddleware } = require(`${appRoot}/logging/matomoHelper`) const { contextMiddleware, validateScopes, @@ -61,59 +60,53 @@ exports.init = async (app) => { return { hasPermissions: true, httpErrorCode: 200 } } - app.get( - '/api/file/:fileId', - contextMiddleware, - matomoMiddleware, - async (req, res) => { - if (process.env.DISABLE_FILE_UPLOADS) { - return res.status(503).send('File uploads are disabled on this server') - } - - const fileInfo = await getFileInfo({ fileId: req.params.fileId }) - - if (!fileInfo) return res.status(404).send('File not found') - - // Check stream read access - const streamId = fileInfo.streamId - const stream = await getStream({ streamId, userId: req.context.userId }) - - if (!stream) { - return res.status(404).send('File stream not found') - } - - if (!stream.isPublic && req.context.auth === false) { - return res.status(401).send('You must be logged in to access private streams') - } - - if (!stream.isPublic) { - try { - await validateScopes(req.context.scopes, 'streams:read') - } catch (err) { - return res.status(401).send("The provided auth token can't read streams") - } - - try { - await authorizeResolver(req.context.userId, streamId, 'stream:reviewer') - } catch (err) { - return res.status(401).send("You don't have access to this private stream") - } - } - - const fileStream = await getFileStream({ fileId: req.params.fileId }) - - res.writeHead(200, { - 'Content-Type': 'application/octet-stream', - 'Content-Disposition': `attachment; filename="${fileInfo.fileName}"` - }) - - fileStream.pipe(res) + app.get('/api/file/:fileId', contextMiddleware, async (req, res) => { + if (process.env.DISABLE_FILE_UPLOADS) { + return res.status(503).send('File uploads are disabled on this server') } - ), + + const fileInfo = await getFileInfo({ fileId: req.params.fileId }) + + if (!fileInfo) return res.status(404).send('File not found') + + // Check stream read access + const streamId = fileInfo.streamId + const stream = await getStream({ streamId, userId: req.context.userId }) + + if (!stream) { + return res.status(404).send('File stream not found') + } + + if (!stream.isPublic && req.context.auth === false) { + return res.status(401).send('You must be logged in to access private streams') + } + + if (!stream.isPublic) { + try { + await validateScopes(req.context.scopes, 'streams:read') + } catch (err) { + return res.status(401).send("The provided auth token can't read streams") + } + + try { + await authorizeResolver(req.context.userId, streamId, 'stream:reviewer') + } catch (err) { + return res.status(401).send("You don't have access to this private stream") + } + } + + const fileStream = await getFileStream({ fileId: req.params.fileId }) + + res.writeHead(200, { + 'Content-Type': 'application/octet-stream', + 'Content-Disposition': `attachment; filename="${fileInfo.fileName}"` + }) + + fileStream.pipe(res) + }), app.post( '/api/file/:fileType/:streamId/:branchName?', contextMiddleware, - matomoMiddleware, async (req, res) => { if (process.env.DISABLE_FILE_UPLOADS) { return res.status(503).send('File uploads are disabled on this server') diff --git a/packages/server/modules/previews/index.js b/packages/server/modules/previews/index.js index 8096b47fe..a619088f5 100644 --- a/packages/server/modules/previews/index.js +++ b/packages/server/modules/previews/index.js @@ -4,7 +4,6 @@ const debug = require('debug') const appRoot = require('app-root-path') -const { matomoMiddleware } = require(`${appRoot}/logging/matomoHelper`) const { contextMiddleware, validateScopes, @@ -151,7 +150,6 @@ exports.init = (app) => { app.get( '/preview/:streamId/objects/:objectId/:angle', contextMiddleware, - matomoMiddleware, async (req, res) => { const { hasPermissions, httpErrorCode } = await checkStreamPermissions(req) if (!hasPermissions) { @@ -171,43 +169,37 @@ exports.init = (app) => { } ) - app.get( - '/preview/:streamId', - contextMiddleware, - matomoMiddleware, - async (req, res) => { - const { hasPermissions, httpErrorCode } = await checkStreamPermissions(req) - if (!hasPermissions) { - // return res.status( httpErrorCode ).end() - return res.sendFile( - `${appRoot}/modules/previews/assets/preview_${httpErrorCode}.png` - ) - } - - const { commits } = await getCommitsByStreamId({ - streamId: req.params.streamId, - limit: 1, - ignoreGlobalsBranch: true - }) - if (!commits || commits.length === 0) { - return res.sendFile(`${appRoot}/modules/previews/assets/no_preview.png`) - } - const lastCommit = commits[0] - - return sendObjectPreview( - req, - res, - req.params.streamId, - lastCommit.referencedObject, - DEFAULT_ANGLE + app.get('/preview/:streamId', contextMiddleware, async (req, res) => { + const { hasPermissions, httpErrorCode } = await checkStreamPermissions(req) + if (!hasPermissions) { + // return res.status( httpErrorCode ).end() + return res.sendFile( + `${appRoot}/modules/previews/assets/preview_${httpErrorCode}.png` ) } - ) + + const { commits } = await getCommitsByStreamId({ + streamId: req.params.streamId, + limit: 1, + ignoreGlobalsBranch: true + }) + if (!commits || commits.length === 0) { + return res.sendFile(`${appRoot}/modules/previews/assets/no_preview.png`) + } + const lastCommit = commits[0] + + return sendObjectPreview( + req, + res, + req.params.streamId, + lastCommit.referencedObject, + DEFAULT_ANGLE + ) + }) app.get( '/preview/:streamId/branches/:branchName', contextMiddleware, - matomoMiddleware, async (req, res) => { const { hasPermissions, httpErrorCode } = await checkStreamPermissions(req) if (!hasPermissions) { @@ -246,7 +238,6 @@ exports.init = (app) => { app.get( '/preview/:streamId/commits/:commitId', contextMiddleware, - matomoMiddleware, async (req, res) => { const { hasPermissions, httpErrorCode } = await checkStreamPermissions(req) if (!hasPermissions) { @@ -277,7 +268,6 @@ exports.init = (app) => { app.get( '/preview/:streamId/objects/:objectId', contextMiddleware, - matomoMiddleware, async (req, res) => { const { hasPermissions, httpErrorCode } = await checkStreamPermissions(req) if (!hasPermissions) { diff --git a/packages/server/package.json b/packages/server/package.json index e897cbb69..a4720b5dd 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -48,7 +48,6 @@ "ioredis": "^4.19.4", "knex": "^1.0.3", "lodash": "^4.17.21", - "matomo-tracker": "^2.2.4", "module-alias": "^2.2.2", "morgan": "^1.10.0", "morgan-debug": "^2.0.0", diff --git a/workspace.code-workspace b/workspace.code-workspace index 8d4313619..a0adfefeb 100644 --- a/workspace.code-workspace +++ b/workspace.code-workspace @@ -1,9 +1,5 @@ { "folders": [ - { - "path": ".", - "name": "🏡 root" - }, { "path": "packages/server", "name": "🖥️ server" @@ -31,7 +27,11 @@ { "path": "packages/objectloader", "name": "🌐 objectloader" - } + }, + { + "path": ".", + "name": "🏡 root" + }, ], "settings": { // Some settings below are duplicated in root/.vscode, incase the repo is opened without targetting the workspace file