Compare commits

...

18 Commits

Author SHA1 Message Date
standardci 7f9e6e2f44 chore(release): publish new version
- @standardnotes/analytics@2.17.8
 - @standardnotes/api-gateway@1.41.3
 - @standardnotes/auth-server@1.70.9
 - @standardnotes/files-server@1.9.3
 - @standardnotes/revisions-server@1.10.3
 - @standardnotes/scheduler-server@1.16.4
 - @standardnotes/syncing-server@1.28.3
 - @standardnotes/websockets-server@1.5.3
 - @standardnotes/workspace-server@1.19.4
2022-12-28 07:07:42 +00:00
Karol Sójko d3c6c0d48e chore(upgrade): sentry deps 2022-12-28 08:05:42 +01:00
Karol Sójko 6c83476fd2 chore: workflow disptach name 2022-12-27 15:50:40 +01:00
Karol Sójko 9cdf7e2c51 Revert "feat: add workflow for tagging latest versions as stable"
This reverts commit a2c484e0f3.
2022-12-27 15:37:32 +01:00
Karol Sójko 599119e14e chore: move e2e test suite to self-hosted repo 2022-12-27 15:00:11 +01:00
Karol Sójko a2c484e0f3 feat: add workflow for tagging latest versions as stable 2022-12-27 14:43:36 +01:00
standardci 97ff4d5ac2 chore(release): publish new version
- @standardnotes/auth-server@1.70.8
2022-12-20 20:24:56 +00:00
Karol Sójko 5255cfbb25 fix(auth): move tracing sessions to session creation instead of cross service token creation 2022-12-20 21:22:24 +01:00
standardci 780358368b chore(release): publish new version
- @standardnotes/auth-server@1.70.7
2022-12-20 19:55:43 +00:00
Karol Sójko cf0b918913 fix(auth): change severity on tracing session errors - most probably hazardous reads 2022-12-20 20:53:26 +01:00
standardci 4ea690204e chore(release): publish new version
- @standardnotes/auth-server@1.70.6
2022-12-20 18:54:47 +00:00
Karol Sójko 14eb775749 fix(auth): query for session traces 2022-12-20 19:52:32 +01:00
standardci bf4a3be6d9 chore(release): publish new version
- @standardnotes/auth-server@1.70.5
2022-12-20 18:48:19 +00:00
Karol Sójko b9e1e47871 fix(auth): add session traces index 2022-12-20 19:46:05 +01:00
standardci ff532ecb22 chore(release): publish new version
- @standardnotes/scheduler-server@1.16.3
2022-12-20 18:21:59 +00:00
Karol Sójko eb21872db1 fix(scheduler): new pricing for subscription encouragement email 2022-12-20 19:19:59 +01:00
standardci 8e3df184dc chore(release): publish new version
- @standardnotes/analytics@2.17.7
2022-12-20 14:43:24 +00:00
Karol Sójko b34bbcac8b fix(analytics): monthly numbers of active users 2022-12-20 15:41:03 +01:00
38 changed files with 424 additions and 262 deletions
@@ -190,9 +190,9 @@ jobs:
uses: convictional/trigger-workflow-and-wait@master uses: convictional/trigger-workflow-and-wait@master
with: with:
owner: standardnotes owner: standardnotes
repo: e2e repo: self-hosted
github_token: ${{ secrets.CI_PAT_TOKEN }} github_token: ${{ secrets.CI_PAT_TOKEN }}
workflow_file_name: testing-with-stable-client.yml workflow_file_name: testing-with-updating-client-and-server.yml
wait_interval: 30 wait_interval: 30
client_payload: '{"${{ inputs.e2e_tag_parameter_name }}": "${{ github.sha }}"}' client_payload: '{"${{ inputs.e2e_tag_parameter_name }}": "${{ github.sha }}"}'
propagate_failure: true propagate_failure: true
Generated
+64 -13
View File
@@ -126,7 +126,7 @@ const RAW_RUNTIME_STATE =
["@lerna-lite/cli", "npm:1.6.0"],\ ["@lerna-lite/cli", "npm:1.6.0"],\
["@lerna-lite/list", "npm:1.6.0"],\ ["@lerna-lite/list", "npm:1.6.0"],\
["@lerna-lite/run", "npm:1.6.0"],\ ["@lerna-lite/run", "npm:1.6.0"],\
["@sentry/node", "npm:7.27.0"],\ ["@sentry/node", "npm:7.28.1"],\
["@types/jest", "npm:29.1.1"],\ ["@types/jest", "npm:29.1.1"],\
["@types/newrelic", "npm:7.0.4"],\ ["@types/newrelic", "npm:7.0.4"],\
["@types/node", "npm:18.11.9"],\ ["@types/node", "npm:18.11.9"],\
@@ -2447,6 +2447,16 @@ const RAW_RUNTIME_STATE =
["tslib", "npm:1.14.1"]\ ["tslib", "npm:1.14.1"]\
],\ ],\
"linkType": "HARD"\ "linkType": "HARD"\
}],\
["npm:7.28.1", {\
"packageLocation": "./.yarn/cache/@sentry-core-npm-7.28.1-a468033ea8-f29d747d3e.zip/node_modules/@sentry/core/",\
"packageDependencies": [\
["@sentry/core", "npm:7.28.1"],\
["@sentry/types", "npm:7.28.1"],\
["@sentry/utils", "npm:7.28.1"],\
["tslib", "npm:1.14.1"]\
],\
"linkType": "HARD"\
}]\ }]\
]],\ ]],\
["@sentry/hub", [\ ["@sentry/hub", [\
@@ -2476,6 +2486,20 @@ const RAW_RUNTIME_STATE =
["tslib", "npm:1.14.1"]\ ["tslib", "npm:1.14.1"]\
],\ ],\
"linkType": "HARD"\ "linkType": "HARD"\
}],\
["npm:7.28.1", {\
"packageLocation": "./.yarn/cache/@sentry-node-npm-7.28.1-b0e124fdfc-b4922d1f0a.zip/node_modules/@sentry/node/",\
"packageDependencies": [\
["@sentry/node", "npm:7.28.1"],\
["@sentry/core", "npm:7.28.1"],\
["@sentry/types", "npm:7.28.1"],\
["@sentry/utils", "npm:7.28.1"],\
["cookie", "npm:0.4.2"],\
["https-proxy-agent", "npm:5.0.1"],\
["lru_map", "npm:0.3.3"],\
["tslib", "npm:1.14.1"]\
],\
"linkType": "HARD"\
}]\ }]\
]],\ ]],\
["@sentry/profiling-node", [\ ["@sentry/profiling-node", [\
@@ -2506,6 +2530,17 @@ const RAW_RUNTIME_STATE =
["tslib", "npm:1.14.1"]\ ["tslib", "npm:1.14.1"]\
],\ ],\
"linkType": "HARD"\ "linkType": "HARD"\
}],\
["npm:7.28.1", {\
"packageLocation": "./.yarn/cache/@sentry-tracing-npm-7.28.1-e15d453d8e-be501ca9d7.zip/node_modules/@sentry/tracing/",\
"packageDependencies": [\
["@sentry/tracing", "npm:7.28.1"],\
["@sentry/core", "npm:7.28.1"],\
["@sentry/types", "npm:7.28.1"],\
["@sentry/utils", "npm:7.28.1"],\
["tslib", "npm:1.14.1"]\
],\
"linkType": "HARD"\
}]\ }]\
]],\ ]],\
["@sentry/types", [\ ["@sentry/types", [\
@@ -2515,6 +2550,13 @@ const RAW_RUNTIME_STATE =
["@sentry/types", "npm:7.27.0"]\ ["@sentry/types", "npm:7.27.0"]\
],\ ],\
"linkType": "HARD"\ "linkType": "HARD"\
}],\
["npm:7.28.1", {\
"packageLocation": "./.yarn/cache/@sentry-types-npm-7.28.1-42d9a8574c-7dc6639cb7.zip/node_modules/@sentry/types/",\
"packageDependencies": [\
["@sentry/types", "npm:7.28.1"]\
],\
"linkType": "HARD"\
}]\ }]\
]],\ ]],\
["@sentry/utils", [\ ["@sentry/utils", [\
@@ -2526,6 +2568,15 @@ const RAW_RUNTIME_STATE =
["tslib", "npm:1.14.1"]\ ["tslib", "npm:1.14.1"]\
],\ ],\
"linkType": "HARD"\ "linkType": "HARD"\
}],\
["npm:7.28.1", {\
"packageLocation": "./.yarn/cache/@sentry-utils-npm-7.28.1-71eaeb767f-a4b5f73db0.zip/node_modules/@sentry/utils/",\
"packageDependencies": [\
["@sentry/utils", "npm:7.28.1"],\
["@sentry/types", "npm:7.28.1"],\
["tslib", "npm:1.14.1"]\
],\
"linkType": "HARD"\
}]\ }]\
]],\ ]],\
["@sinclair/typebox", [\ ["@sinclair/typebox", [\
@@ -2581,7 +2632,7 @@ const RAW_RUNTIME_STATE =
"packageDependencies": [\ "packageDependencies": [\
["@standardnotes/analytics", "workspace:packages/analytics"],\ ["@standardnotes/analytics", "workspace:packages/analytics"],\
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\ ["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
["@sentry/node", "npm:7.27.0"],\ ["@sentry/node", "npm:7.28.1"],\
["@standardnotes/common", "workspace:packages/common"],\ ["@standardnotes/common", "workspace:packages/common"],\
["@standardnotes/domain-core", "workspace:packages/domain-core"],\ ["@standardnotes/domain-core", "workspace:packages/domain-core"],\
["@standardnotes/domain-events", "workspace:packages/domain-events"],\ ["@standardnotes/domain-events", "workspace:packages/domain-events"],\
@@ -2633,7 +2684,7 @@ const RAW_RUNTIME_STATE =
"packageDependencies": [\ "packageDependencies": [\
["@standardnotes/api-gateway", "workspace:packages/api-gateway"],\ ["@standardnotes/api-gateway", "workspace:packages/api-gateway"],\
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\ ["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
["@sentry/node", "npm:7.27.0"],\ ["@sentry/node", "npm:7.28.1"],\
["@standardnotes/common", "workspace:packages/common"],\ ["@standardnotes/common", "workspace:packages/common"],\
["@standardnotes/domain-events", "workspace:packages/domain-events"],\ ["@standardnotes/domain-events", "workspace:packages/domain-events"],\
["@standardnotes/domain-events-infra", "workspace:packages/domain-events-infra"],\ ["@standardnotes/domain-events-infra", "workspace:packages/domain-events-infra"],\
@@ -2689,9 +2740,9 @@ const RAW_RUNTIME_STATE =
"packageDependencies": [\ "packageDependencies": [\
["@standardnotes/auth-server", "workspace:packages/auth"],\ ["@standardnotes/auth-server", "workspace:packages/auth"],\
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\ ["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
["@sentry/node", "npm:7.27.0"],\ ["@sentry/node", "npm:7.28.1"],\
["@sentry/profiling-node", "npm:0.0.12"],\ ["@sentry/profiling-node", "npm:0.0.12"],\
["@sentry/tracing", "npm:7.27.0"],\ ["@sentry/tracing", "npm:7.28.1"],\
["@standardnotes/api", "npm:1.19.0"],\ ["@standardnotes/api", "npm:1.19.0"],\
["@standardnotes/common", "workspace:packages/common"],\ ["@standardnotes/common", "workspace:packages/common"],\
["@standardnotes/domain-core", "workspace:packages/domain-core"],\ ["@standardnotes/domain-core", "workspace:packages/domain-core"],\
@@ -2915,7 +2966,7 @@ const RAW_RUNTIME_STATE =
"packageLocation": "./packages/files/",\ "packageLocation": "./packages/files/",\
"packageDependencies": [\ "packageDependencies": [\
["@standardnotes/files-server", "workspace:packages/files"],\ ["@standardnotes/files-server", "workspace:packages/files"],\
["@sentry/node", "npm:7.27.0"],\ ["@sentry/node", "npm:7.28.1"],\
["@standardnotes/common", "workspace:packages/common"],\ ["@standardnotes/common", "workspace:packages/common"],\
["@standardnotes/config", "npm:2.4.3"],\ ["@standardnotes/config", "npm:2.4.3"],\
["@standardnotes/domain-events", "workspace:packages/domain-events"],\ ["@standardnotes/domain-events", "workspace:packages/domain-events"],\
@@ -3050,7 +3101,7 @@ const RAW_RUNTIME_STATE =
"packageDependencies": [\ "packageDependencies": [\
["@standardnotes/revisions-server", "workspace:packages/revisions"],\ ["@standardnotes/revisions-server", "workspace:packages/revisions"],\
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\ ["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
["@sentry/node", "npm:7.27.0"],\ ["@sentry/node", "npm:7.28.1"],\
["@standardnotes/api", "npm:1.19.0"],\ ["@standardnotes/api", "npm:1.19.0"],\
["@standardnotes/common", "workspace:packages/common"],\ ["@standardnotes/common", "workspace:packages/common"],\
["@standardnotes/domain-core", "workspace:packages/domain-core"],\ ["@standardnotes/domain-core", "workspace:packages/domain-core"],\
@@ -3095,7 +3146,7 @@ const RAW_RUNTIME_STATE =
"packageDependencies": [\ "packageDependencies": [\
["@standardnotes/scheduler-server", "workspace:packages/scheduler"],\ ["@standardnotes/scheduler-server", "workspace:packages/scheduler"],\
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\ ["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
["@sentry/node", "npm:7.27.0"],\ ["@sentry/node", "npm:7.28.1"],\
["@standardnotes/common", "workspace:packages/common"],\ ["@standardnotes/common", "workspace:packages/common"],\
["@standardnotes/domain-core", "workspace:packages/domain-core"],\ ["@standardnotes/domain-core", "workspace:packages/domain-core"],\
["@standardnotes/domain-events", "workspace:packages/domain-events"],\ ["@standardnotes/domain-events", "workspace:packages/domain-events"],\
@@ -3156,7 +3207,7 @@ const RAW_RUNTIME_STATE =
["@lerna-lite/cli", "npm:1.6.0"],\ ["@lerna-lite/cli", "npm:1.6.0"],\
["@lerna-lite/list", "npm:1.6.0"],\ ["@lerna-lite/list", "npm:1.6.0"],\
["@lerna-lite/run", "npm:1.6.0"],\ ["@lerna-lite/run", "npm:1.6.0"],\
["@sentry/node", "npm:7.27.0"],\ ["@sentry/node", "npm:7.28.1"],\
["@types/jest", "npm:29.1.1"],\ ["@types/jest", "npm:29.1.1"],\
["@types/newrelic", "npm:7.0.4"],\ ["@types/newrelic", "npm:7.0.4"],\
["@types/node", "npm:18.11.9"],\ ["@types/node", "npm:18.11.9"],\
@@ -3222,9 +3273,9 @@ const RAW_RUNTIME_STATE =
"packageDependencies": [\ "packageDependencies": [\
["@standardnotes/syncing-server", "workspace:packages/syncing-server"],\ ["@standardnotes/syncing-server", "workspace:packages/syncing-server"],\
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\ ["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
["@sentry/node", "npm:7.27.0"],\ ["@sentry/node", "npm:7.28.1"],\
["@sentry/profiling-node", "npm:0.0.12"],\ ["@sentry/profiling-node", "npm:0.0.12"],\
["@sentry/tracing", "npm:7.27.0"],\ ["@sentry/tracing", "npm:7.28.1"],\
["@standardnotes/common", "workspace:packages/common"],\ ["@standardnotes/common", "workspace:packages/common"],\
["@standardnotes/domain-core", "workspace:packages/domain-core"],\ ["@standardnotes/domain-core", "workspace:packages/domain-core"],\
["@standardnotes/domain-events", "workspace:packages/domain-events"],\ ["@standardnotes/domain-events", "workspace:packages/domain-events"],\
@@ -3324,7 +3375,7 @@ const RAW_RUNTIME_STATE =
"packageDependencies": [\ "packageDependencies": [\
["@standardnotes/websockets-server", "workspace:packages/websockets"],\ ["@standardnotes/websockets-server", "workspace:packages/websockets"],\
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\ ["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
["@sentry/node", "npm:7.27.0"],\ ["@sentry/node", "npm:7.28.1"],\
["@standardnotes/api", "npm:1.19.0"],\ ["@standardnotes/api", "npm:1.19.0"],\
["@standardnotes/common", "workspace:packages/common"],\ ["@standardnotes/common", "workspace:packages/common"],\
["@standardnotes/domain-events", "workspace:packages/domain-events"],\ ["@standardnotes/domain-events", "workspace:packages/domain-events"],\
@@ -3364,7 +3415,7 @@ const RAW_RUNTIME_STATE =
"packageDependencies": [\ "packageDependencies": [\
["@standardnotes/workspace-server", "workspace:packages/workspace"],\ ["@standardnotes/workspace-server", "workspace:packages/workspace"],\
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\ ["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
["@sentry/node", "npm:7.27.0"],\ ["@sentry/node", "npm:7.28.1"],\
["@standardnotes/api", "npm:1.19.0"],\ ["@standardnotes/api", "npm:1.19.0"],\
["@standardnotes/common", "workspace:packages/common"],\ ["@standardnotes/common", "workspace:packages/common"],\
["@standardnotes/domain-core", "workspace:packages/domain-core"],\ ["@standardnotes/domain-core", "workspace:packages/domain-core"],\
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -61,7 +61,7 @@
}, },
"packageManager": "yarn@4.0.0-rc.25", "packageManager": "yarn@4.0.0-rc.25",
"dependencies": { "dependencies": {
"@sentry/node": "^7.27.0", "@sentry/node": "^7.28.1",
"newrelic": "^9.6.0" "newrelic": "^9.6.0"
} }
} }
+10
View File
@@ -3,6 +3,16 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [2.17.8](https://github.com/standardnotes/server/compare/@standardnotes/analytics@2.17.7...@standardnotes/analytics@2.17.8) (2022-12-28)
**Note:** Version bump only for package @standardnotes/analytics
## [2.17.7](https://github.com/standardnotes/server/compare/@standardnotes/analytics@2.17.6...@standardnotes/analytics@2.17.7) (2022-12-20)
### Bug Fixes
* **analytics:** monthly numbers of active users ([b34bbca](https://github.com/standardnotes/server/commit/b34bbcac8b9604283b3a5959ab3218c468ce8a00))
## [2.17.6](https://github.com/standardnotes/server/compare/@standardnotes/analytics@2.17.5...@standardnotes/analytics@2.17.6) (2022-12-20) ## [2.17.6](https://github.com/standardnotes/server/compare/@standardnotes/analytics@2.17.5...@standardnotes/analytics@2.17.6) (2022-12-20)
### Bug Fixes ### Bug Fixes
+2 -2
View File
@@ -1,6 +1,6 @@
{ {
"name": "@standardnotes/analytics", "name": "@standardnotes/analytics",
"version": "2.17.6", "version": "2.17.8",
"engines": { "engines": {
"node": ">=18.0.0 <19.0.0" "node": ">=18.0.0 <19.0.0"
}, },
@@ -38,7 +38,7 @@
}, },
"dependencies": { "dependencies": {
"@newrelic/winston-enricher": "^4.0.0", "@newrelic/winston-enricher": "^4.0.0",
"@sentry/node": "^7.27.0", "@sentry/node": "^7.28.1",
"@standardnotes/common": "workspace:*", "@standardnotes/common": "workspace:*",
"@standardnotes/domain-core": "workspace:^", "@standardnotes/domain-core": "workspace:^",
"@standardnotes/domain-events": "workspace:*", "@standardnotes/domain-events": "workspace:*",
@@ -24,11 +24,12 @@ const countActiveUsers = (measureName: string, data: any): { yesterday: number;
} }
} }
const averageActiveUsersLast30Days = Math.floor( const last30DaysNumbers = filteredCounts.map((count: { totalCount: number }) => count.totalCount)
filteredCounts.reduce((previousValue: { totalCount: any }, currentValue: { totalCount: any }) => { const last30DaysCount = last30DaysNumbers.reduce((previousValue: number, currentValue: number) => {
return previousValue.totalCount + currentValue.totalCount return previousValue + currentValue
}) / filteredCounts.length, })
)
const averageActiveUsersLast30Days = Math.floor(last30DaysCount / last30DaysNumbers.length)
return { return {
yesterday: totalActiveUsersYesterday, yesterday: totalActiveUsersYesterday,
+4
View File
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.41.3](https://github.com/standardnotes/api-gateway/compare/@standardnotes/api-gateway@1.41.2...@standardnotes/api-gateway@1.41.3) (2022-12-28)
**Note:** Version bump only for package @standardnotes/api-gateway
## [1.41.2](https://github.com/standardnotes/api-gateway/compare/@standardnotes/api-gateway@1.41.1...@standardnotes/api-gateway@1.41.2) (2022-12-20) ## [1.41.2](https://github.com/standardnotes/api-gateway/compare/@standardnotes/api-gateway@1.41.1...@standardnotes/api-gateway@1.41.2) (2022-12-20)
**Note:** Version bump only for package @standardnotes/api-gateway **Note:** Version bump only for package @standardnotes/api-gateway
+2 -2
View File
@@ -1,6 +1,6 @@
{ {
"name": "@standardnotes/api-gateway", "name": "@standardnotes/api-gateway",
"version": "1.41.2", "version": "1.41.3",
"engines": { "engines": {
"node": ">=18.0.0 <19.0.0" "node": ">=18.0.0 <19.0.0"
}, },
@@ -21,7 +21,7 @@
}, },
"dependencies": { "dependencies": {
"@newrelic/winston-enricher": "^4.0.0", "@newrelic/winston-enricher": "^4.0.0",
"@sentry/node": "^7.27.0", "@sentry/node": "^7.28.1",
"@standardnotes/common": "workspace:^", "@standardnotes/common": "workspace:^",
"@standardnotes/domain-events": "workspace:*", "@standardnotes/domain-events": "workspace:*",
"@standardnotes/domain-events-infra": "workspace:*", "@standardnotes/domain-events-infra": "workspace:*",
+2 -2
View File
@@ -13,8 +13,8 @@ ENCRYPTION_SERVER_KEY=change-me-!
PORT=3000 PORT=3000
DB_HOST=localhost DB_HOST=127.0.0.1
DB_REPLICA_HOST=localhost DB_REPLICA_HOST=127.0.0.1
DB_PORT=3306 DB_PORT=3306
DB_USERNAME=auth DB_USERNAME=auth
DB_PASSWORD=changeme123 DB_PASSWORD=changeme123
+28
View File
@@ -3,6 +3,34 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.70.9](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.70.8...@standardnotes/auth-server@1.70.9) (2022-12-28)
**Note:** Version bump only for package @standardnotes/auth-server
## [1.70.8](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.70.7...@standardnotes/auth-server@1.70.8) (2022-12-20)
### Bug Fixes
* **auth:** move tracing sessions to session creation instead of cross service token creation ([5255cfb](https://github.com/standardnotes/server/commit/5255cfbb257cc9e6ac437fe0c5b28d938e3e599b))
## [1.70.7](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.70.6...@standardnotes/auth-server@1.70.7) (2022-12-20)
### Bug Fixes
* **auth:** change severity on tracing session errors - most probably hazardous reads ([cf0b918](https://github.com/standardnotes/server/commit/cf0b91891370e1c1799ad80c10ee9f6b98087a94))
## [1.70.6](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.70.5...@standardnotes/auth-server@1.70.6) (2022-12-20)
### Bug Fixes
* **auth:** query for session traces ([14eb775](https://github.com/standardnotes/server/commit/14eb775749bfa9972dc3c07049505f3d15f0b556))
## [1.70.5](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.70.4...@standardnotes/auth-server@1.70.5) (2022-12-20)
### Bug Fixes
* **auth:** add session traces index ([b9e1e47](https://github.com/standardnotes/server/commit/b9e1e4787129f00fab8f98cb721141f2e7d75600))
## [1.70.4](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.70.3...@standardnotes/auth-server@1.70.4) (2022-12-20) ## [1.70.4](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.70.3...@standardnotes/auth-server@1.70.4) (2022-12-20)
### Bug Fixes ### Bug Fixes
@@ -0,0 +1,15 @@
import { MigrationInterface, QueryRunner } from 'typeorm'
export class addSessionTracesCompoundIndex1671561748264 implements MigrationInterface {
name = 'addSessionTracesCompoundIndex1671561748264'
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(
'CREATE UNIQUE INDEX `user_uuid_and_creation_date` ON `session_traces` (`user_uuid`, `creation_date`)',
)
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query('DROP INDEX `user_uuid_and_creation_date` ON `session_traces`')
}
}
+3 -3
View File
@@ -1,6 +1,6 @@
{ {
"name": "@standardnotes/auth-server", "name": "@standardnotes/auth-server",
"version": "1.70.4", "version": "1.70.9",
"engines": { "engines": {
"node": ">=18.0.0 <19.0.0" "node": ">=18.0.0 <19.0.0"
}, },
@@ -33,9 +33,9 @@
}, },
"dependencies": { "dependencies": {
"@newrelic/winston-enricher": "^4.0.0", "@newrelic/winston-enricher": "^4.0.0",
"@sentry/node": "^7.27.0", "@sentry/node": "^7.28.1",
"@sentry/profiling-node": "^0.0.12", "@sentry/profiling-node": "^0.0.12",
"@sentry/tracing": "^7.27.0", "@sentry/tracing": "^7.28.1",
"@standardnotes/api": "^1.19.0", "@standardnotes/api": "^1.19.0",
"@standardnotes/common": "workspace:*", "@standardnotes/common": "workspace:*",
"@standardnotes/domain-core": "workspace:^", "@standardnotes/domain-core": "workspace:^",
@@ -15,6 +15,10 @@ import { SettingServiceInterface } from '../Setting/SettingServiceInterface'
import { LogSessionUserAgentOption } from '@standardnotes/settings' import { LogSessionUserAgentOption } from '@standardnotes/settings'
import { Setting } from '../Setting/Setting' import { Setting } from '../Setting/Setting'
import { CryptoNode } from '@standardnotes/sncrypto-node' import { CryptoNode } from '@standardnotes/sncrypto-node'
import { UserSubscriptionRepositoryInterface } from '../Subscription/UserSubscriptionRepositoryInterface'
import { TraceSession } from '../UseCase/TraceSession/TraceSession'
import { UserSubscription } from '../Subscription/UserSubscription'
import { Result } from '@standardnotes/domain-core'
describe('SessionService', () => { describe('SessionService', () => {
let sessionRepository: SessionRepositoryInterface let sessionRepository: SessionRepositoryInterface
@@ -28,6 +32,8 @@ describe('SessionService', () => {
let timer: TimerInterface let timer: TimerInterface
let logger: winston.Logger let logger: winston.Logger
let cryptoNode: CryptoNode let cryptoNode: CryptoNode
let traceSession: TraceSession
let userSubscriptionRepository: UserSubscriptionRepositoryInterface
const createService = () => const createService = () =>
new SessionService( new SessionService(
@@ -41,6 +47,8 @@ describe('SessionService', () => {
234, 234,
settingService, settingService,
cryptoNode, cryptoNode,
traceSession,
userSubscriptionRepository,
) )
beforeEach(() => { beforeEach(() => {
@@ -106,6 +114,14 @@ describe('SessionService', () => {
cryptoNode = {} as jest.Mocked<CryptoNode> cryptoNode = {} as jest.Mocked<CryptoNode>
cryptoNode.generateRandomKey = jest.fn().mockReturnValue('foo bar') cryptoNode.generateRandomKey = jest.fn().mockReturnValue('foo bar')
cryptoNode.base64URLEncode = jest.fn().mockReturnValue('foobar') cryptoNode.base64URLEncode = jest.fn().mockReturnValue('foobar')
traceSession = {} as jest.Mocked<TraceSession>
traceSession.execute = jest.fn()
userSubscriptionRepository = {} as jest.Mocked<UserSubscriptionRepositoryInterface>
userSubscriptionRepository.findOneByUserUuid = jest.fn().mockReturnValue({
planName: 'PRO_PLAN',
} as jest.Mocked<UserSubscription>)
}) })
it('should mark a revoked session as received', async () => { it('should mark a revoked session as received', async () => {
@@ -204,6 +220,129 @@ describe('SessionService', () => {
}) })
}) })
it('should trace a session', async () => {
const user = {} as jest.Mocked<User>
user.uuid = '123'
user.email = 'test@test.te'
await createService().createNewSessionForUser({
user,
apiVersion: '003',
userAgent: 'Google Chrome',
readonlyAccess: false,
})
expect(traceSession.execute).toHaveBeenCalledWith({
userUuid: '123',
username: 'test@test.te',
subscriptionPlanName: 'PRO_PLAN',
})
})
it('should trace a session without a subscription', async () => {
userSubscriptionRepository.findOneByUserUuid = jest.fn().mockReturnValue(null)
const user = {} as jest.Mocked<User>
user.uuid = '123'
user.email = 'test@test.te'
await createService().createNewSessionForUser({
user,
apiVersion: '003',
userAgent: 'Google Chrome',
readonlyAccess: false,
})
expect(traceSession.execute).toHaveBeenCalledWith({
userUuid: '123',
username: 'test@test.te',
subscriptionPlanName: null,
})
})
it('should create a session if tracing session throws an error', async () => {
traceSession.execute = jest.fn().mockRejectedValue(new Error('foo bar'))
userSubscriptionRepository.findOneByUserUuid = jest.fn().mockReturnValue(null)
const user = {} as jest.Mocked<User>
user.uuid = '123'
user.email = 'test@test.te'
const sessionPayload = await createService().createNewSessionForUser({
user,
apiVersion: '003',
userAgent: 'Google Chrome',
readonlyAccess: false,
})
expect(traceSession.execute).toHaveBeenCalledWith({
userUuid: '123',
username: 'test@test.te',
subscriptionPlanName: null,
})
expect(sessionPayload).toEqual({
access_expiration: 123,
access_token: expect.any(String),
refresh_expiration: 123,
refresh_token: expect.any(String),
readonly_access: false,
})
})
it('should create a session if tracing session throws an error', async () => {
traceSession.execute = jest.fn().mockRejectedValue(new Error('foo bar'))
userSubscriptionRepository.findOneByUserUuid = jest.fn().mockReturnValue(null)
const user = {} as jest.Mocked<User>
user.uuid = '123'
user.email = 'test@test.te'
const sessionPayload = await createService().createNewSessionForUser({
user,
apiVersion: '003',
userAgent: 'Google Chrome',
readonlyAccess: false,
})
expect(traceSession.execute).toHaveBeenCalledWith({
userUuid: '123',
username: 'test@test.te',
subscriptionPlanName: null,
})
expect(sessionPayload).toEqual({
access_expiration: 123,
access_token: expect.any(String),
refresh_expiration: 123,
refresh_token: expect.any(String),
readonly_access: false,
})
})
it('should create a session if tracing session fails', async () => {
traceSession.execute = jest.fn().mockReturnValue(Result.fail('Oops'))
userSubscriptionRepository.findOneByUserUuid = jest.fn().mockReturnValue(null)
const user = {} as jest.Mocked<User>
user.uuid = '123'
user.email = 'test@test.te'
const sessionPayload = await createService().createNewSessionForUser({
user,
apiVersion: '003',
userAgent: 'Google Chrome',
readonlyAccess: false,
})
expect(traceSession.execute).toHaveBeenCalledWith({
userUuid: '123',
username: 'test@test.te',
subscriptionPlanName: null,
})
expect(sessionPayload).toEqual({
access_expiration: 123,
access_token: expect.any(String),
refresh_expiration: 123,
refresh_token: expect.any(String),
readonly_access: false,
})
})
it('should create new ephemeral session for a user', async () => { it('should create new ephemeral session for a user', async () => {
const user = {} as jest.Mocked<User> const user = {} as jest.Mocked<User>
user.uuid = '123' user.uuid = '123'
@@ -1,10 +1,14 @@
import * as crypto from 'crypto' import * as crypto from 'crypto'
import * as winston from 'winston'
import * as dayjs from 'dayjs' import * as dayjs from 'dayjs'
import { UAParser } from 'ua-parser-js' import { UAParser } from 'ua-parser-js'
import { inject, injectable } from 'inversify' import { inject, injectable } from 'inversify'
import { v4 as uuidv4 } from 'uuid' import { v4 as uuidv4 } from 'uuid'
import { TimerInterface } from '@standardnotes/time' import { TimerInterface } from '@standardnotes/time'
import { Logger } from 'winston'
import { LogSessionUserAgentOption, SettingName } from '@standardnotes/settings'
import { SessionBody } from '@standardnotes/responses'
import { Uuid } from '@standardnotes/common'
import { CryptoNode } from '@standardnotes/sncrypto-node'
import TYPES from '../../Bootstrap/Types' import TYPES from '../../Bootstrap/Types'
import { Session } from './Session' import { Session } from './Session'
@@ -16,10 +20,8 @@ import { EphemeralSession } from './EphemeralSession'
import { RevokedSession } from './RevokedSession' import { RevokedSession } from './RevokedSession'
import { RevokedSessionRepositoryInterface } from './RevokedSessionRepositoryInterface' import { RevokedSessionRepositoryInterface } from './RevokedSessionRepositoryInterface'
import { SettingServiceInterface } from '../Setting/SettingServiceInterface' import { SettingServiceInterface } from '../Setting/SettingServiceInterface'
import { LogSessionUserAgentOption, SettingName } from '@standardnotes/settings' import { TraceSession } from '../UseCase/TraceSession/TraceSession'
import { SessionBody } from '@standardnotes/responses' import { UserSubscriptionRepositoryInterface } from '../Subscription/UserSubscriptionRepositoryInterface'
import { Uuid } from '@standardnotes/common'
import { CryptoNode } from '@standardnotes/sncrypto-node'
@injectable() @injectable()
export class SessionService implements SessionServiceInterface { export class SessionService implements SessionServiceInterface {
@@ -31,11 +33,13 @@ export class SessionService implements SessionServiceInterface {
@inject(TYPES.RevokedSessionRepository) private revokedSessionRepository: RevokedSessionRepositoryInterface, @inject(TYPES.RevokedSessionRepository) private revokedSessionRepository: RevokedSessionRepositoryInterface,
@inject(TYPES.DeviceDetector) private deviceDetector: UAParser, @inject(TYPES.DeviceDetector) private deviceDetector: UAParser,
@inject(TYPES.Timer) private timer: TimerInterface, @inject(TYPES.Timer) private timer: TimerInterface,
@inject(TYPES.Logger) private logger: winston.Logger, @inject(TYPES.Logger) private logger: Logger,
@inject(TYPES.ACCESS_TOKEN_AGE) private accessTokenAge: number, @inject(TYPES.ACCESS_TOKEN_AGE) private accessTokenAge: number,
@inject(TYPES.REFRESH_TOKEN_AGE) private refreshTokenAge: number, @inject(TYPES.REFRESH_TOKEN_AGE) private refreshTokenAge: number,
@inject(TYPES.SettingService) private settingService: SettingServiceInterface, @inject(TYPES.SettingService) private settingService: SettingServiceInterface,
@inject(TYPES.CryptoNode) private cryptoNode: CryptoNode, @inject(TYPES.CryptoNode) private cryptoNode: CryptoNode,
@inject(TYPES.TraceSession) private traceSession: TraceSession,
@inject(TYPES.UserSubscriptionRepository) private userSubscriptionRepository: UserSubscriptionRepositoryInterface,
) {} ) {}
async createNewSessionForUser(dto: { async createNewSessionForUser(dto: {
@@ -53,6 +57,20 @@ export class SessionService implements SessionServiceInterface {
await this.sessionRepository.save(session) await this.sessionRepository.save(session)
try {
const userSubscription = await this.userSubscriptionRepository.findOneByUserUuid(dto.user.uuid)
const traceSessionResult = await this.traceSession.execute({
userUuid: dto.user.uuid,
username: dto.user.email,
subscriptionPlanName: userSubscription ? userSubscription.planName : null,
})
if (traceSessionResult.isFailed()) {
this.logger.error(traceSessionResult.getError())
}
} catch (error) {
this.logger.error(`Could not trace session while creating cross service token.: ${(error as Error).message}`)
}
return sessionPayload return sessionPayload
} }
@@ -8,10 +8,6 @@ import { Role } from '../../Role/Role'
import { UserRepositoryInterface } from '../../User/UserRepositoryInterface' import { UserRepositoryInterface } from '../../User/UserRepositoryInterface'
import { CreateCrossServiceToken } from './CreateCrossServiceToken' import { CreateCrossServiceToken } from './CreateCrossServiceToken'
import { RoleToSubscriptionMapInterface } from '../../Role/RoleToSubscriptionMapInterface'
import { TraceSession } from '../TraceSession/TraceSession'
import { Logger } from 'winston'
import { Result, RoleName, SubscriptionPlanName } from '@standardnotes/domain-core'
describe('CreateCrossServiceToken', () => { describe('CreateCrossServiceToken', () => {
let userProjector: ProjectorInterface<User> let userProjector: ProjectorInterface<User>
@@ -19,9 +15,6 @@ describe('CreateCrossServiceToken', () => {
let roleProjector: ProjectorInterface<Role> let roleProjector: ProjectorInterface<Role>
let tokenEncoder: TokenEncoderInterface<CrossServiceTokenData> let tokenEncoder: TokenEncoderInterface<CrossServiceTokenData>
let userRepository: UserRepositoryInterface let userRepository: UserRepositoryInterface
let roleToSubscriptionMap: RoleToSubscriptionMapInterface
let traceSession: TraceSession
let logger: Logger
const jwtTTL = 60 const jwtTTL = 60
let session: Session let session: Session
@@ -29,17 +22,7 @@ describe('CreateCrossServiceToken', () => {
let role: Role let role: Role
const createUseCase = () => const createUseCase = () =>
new CreateCrossServiceToken( new CreateCrossServiceToken(userProjector, sessionProjector, roleProjector, tokenEncoder, userRepository, jwtTTL)
userProjector,
sessionProjector,
roleProjector,
tokenEncoder,
userRepository,
jwtTTL,
roleToSubscriptionMap,
traceSession,
logger,
)
beforeEach(() => { beforeEach(() => {
session = {} as jest.Mocked<Session> session = {} as jest.Mocked<Session>
@@ -65,18 +48,6 @@ describe('CreateCrossServiceToken', () => {
userRepository = {} as jest.Mocked<UserRepositoryInterface> userRepository = {} as jest.Mocked<UserRepositoryInterface>
userRepository.findOneByUuid = jest.fn().mockReturnValue(user) userRepository.findOneByUuid = jest.fn().mockReturnValue(user)
roleToSubscriptionMap = {} as jest.Mocked<RoleToSubscriptionMapInterface>
roleToSubscriptionMap.filterSubscriptionRoles = jest.fn().mockReturnValue([RoleName.NAMES.PlusUser])
roleToSubscriptionMap.getSubscriptionNameForRoleName = jest
.fn()
.mockReturnValue(SubscriptionPlanName.NAMES.PlusPlan)
traceSession = {} as jest.Mocked<TraceSession>
traceSession.execute = jest.fn()
logger = {} as jest.Mocked<Logger>
logger.error = jest.fn()
}) })
it('should create a cross service token for user', async () => { it('should create a cross service token for user', async () => {
@@ -85,11 +56,6 @@ describe('CreateCrossServiceToken', () => {
session, session,
}) })
expect(traceSession.execute).toHaveBeenCalledWith({
userUuid: '1-2-3',
username: 'test@test.te',
subscriptionPlanName: 'PLUS_PLAN',
})
expect(tokenEncoder.encodeExpirableToken).toHaveBeenCalledWith( expect(tokenEncoder.encodeExpirableToken).toHaveBeenCalledWith(
{ {
roles: [ roles: [
@@ -168,126 +134,4 @@ describe('CreateCrossServiceToken', () => {
expect(caughtError).not.toBeNull() expect(caughtError).not.toBeNull()
}) })
it('should trace session without a subscription role', async () => {
roleToSubscriptionMap.filterSubscriptionRoles = jest.fn().mockReturnValue([])
await createUseCase().execute({
user,
session,
})
expect(traceSession.execute).toHaveBeenCalledWith({
userUuid: '1-2-3',
username: 'test@test.te',
subscriptionPlanName: null,
})
expect(tokenEncoder.encodeExpirableToken).toHaveBeenCalledWith(
{
roles: [
{
name: 'role1',
uuid: '1-3-4',
},
],
session: {
test: 'test',
},
user: {
email: 'test@test.te',
uuid: '1-2-3',
},
},
60,
)
})
it('should trace session without a subscription', async () => {
roleToSubscriptionMap.getSubscriptionNameForRoleName = jest.fn().mockReturnValue(undefined)
await createUseCase().execute({
user,
session,
})
expect(traceSession.execute).toHaveBeenCalledWith({
userUuid: '1-2-3',
username: 'test@test.te',
subscriptionPlanName: null,
})
expect(tokenEncoder.encodeExpirableToken).toHaveBeenCalledWith(
{
roles: [
{
name: 'role1',
uuid: '1-3-4',
},
],
session: {
test: 'test',
},
user: {
email: 'test@test.te',
uuid: '1-2-3',
},
},
60,
)
})
it('should create token if tracing session throws an error', async () => {
traceSession.execute = jest.fn().mockRejectedValue(new Error('test'))
await createUseCase().execute({
user,
session,
})
expect(tokenEncoder.encodeExpirableToken).toHaveBeenCalledWith(
{
roles: [
{
name: 'role1',
uuid: '1-3-4',
},
],
session: {
test: 'test',
},
user: {
email: 'test@test.te',
uuid: '1-2-3',
},
},
60,
)
})
it('should create token if tracing session fails', async () => {
traceSession.execute = jest.fn().mockReturnValue(Result.fail('Ooops'))
await createUseCase().execute({
user,
session,
})
expect(tokenEncoder.encodeExpirableToken).toHaveBeenCalledWith(
{
roles: [
{
name: 'role1',
uuid: '1-3-4',
},
],
session: {
test: 'test',
},
user: {
email: 'test@test.te',
uuid: '1-2-3',
},
},
60,
)
})
}) })
@@ -1,16 +1,13 @@
import { RoleName } from '@standardnotes/common' import { RoleName } from '@standardnotes/common'
import { TokenEncoderInterface, CrossServiceTokenData } from '@standardnotes/security' import { TokenEncoderInterface, CrossServiceTokenData } from '@standardnotes/security'
import { inject, injectable } from 'inversify' import { inject, injectable } from 'inversify'
import { Logger } from 'winston'
import TYPES from '../../../Bootstrap/Types' import TYPES from '../../../Bootstrap/Types'
import { ProjectorInterface } from '../../../Projection/ProjectorInterface' import { ProjectorInterface } from '../../../Projection/ProjectorInterface'
import { Role } from '../../Role/Role' import { Role } from '../../Role/Role'
import { RoleToSubscriptionMapInterface } from '../../Role/RoleToSubscriptionMapInterface'
import { Session } from '../../Session/Session' import { Session } from '../../Session/Session'
import { User } from '../../User/User' import { User } from '../../User/User'
import { UserRepositoryInterface } from '../../User/UserRepositoryInterface' import { UserRepositoryInterface } from '../../User/UserRepositoryInterface'
import { TraceSession } from '../TraceSession/TraceSession'
import { UseCaseInterface } from '../UseCaseInterface' import { UseCaseInterface } from '../UseCaseInterface'
import { CreateCrossServiceTokenDTO } from './CreateCrossServiceTokenDTO' import { CreateCrossServiceTokenDTO } from './CreateCrossServiceTokenDTO'
@@ -25,9 +22,6 @@ export class CreateCrossServiceToken implements UseCaseInterface {
@inject(TYPES.CrossServiceTokenEncoder) private tokenEncoder: TokenEncoderInterface<CrossServiceTokenData>, @inject(TYPES.CrossServiceTokenEncoder) private tokenEncoder: TokenEncoderInterface<CrossServiceTokenData>,
@inject(TYPES.UserRepository) private userRepository: UserRepositoryInterface, @inject(TYPES.UserRepository) private userRepository: UserRepositoryInterface,
@inject(TYPES.AUTH_JWT_TTL) private jwtTTL: number, @inject(TYPES.AUTH_JWT_TTL) private jwtTTL: number,
@inject(TYPES.RoleToSubscriptionMap) private roleToSubscriptionMap: RoleToSubscriptionMapInterface,
@inject(TYPES.TraceSession) private traceSession: TraceSession,
@inject(TYPES.Logger) private logger: Logger,
) {} ) {}
async execute(dto: CreateCrossServiceTokenDTO): Promise<CreateCrossServiceTokenResponse> { async execute(dto: CreateCrossServiceTokenDTO): Promise<CreateCrossServiceTokenResponse> {
@@ -51,19 +45,6 @@ export class CreateCrossServiceToken implements UseCaseInterface {
authTokenData.session = this.projectSession(dto.session) authTokenData.session = this.projectSession(dto.session)
} }
try {
const traceSessionResult = await this.traceSession.execute({
userUuid: user.uuid,
username: user.email,
subscriptionPlanName: this.getSubscriptionNameFromRoles(roles),
})
if (traceSessionResult.isFailed()) {
this.logger.error(traceSessionResult.getError())
}
} catch (error) {
this.logger.error(`Could not trace session while creating cross service token: ${(error as Error).message}`)
}
return { return {
token: this.tokenEncoder.encodeExpirableToken(authTokenData, this.jwtTTL), token: this.tokenEncoder.encodeExpirableToken(authTokenData, this.jwtTTL),
} }
@@ -100,17 +81,4 @@ export class CreateCrossServiceToken implements UseCaseInterface {
private projectRoles(roles: Array<Role>): Array<{ uuid: string; name: RoleName }> { private projectRoles(roles: Array<Role>): Array<{ uuid: string; name: RoleName }> {
return roles.map((role) => <{ uuid: string; name: RoleName }>this.roleProjector.projectSimple(role)) return roles.map((role) => <{ uuid: string; name: RoleName }>this.roleProjector.projectSimple(role))
} }
private getSubscriptionNameFromRoles(roles: Array<Role>): string | null {
const nonSubscriptionRoles = this.roleToSubscriptionMap.filterSubscriptionRoles(roles)
if (nonSubscriptionRoles.length === 0) {
return null
}
const subscriptionName = this.roleToSubscriptionMap.getSubscriptionNameForRoleName(
nonSubscriptionRoles[0].name as RoleName,
)
return subscriptionName === undefined ? null : subscriptionName
}
} }
@@ -14,7 +14,7 @@ export class MySQLSessionTraceRepository implements SessionTraceRepositoryInterf
return this.ormRepository return this.ormRepository
.createQueryBuilder('trace') .createQueryBuilder('trace')
.where('trace.creation_date = :creationDate', { .where('trace.creation_date = :creationDate', {
creationDate: new Date(date.getFullYear(), date.getMonth(), date.getDate()), creationDate: `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}`,
}) })
.andWhere('trace.subscription_plan_name = :subscriptionPlanName', { .andWhere('trace.subscription_plan_name = :subscriptionPlanName', {
subscriptionPlanName: subscriptionPlanName.value, subscriptionPlanName: subscriptionPlanName.value,
@@ -26,7 +26,7 @@ export class MySQLSessionTraceRepository implements SessionTraceRepositoryInterf
return this.ormRepository return this.ormRepository
.createQueryBuilder('trace') .createQueryBuilder('trace')
.where('trace.creation_date = :creationDate', { .where('trace.creation_date = :creationDate', {
creationDate: new Date(date.getFullYear(), date.getMonth(), date.getDate()), creationDate: `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}`,
}) })
.getCount() .getCount()
} }
@@ -44,7 +44,7 @@ export class MySQLSessionTraceRepository implements SessionTraceRepositoryInterf
.createQueryBuilder('trace') .createQueryBuilder('trace')
.where('trace.user_uuid = :userUuid AND trace.creation_date = :creationDate', { .where('trace.user_uuid = :userUuid AND trace.creation_date = :creationDate', {
userUuid: userUuid.value, userUuid: userUuid.value,
creationDate: new Date(date.getFullYear(), date.getMonth(), date.getDate()), creationDate: `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}`,
}) })
.getOne() .getOne()
@@ -1,6 +1,7 @@
import { Column, Entity, Index, PrimaryGeneratedColumn } from 'typeorm' import { Column, Entity, Index, PrimaryGeneratedColumn } from 'typeorm'
@Entity({ name: 'session_traces' }) @Entity({ name: 'session_traces' })
@Index('user_uuid_and_creation_date', ['userUuid', 'creationDate'], { unique: true })
export class TypeORMSessionTrace { export class TypeORMSessionTrace {
@PrimaryGeneratedColumn('uuid') @PrimaryGeneratedColumn('uuid')
declare uuid: string declare uuid: string
+4
View File
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.9.3](https://github.com/standardnotes/files/compare/@standardnotes/files-server@1.9.2...@standardnotes/files-server@1.9.3) (2022-12-28)
**Note:** Version bump only for package @standardnotes/files-server
## [1.9.2](https://github.com/standardnotes/files/compare/@standardnotes/files-server@1.9.1...@standardnotes/files-server@1.9.2) (2022-12-20) ## [1.9.2](https://github.com/standardnotes/files/compare/@standardnotes/files-server@1.9.1...@standardnotes/files-server@1.9.2) (2022-12-20)
**Note:** Version bump only for package @standardnotes/files-server **Note:** Version bump only for package @standardnotes/files-server
+2 -2
View File
@@ -1,6 +1,6 @@
{ {
"name": "@standardnotes/files-server", "name": "@standardnotes/files-server",
"version": "1.9.2", "version": "1.9.3",
"engines": { "engines": {
"node": ">=18.0.0 <19.0.0" "node": ">=18.0.0 <19.0.0"
}, },
@@ -25,7 +25,7 @@
"upgrade:snjs": "yarn ncu -u '@standardnotes/*'" "upgrade:snjs": "yarn ncu -u '@standardnotes/*'"
}, },
"dependencies": { "dependencies": {
"@sentry/node": "^7.27.0", "@sentry/node": "^7.28.1",
"@standardnotes/common": "workspace:*", "@standardnotes/common": "workspace:*",
"@standardnotes/domain-events": "workspace:*", "@standardnotes/domain-events": "workspace:*",
"@standardnotes/domain-events-infra": "workspace:*", "@standardnotes/domain-events-infra": "workspace:*",
+4
View File
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.10.3](https://github.com/standardnotes/server/compare/@standardnotes/revisions-server@1.10.2...@standardnotes/revisions-server@1.10.3) (2022-12-28)
**Note:** Version bump only for package @standardnotes/revisions-server
## [1.10.2](https://github.com/standardnotes/server/compare/@standardnotes/revisions-server@1.10.1...@standardnotes/revisions-server@1.10.2) (2022-12-20) ## [1.10.2](https://github.com/standardnotes/server/compare/@standardnotes/revisions-server@1.10.1...@standardnotes/revisions-server@1.10.2) (2022-12-20)
**Note:** Version bump only for package @standardnotes/revisions-server **Note:** Version bump only for package @standardnotes/revisions-server
+2 -2
View File
@@ -1,6 +1,6 @@
{ {
"name": "@standardnotes/revisions-server", "name": "@standardnotes/revisions-server",
"version": "1.10.2", "version": "1.10.3",
"engines": { "engines": {
"node": ">=18.0.0 <19.0.0" "node": ">=18.0.0 <19.0.0"
}, },
@@ -24,7 +24,7 @@
}, },
"dependencies": { "dependencies": {
"@newrelic/winston-enricher": "^4.0.0", "@newrelic/winston-enricher": "^4.0.0",
"@sentry/node": "^7.27.0", "@sentry/node": "^7.28.1",
"@standardnotes/api": "^1.19.0", "@standardnotes/api": "^1.19.0",
"@standardnotes/common": "workspace:^", "@standardnotes/common": "workspace:^",
"@standardnotes/domain-core": "workspace:^", "@standardnotes/domain-core": "workspace:^",
+10
View File
@@ -3,6 +3,16 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.16.4](https://github.com/standardnotes/server/compare/@standardnotes/scheduler-server@1.16.3...@standardnotes/scheduler-server@1.16.4) (2022-12-28)
**Note:** Version bump only for package @standardnotes/scheduler-server
## [1.16.3](https://github.com/standardnotes/server/compare/@standardnotes/scheduler-server@1.16.2...@standardnotes/scheduler-server@1.16.3) (2022-12-20)
### Bug Fixes
* **scheduler:** new pricing for subscription encouragement email ([eb21872](https://github.com/standardnotes/server/commit/eb21872db1726c4f8a55b5d16de712650c5e946b))
## [1.16.2](https://github.com/standardnotes/server/compare/@standardnotes/scheduler-server@1.16.1...@standardnotes/scheduler-server@1.16.2) (2022-12-20) ## [1.16.2](https://github.com/standardnotes/server/compare/@standardnotes/scheduler-server@1.16.1...@standardnotes/scheduler-server@1.16.2) (2022-12-20)
**Note:** Version bump only for package @standardnotes/scheduler-server **Note:** Version bump only for package @standardnotes/scheduler-server
+2 -2
View File
@@ -1,6 +1,6 @@
{ {
"name": "@standardnotes/scheduler-server", "name": "@standardnotes/scheduler-server",
"version": "1.16.2", "version": "1.16.4",
"engines": { "engines": {
"node": ">=18.0.0 <19.0.0" "node": ">=18.0.0 <19.0.0"
}, },
@@ -25,7 +25,7 @@
}, },
"dependencies": { "dependencies": {
"@newrelic/winston-enricher": "^4.0.0", "@newrelic/winston-enricher": "^4.0.0",
"@sentry/node": "^7.27.0", "@sentry/node": "^7.28.1",
"@standardnotes/common": "workspace:*", "@standardnotes/common": "workspace:*",
"@standardnotes/domain-core": "workspace:^", "@standardnotes/domain-core": "workspace:^",
"@standardnotes/domain-events": "workspace:*", "@standardnotes/domain-events": "workspace:*",
@@ -5,7 +5,5 @@ export function getSubject(): string {
} }
export function getBody(registrationDate: string): string { export function getBody(registrationDate: string): string {
const body = html return html(registrationDate, 90, 120)
return body.replace('%%REGISTRATION_DATE%%', registrationDate)
} }
@@ -1,4 +1,4 @@
export const html = `<div> export const html = (registrationDate: string, annualPlusPrice: number, annualProPrice: number) => `<div>
<p>Hi there,</p> <p>Hi there,</p>
<p> <p>
We hope you've been finding great use out of Standard Notes. We built Standard Notes to be a secure place for We hope you've been finding great use out of Standard Notes. We built Standard Notes to be a secure place for
@@ -7,7 +7,7 @@ export const html = `<div>
<p> <p>
As a reminder, As a reminder,
<strong> <strong>
<em>you signed up for the Standard Notes free plan on %%REGISTRATION_DATE%%</em> <em>you signed up for the Standard Notes free plan on ${registrationDate}</em>
</strong> </strong>
Your free account comes with standard features like end-to-end encryption, multiple-device sync, and Your free account comes with standard features like end-to-end encryption, multiple-device sync, and
two-factor authentication. two-factor authentication.
@@ -19,13 +19,13 @@ export const html = `<div>
<ul> <ul>
<li> <li>
<p> <p>
<strong>Productivity</strong> <strong>($59/year)</strong> powers up your editing experience with unique <strong>Productivity</strong> <strong>($${annualPlusPrice}/year)</strong> powers up your editing experience with unique
and special-built note-types for markdown, rich text, spreadsheets, todo, and more. and special-built note-types for markdown, rich text, spreadsheets, todo, and more.
</p> </p>
</li> </li>
<li> <li>
<p> <p>
<strong>Professional</strong> <strong>($99/year)</strong> gives you all the power of Productivity plus <strong>Professional</strong> <strong>($${annualProPrice}/year)</strong> gives you all the power of Productivity plus
100GB of end-to-end encrypted file storage for your private photos, videos, and documents, plus family 100GB of end-to-end encrypted file storage for your private photos, videos, and documents, plus family
subscription sharing with up to 5 people. subscription sharing with up to 5 people.
</p> </p>
+4
View File
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.28.3](https://github.com/standardnotes/syncing-server-js/compare/@standardnotes/syncing-server@1.28.2...@standardnotes/syncing-server@1.28.3) (2022-12-28)
**Note:** Version bump only for package @standardnotes/syncing-server
## [1.28.2](https://github.com/standardnotes/syncing-server-js/compare/@standardnotes/syncing-server@1.28.1...@standardnotes/syncing-server@1.28.2) (2022-12-20) ## [1.28.2](https://github.com/standardnotes/syncing-server-js/compare/@standardnotes/syncing-server@1.28.1...@standardnotes/syncing-server@1.28.2) (2022-12-20)
**Note:** Version bump only for package @standardnotes/syncing-server **Note:** Version bump only for package @standardnotes/syncing-server
+3 -3
View File
@@ -1,6 +1,6 @@
{ {
"name": "@standardnotes/syncing-server", "name": "@standardnotes/syncing-server",
"version": "1.28.2", "version": "1.28.3",
"engines": { "engines": {
"node": ">=18.0.0 <19.0.0" "node": ">=18.0.0 <19.0.0"
}, },
@@ -27,9 +27,9 @@
}, },
"dependencies": { "dependencies": {
"@newrelic/winston-enricher": "^4.0.0", "@newrelic/winston-enricher": "^4.0.0",
"@sentry/node": "^7.27.0", "@sentry/node": "^7.28.1",
"@sentry/profiling-node": "^0.0.12", "@sentry/profiling-node": "^0.0.12",
"@sentry/tracing": "^7.27.0", "@sentry/tracing": "^7.28.1",
"@standardnotes/common": "workspace:*", "@standardnotes/common": "workspace:*",
"@standardnotes/domain-core": "workspace:^", "@standardnotes/domain-core": "workspace:^",
"@standardnotes/domain-events": "workspace:*", "@standardnotes/domain-events": "workspace:*",
+4
View File
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.5.3](https://github.com/standardnotes/server/compare/@standardnotes/websockets-server@1.5.2...@standardnotes/websockets-server@1.5.3) (2022-12-28)
**Note:** Version bump only for package @standardnotes/websockets-server
## [1.5.2](https://github.com/standardnotes/server/compare/@standardnotes/websockets-server@1.5.1...@standardnotes/websockets-server@1.5.2) (2022-12-20) ## [1.5.2](https://github.com/standardnotes/server/compare/@standardnotes/websockets-server@1.5.1...@standardnotes/websockets-server@1.5.2) (2022-12-20)
**Note:** Version bump only for package @standardnotes/websockets-server **Note:** Version bump only for package @standardnotes/websockets-server
+2 -2
View File
@@ -1,6 +1,6 @@
{ {
"name": "@standardnotes/websockets-server", "name": "@standardnotes/websockets-server",
"version": "1.5.2", "version": "1.5.3",
"engines": { "engines": {
"node": ">=18.0.0 <19.0.0" "node": ">=18.0.0 <19.0.0"
}, },
@@ -23,7 +23,7 @@
}, },
"dependencies": { "dependencies": {
"@newrelic/winston-enricher": "^4.0.0", "@newrelic/winston-enricher": "^4.0.0",
"@sentry/node": "^7.27.0", "@sentry/node": "^7.28.1",
"@standardnotes/api": "^1.19.0", "@standardnotes/api": "^1.19.0",
"@standardnotes/common": "workspace:^", "@standardnotes/common": "workspace:^",
"@standardnotes/domain-events": "workspace:^", "@standardnotes/domain-events": "workspace:^",
+4
View File
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.19.4](https://github.com/standardnotes/server/compare/@standardnotes/workspace-server@1.19.3...@standardnotes/workspace-server@1.19.4) (2022-12-28)
**Note:** Version bump only for package @standardnotes/workspace-server
## [1.19.3](https://github.com/standardnotes/server/compare/@standardnotes/workspace-server@1.19.2...@standardnotes/workspace-server@1.19.3) (2022-12-20) ## [1.19.3](https://github.com/standardnotes/server/compare/@standardnotes/workspace-server@1.19.2...@standardnotes/workspace-server@1.19.3) (2022-12-20)
### Bug Fixes ### Bug Fixes
+2 -2
View File
@@ -1,6 +1,6 @@
{ {
"name": "@standardnotes/workspace-server", "name": "@standardnotes/workspace-server",
"version": "1.19.3", "version": "1.19.4",
"engines": { "engines": {
"node": ">=18.0.0 <19.0.0" "node": ">=18.0.0 <19.0.0"
}, },
@@ -23,7 +23,7 @@
}, },
"dependencies": { "dependencies": {
"@newrelic/winston-enricher": "^4.0.0", "@newrelic/winston-enricher": "^4.0.0",
"@sentry/node": "^7.27.0", "@sentry/node": "^7.28.1",
"@standardnotes/api": "^1.19.0", "@standardnotes/api": "^1.19.0",
"@standardnotes/common": "workspace:*", "@standardnotes/common": "workspace:*",
"@standardnotes/domain-core": "workspace:^", "@standardnotes/domain-core": "workspace:^",
+69 -14
View File
@@ -1717,6 +1717,17 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@sentry/core@npm:7.28.1":
version: 7.28.1
resolution: "@sentry/core@npm:7.28.1"
dependencies:
"@sentry/types": "npm:7.28.1"
"@sentry/utils": "npm:7.28.1"
tslib: "npm:^1.9.3"
checksum: f29d747d3e15000d8010fe3c192260a78927f37d30a3bb82cd533f3a5beca0c7fd81353ec57420c4295daea5384a045bde70ff6d3af1468ec1201b1d84131d6d
languageName: node
linkType: hard
"@sentry/hub@npm:^7.16.0": "@sentry/hub@npm:^7.16.0":
version: 7.27.0 version: 7.27.0
resolution: "@sentry/hub@npm:7.27.0" resolution: "@sentry/hub@npm:7.27.0"
@@ -1729,7 +1740,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@sentry/node@npm:^7.16.0, @sentry/node@npm:^7.27.0": "@sentry/node@npm:^7.16.0":
version: 7.27.0 version: 7.27.0
resolution: "@sentry/node@npm:7.27.0" resolution: "@sentry/node@npm:7.27.0"
dependencies: dependencies:
@@ -1744,6 +1755,21 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@sentry/node@npm:^7.28.1":
version: 7.28.1
resolution: "@sentry/node@npm:7.28.1"
dependencies:
"@sentry/core": "npm:7.28.1"
"@sentry/types": "npm:7.28.1"
"@sentry/utils": "npm:7.28.1"
cookie: "npm:^0.4.1"
https-proxy-agent: "npm:^5.0.0"
lru_map: "npm:^0.3.3"
tslib: "npm:^1.9.3"
checksum: b4922d1f0a1b1e96cd73e5381871d0a2d20c4a05dd09f1cb9def6795c5fbe099b2e2b97025262cac595d19a42ebc82a34a8f9e59f87c0176e5206ae1f6377532
languageName: node
linkType: hard
"@sentry/profiling-node@npm:^0.0.12": "@sentry/profiling-node@npm:^0.0.12":
version: 0.0.12 version: 0.0.12
resolution: "@sentry/profiling-node@npm:0.0.12" resolution: "@sentry/profiling-node@npm:0.0.12"
@@ -1760,7 +1786,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@sentry/tracing@npm:^7.16.0, @sentry/tracing@npm:^7.27.0": "@sentry/tracing@npm:^7.16.0":
version: 7.27.0 version: 7.27.0
resolution: "@sentry/tracing@npm:7.27.0" resolution: "@sentry/tracing@npm:7.27.0"
dependencies: dependencies:
@@ -1772,6 +1798,18 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@sentry/tracing@npm:^7.28.1":
version: 7.28.1
resolution: "@sentry/tracing@npm:7.28.1"
dependencies:
"@sentry/core": "npm:7.28.1"
"@sentry/types": "npm:7.28.1"
"@sentry/utils": "npm:7.28.1"
tslib: "npm:^1.9.3"
checksum: be501ca9d727f4893121c208f80fa82589964970c5a01155ba1d24cfd7ebdb2a1d6e325ea5556f0747d16519631013315781ad1c178f8721e5eab77de2446b63
languageName: node
linkType: hard
"@sentry/types@npm:7.27.0, @sentry/types@npm:^7.16.0": "@sentry/types@npm:7.27.0, @sentry/types@npm:^7.16.0":
version: 7.27.0 version: 7.27.0
resolution: "@sentry/types@npm:7.27.0" resolution: "@sentry/types@npm:7.27.0"
@@ -1779,6 +1817,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@sentry/types@npm:7.28.1":
version: 7.28.1
resolution: "@sentry/types@npm:7.28.1"
checksum: 7dc6639cb7645c37bd8f759b60dbf2a149573b8a24dfb06baf7d7978f785e4635a65b3fb9e007f0eea56d33b543043fcfa1c1a376a83aa9824bb2d25be1a56dc
languageName: node
linkType: hard
"@sentry/utils@npm:7.27.0, @sentry/utils@npm:^7.16.0": "@sentry/utils@npm:7.27.0, @sentry/utils@npm:^7.16.0":
version: 7.27.0 version: 7.27.0
resolution: "@sentry/utils@npm:7.27.0" resolution: "@sentry/utils@npm:7.27.0"
@@ -1789,6 +1834,16 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@sentry/utils@npm:7.28.1":
version: 7.28.1
resolution: "@sentry/utils@npm:7.28.1"
dependencies:
"@sentry/types": "npm:7.28.1"
tslib: "npm:^1.9.3"
checksum: a4b5f73db0e287e49b2eab5da80d6bbf1f6c7e11e1cc06ae06f49a9477d2b45de98310b143198207f3ae1fdd25ef76c90984eb99553a8308f6516e12c0c9c98c
languageName: node
linkType: hard
"@sinclair/typebox@npm:^0.24.1": "@sinclair/typebox@npm:^0.24.1":
version: 0.24.44 version: 0.24.44
resolution: "@sinclair/typebox@npm:0.24.44" resolution: "@sinclair/typebox@npm:0.24.44"
@@ -1833,7 +1888,7 @@ __metadata:
resolution: "@standardnotes/analytics@workspace:packages/analytics" resolution: "@standardnotes/analytics@workspace:packages/analytics"
dependencies: dependencies:
"@newrelic/winston-enricher": "npm:^4.0.0" "@newrelic/winston-enricher": "npm:^4.0.0"
"@sentry/node": "npm:^7.27.0" "@sentry/node": "npm:^7.28.1"
"@standardnotes/common": "workspace:*" "@standardnotes/common": "workspace:*"
"@standardnotes/domain-core": "workspace:^" "@standardnotes/domain-core": "workspace:^"
"@standardnotes/domain-events": "workspace:*" "@standardnotes/domain-events": "workspace:*"
@@ -1867,7 +1922,7 @@ __metadata:
resolution: "@standardnotes/api-gateway@workspace:packages/api-gateway" resolution: "@standardnotes/api-gateway@workspace:packages/api-gateway"
dependencies: dependencies:
"@newrelic/winston-enricher": "npm:^4.0.0" "@newrelic/winston-enricher": "npm:^4.0.0"
"@sentry/node": "npm:^7.27.0" "@sentry/node": "npm:^7.28.1"
"@standardnotes/common": "workspace:^" "@standardnotes/common": "workspace:^"
"@standardnotes/domain-events": "workspace:*" "@standardnotes/domain-events": "workspace:*"
"@standardnotes/domain-events-infra": "workspace:*" "@standardnotes/domain-events-infra": "workspace:*"
@@ -1925,9 +1980,9 @@ __metadata:
resolution: "@standardnotes/auth-server@workspace:packages/auth" resolution: "@standardnotes/auth-server@workspace:packages/auth"
dependencies: dependencies:
"@newrelic/winston-enricher": "npm:^4.0.0" "@newrelic/winston-enricher": "npm:^4.0.0"
"@sentry/node": "npm:^7.27.0" "@sentry/node": "npm:^7.28.1"
"@sentry/profiling-node": "npm:^0.0.12" "@sentry/profiling-node": "npm:^0.0.12"
"@sentry/tracing": "npm:^7.27.0" "@sentry/tracing": "npm:^7.28.1"
"@standardnotes/api": "npm:^1.19.0" "@standardnotes/api": "npm:^1.19.0"
"@standardnotes/common": "workspace:*" "@standardnotes/common": "workspace:*"
"@standardnotes/domain-core": "workspace:^" "@standardnotes/domain-core": "workspace:^"
@@ -2147,7 +2202,7 @@ __metadata:
version: 0.0.0-use.local version: 0.0.0-use.local
resolution: "@standardnotes/files-server@workspace:packages/files" resolution: "@standardnotes/files-server@workspace:packages/files"
dependencies: dependencies:
"@sentry/node": "npm:^7.27.0" "@sentry/node": "npm:^7.28.1"
"@standardnotes/common": "workspace:*" "@standardnotes/common": "workspace:*"
"@standardnotes/config": "npm:2.4.3" "@standardnotes/config": "npm:2.4.3"
"@standardnotes/domain-events": "workspace:*" "@standardnotes/domain-events": "workspace:*"
@@ -2277,7 +2332,7 @@ __metadata:
resolution: "@standardnotes/revisions-server@workspace:packages/revisions" resolution: "@standardnotes/revisions-server@workspace:packages/revisions"
dependencies: dependencies:
"@newrelic/winston-enricher": "npm:^4.0.0" "@newrelic/winston-enricher": "npm:^4.0.0"
"@sentry/node": "npm:^7.27.0" "@sentry/node": "npm:^7.28.1"
"@standardnotes/api": "npm:^1.19.0" "@standardnotes/api": "npm:^1.19.0"
"@standardnotes/common": "workspace:^" "@standardnotes/common": "workspace:^"
"@standardnotes/domain-core": "workspace:^" "@standardnotes/domain-core": "workspace:^"
@@ -2320,7 +2375,7 @@ __metadata:
resolution: "@standardnotes/scheduler-server@workspace:packages/scheduler" resolution: "@standardnotes/scheduler-server@workspace:packages/scheduler"
dependencies: dependencies:
"@newrelic/winston-enricher": "npm:^4.0.0" "@newrelic/winston-enricher": "npm:^4.0.0"
"@sentry/node": "npm:^7.27.0" "@sentry/node": "npm:^7.28.1"
"@standardnotes/common": "workspace:*" "@standardnotes/common": "workspace:*"
"@standardnotes/domain-core": "workspace:^" "@standardnotes/domain-core": "workspace:^"
"@standardnotes/domain-events": "workspace:*" "@standardnotes/domain-events": "workspace:*"
@@ -2377,7 +2432,7 @@ __metadata:
"@lerna-lite/cli": "npm:^1.5.1" "@lerna-lite/cli": "npm:^1.5.1"
"@lerna-lite/list": "npm:^1.5.1" "@lerna-lite/list": "npm:^1.5.1"
"@lerna-lite/run": "npm:^1.5.1" "@lerna-lite/run": "npm:^1.5.1"
"@sentry/node": "npm:^7.27.0" "@sentry/node": "npm:^7.28.1"
"@types/jest": "npm:^29.1.1" "@types/jest": "npm:^29.1.1"
"@types/newrelic": "npm:^7.0.4" "@types/newrelic": "npm:^7.0.4"
"@types/node": "npm:^18.11.9" "@types/node": "npm:^18.11.9"
@@ -2436,9 +2491,9 @@ __metadata:
resolution: "@standardnotes/syncing-server@workspace:packages/syncing-server" resolution: "@standardnotes/syncing-server@workspace:packages/syncing-server"
dependencies: dependencies:
"@newrelic/winston-enricher": "npm:^4.0.0" "@newrelic/winston-enricher": "npm:^4.0.0"
"@sentry/node": "npm:^7.27.0" "@sentry/node": "npm:^7.28.1"
"@sentry/profiling-node": "npm:^0.0.12" "@sentry/profiling-node": "npm:^0.0.12"
"@sentry/tracing": "npm:^7.27.0" "@sentry/tracing": "npm:^7.28.1"
"@standardnotes/common": "workspace:*" "@standardnotes/common": "workspace:*"
"@standardnotes/domain-core": "workspace:^" "@standardnotes/domain-core": "workspace:^"
"@standardnotes/domain-events": "workspace:*" "@standardnotes/domain-events": "workspace:*"
@@ -2534,7 +2589,7 @@ __metadata:
resolution: "@standardnotes/websockets-server@workspace:packages/websockets" resolution: "@standardnotes/websockets-server@workspace:packages/websockets"
dependencies: dependencies:
"@newrelic/winston-enricher": "npm:^4.0.0" "@newrelic/winston-enricher": "npm:^4.0.0"
"@sentry/node": "npm:^7.27.0" "@sentry/node": "npm:^7.28.1"
"@standardnotes/api": "npm:^1.19.0" "@standardnotes/api": "npm:^1.19.0"
"@standardnotes/common": "workspace:^" "@standardnotes/common": "workspace:^"
"@standardnotes/domain-events": "workspace:^" "@standardnotes/domain-events": "workspace:^"
@@ -2572,7 +2627,7 @@ __metadata:
resolution: "@standardnotes/workspace-server@workspace:packages/workspace" resolution: "@standardnotes/workspace-server@workspace:packages/workspace"
dependencies: dependencies:
"@newrelic/winston-enricher": "npm:^4.0.0" "@newrelic/winston-enricher": "npm:^4.0.0"
"@sentry/node": "npm:^7.27.0" "@sentry/node": "npm:^7.28.1"
"@standardnotes/api": "npm:^1.19.0" "@standardnotes/api": "npm:^1.19.0"
"@standardnotes/common": "workspace:*" "@standardnotes/common": "workspace:*"
"@standardnotes/domain-core": "workspace:^" "@standardnotes/domain-core": "workspace:^"