Compare commits

..

41 Commits

Author SHA1 Message Date
standardci
245f091e22 chore(release): publish new version
- @standardnotes/analytics@2.11.11
 - @standardnotes/domain-core@1.4.0
 - @standardnotes/revisions-server@1.4.6
 - @standardnotes/syncing-server@1.18.10
2022-11-24 10:36:50 +00:00
Karol Sójko
ae2f8f086b feat(domain-core): add role name collection value object 2022-11-24 11:34:43 +01:00
standardci
5e5eb7f937 chore(release): publish new version
- @standardnotes/analytics@2.11.10
 - @standardnotes/domain-core@1.3.0
 - @standardnotes/revisions-server@1.4.5
 - @standardnotes/syncing-server@1.18.9
2022-11-24 09:49:56 +00:00
Karol Sójko
748630e1f1 feat(domain-core): add role name value object 2022-11-24 10:48:00 +01:00
standardci
43064c8c55 chore(release): publish new version
- @standardnotes/analytics@2.11.9
 - @standardnotes/api-gateway@1.39.2
 - @standardnotes/auth-server@1.60.10
 - @standardnotes/domain-events-infra@1.9.33
 - @standardnotes/event-store@1.6.29
 - @standardnotes/files-server@1.8.29
 - @standardnotes/revisions-server@1.4.4
 - @standardnotes/scheduler-server@1.13.30
 - @standardnotes/settings@1.18.4
 - @standardnotes/syncing-server@1.18.8
 - @standardnotes/websockets-server@1.4.30
 - @standardnotes/workspace-server@1.17.29
2022-11-24 08:59:04 +00:00
Karol Sójko
4559a3047c chore(deps): remove newrelic native metrics 2022-11-24 09:56:53 +01:00
standardci
de8064ee5c chore(release): publish new version
- @standardnotes/analytics@2.11.8
 - @standardnotes/api-gateway@1.39.1
 - @standardnotes/auth-server@1.60.9
 - @standardnotes/domain-events-infra@1.9.32
 - @standardnotes/event-store@1.6.28
 - @standardnotes/files-server@1.8.28
 - @standardnotes/revisions-server@1.4.3
 - @standardnotes/scheduler-server@1.13.29
 - @standardnotes/syncing-server@1.18.7
 - @standardnotes/websockets-server@1.4.29
 - @standardnotes/workspace-server@1.17.28
2022-11-23 12:12:10 +00:00
Karol Sójko
48c8dba342 chore(deps): upgrade aws sdk 2022-11-23 13:10:05 +01:00
Karol Sójko
31a515b2f1 Revert "chore: tmp disable e2e to publish images with fixed sns and sqs binding"
This reverts commit 70596a0aac.
2022-11-23 09:29:12 +01:00
standardci
294f56e189 chore(release): publish new version
- @standardnotes/analytics@2.11.7
 - @standardnotes/auth-server@1.60.8
 - @standardnotes/event-store@1.6.27
 - @standardnotes/files-server@1.8.27
 - @standardnotes/scheduler-server@1.13.28
 - @standardnotes/syncing-server@1.18.6
 - @standardnotes/workspace-server@1.17.27
2022-11-23 08:19:47 +00:00
Karol Sójko
70596a0aac chore: tmp disable e2e to publish images with fixed sns and sqs binding 2022-11-23 09:17:43 +01:00
Karol Sójko
74bc79116b fix: binding of sns and sqs with additional config 2022-11-23 09:17:26 +01:00
standardci
e6bd50ae77 chore(release): publish new version
- @standardnotes/syncing-server@1.18.5
2022-11-22 14:52:13 +00:00
Karol Sójko
308662550f fix(syncing-server): publish revision creation request only for notes and files 2022-11-22 15:50:00 +01:00
Karol Sójko
d94a7e7157 Revert "Revert "chore: bring back e2e testing""
This reverts commit f68ece68af.
2022-11-22 15:50:00 +01:00
standardci
630b264754 chore(release): publish new version
- @standardnotes/auth-server@1.60.7
2022-11-22 14:33:44 +00:00
Karol Sójko
5f2be44b85 fix(auth): remove temporary email campaign check for team member 2022-11-22 15:31:44 +01:00
Karol Sójko
f68ece68af Revert "chore: bring back e2e testing"
This reverts commit 70c829a2c9.
2022-11-22 15:27:29 +01:00
Karol Sójko
70c829a2c9 chore: bring back e2e testing 2022-11-22 15:17:04 +01:00
Karol Sójko
e3b6ac4874 chore: temporary disable e2e to publish latest versions 2022-11-22 14:37:46 +01:00
standardci
a762d5a22c chore(release): publish new version
- @standardnotes/auth-server@1.60.6
 - @standardnotes/syncing-server@1.18.4
2022-11-22 13:31:16 +00:00
Karol Sójko
3686a26019 fix: sns binding 2022-11-22 14:29:07 +01:00
standardci
80daec748d chore(release): publish new version
- @standardnotes/auth-server@1.60.5
2022-11-22 13:22:58 +00:00
Karol Sójko
94359f1299 fix(auth): tmp send email campaign only to team 2022-11-22 14:08:48 +01:00
standardci
59dda1bb99 chore(release): publish new version
- @standardnotes/revisions-server@1.4.2
 - @standardnotes/syncing-server@1.18.3
2022-11-22 13:02:45 +00:00
Karol Sójko
806a732cbc fix: sqs binding 2022-11-22 14:00:54 +01:00
standardci
7816be7ba7 chore(release): publish new version
- @standardnotes/syncing-server@1.18.2
2022-11-22 12:31:22 +00:00
Karol Sójko
5f3bd5137f fix(syncing-server): bring back creating revisions in syncing server for a transition period 2022-11-22 13:23:56 +01:00
standardci
6c9fc5fb86 chore(release): publish new version
- @standardnotes/syncing-server@1.18.1
2022-11-22 11:38:45 +00:00
Karol Sójko
f7e0b68643 fix(syncing-server): specs 2022-11-22 12:36:32 +01:00
standardci
b283bbaca9 chore(release): publish new version
- @standardnotes/api-gateway@1.39.0
2022-11-22 11:30:16 +00:00
Karol Sójko
92ba759b1c feat(api-gateway): add v2 revisions controller 2022-11-22 12:28:03 +01:00
standardci
0acc9d8d68 chore(release): publish new version
- @standardnotes/revisions-server@1.4.1
 - @standardnotes/syncing-server@1.18.0
2022-11-22 11:20:59 +00:00
Karol Sójko
daa7a9ff61 fix(revisions): add more verbose error messages 2022-11-22 12:18:26 +01:00
Karol Sójko
455f35e0c1 feat(syncing-server): add dump projection for revisions 2022-11-22 12:18:26 +01:00
standardci
1fa655b56e chore(release): publish new version
- @standardnotes/revisions-server@1.4.0
2022-11-22 10:42:49 +00:00
Karol Sójko
e553222b4b feat(revisions): add database 2022-11-22 11:40:30 +01:00
standardci
f1b6f48926 chore(release): publish new version
- @standardnotes/revisions-server@1.3.0
2022-11-22 09:21:44 +00:00
Karol Sójko
14ab1cae69 feat(revisions): add filesystem dump repository 2022-11-22 10:19:46 +01:00
standardci
5f9cf90b16 chore(release): publish new version
- @standardnotes/syncing-server@1.17.0
2022-11-22 09:13:25 +00:00
Karol Sójko
97b367d4ee feat(syncing-server): add dumping backup items to filesystem 2022-11-22 10:11:09 +01:00
77 changed files with 889 additions and 208 deletions

44
.pnp.cjs generated
View File

@@ -126,7 +126,6 @@ const RAW_RUNTIME_STATE =
["@lerna-lite/cli", "npm:1.6.0"],\
["@lerna-lite/list", "npm:1.6.0"],\
["@lerna-lite/run", "npm:1.6.0"],\
["@newrelic/native-metrics", "npm:9.0.0"],\
["@sentry/node", "npm:7.19.0"],\
["@types/jest", "npm:29.1.1"],\
["@types/newrelic", "npm:7.0.4"],\
@@ -2538,7 +2537,6 @@ const RAW_RUNTIME_STATE =
"packageLocation": "./packages/analytics/",\
"packageDependencies": [\
["@standardnotes/analytics", "workspace:packages/analytics"],\
["@newrelic/native-metrics", "npm:9.0.0"],\
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
["@sentry/node", "npm:7.19.0"],\
["@standardnotes/common", "workspace:packages/common"],\
@@ -2551,7 +2549,7 @@ const RAW_RUNTIME_STATE =
["@types/newrelic", "npm:7.0.4"],\
["@types/node", "npm:18.11.9"],\
["@typescript-eslint/eslint-plugin", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:5.30.5"],\
["aws-sdk", "npm:2.1253.0"],\
["aws-sdk", "npm:2.1260.0"],\
["dayjs", "npm:1.11.6"],\
["dotenv", "npm:16.0.1"],\
["eslint", "npm:8.25.0"],\
@@ -2591,7 +2589,6 @@ const RAW_RUNTIME_STATE =
"packageLocation": "./packages/api-gateway/",\
"packageDependencies": [\
["@standardnotes/api-gateway", "workspace:packages/api-gateway"],\
["@newrelic/native-metrics", "npm:9.0.0"],\
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
["@sentry/node", "npm:7.19.0"],\
["@standardnotes/common", "workspace:packages/common"],\
@@ -2607,7 +2604,7 @@ const RAW_RUNTIME_STATE =
["@types/newrelic", "npm:7.0.4"],\
["@types/prettyjson", "npm:0.0.30"],\
["@typescript-eslint/eslint-plugin", "virtual:04783e12400851b8a3d76e71495851cc94959db6e62f04cb0a31190080629440b182d8c8eb4d7f2b04e281912f2783a5fd4d2c3c6ab68d38b7097246c93f4c19#npm:5.40.1"],\
["aws-sdk", "npm:2.1253.0"],\
["aws-sdk", "npm:2.1260.0"],\
["axios", "npm:1.1.3"],\
["cors", "npm:2.8.5"],\
["dotenv", "npm:16.0.1"],\
@@ -2648,7 +2645,6 @@ const RAW_RUNTIME_STATE =
"packageLocation": "./packages/auth/",\
"packageDependencies": [\
["@standardnotes/auth-server", "workspace:packages/auth"],\
["@newrelic/native-metrics", "npm:9.0.0"],\
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
["@sentry/node", "npm:7.19.0"],\
["@standardnotes/api", "npm:1.19.0"],\
@@ -2674,7 +2670,7 @@ const RAW_RUNTIME_STATE =
["@types/ua-parser-js", "npm:0.7.36"],\
["@types/uuid", "npm:8.3.4"],\
["@typescript-eslint/eslint-plugin", "virtual:04783e12400851b8a3d76e71495851cc94959db6e62f04cb0a31190080629440b182d8c8eb4d7f2b04e281912f2783a5fd4d2c3c6ab68d38b7097246c93f4c19#npm:5.40.1"],\
["aws-sdk", "npm:2.1253.0"],\
["aws-sdk", "npm:2.1260.0"],\
["axios", "npm:1.1.3"],\
["bcryptjs", "npm:2.4.3"],\
["cors", "npm:2.8.5"],\
@@ -2783,13 +2779,12 @@ const RAW_RUNTIME_STATE =
"packageLocation": "./packages/domain-events-infra/",\
"packageDependencies": [\
["@standardnotes/domain-events-infra", "workspace:packages/domain-events-infra"],\
["@newrelic/native-metrics", "npm:9.0.0"],\
["@standardnotes/domain-events", "workspace:packages/domain-events"],\
["@types/ioredis", "npm:5.0.0"],\
["@types/jest", "npm:29.1.1"],\
["@types/newrelic", "npm:7.0.4"],\
["@typescript-eslint/eslint-plugin", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:5.30.5"],\
["aws-sdk", "npm:2.1253.0"],\
["aws-sdk", "npm:2.1260.0"],\
["eslint-plugin-prettier", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:4.2.1"],\
["ioredis", "npm:5.2.4"],\
["jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.1.2"],\
@@ -2823,7 +2818,6 @@ const RAW_RUNTIME_STATE =
"packageLocation": "./packages/event-store/",\
"packageDependencies": [\
["@standardnotes/event-store", "workspace:packages/event-store"],\
["@newrelic/native-metrics", "npm:9.0.0"],\
["@standardnotes/domain-events", "workspace:packages/domain-events"],\
["@standardnotes/domain-events-infra", "workspace:packages/domain-events-infra"],\
["@standardnotes/time", "workspace:packages/time"],\
@@ -2832,7 +2826,7 @@ const RAW_RUNTIME_STATE =
["@types/newrelic", "npm:7.0.4"],\
["@types/nodemailer", "npm:6.4.6"],\
["@typescript-eslint/eslint-plugin", "virtual:04783e12400851b8a3d76e71495851cc94959db6e62f04cb0a31190080629440b182d8c8eb4d7f2b04e281912f2783a5fd4d2c3c6ab68d38b7097246c93f4c19#npm:5.40.1"],\
["aws-sdk", "npm:2.1253.0"],\
["aws-sdk", "npm:2.1260.0"],\
["dotenv", "npm:16.0.1"],\
["eslint", "npm:8.25.0"],\
["eslint-plugin-prettier", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.2.1"],\
@@ -2879,7 +2873,6 @@ const RAW_RUNTIME_STATE =
"packageLocation": "./packages/files/",\
"packageDependencies": [\
["@standardnotes/files-server", "workspace:packages/files"],\
["@newrelic/native-metrics", "npm:9.0.0"],\
["@sentry/node", "npm:7.19.0"],\
["@standardnotes/common", "workspace:packages/common"],\
["@standardnotes/config", "npm:2.4.3"],\
@@ -2899,7 +2892,7 @@ const RAW_RUNTIME_STATE =
["@types/prettyjson", "npm:0.0.30"],\
["@types/uuid", "npm:8.3.4"],\
["@typescript-eslint/eslint-plugin", "virtual:04783e12400851b8a3d76e71495851cc94959db6e62f04cb0a31190080629440b182d8c8eb4d7f2b04e281912f2783a5fd4d2c3c6ab68d38b7097246c93f4c19#npm:5.40.1"],\
["aws-sdk", "npm:2.1253.0"],\
["aws-sdk", "npm:2.1260.0"],\
["connect-busboy", "npm:1.0.0"],\
["cors", "npm:2.8.5"],\
["dayjs", "npm:1.11.6"],\
@@ -3014,7 +3007,6 @@ const RAW_RUNTIME_STATE =
"packageLocation": "./packages/revisions/",\
"packageDependencies": [\
["@standardnotes/revisions-server", "workspace:packages/revisions"],\
["@newrelic/native-metrics", "npm:9.0.0"],\
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
["@sentry/node", "npm:7.19.0"],\
["@standardnotes/api", "npm:1.19.0"],\
@@ -3032,7 +3024,7 @@ const RAW_RUNTIME_STATE =
["@types/jest", "npm:29.1.1"],\
["@types/newrelic", "npm:7.0.4"],\
["@typescript-eslint/eslint-plugin", "virtual:04783e12400851b8a3d76e71495851cc94959db6e62f04cb0a31190080629440b182d8c8eb4d7f2b04e281912f2783a5fd4d2c3c6ab68d38b7097246c93f4c19#npm:5.40.1"],\
["aws-sdk", "npm:2.1253.0"],\
["aws-sdk", "npm:2.1260.0"],\
["cors", "npm:2.8.5"],\
["dotenv", "npm:16.0.1"],\
["eslint", "npm:8.25.0"],\
@@ -3060,7 +3052,6 @@ const RAW_RUNTIME_STATE =
"packageLocation": "./packages/scheduler/",\
"packageDependencies": [\
["@standardnotes/scheduler-server", "workspace:packages/scheduler"],\
["@newrelic/native-metrics", "npm:9.0.0"],\
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
["@sentry/node", "npm:7.19.0"],\
["@standardnotes/common", "workspace:packages/common"],\
@@ -3073,7 +3064,7 @@ const RAW_RUNTIME_STATE =
["@types/newrelic", "npm:7.0.4"],\
["@types/node", "npm:18.11.9"],\
["@typescript-eslint/eslint-plugin", "virtual:04783e12400851b8a3d76e71495851cc94959db6e62f04cb0a31190080629440b182d8c8eb4d7f2b04e281912f2783a5fd4d2c3c6ab68d38b7097246c93f4c19#npm:5.40.1"],\
["aws-sdk", "npm:2.1253.0"],\
["aws-sdk", "npm:2.1260.0"],\
["dayjs", "npm:1.11.6"],\
["dotenv", "npm:16.0.1"],\
["eslint", "npm:8.25.0"],\
@@ -3122,7 +3113,6 @@ const RAW_RUNTIME_STATE =
["@lerna-lite/cli", "npm:1.6.0"],\
["@lerna-lite/list", "npm:1.6.0"],\
["@lerna-lite/run", "npm:1.6.0"],\
["@newrelic/native-metrics", "npm:9.0.0"],\
["@sentry/node", "npm:7.19.0"],\
["@types/jest", "npm:29.1.1"],\
["@types/newrelic", "npm:7.0.4"],\
@@ -3145,7 +3135,6 @@ const RAW_RUNTIME_STATE =
"packageLocation": "./packages/settings/",\
"packageDependencies": [\
["@standardnotes/settings", "workspace:packages/settings"],\
["@newrelic/native-metrics", "npm:9.0.0"],\
["@typescript-eslint/eslint-plugin", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:5.30.5"],\
["eslint-plugin-prettier", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:4.2.1"],\
["reflect-metadata", "npm:0.1.13"],\
@@ -3189,7 +3178,6 @@ const RAW_RUNTIME_STATE =
"packageLocation": "./packages/syncing-server/",\
"packageDependencies": [\
["@standardnotes/syncing-server", "workspace:packages/syncing-server"],\
["@newrelic/native-metrics", "npm:9.0.0"],\
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
["@sentry/node", "npm:7.19.0"],\
["@standardnotes/common", "workspace:packages/common"],\
@@ -3213,7 +3201,7 @@ const RAW_RUNTIME_STATE =
["@types/ua-parser-js", "npm:0.7.36"],\
["@types/uuid", "npm:8.3.4"],\
["@typescript-eslint/eslint-plugin", "virtual:04783e12400851b8a3d76e71495851cc94959db6e62f04cb0a31190080629440b182d8c8eb4d7f2b04e281912f2783a5fd4d2c3c6ab68d38b7097246c93f4c19#npm:5.40.1"],\
["aws-sdk", "npm:2.1253.0"],\
["aws-sdk", "npm:2.1260.0"],\
["axios", "npm:1.1.3"],\
["cors", "npm:2.8.5"],\
["dotenv", "npm:16.0.1"],\
@@ -3290,7 +3278,6 @@ const RAW_RUNTIME_STATE =
"packageLocation": "./packages/websockets/",\
"packageDependencies": [\
["@standardnotes/websockets-server", "workspace:packages/websockets"],\
["@newrelic/native-metrics", "npm:9.0.0"],\
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
["@sentry/node", "npm:7.19.0"],\
["@standardnotes/api", "npm:1.19.0"],\
@@ -3304,7 +3291,7 @@ const RAW_RUNTIME_STATE =
["@types/jest", "npm:29.1.1"],\
["@types/newrelic", "npm:7.0.4"],\
["@typescript-eslint/eslint-plugin", "virtual:04783e12400851b8a3d76e71495851cc94959db6e62f04cb0a31190080629440b182d8c8eb4d7f2b04e281912f2783a5fd4d2c3c6ab68d38b7097246c93f4c19#npm:5.40.1"],\
["aws-sdk", "npm:2.1253.0"],\
["aws-sdk", "npm:2.1260.0"],\
["axios", "npm:1.1.3"],\
["cors", "npm:2.8.5"],\
["dotenv", "npm:16.0.1"],\
@@ -3331,7 +3318,6 @@ const RAW_RUNTIME_STATE =
"packageLocation": "./packages/workspace/",\
"packageDependencies": [\
["@standardnotes/workspace-server", "workspace:packages/workspace"],\
["@newrelic/native-metrics", "npm:9.0.0"],\
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
["@sentry/node", "npm:7.19.0"],\
["@standardnotes/api", "npm:1.19.0"],\
@@ -3347,7 +3333,7 @@ const RAW_RUNTIME_STATE =
["@types/jest", "npm:29.1.1"],\
["@types/newrelic", "npm:7.0.4"],\
["@typescript-eslint/eslint-plugin", "virtual:04783e12400851b8a3d76e71495851cc94959db6e62f04cb0a31190080629440b182d8c8eb4d7f2b04e281912f2783a5fd4d2c3c6ab68d38b7097246c93f4c19#npm:5.40.1"],\
["aws-sdk", "npm:2.1253.0"],\
["aws-sdk", "npm:2.1260.0"],\
["cors", "npm:2.8.5"],\
["dotenv", "npm:16.0.1"],\
["eslint", "npm:8.25.0"],\
@@ -4814,10 +4800,10 @@ const RAW_RUNTIME_STATE =
}]\
]],\
["aws-sdk", [\
["npm:2.1253.0", {\
"packageLocation": "./.yarn/cache/aws-sdk-npm-2.1253.0-2cf60975ab-faa4af2949.zip/node_modules/aws-sdk/",\
["npm:2.1260.0", {\
"packageLocation": "./.yarn/cache/aws-sdk-npm-2.1260.0-0145998ab1-9a1b2e4cb5.zip/node_modules/aws-sdk/",\
"packageDependencies": [\
["aws-sdk", "npm:2.1253.0"],\
["aws-sdk", "npm:2.1260.0"],\
["buffer", "npm:4.9.2"],\
["events", "npm:1.1.1"],\
["ieee754", "npm:1.1.13"],\
@@ -12584,7 +12570,7 @@ const RAW_RUNTIME_STATE =
"packageDependencies": [\
["sqs-consumer", "virtual:685a6222c3349423674bb7f0684ba34e2ab20912010f352e04dcf707a156e13183fc382e2417cb37a60f3e7b52fd0178c53181674890e1773eb83e190dc13378#npm:5.7.0"],\
["@types/aws-sdk", null],\
["aws-sdk", "npm:2.1253.0"],\
["aws-sdk", "npm:2.1260.0"],\
["debug", "virtual:b86a9fb34323a98c6519528ed55faa0d9b44ca8879307c0b29aa384bde47ff59a7d0c9051b31246f14521dfb71ba3c5d6d0b35c29fffc17bf875aa6ad977d9e8#npm:4.3.4"]\
],\
"packagePeers": [\

View File

@@ -61,7 +61,6 @@
},
"packageManager": "yarn@4.0.0-rc.25",
"dependencies": {
"@newrelic/native-metrics": "^9.0.0",
"@sentry/node": "^7.19.0",
"newrelic": "^9.6.0"
}

View File

@@ -3,6 +3,28 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [2.11.11](https://github.com/standardnotes/server/compare/@standardnotes/analytics@2.11.10...@standardnotes/analytics@2.11.11) (2022-11-24)
**Note:** Version bump only for package @standardnotes/analytics
## [2.11.10](https://github.com/standardnotes/server/compare/@standardnotes/analytics@2.11.9...@standardnotes/analytics@2.11.10) (2022-11-24)
**Note:** Version bump only for package @standardnotes/analytics
## [2.11.9](https://github.com/standardnotes/server/compare/@standardnotes/analytics@2.11.8...@standardnotes/analytics@2.11.9) (2022-11-24)
**Note:** Version bump only for package @standardnotes/analytics
## [2.11.8](https://github.com/standardnotes/server/compare/@standardnotes/analytics@2.11.7...@standardnotes/analytics@2.11.8) (2022-11-23)
**Note:** Version bump only for package @standardnotes/analytics
## [2.11.7](https://github.com/standardnotes/server/compare/@standardnotes/analytics@2.11.6...@standardnotes/analytics@2.11.7) (2022-11-23)
### Bug Fixes
* binding of sns and sqs with additional config ([74bc791](https://github.com/standardnotes/server/commit/74bc79116bc50d9a5af1a558db1b7108dcda6d0e))
## [2.11.6](https://github.com/standardnotes/server/compare/@standardnotes/analytics@2.11.5...@standardnotes/analytics@2.11.6) (2022-11-22)
**Note:** Version bump only for package @standardnotes/analytics

View File

@@ -1,6 +1,6 @@
{
"name": "@standardnotes/analytics",
"version": "2.11.6",
"version": "2.11.11",
"engines": {
"node": ">=18.0.0 <19.0.0"
},
@@ -37,7 +37,6 @@
"typescript": "^4.8.4"
},
"dependencies": {
"@newrelic/native-metrics": "^9.0.0",
"@newrelic/winston-enricher": "^4.0.0",
"@sentry/node": "^7.19.0",
"@standardnotes/common": "workspace:*",
@@ -45,7 +44,7 @@
"@standardnotes/domain-events": "workspace:*",
"@standardnotes/domain-events-infra": "workspace:*",
"@standardnotes/time": "workspace:*",
"aws-sdk": "^2.1253.0",
"aws-sdk": "^2.1260.0",
"dayjs": "^1.11.6",
"dotenv": "^16.0.1",
"inversify": "^6.0.1",

View File

@@ -89,13 +89,24 @@ export class ContainerConfigLoader {
})
container.bind<winston.Logger>(TYPES.Logger).toConstantValue(logger)
if (env.get('SNS_AWS_REGION', true)) {
container.bind<AWS.SNS>(TYPES.SNS).toConstantValue(
new AWS.SNS({
apiVersion: 'latest',
region: env.get('SNS_AWS_REGION', true),
}),
)
if (env.get('SNS_TOPIC_ARN', true)) {
const snsConfig: AWS.SNS.Types.ClientConfiguration = {
apiVersion: 'latest',
region: env.get('SNS_AWS_REGION', true),
}
if (env.get('SNS_ENDPOINT', true)) {
snsConfig.endpoint = env.get('SNS_ENDPOINT', true)
}
if (env.get('SNS_DISABLE_SSL', true) === 'true') {
snsConfig.sslEnabled = false
}
if (env.get('SNS_ACCESS_KEY_ID', true) && env.get('SNS_SECRET_ACCESS_KEY', true)) {
snsConfig.credentials = {
accessKeyId: env.get('SNS_ACCESS_KEY_ID', true),
secretAccessKey: env.get('SNS_SECRET_ACCESS_KEY', true),
}
}
container.bind<AWS.SNS>(TYPES.SNS).toConstantValue(new AWS.SNS(snsConfig))
}
if (env.get('SQS_QUEUE_URL', true)) {

View File

@@ -10,6 +10,7 @@ WORKSPACE_SERVER_URL=http://workspace:3000
WEB_SOCKET_SERVER_URL=http://websockets:3000
PAYMENTS_SERVER_URL=http://payments:3000
FILES_SERVER_URL=http://files:3000
REVISIONS_SERVER_URL=http://revisions:3000
HTTP_CALL_TIMEOUT=60000

View File

@@ -3,6 +3,20 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.39.2](https://github.com/standardnotes/api-gateway/compare/@standardnotes/api-gateway@1.39.1...@standardnotes/api-gateway@1.39.2) (2022-11-24)
**Note:** Version bump only for package @standardnotes/api-gateway
## [1.39.1](https://github.com/standardnotes/api-gateway/compare/@standardnotes/api-gateway@1.39.0...@standardnotes/api-gateway@1.39.1) (2022-11-23)
**Note:** Version bump only for package @standardnotes/api-gateway
# [1.39.0](https://github.com/standardnotes/api-gateway/compare/@standardnotes/api-gateway@1.38.9...@standardnotes/api-gateway@1.39.0) (2022-11-22)
### Features
* **api-gateway:** add v2 revisions controller ([92ba759](https://github.com/standardnotes/api-gateway/commit/92ba759b1c3719e773f989707ddd6d7a9ec57d1c))
## [1.38.9](https://github.com/standardnotes/api-gateway/compare/@standardnotes/api-gateway@1.38.8...@standardnotes/api-gateway@1.38.9) (2022-11-22)
**Note:** Version bump only for package @standardnotes/api-gateway

View File

@@ -24,6 +24,7 @@ import '../src/Controller/v1/InvitesController'
import '../src/Controller/v2/PaymentsControllerV2'
import '../src/Controller/v2/ActionsControllerV2'
import '../src/Controller/v2/RevisionsControllerV2'
import helmet from 'helmet'
import * as cors from 'cors'

View File

@@ -1,6 +1,6 @@
{
"name": "@standardnotes/api-gateway",
"version": "1.38.9",
"version": "1.39.2",
"engines": {
"node": ">=18.0.0 <19.0.0"
},
@@ -20,7 +20,6 @@
"upgrade:snjs": "yarn ncu -u '@standardnotes/*'"
},
"dependencies": {
"@newrelic/native-metrics": "^9.0.0",
"@newrelic/winston-enricher": "^4.0.0",
"@sentry/node": "^7.19.0",
"@standardnotes/common": "workspace:^",
@@ -28,7 +27,7 @@
"@standardnotes/domain-events-infra": "workspace:*",
"@standardnotes/security": "workspace:*",
"@standardnotes/time": "workspace:*",
"aws-sdk": "^2.1253.0",
"aws-sdk": "^2.1260.0",
"axios": "^1.1.3",
"cors": "2.8.5",
"dotenv": "^16.0.1",

View File

@@ -54,6 +54,7 @@ export class ContainerConfigLoader {
// env vars
container.bind(TYPES.SYNCING_SERVER_JS_URL).toConstantValue(env.get('SYNCING_SERVER_JS_URL'))
container.bind(TYPES.AUTH_SERVER_URL).toConstantValue(env.get('AUTH_SERVER_URL'))
container.bind(TYPES.REVISIONS_SERVER_URL).toConstantValue(env.get('REVISIONS_SERVER_URL'))
container.bind(TYPES.PAYMENTS_SERVER_URL).toConstantValue(env.get('PAYMENTS_SERVER_URL', true))
container.bind(TYPES.FILES_SERVER_URL).toConstantValue(env.get('FILES_SERVER_URL', true))
container.bind(TYPES.AUTH_JWT_SECRET).toConstantValue(env.get('AUTH_JWT_SECRET'))

View File

@@ -7,6 +7,7 @@ const TYPES = {
AUTH_SERVER_URL: Symbol.for('AUTH_SERVER_URL'),
PAYMENTS_SERVER_URL: Symbol.for('PAYMENTS_SERVER_URL'),
FILES_SERVER_URL: Symbol.for('FILES_SERVER_URL'),
REVISIONS_SERVER_URL: Symbol.for('REVISIONS_SERVER_URL'),
WORKSPACE_SERVER_URL: Symbol.for('WORKSPACE_SERVER_URL'),
WEB_SOCKET_SERVER_URL: Symbol.for('WEB_SOCKET_SERVER_URL'),
AUTH_JWT_SECRET: Symbol.for('AUTH_JWT_SECRET'),

View File

@@ -0,0 +1,17 @@
import { Request, Response } from 'express'
import { inject } from 'inversify'
import { BaseHttpController, controller, httpGet } from 'inversify-express-utils'
import TYPES from '../../Bootstrap/Types'
import { HttpServiceInterface } from '../../Service/Http/HttpServiceInterface'
@controller('/v2/items/:item_id/revisions', TYPES.AuthMiddleware)
export class RevisionsControllerV2 extends BaseHttpController {
constructor(@inject(TYPES.HTTPService) private httpService: HttpServiceInterface) {
super()
}
@httpGet('/')
async getRevisions(request: Request, response: Response): Promise<void> {
await this.httpService.callRevisionsServer(request, response, `items/${request.params.item_id}/revisions`)
}
}

View File

@@ -18,6 +18,7 @@ export class HttpService implements HttpServiceInterface {
@inject(TYPES.FILES_SERVER_URL) private filesServerUrl: string,
@inject(TYPES.WORKSPACE_SERVER_URL) private workspaceServerUrl: string,
@inject(TYPES.WEB_SOCKET_SERVER_URL) private webSocketServerUrl: string,
@inject(TYPES.REVISIONS_SERVER_URL) private revisionsServerUrl: string,
@inject(TYPES.HTTP_CALL_TIMEOUT) private httpCallTimeout: number,
@inject(TYPES.CrossServiceTokenCache) private crossServiceTokenCache: CrossServiceTokenCacheInterface,
@inject(TYPES.Logger) private logger: Logger,
@@ -32,6 +33,15 @@ export class HttpService implements HttpServiceInterface {
await this.callServer(this.syncingServerJsUrl, request, response, endpoint, payload)
}
async callRevisionsServer(
request: Request,
response: Response,
endpoint: string,
payload?: Record<string, unknown> | string,
): Promise<void> {
await this.callServer(this.revisionsServerUrl, request, response, endpoint, payload)
}
async callLegacySyncingServer(
request: Request,
response: Response,

View File

@@ -13,6 +13,12 @@ export interface HttpServiceInterface {
endpoint: string,
payload?: Record<string, unknown> | string,
): Promise<void>
callRevisionsServer(
request: Request,
response: Response,
endpoint: string,
payload?: Record<string, unknown> | string,
): Promise<void>
callSyncingServer(
request: Request,
response: Response,

View File

@@ -3,6 +3,38 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.60.10](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.60.9...@standardnotes/auth-server@1.60.10) (2022-11-24)
**Note:** Version bump only for package @standardnotes/auth-server
## [1.60.9](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.60.8...@standardnotes/auth-server@1.60.9) (2022-11-23)
**Note:** Version bump only for package @standardnotes/auth-server
## [1.60.8](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.60.7...@standardnotes/auth-server@1.60.8) (2022-11-23)
### Bug Fixes
* binding of sns and sqs with additional config ([74bc791](https://github.com/standardnotes/server/commit/74bc79116bc50d9a5af1a558db1b7108dcda6d0e))
## [1.60.7](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.60.6...@standardnotes/auth-server@1.60.7) (2022-11-22)
### Bug Fixes
* **auth:** remove temporary email campaign check for team member ([5f2be44](https://github.com/standardnotes/server/commit/5f2be44b853e83abb6c4e758efd477e899381e07))
## [1.60.6](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.60.5...@standardnotes/auth-server@1.60.6) (2022-11-22)
### Bug Fixes
* sns binding ([3686a26](https://github.com/standardnotes/server/commit/3686a260192468c00b52087590dd2edf76ada939))
## [1.60.5](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.60.4...@standardnotes/auth-server@1.60.5) (2022-11-22)
### Bug Fixes
* **auth:** tmp send email campaign only to team ([94359f1](https://github.com/standardnotes/server/commit/94359f1299a2bb009099af163d3929c4adc7e274))
## [1.60.4](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.60.3...@standardnotes/auth-server@1.60.4) (2022-11-22)
**Note:** Version bump only for package @standardnotes/auth-server

View File

@@ -1,6 +1,6 @@
{
"name": "@standardnotes/auth-server",
"version": "1.60.4",
"version": "1.60.10",
"engines": {
"node": ">=18.0.0 <19.0.0"
},
@@ -31,7 +31,6 @@
"upgrade:snjs": "yarn ncu -u '@standardnotes/*'"
},
"dependencies": {
"@newrelic/native-metrics": "^9.0.0",
"@newrelic/winston-enricher": "^4.0.0",
"@sentry/node": "^7.19.0",
"@standardnotes/api": "^1.19.0",
@@ -46,7 +45,7 @@
"@standardnotes/sncrypto-common": "^1.9.0",
"@standardnotes/sncrypto-node": "workspace:*",
"@standardnotes/time": "workspace:*",
"aws-sdk": "^2.1253.0",
"aws-sdk": "^2.1260.0",
"axios": "^1.1.3",
"bcryptjs": "2.4.3",
"cors": "2.8.5",

View File

@@ -230,13 +230,24 @@ export class ContainerConfigLoader {
})
container.bind<winston.Logger>(TYPES.Logger).toConstantValue(logger)
if (env.get('SNS_AWS_REGION', true)) {
container.bind<AWS.SNS>(TYPES.SNS).toConstantValue(
new AWS.SNS({
apiVersion: 'latest',
region: env.get('SNS_AWS_REGION', true),
}),
)
if (env.get('SNS_TOPIC_ARN', true)) {
const snsConfig: AWS.SNS.Types.ClientConfiguration = {
apiVersion: 'latest',
region: env.get('SNS_AWS_REGION', true),
}
if (env.get('SNS_ENDPOINT', true)) {
snsConfig.endpoint = env.get('SNS_ENDPOINT', true)
}
if (env.get('SNS_DISABLE_SSL', true) === 'true') {
snsConfig.sslEnabled = false
}
if (env.get('SNS_ACCESS_KEY_ID', true) && env.get('SNS_SECRET_ACCESS_KEY', true)) {
snsConfig.credentials = {
accessKeyId: env.get('SNS_ACCESS_KEY_ID', true),
secretAccessKey: env.get('SNS_SECRET_ACCESS_KEY', true),
}
}
container.bind<AWS.SNS>(TYPES.SNS).toConstantValue(new AWS.SNS(snsConfig))
}
if (env.get('SQS_QUEUE_URL', true)) {

View File

@@ -3,6 +3,18 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [1.4.0](https://github.com/standardnotes/server/compare/@standardnotes/domain-core@1.3.0...@standardnotes/domain-core@1.4.0) (2022-11-24)
### Features
* **domain-core:** add role name collection value object ([ae2f8f0](https://github.com/standardnotes/server/commit/ae2f8f086b9f647bb98c59f32375b45243cb0af9))
# [1.3.0](https://github.com/standardnotes/server/compare/@standardnotes/domain-core@1.2.2...@standardnotes/domain-core@1.3.0) (2022-11-24)
### Features
* **domain-core:** add role name value object ([748630e](https://github.com/standardnotes/server/commit/748630e1f1ed1dfae2e743cd2b3d3fd91967088c))
## [1.2.2](https://github.com/standardnotes/server/compare/@standardnotes/domain-core@1.2.1...@standardnotes/domain-core@1.2.2) (2022-11-22)
**Note:** Version bump only for package @standardnotes/domain-core

View File

@@ -1,6 +1,6 @@
{
"name": "@standardnotes/domain-core",
"version": "1.2.2",
"version": "1.4.0",
"engines": {
"node": ">=18.0.0 <19.0.0"
},

View File

@@ -0,0 +1,18 @@
import { RoleName } from './RoleName'
describe('RoleName', () => {
it('should create a value object', () => {
const valueOrError = RoleName.create('PRO_USER')
expect(valueOrError.isFailed()).toBeFalsy()
expect(valueOrError.getValue().value).toEqual('PRO_USER')
})
it('should not create an invalid value object', () => {
for (const value of ['', undefined, null, 0, 'SOME_USER']) {
const valueOrError = RoleName.create(value as string)
expect(valueOrError.isFailed()).toBeTruthy()
}
})
})

View File

@@ -0,0 +1,29 @@
import { ValueObject } from '../Core/ValueObject'
import { Result } from '../Core/Result'
import { RoleNameProps } from './RoleNameProps'
export class RoleName extends ValueObject<RoleNameProps> {
private static readonly NAMES = {
CoreUser: 'CORE_USER',
PlusUser: 'PLUS_USER',
ProUser: 'PRO_USER',
FilesBetaUser: 'FILES_BETA_USER',
}
get value(): string {
return this.props.value
}
private constructor(props: RoleNameProps) {
super(props)
}
static create(name: string): Result<RoleName> {
const isValidName = Object.values(this.NAMES).includes(name)
if (!isValidName) {
return Result.fail<RoleName>(`Invalid role name: ${name}`)
} else {
return Result.ok<RoleName>(new RoleName({ value: name }))
}
}
}

View File

@@ -0,0 +1,51 @@
import { RoleName } from './RoleName'
import { RoleNameCollection } from './RoleNameCollection'
describe('RoleNameCollection', () => {
it('should create a value object', () => {
const role1 = RoleName.create('PRO_USER').getValue()
const valueOrError = RoleNameCollection.create([role1])
expect(valueOrError.isFailed()).toBeFalsy()
expect(valueOrError.getValue().value).toEqual([role1])
})
it('should tell if collections are not equal', () => {
const roles1 = [RoleName.create('PRO_USER').getValue(), RoleName.create('PLUS_USER').getValue()]
const roles2 = RoleNameCollection.create([
RoleName.create('PRO_USER').getValue(),
RoleName.create('CORE_USER').getValue(),
]).getValue()
const valueOrError = RoleNameCollection.create(roles1)
expect(valueOrError.getValue().equals(roles2)).toBeFalsy()
})
it('should tell if collections are equal', () => {
const roles1 = [RoleName.create('PRO_USER').getValue(), RoleName.create('PLUS_USER').getValue()]
const roles2 = RoleNameCollection.create([
RoleName.create('PRO_USER').getValue(),
RoleName.create('PLUS_USER').getValue(),
]).getValue()
const valueOrError = RoleNameCollection.create(roles1)
expect(valueOrError.getValue().equals(roles2)).toBeTruthy()
})
it('should tell if collection includes element', () => {
const roles1 = [RoleName.create('PRO_USER').getValue(), RoleName.create('PLUS_USER').getValue()]
const valueOrError = RoleNameCollection.create(roles1)
expect(valueOrError.getValue().includes(RoleName.create('PRO_USER').getValue())).toBeTruthy()
})
it('should tell if collection does not includes element', () => {
const roles1 = [RoleName.create('PRO_USER').getValue(), RoleName.create('PLUS_USER').getValue()]
const valueOrError = RoleNameCollection.create(roles1)
expect(valueOrError.getValue().includes(RoleName.create('CORE_USER').getValue())).toBeFalsy()
})
})

View File

@@ -0,0 +1,42 @@
import { ValueObject } from '../Core/ValueObject'
import { Result } from '../Core/Result'
import { RoleNameCollectionProps } from './RoleNameCollectionProps'
import { RoleName } from './RoleName'
export class RoleNameCollection extends ValueObject<RoleNameCollectionProps> {
get value(): RoleName[] {
return this.props.value
}
includes(roleName: RoleName): boolean {
for (const existingRoleName of this.props.value) {
if (existingRoleName.equals(roleName)) {
return true
}
}
return false
}
override equals(roleNameCollection: RoleNameCollection): boolean {
if (this.props.value.length !== roleNameCollection.value.length) {
return false
}
for (const roleName of roleNameCollection.value) {
if (!this.includes(roleName)) {
return false
}
}
return true
}
private constructor(props: RoleNameCollectionProps) {
super(props)
}
static create(roleName: RoleName[]): Result<RoleNameCollection> {
return Result.ok<RoleNameCollection>(new RoleNameCollection({ value: roleName }))
}
}

View File

@@ -0,0 +1,5 @@
import { RoleName } from './RoleName'
export interface RoleNameCollectionProps {
value: RoleName[]
}

View File

@@ -0,0 +1,3 @@
export interface RoleNameProps {
value: string
}

View File

@@ -1,5 +1,9 @@
export * from './Common/Email'
export * from './Common/EmailProps'
export * from './Common/RoleName'
export * from './Common/RoleNameProps'
export * from './Common/RoleNameCollection'
export * from './Common/RoleNameCollectionProps'
export * from './Common/Timestamps'
export * from './Common/TimestampsProps'
export * from './Common/Uuid'

View File

@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.9.33](https://github.com/standardnotes/server/compare/@standardnotes/domain-events-infra@1.9.32...@standardnotes/domain-events-infra@1.9.33) (2022-11-24)
**Note:** Version bump only for package @standardnotes/domain-events-infra
## [1.9.32](https://github.com/standardnotes/server/compare/@standardnotes/domain-events-infra@1.9.31...@standardnotes/domain-events-infra@1.9.32) (2022-11-23)
**Note:** Version bump only for package @standardnotes/domain-events-infra
## [1.9.31](https://github.com/standardnotes/server/compare/@standardnotes/domain-events-infra@1.9.30...@standardnotes/domain-events-infra@1.9.31) (2022-11-22)
**Note:** Version bump only for package @standardnotes/domain-events-infra

View File

@@ -1,6 +1,6 @@
{
"name": "@standardnotes/domain-events-infra",
"version": "1.9.31",
"version": "1.9.33",
"engines": {
"node": ">=18.0.0 <19.0.0"
},
@@ -23,9 +23,8 @@
"test": "jest spec --coverage"
},
"dependencies": {
"@newrelic/native-metrics": "^9.0.0",
"@standardnotes/domain-events": "workspace:*",
"aws-sdk": "^2.1253.0",
"aws-sdk": "^2.1260.0",
"ioredis": "^5.2.4",
"newrelic": "^9.6.0",
"reflect-metadata": "^0.1.13",

View File

@@ -3,6 +3,20 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.6.29](https://github.com/standardnotes/server/compare/@standardnotes/event-store@1.6.28...@standardnotes/event-store@1.6.29) (2022-11-24)
**Note:** Version bump only for package @standardnotes/event-store
## [1.6.28](https://github.com/standardnotes/server/compare/@standardnotes/event-store@1.6.27...@standardnotes/event-store@1.6.28) (2022-11-23)
**Note:** Version bump only for package @standardnotes/event-store
## [1.6.27](https://github.com/standardnotes/server/compare/@standardnotes/event-store@1.6.26...@standardnotes/event-store@1.6.27) (2022-11-23)
### Bug Fixes
* binding of sns and sqs with additional config ([74bc791](https://github.com/standardnotes/server/commit/74bc79116bc50d9a5af1a558db1b7108dcda6d0e))
## [1.6.26](https://github.com/standardnotes/server/compare/@standardnotes/event-store@1.6.25...@standardnotes/event-store@1.6.26) (2022-11-22)
**Note:** Version bump only for package @standardnotes/event-store

View File

@@ -1,6 +1,6 @@
{
"name": "@standardnotes/event-store",
"version": "1.6.26",
"version": "1.6.29",
"description": "Event Store Service",
"private": true,
"main": "dist/src/index.js",
@@ -31,11 +31,10 @@
"typescript": "^4.8.4"
},
"dependencies": {
"@newrelic/native-metrics": "^9.0.0",
"@standardnotes/domain-events": "workspace:*",
"@standardnotes/domain-events-infra": "workspace:*",
"@standardnotes/time": "workspace:*",
"aws-sdk": "^2.1253.0",
"aws-sdk": "^2.1260.0",
"dotenv": "^16.0.1",
"inversify": "^6.0.1",
"ioredis": "^5.2.4",

View File

@@ -28,12 +28,19 @@ export class ContainerConfigLoader {
await AppDataSource.initialize()
container.bind<AWS.SQS>(TYPES.SQS).toConstantValue(
new AWS.SQS({
if (env.get('SQS_QUEUE_URL', true)) {
const sqsConfig: AWS.SQS.Types.ClientConfiguration = {
apiVersion: 'latest',
region: env.get('SQS_AWS_REGION'),
}),
)
region: env.get('SQS_AWS_REGION', true),
}
if (env.get('SQS_ACCESS_KEY_ID', true) && env.get('SQS_SECRET_ACCESS_KEY', true)) {
sqsConfig.credentials = {
accessKeyId: env.get('SQS_ACCESS_KEY_ID', true),
secretAccessKey: env.get('SQS_SECRET_ACCESS_KEY', true),
}
}
container.bind<AWS.SQS>(TYPES.SQS).toConstantValue(new AWS.SQS(sqsConfig))
}
const logger = winston.createLogger({
level: env.get('LOG_LEVEL') || 'info',

View File

@@ -3,6 +3,20 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.8.29](https://github.com/standardnotes/files/compare/@standardnotes/files-server@1.8.28...@standardnotes/files-server@1.8.29) (2022-11-24)
**Note:** Version bump only for package @standardnotes/files-server
## [1.8.28](https://github.com/standardnotes/files/compare/@standardnotes/files-server@1.8.27...@standardnotes/files-server@1.8.28) (2022-11-23)
**Note:** Version bump only for package @standardnotes/files-server
## [1.8.27](https://github.com/standardnotes/files/compare/@standardnotes/files-server@1.8.26...@standardnotes/files-server@1.8.27) (2022-11-23)
### Bug Fixes
* binding of sns and sqs with additional config ([74bc791](https://github.com/standardnotes/files/commit/74bc79116bc50d9a5af1a558db1b7108dcda6d0e))
## [1.8.26](https://github.com/standardnotes/files/compare/@standardnotes/files-server@1.8.25...@standardnotes/files-server@1.8.26) (2022-11-22)
**Note:** Version bump only for package @standardnotes/files-server

View File

@@ -1,6 +1,6 @@
{
"name": "@standardnotes/files-server",
"version": "1.8.26",
"version": "1.8.29",
"engines": {
"node": ">=18.0.0 <19.0.0"
},
@@ -25,7 +25,6 @@
"upgrade:snjs": "yarn ncu -u '@standardnotes/*'"
},
"dependencies": {
"@newrelic/native-metrics": "^9.0.0",
"@sentry/node": "^7.19.0",
"@standardnotes/common": "workspace:*",
"@standardnotes/domain-events": "workspace:*",
@@ -34,7 +33,7 @@
"@standardnotes/sncrypto-common": "^1.9.0",
"@standardnotes/sncrypto-node": "workspace:*",
"@standardnotes/time": "workspace:*",
"aws-sdk": "^2.1253.0",
"aws-sdk": "^2.1260.0",
"connect-busboy": "^1.0.0",
"cors": "^2.8.5",
"dayjs": "^1.11.6",

View File

@@ -110,13 +110,24 @@ export class ContainerConfigLoader {
}
container.bind<ValidatorInterface<Uuid>>(TYPES.UuidValidator).toConstantValue(new UuidValidator())
if (env.get('SNS_AWS_REGION', true)) {
container.bind<AWS.SNS>(TYPES.SNS).toConstantValue(
new AWS.SNS({
apiVersion: 'latest',
region: env.get('SNS_AWS_REGION', true),
}),
)
if (env.get('SNS_TOPIC_ARN', true)) {
const snsConfig: AWS.SNS.Types.ClientConfiguration = {
apiVersion: 'latest',
region: env.get('SNS_AWS_REGION', true),
}
if (env.get('SNS_ENDPOINT', true)) {
snsConfig.endpoint = env.get('SNS_ENDPOINT', true)
}
if (env.get('SNS_DISABLE_SSL', true) === 'true') {
snsConfig.sslEnabled = false
}
if (env.get('SNS_ACCESS_KEY_ID', true) && env.get('SNS_SECRET_ACCESS_KEY', true)) {
snsConfig.credentials = {
accessKeyId: env.get('SNS_ACCESS_KEY_ID', true),
secretAccessKey: env.get('SNS_SECRET_ACCESS_KEY', true),
}
}
container.bind<AWS.SNS>(TYPES.SNS).toConstantValue(new AWS.SNS(snsConfig))
}
if (env.get('SQS_QUEUE_URL', true)) {

View File

@@ -6,12 +6,12 @@ AUTH_JWT_SECRET=auth_jwt_secret
PORT=3000
DB_HOST=db
DB_REPLICA_HOST=db
DB_HOST=127.0.0.1
DB_REPLICA_HOST=127.0.0.1
DB_PORT=3306
DB_USERNAME=std_notes_user
DB_PASSWORD=changeme123
DB_DATABASE=standard_notes_db
DB_USERNAME=revisions
DB_PASSWORD=revisionspassword
DB_DATABASE=revisions
DB_DEBUG_LEVEL=all # "all" | "query" | "schema" | "error" | "warn" | "info" | "log" | "migration"
DB_MIGRATIONS_PATH=dist/migrations/*.js

View File

@@ -3,6 +3,46 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.4.6](https://github.com/standardnotes/server/compare/@standardnotes/revisions-server@1.4.5...@standardnotes/revisions-server@1.4.6) (2022-11-24)
**Note:** Version bump only for package @standardnotes/revisions-server
## [1.4.5](https://github.com/standardnotes/server/compare/@standardnotes/revisions-server@1.4.4...@standardnotes/revisions-server@1.4.5) (2022-11-24)
**Note:** Version bump only for package @standardnotes/revisions-server
## [1.4.4](https://github.com/standardnotes/server/compare/@standardnotes/revisions-server@1.4.3...@standardnotes/revisions-server@1.4.4) (2022-11-24)
**Note:** Version bump only for package @standardnotes/revisions-server
## [1.4.3](https://github.com/standardnotes/server/compare/@standardnotes/revisions-server@1.4.2...@standardnotes/revisions-server@1.4.3) (2022-11-23)
**Note:** Version bump only for package @standardnotes/revisions-server
## [1.4.2](https://github.com/standardnotes/server/compare/@standardnotes/revisions-server@1.4.1...@standardnotes/revisions-server@1.4.2) (2022-11-22)
### Bug Fixes
* sqs binding ([806a732](https://github.com/standardnotes/server/commit/806a732cbc92cd89deb9d9d2aa95565922ce6b72))
## [1.4.1](https://github.com/standardnotes/server/compare/@standardnotes/revisions-server@1.4.0...@standardnotes/revisions-server@1.4.1) (2022-11-22)
### Bug Fixes
* **revisions:** add more verbose error messages ([daa7a9f](https://github.com/standardnotes/server/commit/daa7a9ff61d389e573960b443faff77e0abe01dc))
# [1.4.0](https://github.com/standardnotes/server/compare/@standardnotes/revisions-server@1.3.0...@standardnotes/revisions-server@1.4.0) (2022-11-22)
### Features
* **revisions:** add database ([e553222](https://github.com/standardnotes/server/commit/e553222b4b0f185bea5146d440834483b140339d))
# [1.3.0](https://github.com/standardnotes/server/compare/@standardnotes/revisions-server@1.2.2...@standardnotes/revisions-server@1.3.0) (2022-11-22)
### Features
* **revisions:** add filesystem dump repository ([14ab1ca](https://github.com/standardnotes/server/commit/14ab1cae6981b7c12e797dd316da1b3bdb37c75f))
## [1.2.2](https://github.com/standardnotes/server/compare/@standardnotes/revisions-server@1.2.1...@standardnotes/revisions-server@1.2.2) (2022-11-22)
**Note:** Version bump only for package @standardnotes/revisions-server

View File

@@ -0,0 +1,19 @@
import { MigrationInterface, QueryRunner } from 'typeorm'
export class init1669113322388 implements MigrationInterface {
name = 'init1669113322388'
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(
'CREATE TABLE `revisions` (`uuid` varchar(36) NOT NULL, `item_uuid` varchar(36) NOT NULL, `user_uuid` varchar(36) NOT NULL, `content` mediumtext NULL, `content_type` varchar(255) NULL, `items_key_id` varchar(255) NULL, `enc_item_key` text NULL, `auth_hash` varchar(255) NULL, `creation_date` date NULL, `created_at` datetime(6) NULL, `updated_at` datetime(6) NULL, INDEX `item_uuid` (`item_uuid`), INDEX `user_uuid` (`user_uuid`), INDEX `creation_date` (`creation_date`), INDEX `created_at` (`created_at`), PRIMARY KEY (`uuid`)) ENGINE=InnoDB',
)
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query('DROP INDEX `created_at` ON `revisions`')
await queryRunner.query('DROP INDEX `creation_date` ON `revisions`')
await queryRunner.query('DROP INDEX `user_uuid` ON `revisions`')
await queryRunner.query('DROP INDEX `item_uuid` ON `revisions`')
await queryRunner.query('DROP TABLE `revisions`')
}
}

View File

@@ -1,6 +1,6 @@
{
"name": "@standardnotes/revisions-server",
"version": "1.2.2",
"version": "1.4.6",
"engines": {
"node": ">=18.0.0 <19.0.0"
},
@@ -23,7 +23,6 @@
"worker": "yarn node dist/bin/worker.js"
},
"dependencies": {
"@newrelic/native-metrics": "^9.0.0",
"@newrelic/winston-enricher": "^4.0.0",
"@sentry/node": "^7.19.0",
"@standardnotes/api": "^1.19.0",
@@ -33,7 +32,7 @@
"@standardnotes/domain-events-infra": "workspace:*",
"@standardnotes/security": "workspace:^",
"@standardnotes/time": "workspace:^",
"aws-sdk": "^2.1253.0",
"aws-sdk": "^2.1260.0",
"cors": "2.8.5",
"dotenv": "^16.0.1",
"express": "^4.18.2",

View File

@@ -35,6 +35,7 @@ import { RevisionPersistenceMapper } from '../Mapping/RevisionPersistenceMapper'
import { ItemDumpedEventHandler } from '../Domain/Handler/ItemDumpedEventHandler'
import { DumpRepositoryInterface } from '../Domain/Dump/DumpRepositoryInterface'
import { S3DumpRepository } from '../Infra/S3/S3ItemDumpRepository'
import { FSDumpRepository } from '../Infra/FS/FSDumpRepository'
// eslint-disable-next-line @typescript-eslint/no-var-requires
const newrelicFormatter = require('@newrelic/winston-enricher')
@@ -72,13 +73,18 @@ export class ContainerConfigLoader {
})
container.bind<winston.Logger>(TYPES.Logger).toConstantValue(logger)
if (env.get('SQS_AWS_REGION', true)) {
container.bind<AWS.SQS>(TYPES.SQS).toConstantValue(
new AWS.SQS({
apiVersion: 'latest',
region: env.get('SQS_AWS_REGION', true),
}),
)
if (env.get('SQS_QUEUE_URL', true)) {
const sqsConfig: AWS.SQS.Types.ClientConfiguration = {
apiVersion: 'latest',
region: env.get('SQS_AWS_REGION', true),
}
if (env.get('SQS_ACCESS_KEY_ID', true) && env.get('SQS_SECRET_ACCESS_KEY', true)) {
sqsConfig.credentials = {
accessKeyId: env.get('SQS_ACCESS_KEY_ID', true),
secretAccessKey: env.get('SQS_SECRET_ACCESS_KEY', true),
}
}
container.bind<AWS.SQS>(TYPES.SQS).toConstantValue(new AWS.SQS(sqsConfig))
}
let s3Client = undefined
@@ -126,15 +132,21 @@ export class ContainerConfigLoader {
container.get(TYPES.RevisionPersistenceMapper),
),
)
container
.bind<DumpRepositoryInterface>(TYPES.DumpRepository)
.toConstantValue(
new S3DumpRepository(
container.get(TYPES.S3_BACKUP_BUCKET_NAME),
container.get(TYPES.S3),
container.get(TYPES.RevisionItemStringMapper),
),
)
if (env.get('S3_AWS_REGION', true)) {
container
.bind<DumpRepositoryInterface>(TYPES.DumpRepository)
.toConstantValue(
new S3DumpRepository(
container.get(TYPES.S3_BACKUP_BUCKET_NAME),
container.get(TYPES.S3),
container.get(TYPES.RevisionItemStringMapper),
),
)
} else {
container
.bind<DumpRepositoryInterface>(TYPES.DumpRepository)
.toConstantValue(new FSDumpRepository(container.get(TYPES.RevisionItemStringMapper)))
}
// use cases
container

View File

@@ -20,14 +20,14 @@ describe('RevisionsController', () => {
})
it('should get revisions list', async () => {
const response = await createController().getRevisions({ itemUuid: '1-2-3' })
const response = await createController().getRevisions({ itemUuid: '1-2-3', userUuid: '1-2-3' })
expect(response.status).toEqual(200)
})
it('should indicate failure to get revisions list', async () => {
getRevisionsMetadata.execute = jest.fn().mockReturnValue(Result.fail('Oops'))
const response = await createController().getRevisions({ itemUuid: '1-2-3' })
const response = await createController().getRevisions({ itemUuid: '1-2-3', userUuid: '1-2-3' })
expect(response.status).toEqual(400)
})

View File

@@ -8,7 +8,10 @@ export class RevisionsController {
constructor(private getRevisionsMetadata: GetRevisionsMetada, private logger: Logger) {}
async getRevisions(params: GetRevisionsMetadataRequestParams): Promise<HttpResponse> {
const revisionMetadataOrError = await this.getRevisionsMetadata.execute({ itemUuid: params.itemUuid })
const revisionMetadataOrError = await this.getRevisionsMetadata.execute({
itemUuid: params.itemUuid,
userUuid: params.userUuid,
})
if (revisionMetadataOrError.isFailed()) {
this.logger.warn(revisionMetadataOrError.getError())

View File

@@ -4,6 +4,7 @@ import { ContentType } from './ContentType'
export interface RevisionProps {
itemUuid: Uuid
userUuid: Uuid
content: string | null
contentType: ContentType
itemsKeyId: string | null

View File

@@ -4,6 +4,6 @@ import { Revision } from './Revision'
import { RevisionMetadata } from './RevisionMetadata'
export interface RevisionRepositoryInterface {
findMetadataByItemId(itemUuid: Uuid): Promise<Array<RevisionMetadata>>
findMetadataByItemId(itemUuid: Uuid, userUuid: Uuid): Promise<Array<RevisionMetadata>>
save(revision: Revision): Promise<Revision>
}

View File

@@ -13,14 +13,29 @@ describe('GetRevisionsMetada', () => {
})
it('should return revisions metadata for a given item', async () => {
const result = await createUseCase().execute({ itemUuid: '84c0f8e8-544a-4c7e-9adf-26209303bc1d' })
const result = await createUseCase().execute({
itemUuid: '84c0f8e8-544a-4c7e-9adf-26209303bc1d',
userUuid: '84c0f8e8-544a-4c7e-9adf-26209303bc1d',
})
expect(result.isFailed()).toBeFalsy()
expect(result.getValue().length).toEqual(1)
})
it('should not return revisions metadata for a an invalid item uuid', async () => {
const result = await createUseCase().execute({ itemUuid: '1-2-3' })
const result = await createUseCase().execute({
itemUuid: '1-2-3',
userUuid: '84c0f8e8-544a-4c7e-9adf-26209303bc1d',
})
expect(result.isFailed()).toBeTruthy()
})
it('should not return revisions metadata for a an invalid user uuid', async () => {
const result = await createUseCase().execute({
userUuid: '1-2-3',
itemUuid: '84c0f8e8-544a-4c7e-9adf-26209303bc1d',
})
expect(result.isFailed()).toBeTruthy()
})

View File

@@ -14,7 +14,15 @@ export class GetRevisionsMetada implements UseCaseInterface<RevisionMetadata[]>
return Result.fail<RevisionMetadata[]>(`Could not get revisions: ${itemUuidOrError.getError()}`)
}
const revisionsMetdata = await this.revisionRepository.findMetadataByItemId(itemUuidOrError.getValue())
const userUuidOrError = Uuid.create(dto.userUuid)
if (userUuidOrError.isFailed()) {
return Result.fail<RevisionMetadata[]>(`Could not get revisions: ${userUuidOrError.getError()}`)
}
const revisionsMetdata = await this.revisionRepository.findMetadataByItemId(
itemUuidOrError.getValue(),
userUuidOrError.getValue(),
)
return Result.ok<RevisionMetadata[]>(revisionsMetdata)
}

View File

@@ -1,3 +1,4 @@
export interface GetRevisionsMetadaDTO {
itemUuid: string
userUuid: string
}

View File

@@ -0,0 +1,21 @@
import { MapperInterface } from '@standardnotes/domain-core'
import { promises } from 'fs'
import { DumpRepositoryInterface } from '../../Domain/Dump/DumpRepositoryInterface'
import { Revision } from '../../Domain/Revision/Revision'
export class FSDumpRepository implements DumpRepositoryInterface {
constructor(private revisionStringItemMapper: MapperInterface<Revision, string>) {}
async getRevisionFromDumpPath(path: string): Promise<Revision | null> {
const contents = (await promises.readFile(path)).toString()
const revision = this.revisionStringItemMapper.toDomain(contents)
return revision
}
async removeDump(path: string): Promise<void> {
await promises.rm(path)
}
}

View File

@@ -1,3 +1,4 @@
export interface GetRevisionsMetadataRequestParams {
itemUuid: string
userUuid: string
}

View File

@@ -1,4 +1,4 @@
import { Request } from 'express'
import { Request, Response } from 'express'
import { BaseHttpController, controller, httpGet, results } from 'inversify-express-utils'
import { inject } from 'inversify'
@@ -12,9 +12,10 @@ export class InversifyExpressRevisionsController extends BaseHttpController {
}
@httpGet('/')
public async getRevisions(req: Request): Promise<results.JsonResult> {
public async getRevisions(req: Request, response: Response): Promise<results.JsonResult> {
const result = await this.revisionsController.getRevisions({
itemUuid: req.params.itemUuid,
userUuid: response.locals.user.uuid,
})
return this.json(result.data, result.status)

View File

@@ -21,16 +21,15 @@ export class MySQLRevisionRepository implements RevisionRepositoryInterface {
return revision
}
async findMetadataByItemId(itemUuid: Uuid): Promise<Array<RevisionMetadata>> {
async findMetadataByItemId(itemUuid: Uuid, userUuid: Uuid): Promise<Array<RevisionMetadata>> {
const queryBuilder = this.ormRepository
.createQueryBuilder()
.select('uuid', 'uuid')
.addSelect('content_type', 'contentType')
.addSelect('created_at', 'createdAt')
.addSelect('updated_at', 'updatedAt')
.where('item_uuid = :item_uuid', {
item_uuid: itemUuid,
})
.where('item_uuid = :itemUuid', { itemUuid })
.andWhere('user_uuid = :userUuid', { userUuid })
.orderBy('created_at', 'DESC')
const simplifiedRevisions = await queryBuilder.getMany()

View File

@@ -9,8 +9,16 @@ export class TypeORMRevision {
name: 'item_uuid',
length: 36,
})
@Index('item_uuid')
declare itemUuid: string
@Column({
name: 'user_uuid',
length: 36,
})
@Index('user_uuid')
declare userUuid: string
@Column({
type: 'mediumtext',
nullable: true,
@@ -53,7 +61,7 @@ export class TypeORMRevision {
type: 'date',
nullable: true,
})
@Index('index_revisions_on_creation_date')
@Index('creation_date')
declare creationDate: Date
@Column({
@@ -62,7 +70,7 @@ export class TypeORMRevision {
precision: 6,
nullable: true,
})
@Index('index_revisions_on_created_at')
@Index('created_at')
declare createdAt: Date
@Column({

View File

@@ -5,22 +5,29 @@ import { Revision } from '../Domain/Revision/Revision'
export class RevisionItemStringMapper implements MapperInterface<Revision, string> {
toDomain(projection: string): Revision {
const item = JSON.parse(projection)
const item = JSON.parse(projection).item
const contentTypeOrError = ContentType.create(item.content_type)
if (contentTypeOrError.isFailed()) {
throw new Error(`Could not map item string to revision: ${contentTypeOrError.getError()}`)
throw new Error(`Could not map item string to revision [content type]: ${contentTypeOrError.getError()}`)
}
const contentType = contentTypeOrError.getValue()
const itemUuidOrError = Uuid.create(item.uuid)
if (itemUuidOrError.isFailed()) {
throw new Error(`Could not map item string to revision: ${itemUuidOrError.getError()}`)
throw new Error(`Could not map item string to revision [item uuid]: ${itemUuidOrError.getError()}`)
}
const itemUuid = itemUuidOrError.getValue()
const userUuidOrError = Uuid.create(item.user_uuid)
if (userUuidOrError.isFailed()) {
throw new Error(`Could not map item string to revision [user uuid]: ${userUuidOrError.getError()}`)
}
const userUuid = userUuidOrError.getValue()
const revisionOrError = Revision.create({
itemUuid,
userUuid,
authHash: item.auth_hash,
content: item.content,
contentType,
@@ -31,7 +38,7 @@ export class RevisionItemStringMapper implements MapperInterface<Revision, strin
})
if (revisionOrError.isFailed()) {
throw new Error(`Could not map item string to revision: ${revisionOrError.getError()}`)
throw new Error(`Could not map item string to revision [revision]: ${revisionOrError.getError()}`)
}
return revisionOrError.getValue()

View File

@@ -23,6 +23,12 @@ export class RevisionPersistenceMapper implements MapperInterface<Revision, Type
}
const itemUuid = itemUuidOrError.getValue()
const userUuidOrError = Uuid.create(projection.userUuid)
if (userUuidOrError.isFailed()) {
throw new Error(`Could not map typeorm revision to domain revision: ${userUuidOrError.getError()}`)
}
const userUuid = userUuidOrError.getValue()
const revisionOrError = Revision.create(
{
authHash: projection.authHash,
@@ -32,6 +38,7 @@ export class RevisionPersistenceMapper implements MapperInterface<Revision, Type
encItemKey: projection.encItemKey,
itemsKeyId: projection.itemsKeyId,
itemUuid,
userUuid,
timestamps,
},
new UniqueEntityId(projection.uuid),
@@ -55,6 +62,7 @@ export class RevisionPersistenceMapper implements MapperInterface<Revision, Type
typeormRevision.encItemKey = domain.props.encItemKey
typeormRevision.itemUuid = domain.props.itemUuid.value
typeormRevision.itemsKeyId = domain.props.itemsKeyId
typeormRevision.userUuid = domain.props.userUuid.value
typeormRevision.uuid = domain.id.toString()
return typeormRevision

View File

@@ -3,6 +3,20 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.13.30](https://github.com/standardnotes/server/compare/@standardnotes/scheduler-server@1.13.29...@standardnotes/scheduler-server@1.13.30) (2022-11-24)
**Note:** Version bump only for package @standardnotes/scheduler-server
## [1.13.29](https://github.com/standardnotes/server/compare/@standardnotes/scheduler-server@1.13.28...@standardnotes/scheduler-server@1.13.29) (2022-11-23)
**Note:** Version bump only for package @standardnotes/scheduler-server
## [1.13.28](https://github.com/standardnotes/server/compare/@standardnotes/scheduler-server@1.13.27...@standardnotes/scheduler-server@1.13.28) (2022-11-23)
### Bug Fixes
* binding of sns and sqs with additional config ([74bc791](https://github.com/standardnotes/server/commit/74bc79116bc50d9a5af1a558db1b7108dcda6d0e))
## [1.13.27](https://github.com/standardnotes/server/compare/@standardnotes/scheduler-server@1.13.26...@standardnotes/scheduler-server@1.13.27) (2022-11-22)
**Note:** Version bump only for package @standardnotes/scheduler-server

View File

@@ -1,6 +1,6 @@
{
"name": "@standardnotes/scheduler-server",
"version": "1.13.27",
"version": "1.13.30",
"engines": {
"node": ">=18.0.0 <19.0.0"
},
@@ -24,7 +24,6 @@
"upgrade:snjs": "yarn ncu -u '@standardnotes/*'"
},
"dependencies": {
"@newrelic/native-metrics": "^9.0.0",
"@newrelic/winston-enricher": "^4.0.0",
"@sentry/node": "^7.19.0",
"@standardnotes/common": "workspace:*",
@@ -32,7 +31,7 @@
"@standardnotes/domain-events-infra": "workspace:*",
"@standardnotes/predicates": "workspace:*",
"@standardnotes/time": "workspace:*",
"aws-sdk": "^2.1253.0",
"aws-sdk": "^2.1260.0",
"dayjs": "^1.11.6",
"dotenv": "^16.0.1",
"inversify": "^6.0.1",

View File

@@ -74,13 +74,24 @@ export class ContainerConfigLoader {
})
container.bind<winston.Logger>(TYPES.Logger).toConstantValue(logger)
if (env.get('SNS_AWS_REGION', true)) {
container.bind<AWS.SNS>(TYPES.SNS).toConstantValue(
new AWS.SNS({
apiVersion: 'latest',
region: env.get('SNS_AWS_REGION', true),
}),
)
if (env.get('SNS_TOPIC_ARN', true)) {
const snsConfig: AWS.SNS.Types.ClientConfiguration = {
apiVersion: 'latest',
region: env.get('SNS_AWS_REGION', true),
}
if (env.get('SNS_ENDPOINT', true)) {
snsConfig.endpoint = env.get('SNS_ENDPOINT', true)
}
if (env.get('SNS_DISABLE_SSL', true) === 'true') {
snsConfig.sslEnabled = false
}
if (env.get('SNS_ACCESS_KEY_ID', true) && env.get('SNS_SECRET_ACCESS_KEY', true)) {
snsConfig.credentials = {
accessKeyId: env.get('SNS_ACCESS_KEY_ID', true),
secretAccessKey: env.get('SNS_SECRET_ACCESS_KEY', true),
}
}
container.bind<AWS.SNS>(TYPES.SNS).toConstantValue(new AWS.SNS(snsConfig))
}
if (env.get('SQS_QUEUE_URL', true)) {

View File

@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.18.4](https://github.com/standardnotes/server/compare/@standardnotes/settings@1.18.3...@standardnotes/settings@1.18.4) (2022-11-24)
**Note:** Version bump only for package @standardnotes/settings
## [1.18.3](https://github.com/standardnotes/server/compare/@standardnotes/settings@1.18.0...@standardnotes/settings@1.18.3) (2022-11-14)
### Bug Fixes

View File

@@ -1,6 +1,6 @@
{
"name": "@standardnotes/settings",
"version": "1.18.3",
"version": "1.18.4",
"engines": {
"node": ">=18.0.0 <19.0.0"
},
@@ -29,7 +29,6 @@
"typescript": "^4.8.4"
},
"dependencies": {
"@newrelic/native-metrics": "^9.0.0",
"reflect-metadata": "^0.1.13"
}
}

View File

@@ -42,3 +42,6 @@ NEW_RELIC_NO_CONFIG_FILE=true
NEW_RELIC_DISTRIBUTED_TRACING_ENABLED=false
NEW_RELIC_LOG_ENABLED=false
NEW_RELIC_LOG_LEVEL=info
# (Optional) Revision Dumps
FILE_UPLOAD_PATH=

View File

@@ -3,6 +3,70 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.18.10](https://github.com/standardnotes/syncing-server-js/compare/@standardnotes/syncing-server@1.18.9...@standardnotes/syncing-server@1.18.10) (2022-11-24)
**Note:** Version bump only for package @standardnotes/syncing-server
## [1.18.9](https://github.com/standardnotes/syncing-server-js/compare/@standardnotes/syncing-server@1.18.8...@standardnotes/syncing-server@1.18.9) (2022-11-24)
**Note:** Version bump only for package @standardnotes/syncing-server
## [1.18.8](https://github.com/standardnotes/syncing-server-js/compare/@standardnotes/syncing-server@1.18.7...@standardnotes/syncing-server@1.18.8) (2022-11-24)
**Note:** Version bump only for package @standardnotes/syncing-server
## [1.18.7](https://github.com/standardnotes/syncing-server-js/compare/@standardnotes/syncing-server@1.18.6...@standardnotes/syncing-server@1.18.7) (2022-11-23)
**Note:** Version bump only for package @standardnotes/syncing-server
## [1.18.6](https://github.com/standardnotes/syncing-server-js/compare/@standardnotes/syncing-server@1.18.5...@standardnotes/syncing-server@1.18.6) (2022-11-23)
### Bug Fixes
* binding of sns and sqs with additional config ([74bc791](https://github.com/standardnotes/syncing-server-js/commit/74bc79116bc50d9a5af1a558db1b7108dcda6d0e))
## [1.18.5](https://github.com/standardnotes/syncing-server-js/compare/@standardnotes/syncing-server@1.18.4...@standardnotes/syncing-server@1.18.5) (2022-11-22)
### Bug Fixes
* **syncing-server:** publish revision creation request only for notes and files ([3086625](https://github.com/standardnotes/syncing-server-js/commit/308662550f7da086a93cb47fd2d0f41cbec14159))
## [1.18.4](https://github.com/standardnotes/syncing-server-js/compare/@standardnotes/syncing-server@1.18.3...@standardnotes/syncing-server@1.18.4) (2022-11-22)
### Bug Fixes
* sns binding ([3686a26](https://github.com/standardnotes/syncing-server-js/commit/3686a260192468c00b52087590dd2edf76ada939))
## [1.18.3](https://github.com/standardnotes/syncing-server-js/compare/@standardnotes/syncing-server@1.18.2...@standardnotes/syncing-server@1.18.3) (2022-11-22)
### Bug Fixes
* sqs binding ([806a732](https://github.com/standardnotes/syncing-server-js/commit/806a732cbc92cd89deb9d9d2aa95565922ce6b72))
## [1.18.2](https://github.com/standardnotes/syncing-server-js/compare/@standardnotes/syncing-server@1.18.1...@standardnotes/syncing-server@1.18.2) (2022-11-22)
### Bug Fixes
* **syncing-server:** bring back creating revisions in syncing server for a transition period ([5f3bd51](https://github.com/standardnotes/syncing-server-js/commit/5f3bd5137f3a22330ea19fefff5f9310e9323044))
## [1.18.1](https://github.com/standardnotes/syncing-server-js/compare/@standardnotes/syncing-server@1.18.0...@standardnotes/syncing-server@1.18.1) (2022-11-22)
### Bug Fixes
* **syncing-server:** specs ([f7e0b68](https://github.com/standardnotes/syncing-server-js/commit/f7e0b68643df4027d274ed1e575cada62c6dbc25))
# [1.18.0](https://github.com/standardnotes/syncing-server-js/compare/@standardnotes/syncing-server@1.17.0...@standardnotes/syncing-server@1.18.0) (2022-11-22)
### Features
* **syncing-server:** add dump projection for revisions ([455f35e](https://github.com/standardnotes/syncing-server-js/commit/455f35e0c1ac811720b67592a9017a3470a7740c))
# [1.17.0](https://github.com/standardnotes/syncing-server-js/compare/@standardnotes/syncing-server@1.16.1...@standardnotes/syncing-server@1.17.0) (2022-11-22)
### Features
* **syncing-server:** add dumping backup items to filesystem ([97b367d](https://github.com/standardnotes/syncing-server-js/commit/97b367d4eee1e8bc2fcfd4a477e6fb1d19507c14))
## [1.16.1](https://github.com/standardnotes/syncing-server-js/compare/@standardnotes/syncing-server@1.16.0...@standardnotes/syncing-server@1.16.1) (2022-11-22)
**Note:** Version bump only for package @standardnotes/syncing-server

View File

@@ -1,6 +1,6 @@
{
"name": "@standardnotes/syncing-server",
"version": "1.16.1",
"version": "1.18.10",
"engines": {
"node": ">=18.0.0 <19.0.0"
},
@@ -25,7 +25,6 @@
"upgrade:snjs": "yarn ncu -u '@standardnotes/*'"
},
"dependencies": {
"@newrelic/native-metrics": "^9.0.0",
"@newrelic/winston-enricher": "^4.0.0",
"@sentry/node": "^7.19.0",
"@standardnotes/common": "workspace:*",
@@ -37,7 +36,7 @@
"@standardnotes/security": "workspace:*",
"@standardnotes/settings": "workspace:*",
"@standardnotes/time": "workspace:*",
"aws-sdk": "^2.1253.0",
"aws-sdk": "^2.1260.0",
"axios": "^1.1.3",
"cors": "2.8.5",
"dotenv": "^16.0.1",

View File

@@ -85,6 +85,7 @@ import { MapperInterface } from '@standardnotes/domain-core'
import { RevisionMetadata } from '../Domain/Revision/RevisionMetadata'
import { SimpleRevisionProjection } from '../Projection/SimpleRevisionProjection'
import { ItemRevisionCreationRequestedEventHandler } from '../Domain/Handler/ItemRevisionCreationRequestedEventHandler'
import { FSItemBackupService } from '../Infra/FS/FSItemBackupService'
// eslint-disable-next-line @typescript-eslint/no-var-requires
const newrelicFormatter = require('@newrelic/winston-enricher')
@@ -92,6 +93,7 @@ const newrelicFormatter = require('@newrelic/winston-enricher')
export class ContainerConfigLoader {
private readonly DEFAULT_CONTENT_SIZE_TRANSFER_LIMIT = 10_000_000
private readonly DEFAULT_MAX_ITEMS_LIMIT = 300
private readonly DEFAULT_FILE_UPLOAD_PATH = `${__dirname}/../../uploads`
async load(): Promise<Container> {
const env: Env = new Env()
@@ -125,22 +127,38 @@ export class ContainerConfigLoader {
})
container.bind<winston.Logger>(TYPES.Logger).toConstantValue(logger)
if (env.get('SNS_AWS_REGION', true)) {
container.bind<AWS.SNS>(TYPES.SNS).toConstantValue(
new AWS.SNS({
apiVersion: 'latest',
region: env.get('SNS_AWS_REGION', true),
}),
)
if (env.get('SNS_TOPIC_ARN', true)) {
const snsConfig: AWS.SNS.Types.ClientConfiguration = {
apiVersion: 'latest',
region: env.get('SNS_AWS_REGION', true),
}
if (env.get('SNS_ENDPOINT', true)) {
snsConfig.endpoint = env.get('SNS_ENDPOINT', true)
}
if (env.get('SNS_DISABLE_SSL', true) === 'true') {
snsConfig.sslEnabled = false
}
if (env.get('SNS_ACCESS_KEY_ID', true) && env.get('SNS_SECRET_ACCESS_KEY', true)) {
snsConfig.credentials = {
accessKeyId: env.get('SNS_ACCESS_KEY_ID', true),
secretAccessKey: env.get('SNS_SECRET_ACCESS_KEY', true),
}
}
container.bind<AWS.SNS>(TYPES.SNS).toConstantValue(new AWS.SNS(snsConfig))
}
if (env.get('SQS_AWS_REGION', true)) {
container.bind<AWS.SQS>(TYPES.SQS).toConstantValue(
new AWS.SQS({
apiVersion: 'latest',
region: env.get('SQS_AWS_REGION', true),
}),
)
if (env.get('SQS_QUEUE_URL', true)) {
const sqsConfig: AWS.SQS.Types.ClientConfiguration = {
apiVersion: 'latest',
region: env.get('SQS_AWS_REGION', true),
}
if (env.get('SQS_ACCESS_KEY_ID', true) && env.get('SQS_SECRET_ACCESS_KEY', true)) {
sqsConfig.credentials = {
accessKeyId: env.get('SQS_ACCESS_KEY_ID', true),
secretAccessKey: env.get('SQS_SECRET_ACCESS_KEY', true),
}
}
container.bind<AWS.SQS>(TYPES.SQS).toConstantValue(new AWS.SQS(sqsConfig))
}
let s3Client = undefined
@@ -203,6 +221,11 @@ export class ContainerConfigLoader {
.toConstantValue(
env.get('MAX_ITEMS_LIMIT', true) ? +env.get('MAX_ITEMS_LIMIT', true) : this.DEFAULT_MAX_ITEMS_LIMIT,
)
container
.bind(TYPES.FILE_UPLOAD_PATH)
.toConstantValue(
env.get('FILE_UPLOAD_PATH', true) ? env.get('FILE_UPLOAD_PATH', true) : this.DEFAULT_FILE_UPLOAD_PATH,
)
// use cases
container.bind<SyncItems>(TYPES.SyncItems).to(SyncItems)
@@ -252,7 +275,11 @@ export class ContainerConfigLoader {
.to(SyncResponseFactoryResolver)
container.bind<AuthHttpServiceInterface>(TYPES.AuthHttpService).to(AuthHttpService)
container.bind<ExtensionsHttpServiceInterface>(TYPES.ExtensionsHttpService).to(ExtensionsHttpService)
container.bind<ItemBackupServiceInterface>(TYPES.ItemBackupService).to(S3ItemBackupService)
if (env.get('S3_AWS_REGION', true)) {
container.bind<ItemBackupServiceInterface>(TYPES.ItemBackupService).to(S3ItemBackupService)
} else {
container.bind<ItemBackupServiceInterface>(TYPES.ItemBackupService).to(FSItemBackupService)
}
container.bind<RevisionServiceInterface>(TYPES.RevisionService).to(RevisionService)
if (env.get('SNS_TOPIC_ARN', true)) {

View File

@@ -37,6 +37,7 @@ const TYPES = {
VERSION: Symbol.for('VERSION'),
CONTENT_SIZE_TRANSFER_LIMIT: Symbol.for('CONTENT_SIZE_TRANSFER_LIMIT'),
MAX_ITEMS_LIMIT: Symbol.for('MAX_ITEMS_LIMIT'),
FILE_UPLOAD_PATH: Symbol.for('FILE_UPLOAD_PATH'),
// use cases
SyncItems: Symbol.for('SyncItems'),
CheckIntegrity: Symbol.for('CheckIntegrity'),

View File

@@ -17,6 +17,7 @@ import { ItemConflict } from './ItemConflict'
import { ItemTransferCalculatorInterface } from './ItemTransferCalculatorInterface'
import { ProjectorInterface } from '../../Projection/ProjectorInterface'
import { ItemProjection } from '../../Projection/ItemProjection'
import { RevisionServiceInterface } from '../Revision/RevisionServiceInterface'
describe('ItemService', () => {
let itemRepository: ItemRepositoryInterface
@@ -38,6 +39,7 @@ describe('ItemService', () => {
let timeHelper: Timer
let itemTransferCalculator: ItemTransferCalculatorInterface
let itemProjector: ProjectorInterface<Item, ItemProjection>
let revisionService: RevisionServiceInterface
const maxItemsSyncLimit = 300
const createService = () =>
@@ -45,6 +47,7 @@ describe('ItemService', () => {
itemSaveValidator,
itemFactory,
itemRepository,
revisionService,
domainEventPublisher,
domainEventFactory,
revisionFrequency,
@@ -122,6 +125,9 @@ describe('ItemService', () => {
itemRepository.countAll = jest.fn().mockReturnValue(2)
itemRepository.save = jest.fn().mockImplementation((item: Item) => item)
revisionService = {} as jest.Mocked<RevisionServiceInterface>
revisionService.createRevision = jest.fn()
timer = {} as jest.Mocked<TimerInterface>
timer.getTimestampInMicroseconds = jest.fn().mockReturnValue(1616164633241568)
timer.getUTCDate = jest.fn().mockReturnValue(new Date())
@@ -152,7 +158,9 @@ describe('ItemService', () => {
itemSaveValidator = {} as jest.Mocked<ItemSaveValidatorInterface>
itemSaveValidator.validate = jest.fn().mockReturnValue({ passed: true })
newItem = {} as jest.Mocked<Item>
newItem = {
contentType: ContentType.Note,
} as jest.Mocked<Item>
itemFactory = {} as jest.Mocked<ItemFactoryInterface>
itemFactory.create = jest.fn().mockReturnValue(newItem)
@@ -515,7 +523,11 @@ describe('ItemService', () => {
it('should save new items that are duplicates', async () => {
itemRepository.findByUuid = jest.fn().mockReturnValue(null)
const duplicateItem = { updatedAtTimestamp: 1616164633241570, duplicateOf: '1-2-3' } as jest.Mocked<Item>
const duplicateItem = {
updatedAtTimestamp: 1616164633241570,
duplicateOf: '1-2-3',
contentType: ContentType.Note,
} as jest.Mocked<Item>
itemFactory.create = jest.fn().mockReturnValueOnce(duplicateItem)
const result = await createService().saveItems({

View File

@@ -22,6 +22,7 @@ import { ConflictType } from '@standardnotes/responses'
import { ItemTransferCalculatorInterface } from './ItemTransferCalculatorInterface'
import { ProjectorInterface } from '../../Projection/ProjectorInterface'
import { ItemProjection } from '../../Projection/ItemProjection'
import { RevisionServiceInterface } from '../Revision/RevisionServiceInterface'
@injectable()
export class ItemService implements ItemServiceInterface {
@@ -32,6 +33,7 @@ export class ItemService implements ItemServiceInterface {
@inject(TYPES.ItemSaveValidator) private itemSaveValidator: ItemSaveValidatorInterface,
@inject(TYPES.ItemFactory) private itemFactory: ItemFactoryInterface,
@inject(TYPES.ItemRepository) private itemRepository: ItemRepositoryInterface,
@inject(TYPES.RevisionService) private revisionService: RevisionServiceInterface,
@inject(TYPES.DomainEventPublisher) private domainEventPublisher: DomainEventPublisherInterface,
@inject(TYPES.DomainEventFactory) private domainEventFactory: DomainEventFactoryInterface,
@inject(TYPES.REVISIONS_FREQUENCY) private revisionFrequency: number,
@@ -251,9 +253,13 @@ export class ItemService implements ItemServiceInterface {
const savedItem = await this.itemRepository.save(dto.existingItem)
if (secondsFromLastUpdate >= this.revisionFrequency) {
await this.domainEventPublisher.publish(
this.domainEventFactory.createItemRevisionCreationRequested(savedItem.uuid, savedItem.userUuid),
)
await this.revisionService.createRevision(savedItem)
if ([ContentType.Note, ContentType.File].includes(savedItem.contentType as ContentType)) {
await this.domainEventPublisher.publish(
this.domainEventFactory.createItemRevisionCreationRequested(savedItem.uuid, savedItem.userUuid),
)
}
}
if (wasMarkedAsDuplicate) {
@@ -270,9 +276,13 @@ export class ItemService implements ItemServiceInterface {
const savedItem = await this.itemRepository.save(newItem)
await this.domainEventPublisher.publish(
this.domainEventFactory.createItemRevisionCreationRequested(savedItem.uuid, savedItem.userUuid),
)
await this.revisionService.createRevision(savedItem)
if ([ContentType.Note, ContentType.File].includes(savedItem.contentType as ContentType)) {
await this.domainEventPublisher.publish(
this.domainEventFactory.createItemRevisionCreationRequested(savedItem.uuid, savedItem.userUuid),
)
}
if (savedItem.duplicateOf) {
await this.domainEventPublisher.publish(

View File

@@ -0,0 +1,34 @@
import { KeyParamsData } from '@standardnotes/responses'
import { promises } from 'fs'
import * as uuid from 'uuid'
import { inject, injectable } from 'inversify'
import TYPES from '../../Bootstrap/Types'
import { Item } from '../../Domain/Item/Item'
import { ItemBackupServiceInterface } from '../../Domain/Item/ItemBackupServiceInterface'
import { ItemProjection } from '../../Projection/ItemProjection'
import { ProjectorInterface } from '../../Projection/ProjectorInterface'
@injectable()
export class FSItemBackupService implements ItemBackupServiceInterface {
constructor(
@inject(TYPES.FILE_UPLOAD_PATH) private fileUploadPath: string,
@inject(TYPES.ItemProjector) private itemProjector: ProjectorInterface<Item, ItemProjection>,
) {}
async backup(_items: Item[], _authParams: KeyParamsData): Promise<string> {
throw new Error('Method not implemented.')
}
async dump(item: Item): Promise<string> {
const contents = JSON.stringify({
item: await this.itemProjector.projectCustom('dump', item),
})
const path = `${this.fileUploadPath}/dumps/${uuid.v4()}`
await promises.writeFile(path, contents)
return path
}
}

View File

@@ -31,7 +31,7 @@ export class S3ItemBackupService implements ItemBackupServiceInterface {
Bucket: this.s3BackupBucketName,
Key: uuid.v4(),
Body: JSON.stringify({
item: await this.itemProjector.projectFull(item),
item: await this.itemProjector.projectCustom('dump', item),
}),
})
.promise()

View File

@@ -0,0 +1,5 @@
import { ItemProjection } from './ItemProjection'
export type ItemProjectionWithUser = ItemProjection & {
user_uuid: string
}

View File

@@ -27,6 +27,7 @@ describe('ItemProjector', () => {
item.createdAtTimestamp = 123
item.updatedAtTimestamp = 123
item.updatedWithSession = '7-6-5'
item.userUuid = 'u1-2-3'
})
it('should create a full projection of an item', async () => {
@@ -45,14 +46,21 @@ describe('ItemProjector', () => {
})
})
it('should throw error on custom projection', async () => {
let error = null
try {
await createProjector().projectCustom('test', item)
} catch (e) {
error = e
}
expect((error as Error).message).toEqual('not implemented')
it('should create a custom projection of an item', async () => {
expect(await createProjector().projectCustom('dump', item)).toMatchObject({
uuid: '1-2-3',
items_key_id: '2-3-4',
duplicate_of: null,
enc_item_key: '3-4-5',
content: 'test',
content_type: 'Note',
auth_hash: 'asd',
deleted: false,
created_at: '2021-04-15T08:00:00.123456Z',
updated_at: '2021-04-15T08:00:00.123456Z',
updated_with_session: '7-6-5',
user_uuid: 'u1-2-3',
})
})
it('should throw error on simple projection', async () => {

View File

@@ -5,6 +5,7 @@ import { ProjectorInterface } from './ProjectorInterface'
import { Item } from '../Domain/Item/Item'
import { ItemProjection } from './ItemProjection'
import { ItemProjectionWithUser } from './ItemProjectionWithUser'
@injectable()
export class ItemProjector implements ProjectorInterface<Item, ItemProjection> {
@@ -14,8 +15,13 @@ export class ItemProjector implements ProjectorInterface<Item, ItemProjection> {
throw Error('not implemented')
}
async projectCustom(_projectionType: string, _item: Item): Promise<ItemProjection> {
throw Error('not implemented')
async projectCustom(_projectionType: string, item: Item): Promise<ItemProjectionWithUser> {
const fullProjection = await this.projectFull(item)
return {
...fullProjection,
user_uuid: item.userUuid,
}
}
async projectFull(item: Item): Promise<ItemProjection> {

View File

@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.4.30](https://github.com/standardnotes/server/compare/@standardnotes/websockets-server@1.4.29...@standardnotes/websockets-server@1.4.30) (2022-11-24)
**Note:** Version bump only for package @standardnotes/websockets-server
## [1.4.29](https://github.com/standardnotes/server/compare/@standardnotes/websockets-server@1.4.28...@standardnotes/websockets-server@1.4.29) (2022-11-23)
**Note:** Version bump only for package @standardnotes/websockets-server
## [1.4.28](https://github.com/standardnotes/server/compare/@standardnotes/websockets-server@1.4.27...@standardnotes/websockets-server@1.4.28) (2022-11-22)
**Note:** Version bump only for package @standardnotes/websockets-server

View File

@@ -1,6 +1,6 @@
{
"name": "@standardnotes/websockets-server",
"version": "1.4.28",
"version": "1.4.30",
"engines": {
"node": ">=18.0.0 <19.0.0"
},
@@ -22,7 +22,6 @@
"typeorm": "typeorm-ts-node-commonjs"
},
"dependencies": {
"@newrelic/native-metrics": "^9.0.0",
"@newrelic/winston-enricher": "^4.0.0",
"@sentry/node": "^7.19.0",
"@standardnotes/api": "^1.19.0",
@@ -30,7 +29,7 @@
"@standardnotes/domain-events": "workspace:^",
"@standardnotes/domain-events-infra": "workspace:^",
"@standardnotes/security": "workspace:^",
"aws-sdk": "^2.1253.0",
"aws-sdk": "^2.1260.0",
"axios": "^1.1.3",
"cors": "2.8.5",
"dotenv": "^16.0.1",

View File

@@ -3,6 +3,20 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.17.29](https://github.com/standardnotes/server/compare/@standardnotes/workspace-server@1.17.28...@standardnotes/workspace-server@1.17.29) (2022-11-24)
**Note:** Version bump only for package @standardnotes/workspace-server
## [1.17.28](https://github.com/standardnotes/server/compare/@standardnotes/workspace-server@1.17.27...@standardnotes/workspace-server@1.17.28) (2022-11-23)
**Note:** Version bump only for package @standardnotes/workspace-server
## [1.17.27](https://github.com/standardnotes/server/compare/@standardnotes/workspace-server@1.17.26...@standardnotes/workspace-server@1.17.27) (2022-11-23)
### Bug Fixes
* binding of sns and sqs with additional config ([74bc791](https://github.com/standardnotes/server/commit/74bc79116bc50d9a5af1a558db1b7108dcda6d0e))
## [1.17.26](https://github.com/standardnotes/server/compare/@standardnotes/workspace-server@1.17.25...@standardnotes/workspace-server@1.17.26) (2022-11-22)
**Note:** Version bump only for package @standardnotes/workspace-server

View File

@@ -1,6 +1,6 @@
{
"name": "@standardnotes/workspace-server",
"version": "1.17.26",
"version": "1.17.29",
"engines": {
"node": ">=18.0.0 <19.0.0"
},
@@ -22,7 +22,6 @@
"typeorm": "typeorm-ts-node-commonjs"
},
"dependencies": {
"@newrelic/native-metrics": "^9.0.0",
"@newrelic/winston-enricher": "^4.0.0",
"@sentry/node": "^7.19.0",
"@standardnotes/api": "^1.19.0",
@@ -32,7 +31,7 @@
"@standardnotes/models": "^1.26.0",
"@standardnotes/security": "workspace:*",
"@standardnotes/time": "workspace:^",
"aws-sdk": "^2.1253.0",
"aws-sdk": "^2.1260.0",
"cors": "2.8.5",
"dotenv": "^16.0.1",
"express": "^4.18.2",

View File

@@ -84,13 +84,24 @@ export class ContainerConfigLoader {
})
container.bind<winston.Logger>(TYPES.Logger).toConstantValue(logger)
if (env.get('SNS_AWS_REGION', true)) {
container.bind<AWS.SNS>(TYPES.SNS).toConstantValue(
new AWS.SNS({
apiVersion: 'latest',
region: env.get('SNS_AWS_REGION', true),
}),
)
if (env.get('SNS_TOPIC_ARN', true)) {
const snsConfig: AWS.SNS.Types.ClientConfiguration = {
apiVersion: 'latest',
region: env.get('SNS_AWS_REGION', true),
}
if (env.get('SNS_ENDPOINT', true)) {
snsConfig.endpoint = env.get('SNS_ENDPOINT', true)
}
if (env.get('SNS_DISABLE_SSL', true) === 'true') {
snsConfig.sslEnabled = false
}
if (env.get('SNS_ACCESS_KEY_ID', true) && env.get('SNS_SECRET_ACCESS_KEY', true)) {
snsConfig.credentials = {
accessKeyId: env.get('SNS_ACCESS_KEY_ID', true),
secretAccessKey: env.get('SNS_SECRET_ACCESS_KEY', true),
}
}
container.bind<AWS.SNS>(TYPES.SNS).toConstantValue(new AWS.SNS(snsConfig))
}
if (env.get('SQS_QUEUE_URL', true)) {

View File

@@ -1792,7 +1792,6 @@ __metadata:
version: 0.0.0-use.local
resolution: "@standardnotes/analytics@workspace:packages/analytics"
dependencies:
"@newrelic/native-metrics": "npm:^9.0.0"
"@newrelic/winston-enricher": "npm:^4.0.0"
"@sentry/node": "npm:^7.19.0"
"@standardnotes/common": "workspace:*"
@@ -1805,7 +1804,7 @@ __metadata:
"@types/newrelic": "npm:^7.0.4"
"@types/node": "npm:^18.11.9"
"@typescript-eslint/eslint-plugin": "npm:^5.30.0"
aws-sdk: "npm:^2.1253.0"
aws-sdk: "npm:^2.1260.0"
dayjs: "npm:^1.11.6"
dotenv: "npm:^16.0.1"
eslint: "npm:^8.14.0"
@@ -1827,7 +1826,6 @@ __metadata:
version: 0.0.0-use.local
resolution: "@standardnotes/api-gateway@workspace:packages/api-gateway"
dependencies:
"@newrelic/native-metrics": "npm:^9.0.0"
"@newrelic/winston-enricher": "npm:^4.0.0"
"@sentry/node": "npm:^7.19.0"
"@standardnotes/common": "workspace:^"
@@ -1843,7 +1841,7 @@ __metadata:
"@types/newrelic": "npm:^7.0.4"
"@types/prettyjson": "npm:^0.0.30"
"@typescript-eslint/eslint-plugin": "npm:^5.29.0"
aws-sdk: "npm:^2.1253.0"
aws-sdk: "npm:^2.1260.0"
axios: "npm:^1.1.3"
cors: "npm:2.8.5"
dotenv: "npm:^16.0.1"
@@ -1886,7 +1884,6 @@ __metadata:
version: 0.0.0-use.local
resolution: "@standardnotes/auth-server@workspace:packages/auth"
dependencies:
"@newrelic/native-metrics": "npm:^9.0.0"
"@newrelic/winston-enricher": "npm:^4.0.0"
"@sentry/node": "npm:^7.19.0"
"@standardnotes/api": "npm:^1.19.0"
@@ -1912,7 +1909,7 @@ __metadata:
"@types/ua-parser-js": "npm:^0.7.36"
"@types/uuid": "npm:^8.3.0"
"@typescript-eslint/eslint-plugin": "npm:^5.29.0"
aws-sdk: "npm:^2.1253.0"
aws-sdk: "npm:^2.1260.0"
axios: "npm:^1.1.3"
bcryptjs: "npm:2.4.3"
cors: "npm:2.8.5"
@@ -2004,13 +2001,12 @@ __metadata:
version: 0.0.0-use.local
resolution: "@standardnotes/domain-events-infra@workspace:packages/domain-events-infra"
dependencies:
"@newrelic/native-metrics": "npm:^9.0.0"
"@standardnotes/domain-events": "workspace:*"
"@types/ioredis": "npm:^5.0.0"
"@types/jest": "npm:^29.1.1"
"@types/newrelic": "npm:^7.0.4"
"@typescript-eslint/eslint-plugin": "npm:^5.30.0"
aws-sdk: "npm:^2.1253.0"
aws-sdk: "npm:^2.1260.0"
eslint-plugin-prettier: "npm:^4.2.1"
ioredis: "npm:^5.2.4"
jest: "npm:^29.1.2"
@@ -2059,7 +2055,6 @@ __metadata:
version: 0.0.0-use.local
resolution: "@standardnotes/event-store@workspace:packages/event-store"
dependencies:
"@newrelic/native-metrics": "npm:^9.0.0"
"@standardnotes/domain-events": "workspace:*"
"@standardnotes/domain-events-infra": "workspace:*"
"@standardnotes/time": "workspace:*"
@@ -2068,7 +2063,7 @@ __metadata:
"@types/newrelic": "npm:^7.0.4"
"@types/nodemailer": "npm:^6.4.1"
"@typescript-eslint/eslint-plugin": "npm:^5.40.1"
aws-sdk: "npm:^2.1253.0"
aws-sdk: "npm:^2.1260.0"
dotenv: "npm:^16.0.1"
eslint: "npm:^8.14.0"
eslint-plugin-prettier: "npm:^4.2.1"
@@ -2113,7 +2108,6 @@ __metadata:
version: 0.0.0-use.local
resolution: "@standardnotes/files-server@workspace:packages/files"
dependencies:
"@newrelic/native-metrics": "npm:^9.0.0"
"@sentry/node": "npm:^7.19.0"
"@standardnotes/common": "workspace:*"
"@standardnotes/config": "npm:2.4.3"
@@ -2133,7 +2127,7 @@ __metadata:
"@types/prettyjson": "npm:^0.0.30"
"@types/uuid": "npm:^8.3.0"
"@typescript-eslint/eslint-plugin": "npm:^5.29.0"
aws-sdk: "npm:^2.1253.0"
aws-sdk: "npm:^2.1260.0"
connect-busboy: "npm:^1.0.0"
cors: "npm:^2.8.5"
dayjs: "npm:^1.11.6"
@@ -2243,7 +2237,6 @@ __metadata:
version: 0.0.0-use.local
resolution: "@standardnotes/revisions-server@workspace:packages/revisions"
dependencies:
"@newrelic/native-metrics": "npm:^9.0.0"
"@newrelic/winston-enricher": "npm:^4.0.0"
"@sentry/node": "npm:^7.19.0"
"@standardnotes/api": "npm:^1.19.0"
@@ -2261,7 +2254,7 @@ __metadata:
"@types/jest": "npm:^29.1.1"
"@types/newrelic": "npm:^7.0.4"
"@typescript-eslint/eslint-plugin": "npm:^5.29.0"
aws-sdk: "npm:^2.1253.0"
aws-sdk: "npm:^2.1260.0"
cors: "npm:2.8.5"
dotenv: "npm:^16.0.1"
eslint: "npm:^8.14.0"
@@ -2287,7 +2280,6 @@ __metadata:
version: 0.0.0-use.local
resolution: "@standardnotes/scheduler-server@workspace:packages/scheduler"
dependencies:
"@newrelic/native-metrics": "npm:^9.0.0"
"@newrelic/winston-enricher": "npm:^4.0.0"
"@sentry/node": "npm:^7.19.0"
"@standardnotes/common": "workspace:*"
@@ -2300,7 +2292,7 @@ __metadata:
"@types/newrelic": "npm:^7.0.4"
"@types/node": "npm:^18.11.9"
"@typescript-eslint/eslint-plugin": "npm:^5.29.0"
aws-sdk: "npm:^2.1253.0"
aws-sdk: "npm:^2.1260.0"
dayjs: "npm:^1.11.6"
dotenv: "npm:^16.0.1"
eslint: "npm:^8.14.0"
@@ -2345,7 +2337,6 @@ __metadata:
"@lerna-lite/cli": "npm:^1.5.1"
"@lerna-lite/list": "npm:^1.5.1"
"@lerna-lite/run": "npm:^1.5.1"
"@newrelic/native-metrics": "npm:^9.0.0"
"@sentry/node": "npm:^7.19.0"
"@types/jest": "npm:^29.1.1"
"@types/newrelic": "npm:^7.0.4"
@@ -2366,7 +2357,6 @@ __metadata:
version: 0.0.0-use.local
resolution: "@standardnotes/settings@workspace:packages/settings"
dependencies:
"@newrelic/native-metrics": "npm:^9.0.0"
"@typescript-eslint/eslint-plugin": "npm:^5.30.0"
eslint-plugin-prettier: "npm:^4.2.1"
reflect-metadata: "npm:^0.1.13"
@@ -2405,7 +2395,6 @@ __metadata:
version: 0.0.0-use.local
resolution: "@standardnotes/syncing-server@workspace:packages/syncing-server"
dependencies:
"@newrelic/native-metrics": "npm:^9.0.0"
"@newrelic/winston-enricher": "npm:^4.0.0"
"@sentry/node": "npm:^7.19.0"
"@standardnotes/common": "workspace:*"
@@ -2429,7 +2418,7 @@ __metadata:
"@types/ua-parser-js": "npm:^0.7.36"
"@types/uuid": "npm:^8.3.0"
"@typescript-eslint/eslint-plugin": "npm:^5.29.0"
aws-sdk: "npm:^2.1253.0"
aws-sdk: "npm:^2.1260.0"
axios: "npm:^1.1.3"
cors: "npm:2.8.5"
dotenv: "npm:^16.0.1"
@@ -2502,7 +2491,6 @@ __metadata:
version: 0.0.0-use.local
resolution: "@standardnotes/websockets-server@workspace:packages/websockets"
dependencies:
"@newrelic/native-metrics": "npm:^9.0.0"
"@newrelic/winston-enricher": "npm:^4.0.0"
"@sentry/node": "npm:^7.19.0"
"@standardnotes/api": "npm:^1.19.0"
@@ -2516,7 +2504,7 @@ __metadata:
"@types/jest": "npm:^29.1.1"
"@types/newrelic": "npm:^7.0.4"
"@typescript-eslint/eslint-plugin": "npm:^5.29.0"
aws-sdk: "npm:^2.1253.0"
aws-sdk: "npm:^2.1260.0"
axios: "npm:^1.1.3"
cors: "npm:2.8.5"
dotenv: "npm:^16.0.1"
@@ -2541,7 +2529,6 @@ __metadata:
version: 0.0.0-use.local
resolution: "@standardnotes/workspace-server@workspace:packages/workspace"
dependencies:
"@newrelic/native-metrics": "npm:^9.0.0"
"@newrelic/winston-enricher": "npm:^4.0.0"
"@sentry/node": "npm:^7.19.0"
"@standardnotes/api": "npm:^1.19.0"
@@ -2557,7 +2544,7 @@ __metadata:
"@types/jest": "npm:^29.1.1"
"@types/newrelic": "npm:^7.0.4"
"@typescript-eslint/eslint-plugin": "npm:^5.29.0"
aws-sdk: "npm:^2.1253.0"
aws-sdk: "npm:^2.1260.0"
cors: "npm:2.8.5"
dotenv: "npm:^16.0.1"
eslint: "npm:^8.14.0"
@@ -3580,9 +3567,9 @@ __metadata:
languageName: node
linkType: hard
"aws-sdk@npm:^2.1253.0":
version: 2.1253.0
resolution: "aws-sdk@npm:2.1253.0"
"aws-sdk@npm:^2.1260.0":
version: 2.1260.0
resolution: "aws-sdk@npm:2.1260.0"
dependencies:
buffer: "npm:4.9.2"
events: "npm:1.1.1"
@@ -3594,7 +3581,7 @@ __metadata:
util: "npm:^0.12.4"
uuid: "npm:8.0.0"
xml2js: "npm:0.4.19"
checksum: faa4af29491f175158b14b58ead3bcc0f84c440300033f49846119f59dc26117b4dad0040a7eef3b12a94a31876913ce2b998c4cfdb103b908e38c52fee52c83
checksum: 9a1b2e4cb5fea2dad4b02c4ae25e68f85c4f952c19d13bd816ad76f6fdde808ca0a6e56e372002e876fbdc34d55d3c6b9b68d788fd7c915b94d40fbf216c6ba0
languageName: node
linkType: hard