mirror of
https://github.com/standardnotes/server
synced 2026-04-22 00:01:46 -04:00
Compare commits
70 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 02639cddb2 | |||
| 0f67aa4058 | |||
| 78c3403d5f | |||
| fc8f8c574d | |||
| 3972ee580d | |||
| b0a994d5be | |||
| 80df28a0c4 | |||
| 1c6c6a9296 | |||
| 7bb698e442 | |||
| 784728cd54 | |||
| 4b883b68de | |||
| dec2cc2aaf | |||
| b4e8971ad2 | |||
| 84e436265e | |||
| ac8a69f8d4 | |||
| b912e050ea | |||
| 284561d093 | |||
| efc355982c | |||
| 8907879a19 | |||
| 86f6057207 | |||
| 4c92698c73 | |||
| 8407c3b649 | |||
| ed8f82617d | |||
| 31d040d1b6 | |||
| 25a6796e63 | |||
| ff091918aa | |||
| 91b76edce1 | |||
| 5ae5c83bf5 | |||
| 9d90f276de | |||
| 245f091e22 | |||
| ae2f8f086b | |||
| 5e5eb7f937 | |||
| 748630e1f1 | |||
| 43064c8c55 | |||
| 4559a3047c | |||
| de8064ee5c | |||
| 48c8dba342 | |||
| 31a515b2f1 | |||
| 294f56e189 | |||
| 70596a0aac | |||
| 74bc79116b | |||
| e6bd50ae77 | |||
| 308662550f | |||
| d94a7e7157 | |||
| 630b264754 | |||
| 5f2be44b85 | |||
| f68ece68af | |||
| 70c829a2c9 | |||
| e3b6ac4874 | |||
| a762d5a22c | |||
| 3686a26019 | |||
| 80daec748d | |||
| 94359f1299 | |||
| 59dda1bb99 | |||
| 806a732cbc | |||
| 7816be7ba7 | |||
| 5f3bd5137f | |||
| 6c9fc5fb86 | |||
| f7e0b68643 | |||
| b283bbaca9 | |||
| 92ba759b1c | |||
| 0acc9d8d68 | |||
| daa7a9ff61 | |||
| 455f35e0c1 | |||
| 1fa655b56e | |||
| e553222b4b | |||
| f1b6f48926 | |||
| 14ab1cae69 | |||
| 5f9cf90b16 | |||
| 97b367d4ee |
@@ -126,7 +126,6 @@ const RAW_RUNTIME_STATE =
|
|||||||
["@lerna-lite/cli", "npm:1.6.0"],\
|
["@lerna-lite/cli", "npm:1.6.0"],\
|
||||||
["@lerna-lite/list", "npm:1.6.0"],\
|
["@lerna-lite/list", "npm:1.6.0"],\
|
||||||
["@lerna-lite/run", "npm:1.6.0"],\
|
["@lerna-lite/run", "npm:1.6.0"],\
|
||||||
["@newrelic/native-metrics", "npm:9.0.0"],\
|
|
||||||
["@sentry/node", "npm:7.19.0"],\
|
["@sentry/node", "npm:7.19.0"],\
|
||||||
["@types/jest", "npm:29.1.1"],\
|
["@types/jest", "npm:29.1.1"],\
|
||||||
["@types/newrelic", "npm:7.0.4"],\
|
["@types/newrelic", "npm:7.0.4"],\
|
||||||
@@ -2538,7 +2537,6 @@ const RAW_RUNTIME_STATE =
|
|||||||
"packageLocation": "./packages/analytics/",\
|
"packageLocation": "./packages/analytics/",\
|
||||||
"packageDependencies": [\
|
"packageDependencies": [\
|
||||||
["@standardnotes/analytics", "workspace:packages/analytics"],\
|
["@standardnotes/analytics", "workspace:packages/analytics"],\
|
||||||
["@newrelic/native-metrics", "npm:9.0.0"],\
|
|
||||||
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
|
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
|
||||||
["@sentry/node", "npm:7.19.0"],\
|
["@sentry/node", "npm:7.19.0"],\
|
||||||
["@standardnotes/common", "workspace:packages/common"],\
|
["@standardnotes/common", "workspace:packages/common"],\
|
||||||
@@ -2551,7 +2549,7 @@ const RAW_RUNTIME_STATE =
|
|||||||
["@types/newrelic", "npm:7.0.4"],\
|
["@types/newrelic", "npm:7.0.4"],\
|
||||||
["@types/node", "npm:18.11.9"],\
|
["@types/node", "npm:18.11.9"],\
|
||||||
["@typescript-eslint/eslint-plugin", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:5.30.5"],\
|
["@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"],\
|
["dayjs", "npm:1.11.6"],\
|
||||||
["dotenv", "npm:16.0.1"],\
|
["dotenv", "npm:16.0.1"],\
|
||||||
["eslint", "npm:8.25.0"],\
|
["eslint", "npm:8.25.0"],\
|
||||||
@@ -2591,7 +2589,6 @@ const RAW_RUNTIME_STATE =
|
|||||||
"packageLocation": "./packages/api-gateway/",\
|
"packageLocation": "./packages/api-gateway/",\
|
||||||
"packageDependencies": [\
|
"packageDependencies": [\
|
||||||
["@standardnotes/api-gateway", "workspace:packages/api-gateway"],\
|
["@standardnotes/api-gateway", "workspace:packages/api-gateway"],\
|
||||||
["@newrelic/native-metrics", "npm:9.0.0"],\
|
|
||||||
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
|
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
|
||||||
["@sentry/node", "npm:7.19.0"],\
|
["@sentry/node", "npm:7.19.0"],\
|
||||||
["@standardnotes/common", "workspace:packages/common"],\
|
["@standardnotes/common", "workspace:packages/common"],\
|
||||||
@@ -2607,7 +2604,7 @@ const RAW_RUNTIME_STATE =
|
|||||||
["@types/newrelic", "npm:7.0.4"],\
|
["@types/newrelic", "npm:7.0.4"],\
|
||||||
["@types/prettyjson", "npm:0.0.30"],\
|
["@types/prettyjson", "npm:0.0.30"],\
|
||||||
["@typescript-eslint/eslint-plugin", "virtual:04783e12400851b8a3d76e71495851cc94959db6e62f04cb0a31190080629440b182d8c8eb4d7f2b04e281912f2783a5fd4d2c3c6ab68d38b7097246c93f4c19#npm:5.40.1"],\
|
["@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"],\
|
["axios", "npm:1.1.3"],\
|
||||||
["cors", "npm:2.8.5"],\
|
["cors", "npm:2.8.5"],\
|
||||||
["dotenv", "npm:16.0.1"],\
|
["dotenv", "npm:16.0.1"],\
|
||||||
@@ -2648,7 +2645,6 @@ const RAW_RUNTIME_STATE =
|
|||||||
"packageLocation": "./packages/auth/",\
|
"packageLocation": "./packages/auth/",\
|
||||||
"packageDependencies": [\
|
"packageDependencies": [\
|
||||||
["@standardnotes/auth-server", "workspace:packages/auth"],\
|
["@standardnotes/auth-server", "workspace:packages/auth"],\
|
||||||
["@newrelic/native-metrics", "npm:9.0.0"],\
|
|
||||||
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
|
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
|
||||||
["@sentry/node", "npm:7.19.0"],\
|
["@sentry/node", "npm:7.19.0"],\
|
||||||
["@standardnotes/api", "npm:1.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/ua-parser-js", "npm:0.7.36"],\
|
||||||
["@types/uuid", "npm:8.3.4"],\
|
["@types/uuid", "npm:8.3.4"],\
|
||||||
["@typescript-eslint/eslint-plugin", "virtual:04783e12400851b8a3d76e71495851cc94959db6e62f04cb0a31190080629440b182d8c8eb4d7f2b04e281912f2783a5fd4d2c3c6ab68d38b7097246c93f4c19#npm:5.40.1"],\
|
["@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"],\
|
["axios", "npm:1.1.3"],\
|
||||||
["bcryptjs", "npm:2.4.3"],\
|
["bcryptjs", "npm:2.4.3"],\
|
||||||
["cors", "npm:2.8.5"],\
|
["cors", "npm:2.8.5"],\
|
||||||
@@ -2783,13 +2779,12 @@ const RAW_RUNTIME_STATE =
|
|||||||
"packageLocation": "./packages/domain-events-infra/",\
|
"packageLocation": "./packages/domain-events-infra/",\
|
||||||
"packageDependencies": [\
|
"packageDependencies": [\
|
||||||
["@standardnotes/domain-events-infra", "workspace:packages/domain-events-infra"],\
|
["@standardnotes/domain-events-infra", "workspace:packages/domain-events-infra"],\
|
||||||
["@newrelic/native-metrics", "npm:9.0.0"],\
|
|
||||||
["@standardnotes/domain-events", "workspace:packages/domain-events"],\
|
["@standardnotes/domain-events", "workspace:packages/domain-events"],\
|
||||||
["@types/ioredis", "npm:5.0.0"],\
|
["@types/ioredis", "npm:5.0.0"],\
|
||||||
["@types/jest", "npm:29.1.1"],\
|
["@types/jest", "npm:29.1.1"],\
|
||||||
["@types/newrelic", "npm:7.0.4"],\
|
["@types/newrelic", "npm:7.0.4"],\
|
||||||
["@typescript-eslint/eslint-plugin", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:5.30.5"],\
|
["@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"],\
|
["eslint-plugin-prettier", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:4.2.1"],\
|
||||||
["ioredis", "npm:5.2.4"],\
|
["ioredis", "npm:5.2.4"],\
|
||||||
["jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.1.2"],\
|
["jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.1.2"],\
|
||||||
@@ -2823,7 +2818,6 @@ const RAW_RUNTIME_STATE =
|
|||||||
"packageLocation": "./packages/event-store/",\
|
"packageLocation": "./packages/event-store/",\
|
||||||
"packageDependencies": [\
|
"packageDependencies": [\
|
||||||
["@standardnotes/event-store", "workspace:packages/event-store"],\
|
["@standardnotes/event-store", "workspace:packages/event-store"],\
|
||||||
["@newrelic/native-metrics", "npm:9.0.0"],\
|
|
||||||
["@standardnotes/domain-events", "workspace:packages/domain-events"],\
|
["@standardnotes/domain-events", "workspace:packages/domain-events"],\
|
||||||
["@standardnotes/domain-events-infra", "workspace:packages/domain-events-infra"],\
|
["@standardnotes/domain-events-infra", "workspace:packages/domain-events-infra"],\
|
||||||
["@standardnotes/time", "workspace:packages/time"],\
|
["@standardnotes/time", "workspace:packages/time"],\
|
||||||
@@ -2832,7 +2826,7 @@ const RAW_RUNTIME_STATE =
|
|||||||
["@types/newrelic", "npm:7.0.4"],\
|
["@types/newrelic", "npm:7.0.4"],\
|
||||||
["@types/nodemailer", "npm:6.4.6"],\
|
["@types/nodemailer", "npm:6.4.6"],\
|
||||||
["@typescript-eslint/eslint-plugin", "virtual:04783e12400851b8a3d76e71495851cc94959db6e62f04cb0a31190080629440b182d8c8eb4d7f2b04e281912f2783a5fd4d2c3c6ab68d38b7097246c93f4c19#npm:5.40.1"],\
|
["@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"],\
|
["dotenv", "npm:16.0.1"],\
|
||||||
["eslint", "npm:8.25.0"],\
|
["eslint", "npm:8.25.0"],\
|
||||||
["eslint-plugin-prettier", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.2.1"],\
|
["eslint-plugin-prettier", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.2.1"],\
|
||||||
@@ -2879,7 +2873,6 @@ const RAW_RUNTIME_STATE =
|
|||||||
"packageLocation": "./packages/files/",\
|
"packageLocation": "./packages/files/",\
|
||||||
"packageDependencies": [\
|
"packageDependencies": [\
|
||||||
["@standardnotes/files-server", "workspace:packages/files"],\
|
["@standardnotes/files-server", "workspace:packages/files"],\
|
||||||
["@newrelic/native-metrics", "npm:9.0.0"],\
|
|
||||||
["@sentry/node", "npm:7.19.0"],\
|
["@sentry/node", "npm:7.19.0"],\
|
||||||
["@standardnotes/common", "workspace:packages/common"],\
|
["@standardnotes/common", "workspace:packages/common"],\
|
||||||
["@standardnotes/config", "npm:2.4.3"],\
|
["@standardnotes/config", "npm:2.4.3"],\
|
||||||
@@ -2899,7 +2892,7 @@ const RAW_RUNTIME_STATE =
|
|||||||
["@types/prettyjson", "npm:0.0.30"],\
|
["@types/prettyjson", "npm:0.0.30"],\
|
||||||
["@types/uuid", "npm:8.3.4"],\
|
["@types/uuid", "npm:8.3.4"],\
|
||||||
["@typescript-eslint/eslint-plugin", "virtual:04783e12400851b8a3d76e71495851cc94959db6e62f04cb0a31190080629440b182d8c8eb4d7f2b04e281912f2783a5fd4d2c3c6ab68d38b7097246c93f4c19#npm:5.40.1"],\
|
["@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"],\
|
["connect-busboy", "npm:1.0.0"],\
|
||||||
["cors", "npm:2.8.5"],\
|
["cors", "npm:2.8.5"],\
|
||||||
["dayjs", "npm:1.11.6"],\
|
["dayjs", "npm:1.11.6"],\
|
||||||
@@ -3014,7 +3007,6 @@ const RAW_RUNTIME_STATE =
|
|||||||
"packageLocation": "./packages/revisions/",\
|
"packageLocation": "./packages/revisions/",\
|
||||||
"packageDependencies": [\
|
"packageDependencies": [\
|
||||||
["@standardnotes/revisions-server", "workspace:packages/revisions"],\
|
["@standardnotes/revisions-server", "workspace:packages/revisions"],\
|
||||||
["@newrelic/native-metrics", "npm:9.0.0"],\
|
|
||||||
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
|
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
|
||||||
["@sentry/node", "npm:7.19.0"],\
|
["@sentry/node", "npm:7.19.0"],\
|
||||||
["@standardnotes/api", "npm:1.19.0"],\
|
["@standardnotes/api", "npm:1.19.0"],\
|
||||||
@@ -3032,7 +3024,7 @@ const RAW_RUNTIME_STATE =
|
|||||||
["@types/jest", "npm:29.1.1"],\
|
["@types/jest", "npm:29.1.1"],\
|
||||||
["@types/newrelic", "npm:7.0.4"],\
|
["@types/newrelic", "npm:7.0.4"],\
|
||||||
["@typescript-eslint/eslint-plugin", "virtual:04783e12400851b8a3d76e71495851cc94959db6e62f04cb0a31190080629440b182d8c8eb4d7f2b04e281912f2783a5fd4d2c3c6ab68d38b7097246c93f4c19#npm:5.40.1"],\
|
["@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"],\
|
["cors", "npm:2.8.5"],\
|
||||||
["dotenv", "npm:16.0.1"],\
|
["dotenv", "npm:16.0.1"],\
|
||||||
["eslint", "npm:8.25.0"],\
|
["eslint", "npm:8.25.0"],\
|
||||||
@@ -3060,7 +3052,6 @@ const RAW_RUNTIME_STATE =
|
|||||||
"packageLocation": "./packages/scheduler/",\
|
"packageLocation": "./packages/scheduler/",\
|
||||||
"packageDependencies": [\
|
"packageDependencies": [\
|
||||||
["@standardnotes/scheduler-server", "workspace:packages/scheduler"],\
|
["@standardnotes/scheduler-server", "workspace:packages/scheduler"],\
|
||||||
["@newrelic/native-metrics", "npm:9.0.0"],\
|
|
||||||
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
|
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
|
||||||
["@sentry/node", "npm:7.19.0"],\
|
["@sentry/node", "npm:7.19.0"],\
|
||||||
["@standardnotes/common", "workspace:packages/common"],\
|
["@standardnotes/common", "workspace:packages/common"],\
|
||||||
@@ -3073,7 +3064,7 @@ const RAW_RUNTIME_STATE =
|
|||||||
["@types/newrelic", "npm:7.0.4"],\
|
["@types/newrelic", "npm:7.0.4"],\
|
||||||
["@types/node", "npm:18.11.9"],\
|
["@types/node", "npm:18.11.9"],\
|
||||||
["@typescript-eslint/eslint-plugin", "virtual:04783e12400851b8a3d76e71495851cc94959db6e62f04cb0a31190080629440b182d8c8eb4d7f2b04e281912f2783a5fd4d2c3c6ab68d38b7097246c93f4c19#npm:5.40.1"],\
|
["@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"],\
|
["dayjs", "npm:1.11.6"],\
|
||||||
["dotenv", "npm:16.0.1"],\
|
["dotenv", "npm:16.0.1"],\
|
||||||
["eslint", "npm:8.25.0"],\
|
["eslint", "npm:8.25.0"],\
|
||||||
@@ -3122,7 +3113,6 @@ const RAW_RUNTIME_STATE =
|
|||||||
["@lerna-lite/cli", "npm:1.6.0"],\
|
["@lerna-lite/cli", "npm:1.6.0"],\
|
||||||
["@lerna-lite/list", "npm:1.6.0"],\
|
["@lerna-lite/list", "npm:1.6.0"],\
|
||||||
["@lerna-lite/run", "npm:1.6.0"],\
|
["@lerna-lite/run", "npm:1.6.0"],\
|
||||||
["@newrelic/native-metrics", "npm:9.0.0"],\
|
|
||||||
["@sentry/node", "npm:7.19.0"],\
|
["@sentry/node", "npm:7.19.0"],\
|
||||||
["@types/jest", "npm:29.1.1"],\
|
["@types/jest", "npm:29.1.1"],\
|
||||||
["@types/newrelic", "npm:7.0.4"],\
|
["@types/newrelic", "npm:7.0.4"],\
|
||||||
@@ -3145,7 +3135,6 @@ const RAW_RUNTIME_STATE =
|
|||||||
"packageLocation": "./packages/settings/",\
|
"packageLocation": "./packages/settings/",\
|
||||||
"packageDependencies": [\
|
"packageDependencies": [\
|
||||||
["@standardnotes/settings", "workspace:packages/settings"],\
|
["@standardnotes/settings", "workspace:packages/settings"],\
|
||||||
["@newrelic/native-metrics", "npm:9.0.0"],\
|
|
||||||
["@typescript-eslint/eslint-plugin", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:5.30.5"],\
|
["@typescript-eslint/eslint-plugin", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:5.30.5"],\
|
||||||
["eslint-plugin-prettier", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:4.2.1"],\
|
["eslint-plugin-prettier", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:4.2.1"],\
|
||||||
["reflect-metadata", "npm:0.1.13"],\
|
["reflect-metadata", "npm:0.1.13"],\
|
||||||
@@ -3189,7 +3178,6 @@ const RAW_RUNTIME_STATE =
|
|||||||
"packageLocation": "./packages/syncing-server/",\
|
"packageLocation": "./packages/syncing-server/",\
|
||||||
"packageDependencies": [\
|
"packageDependencies": [\
|
||||||
["@standardnotes/syncing-server", "workspace:packages/syncing-server"],\
|
["@standardnotes/syncing-server", "workspace:packages/syncing-server"],\
|
||||||
["@newrelic/native-metrics", "npm:9.0.0"],\
|
|
||||||
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
|
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
|
||||||
["@sentry/node", "npm:7.19.0"],\
|
["@sentry/node", "npm:7.19.0"],\
|
||||||
["@standardnotes/common", "workspace:packages/common"],\
|
["@standardnotes/common", "workspace:packages/common"],\
|
||||||
@@ -3213,7 +3201,7 @@ const RAW_RUNTIME_STATE =
|
|||||||
["@types/ua-parser-js", "npm:0.7.36"],\
|
["@types/ua-parser-js", "npm:0.7.36"],\
|
||||||
["@types/uuid", "npm:8.3.4"],\
|
["@types/uuid", "npm:8.3.4"],\
|
||||||
["@typescript-eslint/eslint-plugin", "virtual:04783e12400851b8a3d76e71495851cc94959db6e62f04cb0a31190080629440b182d8c8eb4d7f2b04e281912f2783a5fd4d2c3c6ab68d38b7097246c93f4c19#npm:5.40.1"],\
|
["@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"],\
|
["axios", "npm:1.1.3"],\
|
||||||
["cors", "npm:2.8.5"],\
|
["cors", "npm:2.8.5"],\
|
||||||
["dotenv", "npm:16.0.1"],\
|
["dotenv", "npm:16.0.1"],\
|
||||||
@@ -3290,7 +3278,6 @@ const RAW_RUNTIME_STATE =
|
|||||||
"packageLocation": "./packages/websockets/",\
|
"packageLocation": "./packages/websockets/",\
|
||||||
"packageDependencies": [\
|
"packageDependencies": [\
|
||||||
["@standardnotes/websockets-server", "workspace:packages/websockets"],\
|
["@standardnotes/websockets-server", "workspace:packages/websockets"],\
|
||||||
["@newrelic/native-metrics", "npm:9.0.0"],\
|
|
||||||
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
|
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
|
||||||
["@sentry/node", "npm:7.19.0"],\
|
["@sentry/node", "npm:7.19.0"],\
|
||||||
["@standardnotes/api", "npm:1.19.0"],\
|
["@standardnotes/api", "npm:1.19.0"],\
|
||||||
@@ -3304,7 +3291,7 @@ const RAW_RUNTIME_STATE =
|
|||||||
["@types/jest", "npm:29.1.1"],\
|
["@types/jest", "npm:29.1.1"],\
|
||||||
["@types/newrelic", "npm:7.0.4"],\
|
["@types/newrelic", "npm:7.0.4"],\
|
||||||
["@typescript-eslint/eslint-plugin", "virtual:04783e12400851b8a3d76e71495851cc94959db6e62f04cb0a31190080629440b182d8c8eb4d7f2b04e281912f2783a5fd4d2c3c6ab68d38b7097246c93f4c19#npm:5.40.1"],\
|
["@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"],\
|
["axios", "npm:1.1.3"],\
|
||||||
["cors", "npm:2.8.5"],\
|
["cors", "npm:2.8.5"],\
|
||||||
["dotenv", "npm:16.0.1"],\
|
["dotenv", "npm:16.0.1"],\
|
||||||
@@ -3331,7 +3318,6 @@ const RAW_RUNTIME_STATE =
|
|||||||
"packageLocation": "./packages/workspace/",\
|
"packageLocation": "./packages/workspace/",\
|
||||||
"packageDependencies": [\
|
"packageDependencies": [\
|
||||||
["@standardnotes/workspace-server", "workspace:packages/workspace"],\
|
["@standardnotes/workspace-server", "workspace:packages/workspace"],\
|
||||||
["@newrelic/native-metrics", "npm:9.0.0"],\
|
|
||||||
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
|
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
|
||||||
["@sentry/node", "npm:7.19.0"],\
|
["@sentry/node", "npm:7.19.0"],\
|
||||||
["@standardnotes/api", "npm:1.19.0"],\
|
["@standardnotes/api", "npm:1.19.0"],\
|
||||||
@@ -3347,7 +3333,7 @@ const RAW_RUNTIME_STATE =
|
|||||||
["@types/jest", "npm:29.1.1"],\
|
["@types/jest", "npm:29.1.1"],\
|
||||||
["@types/newrelic", "npm:7.0.4"],\
|
["@types/newrelic", "npm:7.0.4"],\
|
||||||
["@typescript-eslint/eslint-plugin", "virtual:04783e12400851b8a3d76e71495851cc94959db6e62f04cb0a31190080629440b182d8c8eb4d7f2b04e281912f2783a5fd4d2c3c6ab68d38b7097246c93f4c19#npm:5.40.1"],\
|
["@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"],\
|
["cors", "npm:2.8.5"],\
|
||||||
["dotenv", "npm:16.0.1"],\
|
["dotenv", "npm:16.0.1"],\
|
||||||
["eslint", "npm:8.25.0"],\
|
["eslint", "npm:8.25.0"],\
|
||||||
@@ -4814,10 +4800,10 @@ const RAW_RUNTIME_STATE =
|
|||||||
}]\
|
}]\
|
||||||
]],\
|
]],\
|
||||||
["aws-sdk", [\
|
["aws-sdk", [\
|
||||||
["npm:2.1253.0", {\
|
["npm:2.1260.0", {\
|
||||||
"packageLocation": "./.yarn/cache/aws-sdk-npm-2.1253.0-2cf60975ab-faa4af2949.zip/node_modules/aws-sdk/",\
|
"packageLocation": "./.yarn/cache/aws-sdk-npm-2.1260.0-0145998ab1-9a1b2e4cb5.zip/node_modules/aws-sdk/",\
|
||||||
"packageDependencies": [\
|
"packageDependencies": [\
|
||||||
["aws-sdk", "npm:2.1253.0"],\
|
["aws-sdk", "npm:2.1260.0"],\
|
||||||
["buffer", "npm:4.9.2"],\
|
["buffer", "npm:4.9.2"],\
|
||||||
["events", "npm:1.1.1"],\
|
["events", "npm:1.1.1"],\
|
||||||
["ieee754", "npm:1.1.13"],\
|
["ieee754", "npm:1.1.13"],\
|
||||||
@@ -12584,7 +12570,7 @@ const RAW_RUNTIME_STATE =
|
|||||||
"packageDependencies": [\
|
"packageDependencies": [\
|
||||||
["sqs-consumer", "virtual:685a6222c3349423674bb7f0684ba34e2ab20912010f352e04dcf707a156e13183fc382e2417cb37a60f3e7b52fd0178c53181674890e1773eb83e190dc13378#npm:5.7.0"],\
|
["sqs-consumer", "virtual:685a6222c3349423674bb7f0684ba34e2ab20912010f352e04dcf707a156e13183fc382e2417cb37a60f3e7b52fd0178c53181674890e1773eb83e190dc13378#npm:5.7.0"],\
|
||||||
["@types/aws-sdk", null],\
|
["@types/aws-sdk", null],\
|
||||||
["aws-sdk", "npm:2.1253.0"],\
|
["aws-sdk", "npm:2.1260.0"],\
|
||||||
["debug", "virtual:b86a9fb34323a98c6519528ed55faa0d9b44ca8879307c0b29aa384bde47ff59a7d0c9051b31246f14521dfb71ba3c5d6d0b35c29fffc17bf875aa6ad977d9e8#npm:4.3.4"]\
|
["debug", "virtual:b86a9fb34323a98c6519528ed55faa0d9b44ca8879307c0b29aa384bde47ff59a7d0c9051b31246f14521dfb71ba3c5d6d0b35c29fffc17bf875aa6ad977d9e8#npm:4.3.4"]\
|
||||||
],\
|
],\
|
||||||
"packagePeers": [\
|
"packagePeers": [\
|
||||||
|
|||||||
BIN
Binary file not shown.
@@ -61,7 +61,6 @@
|
|||||||
},
|
},
|
||||||
"packageManager": "yarn@4.0.0-rc.25",
|
"packageManager": "yarn@4.0.0-rc.25",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@newrelic/native-metrics": "^9.0.0",
|
|
||||||
"@sentry/node": "^7.19.0",
|
"@sentry/node": "^7.19.0",
|
||||||
"newrelic": "^9.6.0"
|
"newrelic": "^9.6.0"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,44 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [2.11.15](https://github.com/standardnotes/server/compare/@standardnotes/analytics@2.11.14...@standardnotes/analytics@2.11.15) (2022-11-30)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @standardnotes/analytics
|
||||||
|
|
||||||
|
## [2.11.14](https://github.com/standardnotes/server/compare/@standardnotes/analytics@2.11.13...@standardnotes/analytics@2.11.14) (2022-11-28)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @standardnotes/analytics
|
||||||
|
|
||||||
|
## [2.11.13](https://github.com/standardnotes/server/compare/@standardnotes/analytics@2.11.12...@standardnotes/analytics@2.11.13) (2022-11-25)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @standardnotes/analytics
|
||||||
|
|
||||||
|
## [2.11.12](https://github.com/standardnotes/server/compare/@standardnotes/analytics@2.11.11...@standardnotes/analytics@2.11.12) (2022-11-24)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @standardnotes/analytics
|
||||||
|
|
||||||
|
## [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)
|
## [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
|
**Note:** Version bump only for package @standardnotes/analytics
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@standardnotes/analytics",
|
"name": "@standardnotes/analytics",
|
||||||
"version": "2.11.6",
|
"version": "2.11.15",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=18.0.0 <19.0.0"
|
"node": ">=18.0.0 <19.0.0"
|
||||||
},
|
},
|
||||||
@@ -37,7 +37,6 @@
|
|||||||
"typescript": "^4.8.4"
|
"typescript": "^4.8.4"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@newrelic/native-metrics": "^9.0.0",
|
|
||||||
"@newrelic/winston-enricher": "^4.0.0",
|
"@newrelic/winston-enricher": "^4.0.0",
|
||||||
"@sentry/node": "^7.19.0",
|
"@sentry/node": "^7.19.0",
|
||||||
"@standardnotes/common": "workspace:*",
|
"@standardnotes/common": "workspace:*",
|
||||||
@@ -45,7 +44,7 @@
|
|||||||
"@standardnotes/domain-events": "workspace:*",
|
"@standardnotes/domain-events": "workspace:*",
|
||||||
"@standardnotes/domain-events-infra": "workspace:*",
|
"@standardnotes/domain-events-infra": "workspace:*",
|
||||||
"@standardnotes/time": "workspace:*",
|
"@standardnotes/time": "workspace:*",
|
||||||
"aws-sdk": "^2.1253.0",
|
"aws-sdk": "^2.1260.0",
|
||||||
"dayjs": "^1.11.6",
|
"dayjs": "^1.11.6",
|
||||||
"dotenv": "^16.0.1",
|
"dotenv": "^16.0.1",
|
||||||
"inversify": "^6.0.1",
|
"inversify": "^6.0.1",
|
||||||
|
|||||||
@@ -89,13 +89,24 @@ export class ContainerConfigLoader {
|
|||||||
})
|
})
|
||||||
container.bind<winston.Logger>(TYPES.Logger).toConstantValue(logger)
|
container.bind<winston.Logger>(TYPES.Logger).toConstantValue(logger)
|
||||||
|
|
||||||
if (env.get('SNS_AWS_REGION', true)) {
|
if (env.get('SNS_TOPIC_ARN', true)) {
|
||||||
container.bind<AWS.SNS>(TYPES.SNS).toConstantValue(
|
const snsConfig: AWS.SNS.Types.ClientConfiguration = {
|
||||||
new AWS.SNS({
|
apiVersion: 'latest',
|
||||||
apiVersion: 'latest',
|
region: env.get('SNS_AWS_REGION', true),
|
||||||
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)) {
|
if (env.get('SQS_QUEUE_URL', true)) {
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ WORKSPACE_SERVER_URL=http://workspace:3000
|
|||||||
WEB_SOCKET_SERVER_URL=http://websockets:3000
|
WEB_SOCKET_SERVER_URL=http://websockets:3000
|
||||||
PAYMENTS_SERVER_URL=http://payments:3000
|
PAYMENTS_SERVER_URL=http://payments:3000
|
||||||
FILES_SERVER_URL=http://files:3000
|
FILES_SERVER_URL=http://files:3000
|
||||||
|
REVISIONS_SERVER_URL=http://revisions:3000
|
||||||
|
|
||||||
HTTP_CALL_TIMEOUT=60000
|
HTTP_CALL_TIMEOUT=60000
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,38 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.39.6](https://github.com/standardnotes/api-gateway/compare/@standardnotes/api-gateway@1.39.5...@standardnotes/api-gateway@1.39.6) (2022-11-30)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @standardnotes/api-gateway
|
||||||
|
|
||||||
|
## [1.39.5](https://github.com/standardnotes/api-gateway/compare/@standardnotes/api-gateway@1.39.4...@standardnotes/api-gateway@1.39.5) (2022-11-28)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @standardnotes/api-gateway
|
||||||
|
|
||||||
|
## [1.39.4](https://github.com/standardnotes/api-gateway/compare/@standardnotes/api-gateway@1.39.3...@standardnotes/api-gateway@1.39.4) (2022-11-25)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **api-gateway:** make revisions and workspace server urls optional ([8907879](https://github.com/standardnotes/api-gateway/commit/8907879a194d2d8328fbd3ca8ec9d0b608c2da50))
|
||||||
|
|
||||||
|
## [1.39.3](https://github.com/standardnotes/api-gateway/compare/@standardnotes/api-gateway@1.39.2...@standardnotes/api-gateway@1.39.3) (2022-11-25)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @standardnotes/api-gateway
|
||||||
|
|
||||||
|
## [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)
|
## [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
|
**Note:** Version bump only for package @standardnotes/api-gateway
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ import '../src/Controller/v1/InvitesController'
|
|||||||
|
|
||||||
import '../src/Controller/v2/PaymentsControllerV2'
|
import '../src/Controller/v2/PaymentsControllerV2'
|
||||||
import '../src/Controller/v2/ActionsControllerV2'
|
import '../src/Controller/v2/ActionsControllerV2'
|
||||||
|
import '../src/Controller/v2/RevisionsControllerV2'
|
||||||
|
|
||||||
import helmet from 'helmet'
|
import helmet from 'helmet'
|
||||||
import * as cors from 'cors'
|
import * as cors from 'cors'
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@standardnotes/api-gateway",
|
"name": "@standardnotes/api-gateway",
|
||||||
"version": "1.38.9",
|
"version": "1.39.6",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=18.0.0 <19.0.0"
|
"node": ">=18.0.0 <19.0.0"
|
||||||
},
|
},
|
||||||
@@ -20,7 +20,6 @@
|
|||||||
"upgrade:snjs": "yarn ncu -u '@standardnotes/*'"
|
"upgrade:snjs": "yarn ncu -u '@standardnotes/*'"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@newrelic/native-metrics": "^9.0.0",
|
|
||||||
"@newrelic/winston-enricher": "^4.0.0",
|
"@newrelic/winston-enricher": "^4.0.0",
|
||||||
"@sentry/node": "^7.19.0",
|
"@sentry/node": "^7.19.0",
|
||||||
"@standardnotes/common": "workspace:^",
|
"@standardnotes/common": "workspace:^",
|
||||||
@@ -28,7 +27,7 @@
|
|||||||
"@standardnotes/domain-events-infra": "workspace:*",
|
"@standardnotes/domain-events-infra": "workspace:*",
|
||||||
"@standardnotes/security": "workspace:*",
|
"@standardnotes/security": "workspace:*",
|
||||||
"@standardnotes/time": "workspace:*",
|
"@standardnotes/time": "workspace:*",
|
||||||
"aws-sdk": "^2.1253.0",
|
"aws-sdk": "^2.1260.0",
|
||||||
"axios": "^1.1.3",
|
"axios": "^1.1.3",
|
||||||
"cors": "2.8.5",
|
"cors": "2.8.5",
|
||||||
"dotenv": "^16.0.1",
|
"dotenv": "^16.0.1",
|
||||||
|
|||||||
@@ -54,10 +54,11 @@ export class ContainerConfigLoader {
|
|||||||
// env vars
|
// env vars
|
||||||
container.bind(TYPES.SYNCING_SERVER_JS_URL).toConstantValue(env.get('SYNCING_SERVER_JS_URL'))
|
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.AUTH_SERVER_URL).toConstantValue(env.get('AUTH_SERVER_URL'))
|
||||||
|
container.bind(TYPES.REVISIONS_SERVER_URL).toConstantValue(env.get('REVISIONS_SERVER_URL', true))
|
||||||
container.bind(TYPES.PAYMENTS_SERVER_URL).toConstantValue(env.get('PAYMENTS_SERVER_URL', true))
|
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.FILES_SERVER_URL).toConstantValue(env.get('FILES_SERVER_URL', true))
|
||||||
container.bind(TYPES.AUTH_JWT_SECRET).toConstantValue(env.get('AUTH_JWT_SECRET'))
|
container.bind(TYPES.AUTH_JWT_SECRET).toConstantValue(env.get('AUTH_JWT_SECRET'))
|
||||||
container.bind(TYPES.WORKSPACE_SERVER_URL).toConstantValue(env.get('WORKSPACE_SERVER_URL'))
|
container.bind(TYPES.WORKSPACE_SERVER_URL).toConstantValue(env.get('WORKSPACE_SERVER_URL', true))
|
||||||
container.bind(TYPES.WEB_SOCKET_SERVER_URL).toConstantValue(env.get('WEB_SOCKET_SERVER_URL', true))
|
container.bind(TYPES.WEB_SOCKET_SERVER_URL).toConstantValue(env.get('WEB_SOCKET_SERVER_URL', true))
|
||||||
container
|
container
|
||||||
.bind(TYPES.HTTP_CALL_TIMEOUT)
|
.bind(TYPES.HTTP_CALL_TIMEOUT)
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ const TYPES = {
|
|||||||
AUTH_SERVER_URL: Symbol.for('AUTH_SERVER_URL'),
|
AUTH_SERVER_URL: Symbol.for('AUTH_SERVER_URL'),
|
||||||
PAYMENTS_SERVER_URL: Symbol.for('PAYMENTS_SERVER_URL'),
|
PAYMENTS_SERVER_URL: Symbol.for('PAYMENTS_SERVER_URL'),
|
||||||
FILES_SERVER_URL: Symbol.for('FILES_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'),
|
WORKSPACE_SERVER_URL: Symbol.for('WORKSPACE_SERVER_URL'),
|
||||||
WEB_SOCKET_SERVER_URL: Symbol.for('WEB_SOCKET_SERVER_URL'),
|
WEB_SOCKET_SERVER_URL: Symbol.for('WEB_SOCKET_SERVER_URL'),
|
||||||
AUTH_JWT_SECRET: Symbol.for('AUTH_JWT_SECRET'),
|
AUTH_JWT_SECRET: Symbol.for('AUTH_JWT_SECRET'),
|
||||||
|
|||||||
@@ -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`)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -18,6 +18,7 @@ export class HttpService implements HttpServiceInterface {
|
|||||||
@inject(TYPES.FILES_SERVER_URL) private filesServerUrl: string,
|
@inject(TYPES.FILES_SERVER_URL) private filesServerUrl: string,
|
||||||
@inject(TYPES.WORKSPACE_SERVER_URL) private workspaceServerUrl: string,
|
@inject(TYPES.WORKSPACE_SERVER_URL) private workspaceServerUrl: string,
|
||||||
@inject(TYPES.WEB_SOCKET_SERVER_URL) private webSocketServerUrl: 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.HTTP_CALL_TIMEOUT) private httpCallTimeout: number,
|
||||||
@inject(TYPES.CrossServiceTokenCache) private crossServiceTokenCache: CrossServiceTokenCacheInterface,
|
@inject(TYPES.CrossServiceTokenCache) private crossServiceTokenCache: CrossServiceTokenCacheInterface,
|
||||||
@inject(TYPES.Logger) private logger: Logger,
|
@inject(TYPES.Logger) private logger: Logger,
|
||||||
@@ -32,6 +33,20 @@ export class HttpService implements HttpServiceInterface {
|
|||||||
await this.callServer(this.syncingServerJsUrl, request, response, endpoint, payload)
|
await this.callServer(this.syncingServerJsUrl, request, response, endpoint, payload)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async callRevisionsServer(
|
||||||
|
request: Request,
|
||||||
|
response: Response,
|
||||||
|
endpoint: string,
|
||||||
|
payload?: Record<string, unknown> | string,
|
||||||
|
): Promise<void> {
|
||||||
|
if (!this.revisionsServerUrl) {
|
||||||
|
response.status(400).send({ message: 'Revisions Server not configured' })
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
await this.callServer(this.revisionsServerUrl, request, response, endpoint, payload)
|
||||||
|
}
|
||||||
|
|
||||||
async callLegacySyncingServer(
|
async callLegacySyncingServer(
|
||||||
request: Request,
|
request: Request,
|
||||||
response: Response,
|
response: Response,
|
||||||
@@ -56,6 +71,12 @@ export class HttpService implements HttpServiceInterface {
|
|||||||
endpoint: string,
|
endpoint: string,
|
||||||
payload?: Record<string, unknown> | string,
|
payload?: Record<string, unknown> | string,
|
||||||
): Promise<void> {
|
): Promise<void> {
|
||||||
|
if (!this.workspaceServerUrl) {
|
||||||
|
response.status(400).send({ message: 'Workspace Server not configured' })
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
await this.callServer(this.workspaceServerUrl, request, response, endpoint, payload)
|
await this.callServer(this.workspaceServerUrl, request, response, endpoint, payload)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,12 @@ export interface HttpServiceInterface {
|
|||||||
endpoint: string,
|
endpoint: string,
|
||||||
payload?: Record<string, unknown> | string,
|
payload?: Record<string, unknown> | string,
|
||||||
): Promise<void>
|
): Promise<void>
|
||||||
|
callRevisionsServer(
|
||||||
|
request: Request,
|
||||||
|
response: Response,
|
||||||
|
endpoint: string,
|
||||||
|
payload?: Record<string, unknown> | string,
|
||||||
|
): Promise<void>
|
||||||
callSyncingServer(
|
callSyncingServer(
|
||||||
request: Request,
|
request: Request,
|
||||||
response: Response,
|
response: Response,
|
||||||
|
|||||||
@@ -3,6 +3,62 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.60.15](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.60.14...@standardnotes/auth-server@1.60.15) (2022-11-30)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @standardnotes/auth-server
|
||||||
|
|
||||||
|
## [1.60.14](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.60.13...@standardnotes/auth-server@1.60.14) (2022-11-28)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @standardnotes/auth-server
|
||||||
|
|
||||||
|
## [1.60.13](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.60.12...@standardnotes/auth-server@1.60.13) (2022-11-25)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **auth:** bring back streaming all users in an email campaign send out ([8407c3b](https://github.com/standardnotes/server/commit/8407c3b64910c87591a97b856f5b0c0aebc98e51))
|
||||||
|
|
||||||
|
## [1.60.12](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.60.11...@standardnotes/auth-server@1.60.12) (2022-11-25)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **auth:** tmp test email campaign black friday 2022 reminder on team only ([25a6796](https://github.com/standardnotes/server/commit/25a6796e636bc30de99001bd16a2a1084b608b6a))
|
||||||
|
|
||||||
|
## [1.60.11](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.60.10...@standardnotes/auth-server@1.60.11) (2022-11-25)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @standardnotes/auth-server
|
||||||
|
|
||||||
|
## [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)
|
## [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
|
**Note:** Version bump only for package @standardnotes/auth-server
|
||||||
|
|||||||
@@ -7,6 +7,6 @@ module.exports = {
|
|||||||
transform: {
|
transform: {
|
||||||
...tsjPreset.transform,
|
...tsjPreset.transform,
|
||||||
},
|
},
|
||||||
coveragePathIgnorePatterns: ['/Bootstrap/', '/InversifyExpressUtils/', 'HealthCheckController'],
|
coveragePathIgnorePatterns: ['/Bootstrap/', '/InversifyExpressUtils/', 'HealthCheckController', '/Infra/'],
|
||||||
setupFilesAfterEnv: ['./test-setup.ts'],
|
setupFilesAfterEnv: ['./test-setup.ts'],
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@standardnotes/auth-server",
|
"name": "@standardnotes/auth-server",
|
||||||
"version": "1.60.4",
|
"version": "1.60.15",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=18.0.0 <19.0.0"
|
"node": ">=18.0.0 <19.0.0"
|
||||||
},
|
},
|
||||||
@@ -31,7 +31,6 @@
|
|||||||
"upgrade:snjs": "yarn ncu -u '@standardnotes/*'"
|
"upgrade:snjs": "yarn ncu -u '@standardnotes/*'"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@newrelic/native-metrics": "^9.0.0",
|
|
||||||
"@newrelic/winston-enricher": "^4.0.0",
|
"@newrelic/winston-enricher": "^4.0.0",
|
||||||
"@sentry/node": "^7.19.0",
|
"@sentry/node": "^7.19.0",
|
||||||
"@standardnotes/api": "^1.19.0",
|
"@standardnotes/api": "^1.19.0",
|
||||||
@@ -46,7 +45,7 @@
|
|||||||
"@standardnotes/sncrypto-common": "^1.9.0",
|
"@standardnotes/sncrypto-common": "^1.9.0",
|
||||||
"@standardnotes/sncrypto-node": "workspace:*",
|
"@standardnotes/sncrypto-node": "workspace:*",
|
||||||
"@standardnotes/time": "workspace:*",
|
"@standardnotes/time": "workspace:*",
|
||||||
"aws-sdk": "^2.1253.0",
|
"aws-sdk": "^2.1260.0",
|
||||||
"axios": "^1.1.3",
|
"axios": "^1.1.3",
|
||||||
"bcryptjs": "2.4.3",
|
"bcryptjs": "2.4.3",
|
||||||
"cors": "2.8.5",
|
"cors": "2.8.5",
|
||||||
|
|||||||
@@ -230,13 +230,24 @@ export class ContainerConfigLoader {
|
|||||||
})
|
})
|
||||||
container.bind<winston.Logger>(TYPES.Logger).toConstantValue(logger)
|
container.bind<winston.Logger>(TYPES.Logger).toConstantValue(logger)
|
||||||
|
|
||||||
if (env.get('SNS_AWS_REGION', true)) {
|
if (env.get('SNS_TOPIC_ARN', true)) {
|
||||||
container.bind<AWS.SNS>(TYPES.SNS).toConstantValue(
|
const snsConfig: AWS.SNS.Types.ClientConfiguration = {
|
||||||
new AWS.SNS({
|
apiVersion: 'latest',
|
||||||
apiVersion: 'latest',
|
region: env.get('SNS_AWS_REGION', true),
|
||||||
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)) {
|
if (env.get('SQS_QUEUE_URL', true)) {
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import { User } from './User'
|
|||||||
|
|
||||||
export interface UserRepositoryInterface {
|
export interface UserRepositoryInterface {
|
||||||
streamAll(): Promise<ReadStream>
|
streamAll(): Promise<ReadStream>
|
||||||
|
streamTeam(memberEmail?: string): Promise<ReadStream>
|
||||||
findOneByUuid(uuid: string): Promise<User | null>
|
findOneByUuid(uuid: string): Promise<User | null>
|
||||||
findOneByEmail(email: string): Promise<User | null>
|
findOneByEmail(email: string): Promise<User | null>
|
||||||
save(user: User): Promise<User>
|
save(user: User): Promise<User>
|
||||||
|
|||||||
@@ -25,6 +25,17 @@ export class MySQLUserRepository implements UserRepositoryInterface {
|
|||||||
return this.ormRepository.createQueryBuilder('user').stream()
|
return this.ormRepository.createQueryBuilder('user').stream()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async streamTeam(memberEmail?: string): Promise<ReadStream> {
|
||||||
|
const queryBuilder = this.ormRepository.createQueryBuilder()
|
||||||
|
if (memberEmail !== undefined) {
|
||||||
|
queryBuilder.where('email = :email', { email: memberEmail })
|
||||||
|
} else {
|
||||||
|
queryBuilder.where('email LIKE :email', { email: '%@standardnotes.com' })
|
||||||
|
}
|
||||||
|
|
||||||
|
return queryBuilder.stream()
|
||||||
|
}
|
||||||
|
|
||||||
async findOneByUuid(uuid: string): Promise<User | null> {
|
async findOneByUuid(uuid: string): Promise<User | null> {
|
||||||
return this.ormRepository
|
return this.ormRepository
|
||||||
.createQueryBuilder('user')
|
.createQueryBuilder('user')
|
||||||
|
|||||||
@@ -3,6 +3,12 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.46.1](https://github.com/standardnotes/server/compare/@standardnotes/common@1.46.0...@standardnotes/common@1.46.1) (2022-11-25)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **common:** add black friday 2022 reminder message identifier ([91b76ed](https://github.com/standardnotes/server/commit/91b76edce1c1abfa4e860932d98ce8cd369017c0))
|
||||||
|
|
||||||
# [1.46.0](https://github.com/standardnotes/server/compare/@standardnotes/common@1.45.0...@standardnotes/common@1.46.0) (2022-11-22)
|
# [1.46.0](https://github.com/standardnotes/server/compare/@standardnotes/common@1.45.0...@standardnotes/common@1.46.0) (2022-11-22)
|
||||||
|
|
||||||
### Features
|
### Features
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@standardnotes/common",
|
"name": "@standardnotes/common",
|
||||||
"version": "1.46.0",
|
"version": "1.46.1",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=18.0.0 <19.0.0"
|
"node": ">=18.0.0 <19.0.0"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ export enum EmailMessageIdentifier {
|
|||||||
STUDENT_DISCOUNT_APPROVED = 'STUDENT_DISCOUNT_APPROVED',
|
STUDENT_DISCOUNT_APPROVED = 'STUDENT_DISCOUNT_APPROVED',
|
||||||
MARKETING_CAMPAIGN_FILES = 'MARKETING_CAMPAIGN_FILES',
|
MARKETING_CAMPAIGN_FILES = 'MARKETING_CAMPAIGN_FILES',
|
||||||
MARKETING_BLACK_FRIDAY_2022 = 'MARKETING_BLACK_FRIDAY_2022',
|
MARKETING_BLACK_FRIDAY_2022 = 'MARKETING_BLACK_FRIDAY_2022',
|
||||||
|
MARKETING_BLACK_FRIDAY_2022_REMINDER = 'MARKETING_BLACK_FRIDAY_2022_REMINDER',
|
||||||
PAYMENT_FAILED = 'PAYMENT_FAILED',
|
PAYMENT_FAILED = 'PAYMENT_FAILED',
|
||||||
SEND_INVOICE = 'SEND_INVOICE',
|
SEND_INVOICE = 'SEND_INVOICE',
|
||||||
DISCOUNT_NOTICE = 'DISCOUNT_NOTICE',
|
DISCOUNT_NOTICE = 'DISCOUNT_NOTICE',
|
||||||
|
|||||||
@@ -3,6 +3,28 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.5.1](https://github.com/standardnotes/server/compare/@standardnotes/domain-core@1.5.0...@standardnotes/domain-core@1.5.1) (2022-11-25)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @standardnotes/domain-core
|
||||||
|
|
||||||
|
# [1.5.0](https://github.com/standardnotes/server/compare/@standardnotes/domain-core@1.4.0...@standardnotes/domain-core@1.5.0) (2022-11-24)
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **domain-core:** add methods to check role power ([9d90f27](https://github.com/standardnotes/server/commit/9d90f276de8915d91d009909154036ba128687e0))
|
||||||
|
|
||||||
|
# [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)
|
## [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
|
**Note:** Version bump only for package @standardnotes/domain-core
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@standardnotes/domain-core",
|
"name": "@standardnotes/domain-core",
|
||||||
"version": "1.2.2",
|
"version": "1.5.1",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=18.0.0 <19.0.0"
|
"node": ">=18.0.0 <19.0.0"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -0,0 +1,36 @@
|
|||||||
|
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()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should say if a role has more power or equal power to another role', () => {
|
||||||
|
const proUserRole = RoleName.create('PRO_USER').getValue()
|
||||||
|
const plusUserRole = RoleName.create('PLUS_USER').getValue()
|
||||||
|
const coreUser = RoleName.create('CORE_USER').getValue()
|
||||||
|
|
||||||
|
expect(proUserRole.hasMoreOrEqualPowerTo(proUserRole)).toBeTruthy()
|
||||||
|
expect(proUserRole.hasMoreOrEqualPowerTo(plusUserRole)).toBeTruthy()
|
||||||
|
expect(proUserRole.hasMoreOrEqualPowerTo(coreUser)).toBeTruthy()
|
||||||
|
|
||||||
|
expect(plusUserRole.hasMoreOrEqualPowerTo(proUserRole)).toBeFalsy()
|
||||||
|
expect(plusUserRole.hasMoreOrEqualPowerTo(plusUserRole)).toBeTruthy()
|
||||||
|
expect(plusUserRole.hasMoreOrEqualPowerTo(coreUser)).toBeTruthy()
|
||||||
|
|
||||||
|
expect(coreUser.hasMoreOrEqualPowerTo(proUserRole)).toBeFalsy()
|
||||||
|
expect(coreUser.hasMoreOrEqualPowerTo(plusUserRole)).toBeFalsy()
|
||||||
|
expect(coreUser.hasMoreOrEqualPowerTo(coreUser)).toBeTruthy()
|
||||||
|
})
|
||||||
|
})
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
hasMoreOrEqualPowerTo(roleName: RoleName): boolean {
|
||||||
|
switch (this.value) {
|
||||||
|
case RoleName.NAMES.ProUser:
|
||||||
|
return true
|
||||||
|
case RoleName.NAMES.PlusUser:
|
||||||
|
return [RoleName.NAMES.CoreUser, RoleName.NAMES.PlusUser].includes(roleName.value)
|
||||||
|
case RoleName.NAMES.CoreUser:
|
||||||
|
return [RoleName.NAMES.CoreUser].includes(roleName.value)
|
||||||
|
default:
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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 }))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,77 @@
|
|||||||
|
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()
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should tell if collection has a role with more or equal power to', () => {
|
||||||
|
let roles = [RoleName.create('CORE_USER').getValue()]
|
||||||
|
let valueOrError = RoleNameCollection.create(roles)
|
||||||
|
let roleNames = valueOrError.getValue()
|
||||||
|
|
||||||
|
expect(roleNames.hasARoleNameWithMoreOrEqualPowerTo(RoleName.create('PLUS_USER').getValue())).toBeFalsy()
|
||||||
|
expect(roleNames.hasARoleNameWithMoreOrEqualPowerTo(RoleName.create('PRO_USER').getValue())).toBeFalsy()
|
||||||
|
expect(roleNames.hasARoleNameWithMoreOrEqualPowerTo(RoleName.create('CORE_USER').getValue())).toBeTruthy()
|
||||||
|
|
||||||
|
roles = [RoleName.create('CORE_USER').getValue(), RoleName.create('PLUS_USER').getValue()]
|
||||||
|
valueOrError = RoleNameCollection.create(roles)
|
||||||
|
roleNames = valueOrError.getValue()
|
||||||
|
|
||||||
|
expect(roleNames.hasARoleNameWithMoreOrEqualPowerTo(RoleName.create('PLUS_USER').getValue())).toBeTruthy()
|
||||||
|
expect(roleNames.hasARoleNameWithMoreOrEqualPowerTo(RoleName.create('PRO_USER').getValue())).toBeFalsy()
|
||||||
|
expect(roleNames.hasARoleNameWithMoreOrEqualPowerTo(RoleName.create('CORE_USER').getValue())).toBeTruthy()
|
||||||
|
|
||||||
|
roles = [RoleName.create('PRO_USER').getValue(), RoleName.create('PLUS_USER').getValue()]
|
||||||
|
valueOrError = RoleNameCollection.create(roles)
|
||||||
|
roleNames = valueOrError.getValue()
|
||||||
|
|
||||||
|
expect(roleNames.hasARoleNameWithMoreOrEqualPowerTo(RoleName.create('PLUS_USER').getValue())).toBeTruthy()
|
||||||
|
expect(roleNames.hasARoleNameWithMoreOrEqualPowerTo(RoleName.create('PRO_USER').getValue())).toBeTruthy()
|
||||||
|
expect(roleNames.hasARoleNameWithMoreOrEqualPowerTo(RoleName.create('CORE_USER').getValue())).toBeTruthy()
|
||||||
|
})
|
||||||
|
})
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
hasARoleNameWithMoreOrEqualPowerTo(roleName: RoleName): boolean {
|
||||||
|
for (const existingRoleName of this.props.value) {
|
||||||
|
if (existingRoleName.hasMoreOrEqualPowerTo(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 }))
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
import { RoleName } from './RoleName'
|
||||||
|
|
||||||
|
export interface RoleNameCollectionProps {
|
||||||
|
value: RoleName[]
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
export interface RoleNameProps {
|
||||||
|
value: string
|
||||||
|
}
|
||||||
@@ -1,5 +1,9 @@
|
|||||||
export * from './Common/Email'
|
export * from './Common/Email'
|
||||||
export * from './Common/EmailProps'
|
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/Timestamps'
|
||||||
export * from './Common/TimestampsProps'
|
export * from './Common/TimestampsProps'
|
||||||
export * from './Common/Uuid'
|
export * from './Common/Uuid'
|
||||||
|
|||||||
@@ -3,6 +3,26 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.9.36](https://github.com/standardnotes/server/compare/@standardnotes/domain-events-infra@1.9.35...@standardnotes/domain-events-infra@1.9.36) (2022-11-30)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @standardnotes/domain-events-infra
|
||||||
|
|
||||||
|
## [1.9.35](https://github.com/standardnotes/server/compare/@standardnotes/domain-events-infra@1.9.34...@standardnotes/domain-events-infra@1.9.35) (2022-11-28)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @standardnotes/domain-events-infra
|
||||||
|
|
||||||
|
## [1.9.34](https://github.com/standardnotes/server/compare/@standardnotes/domain-events-infra@1.9.33...@standardnotes/domain-events-infra@1.9.34) (2022-11-25)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @standardnotes/domain-events-infra
|
||||||
|
|
||||||
|
## [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)
|
## [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
|
**Note:** Version bump only for package @standardnotes/domain-events-infra
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@standardnotes/domain-events-infra",
|
"name": "@standardnotes/domain-events-infra",
|
||||||
"version": "1.9.31",
|
"version": "1.9.36",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=18.0.0 <19.0.0"
|
"node": ">=18.0.0 <19.0.0"
|
||||||
},
|
},
|
||||||
@@ -23,9 +23,8 @@
|
|||||||
"test": "jest spec --coverage"
|
"test": "jest spec --coverage"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@newrelic/native-metrics": "^9.0.0",
|
|
||||||
"@standardnotes/domain-events": "workspace:*",
|
"@standardnotes/domain-events": "workspace:*",
|
||||||
"aws-sdk": "^2.1253.0",
|
"aws-sdk": "^2.1260.0",
|
||||||
"ioredis": "^5.2.4",
|
"ioredis": "^5.2.4",
|
||||||
"newrelic": "^9.6.0",
|
"newrelic": "^9.6.0",
|
||||||
"reflect-metadata": "^0.1.13",
|
"reflect-metadata": "^0.1.13",
|
||||||
|
|||||||
@@ -3,6 +3,22 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
# [2.92.0](https://github.com/standardnotes/server/compare/@standardnotes/domain-events@2.91.0...@standardnotes/domain-events@2.92.0) (2022-11-30)
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **revisions:** add updating user uuid on revisions in async processing ([0f67aa4](https://github.com/standardnotes/server/commit/0f67aa4058301dfa92794b90a842966173f71b95))
|
||||||
|
|
||||||
|
# [2.91.0](https://github.com/standardnotes/server/compare/@standardnotes/domain-events@2.90.2...@standardnotes/domain-events@2.91.0) (2022-11-28)
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **revisions:** add copying revisions on duplicated items ([7bb698e](https://github.com/standardnotes/server/commit/7bb698e44222ef128d9642d625e96b7d26ee4dbf))
|
||||||
|
|
||||||
|
## [2.90.2](https://github.com/standardnotes/server/compare/@standardnotes/domain-events@2.90.1...@standardnotes/domain-events@2.90.2) (2022-11-25)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @standardnotes/domain-events
|
||||||
|
|
||||||
## [2.90.1](https://github.com/standardnotes/server/compare/@standardnotes/domain-events@2.90.0...@standardnotes/domain-events@2.90.1) (2022-11-22)
|
## [2.90.1](https://github.com/standardnotes/server/compare/@standardnotes/domain-events@2.90.0...@standardnotes/domain-events@2.90.1) (2022-11-22)
|
||||||
|
|
||||||
**Note:** Version bump only for package @standardnotes/domain-events
|
**Note:** Version bump only for package @standardnotes/domain-events
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@standardnotes/domain-events",
|
"name": "@standardnotes/domain-events",
|
||||||
"version": "2.90.1",
|
"version": "2.92.0",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=18.0.0 <19.0.0"
|
"node": ">=18.0.0 <19.0.0"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
import { DomainEventInterface } from './DomainEventInterface'
|
||||||
|
import { RevisionsCopyRequestedEventPayload } from './RevisionsCopyRequestedEventPayload'
|
||||||
|
|
||||||
|
export interface RevisionsCopyRequestedEvent extends DomainEventInterface {
|
||||||
|
type: 'REVISIONS_COPY_REQUESTED'
|
||||||
|
payload: RevisionsCopyRequestedEventPayload
|
||||||
|
}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
export interface RevisionsCopyRequestedEventPayload {
|
||||||
|
newItemUuid: string
|
||||||
|
originalItemUuid: string
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
import { DomainEventInterface } from './DomainEventInterface'
|
||||||
|
import { RevisionsOwnershipUpdateRequestedEventPayload } from './RevisionsOwnershipUpdateRequestedEventPayload'
|
||||||
|
|
||||||
|
export interface RevisionsOwnershipUpdateRequestedEvent extends DomainEventInterface {
|
||||||
|
type: 'REVISIONS_OWNERSHIP_UPDATE_REQUESTED'
|
||||||
|
payload: RevisionsOwnershipUpdateRequestedEventPayload
|
||||||
|
}
|
||||||
+4
@@ -0,0 +1,4 @@
|
|||||||
|
export interface RevisionsOwnershipUpdateRequestedEventPayload {
|
||||||
|
itemUuid: string
|
||||||
|
userUuid: string
|
||||||
|
}
|
||||||
@@ -74,6 +74,10 @@ export * from './Event/RefundRequestedEvent'
|
|||||||
export * from './Event/RefundRequestedEventPayload'
|
export * from './Event/RefundRequestedEventPayload'
|
||||||
export * from './Event/RefundProcessedEvent'
|
export * from './Event/RefundProcessedEvent'
|
||||||
export * from './Event/RefundProcessedEventPayload'
|
export * from './Event/RefundProcessedEventPayload'
|
||||||
|
export * from './Event/RevisionsCopyRequestedEvent'
|
||||||
|
export * from './Event/RevisionsCopyRequestedEventPayload'
|
||||||
|
export * from './Event/RevisionsOwnershipUpdateRequestedEvent'
|
||||||
|
export * from './Event/RevisionsOwnershipUpdateRequestedEventPayload'
|
||||||
export * from './Event/SharedSubscriptionInvitationCanceledEvent'
|
export * from './Event/SharedSubscriptionInvitationCanceledEvent'
|
||||||
export * from './Event/SharedSubscriptionInvitationCanceledEventPayload'
|
export * from './Event/SharedSubscriptionInvitationCanceledEventPayload'
|
||||||
export * from './Event/SharedSubscriptionInvitationCreatedEvent'
|
export * from './Event/SharedSubscriptionInvitationCreatedEvent'
|
||||||
|
|||||||
@@ -3,6 +3,32 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.6.32](https://github.com/standardnotes/server/compare/@standardnotes/event-store@1.6.31...@standardnotes/event-store@1.6.32) (2022-11-30)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @standardnotes/event-store
|
||||||
|
|
||||||
|
## [1.6.31](https://github.com/standardnotes/server/compare/@standardnotes/event-store@1.6.30...@standardnotes/event-store@1.6.31) (2022-11-28)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @standardnotes/event-store
|
||||||
|
|
||||||
|
## [1.6.30](https://github.com/standardnotes/server/compare/@standardnotes/event-store@1.6.29...@standardnotes/event-store@1.6.30) (2022-11-25)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @standardnotes/event-store
|
||||||
|
|
||||||
|
## [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)
|
## [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
|
**Note:** Version bump only for package @standardnotes/event-store
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@standardnotes/event-store",
|
"name": "@standardnotes/event-store",
|
||||||
"version": "1.6.26",
|
"version": "1.6.32",
|
||||||
"description": "Event Store Service",
|
"description": "Event Store Service",
|
||||||
"private": true,
|
"private": true,
|
||||||
"main": "dist/src/index.js",
|
"main": "dist/src/index.js",
|
||||||
@@ -31,11 +31,10 @@
|
|||||||
"typescript": "^4.8.4"
|
"typescript": "^4.8.4"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@newrelic/native-metrics": "^9.0.0",
|
|
||||||
"@standardnotes/domain-events": "workspace:*",
|
"@standardnotes/domain-events": "workspace:*",
|
||||||
"@standardnotes/domain-events-infra": "workspace:*",
|
"@standardnotes/domain-events-infra": "workspace:*",
|
||||||
"@standardnotes/time": "workspace:*",
|
"@standardnotes/time": "workspace:*",
|
||||||
"aws-sdk": "^2.1253.0",
|
"aws-sdk": "^2.1260.0",
|
||||||
"dotenv": "^16.0.1",
|
"dotenv": "^16.0.1",
|
||||||
"inversify": "^6.0.1",
|
"inversify": "^6.0.1",
|
||||||
"ioredis": "^5.2.4",
|
"ioredis": "^5.2.4",
|
||||||
|
|||||||
@@ -28,12 +28,19 @@ export class ContainerConfigLoader {
|
|||||||
|
|
||||||
await AppDataSource.initialize()
|
await AppDataSource.initialize()
|
||||||
|
|
||||||
container.bind<AWS.SQS>(TYPES.SQS).toConstantValue(
|
if (env.get('SQS_QUEUE_URL', true)) {
|
||||||
new AWS.SQS({
|
const sqsConfig: AWS.SQS.Types.ClientConfiguration = {
|
||||||
apiVersion: 'latest',
|
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({
|
const logger = winston.createLogger({
|
||||||
level: env.get('LOG_LEVEL') || 'info',
|
level: env.get('LOG_LEVEL') || 'info',
|
||||||
|
|||||||
@@ -3,6 +3,32 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.8.32](https://github.com/standardnotes/files/compare/@standardnotes/files-server@1.8.31...@standardnotes/files-server@1.8.32) (2022-11-30)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @standardnotes/files-server
|
||||||
|
|
||||||
|
## [1.8.31](https://github.com/standardnotes/files/compare/@standardnotes/files-server@1.8.30...@standardnotes/files-server@1.8.31) (2022-11-28)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @standardnotes/files-server
|
||||||
|
|
||||||
|
## [1.8.30](https://github.com/standardnotes/files/compare/@standardnotes/files-server@1.8.29...@standardnotes/files-server@1.8.30) (2022-11-25)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @standardnotes/files-server
|
||||||
|
|
||||||
|
## [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)
|
## [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
|
**Note:** Version bump only for package @standardnotes/files-server
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@standardnotes/files-server",
|
"name": "@standardnotes/files-server",
|
||||||
"version": "1.8.26",
|
"version": "1.8.32",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=18.0.0 <19.0.0"
|
"node": ">=18.0.0 <19.0.0"
|
||||||
},
|
},
|
||||||
@@ -25,7 +25,6 @@
|
|||||||
"upgrade:snjs": "yarn ncu -u '@standardnotes/*'"
|
"upgrade:snjs": "yarn ncu -u '@standardnotes/*'"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@newrelic/native-metrics": "^9.0.0",
|
|
||||||
"@sentry/node": "^7.19.0",
|
"@sentry/node": "^7.19.0",
|
||||||
"@standardnotes/common": "workspace:*",
|
"@standardnotes/common": "workspace:*",
|
||||||
"@standardnotes/domain-events": "workspace:*",
|
"@standardnotes/domain-events": "workspace:*",
|
||||||
@@ -34,7 +33,7 @@
|
|||||||
"@standardnotes/sncrypto-common": "^1.9.0",
|
"@standardnotes/sncrypto-common": "^1.9.0",
|
||||||
"@standardnotes/sncrypto-node": "workspace:*",
|
"@standardnotes/sncrypto-node": "workspace:*",
|
||||||
"@standardnotes/time": "workspace:*",
|
"@standardnotes/time": "workspace:*",
|
||||||
"aws-sdk": "^2.1253.0",
|
"aws-sdk": "^2.1260.0",
|
||||||
"connect-busboy": "^1.0.0",
|
"connect-busboy": "^1.0.0",
|
||||||
"cors": "^2.8.5",
|
"cors": "^2.8.5",
|
||||||
"dayjs": "^1.11.6",
|
"dayjs": "^1.11.6",
|
||||||
|
|||||||
@@ -110,13 +110,24 @@ export class ContainerConfigLoader {
|
|||||||
}
|
}
|
||||||
container.bind<ValidatorInterface<Uuid>>(TYPES.UuidValidator).toConstantValue(new UuidValidator())
|
container.bind<ValidatorInterface<Uuid>>(TYPES.UuidValidator).toConstantValue(new UuidValidator())
|
||||||
|
|
||||||
if (env.get('SNS_AWS_REGION', true)) {
|
if (env.get('SNS_TOPIC_ARN', true)) {
|
||||||
container.bind<AWS.SNS>(TYPES.SNS).toConstantValue(
|
const snsConfig: AWS.SNS.Types.ClientConfiguration = {
|
||||||
new AWS.SNS({
|
apiVersion: 'latest',
|
||||||
apiVersion: 'latest',
|
region: env.get('SNS_AWS_REGION', true),
|
||||||
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)) {
|
if (env.get('SQS_QUEUE_URL', true)) {
|
||||||
|
|||||||
@@ -3,6 +3,10 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.6.2](https://github.com/standardnotes/server/compare/@standardnotes/predicates@1.6.1...@standardnotes/predicates@1.6.2) (2022-11-25)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @standardnotes/predicates
|
||||||
|
|
||||||
## [1.6.1](https://github.com/standardnotes/server/compare/@standardnotes/predicates@1.6.0...@standardnotes/predicates@1.6.1) (2022-11-22)
|
## [1.6.1](https://github.com/standardnotes/server/compare/@standardnotes/predicates@1.6.0...@standardnotes/predicates@1.6.1) (2022-11-22)
|
||||||
|
|
||||||
**Note:** Version bump only for package @standardnotes/predicates
|
**Note:** Version bump only for package @standardnotes/predicates
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@standardnotes/predicates",
|
"name": "@standardnotes/predicates",
|
||||||
"version": "1.6.1",
|
"version": "1.6.2",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=18.0.0 <19.0.0"
|
"node": ">=18.0.0 <19.0.0"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -6,12 +6,12 @@ AUTH_JWT_SECRET=auth_jwt_secret
|
|||||||
|
|
||||||
PORT=3000
|
PORT=3000
|
||||||
|
|
||||||
DB_HOST=db
|
DB_HOST=127.0.0.1
|
||||||
DB_REPLICA_HOST=db
|
DB_REPLICA_HOST=127.0.0.1
|
||||||
DB_PORT=3306
|
DB_PORT=3306
|
||||||
DB_USERNAME=std_notes_user
|
DB_USERNAME=revisions
|
||||||
DB_PASSWORD=changeme123
|
DB_PASSWORD=revisionspassword
|
||||||
DB_DATABASE=standard_notes_db
|
DB_DATABASE=revisions
|
||||||
DB_DEBUG_LEVEL=all # "all" | "query" | "schema" | "error" | "warn" | "info" | "log" | "migration"
|
DB_DEBUG_LEVEL=all # "all" | "query" | "schema" | "error" | "warn" | "info" | "log" | "migration"
|
||||||
DB_MIGRATIONS_PATH=dist/migrations/*.js
|
DB_MIGRATIONS_PATH=dist/migrations/*.js
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,106 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
# [1.9.0](https://github.com/standardnotes/server/compare/@standardnotes/revisions-server@1.8.2...@standardnotes/revisions-server@1.9.0) (2022-11-30)
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **revisions:** add updating user uuid on revisions in async processing ([0f67aa4](https://github.com/standardnotes/server/commit/0f67aa4058301dfa92794b90a842966173f71b95))
|
||||||
|
|
||||||
|
## [1.8.2](https://github.com/standardnotes/server/compare/@standardnotes/revisions-server@1.8.1...@standardnotes/revisions-server@1.8.2) (2022-11-29)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **revisions:** make user uuid nullable ([fc8f8c5](https://github.com/standardnotes/server/commit/fc8f8c574dbc8901cc4a12986154841d39abcc9b))
|
||||||
|
|
||||||
|
## [1.8.1](https://github.com/standardnotes/server/compare/@standardnotes/revisions-server@1.8.0...@standardnotes/revisions-server@1.8.1) (2022-11-29)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **revisions:** mysql queries ([b0a994d](https://github.com/standardnotes/server/commit/b0a994d5be3b35f054a14a6e9661232090ec11e5))
|
||||||
|
|
||||||
|
# [1.8.0](https://github.com/standardnotes/server/compare/@standardnotes/revisions-server@1.7.1...@standardnotes/revisions-server@1.8.0) (2022-11-28)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **revisions:** binding for revisions copy request handler ([1c6c6a9](https://github.com/standardnotes/server/commit/1c6c6a9296d91c35699a15b2cb4182e26233eeb2))
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **revisions:** add copying revisions on duplicated items ([7bb698e](https://github.com/standardnotes/server/commit/7bb698e44222ef128d9642d625e96b7d26ee4dbf))
|
||||||
|
|
||||||
|
## [1.7.1](https://github.com/standardnotes/server/compare/@standardnotes/revisions-server@1.7.0...@standardnotes/revisions-server@1.7.1) (2022-11-28)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **revisions:** remove unnecessary indexes ([4b883b6](https://github.com/standardnotes/server/commit/4b883b68def777b0c0682cc6a8af6fd968b18d9f))
|
||||||
|
|
||||||
|
# [1.7.0](https://github.com/standardnotes/server/compare/@standardnotes/revisions-server@1.6.0...@standardnotes/revisions-server@1.7.0) (2022-11-28)
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **revisions:** add handling account deletion requests ([b4e8971](https://github.com/standardnotes/server/commit/b4e8971ad27fd198239f6eb976b8286575373ed6))
|
||||||
|
|
||||||
|
# [1.6.0](https://github.com/standardnotes/server/compare/@standardnotes/revisions-server@1.5.0...@standardnotes/revisions-server@1.6.0) (2022-11-28)
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **revisions:** add deleting revisions ([ac8a69f](https://github.com/standardnotes/server/commit/ac8a69f8d428e3cf8e4df5269db3cb31d9b118d5))
|
||||||
|
|
||||||
|
# [1.5.0](https://github.com/standardnotes/server/compare/@standardnotes/revisions-server@1.4.8...@standardnotes/revisions-server@1.5.0) (2022-11-28)
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **revisions:** add fetching single revision ([284561d](https://github.com/standardnotes/server/commit/284561d093eaa6d73af888142583ec705ba18f79))
|
||||||
|
|
||||||
|
## [1.4.8](https://github.com/standardnotes/server/compare/@standardnotes/revisions-server@1.4.7...@standardnotes/revisions-server@1.4.8) (2022-11-25)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @standardnotes/revisions-server
|
||||||
|
|
||||||
|
## [1.4.7](https://github.com/standardnotes/server/compare/@standardnotes/revisions-server@1.4.6...@standardnotes/revisions-server@1.4.7) (2022-11-24)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @standardnotes/revisions-server
|
||||||
|
|
||||||
|
## [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)
|
## [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
|
**Note:** Version bump only for package @standardnotes/revisions-server
|
||||||
|
|||||||
@@ -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`')
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
import { MigrationInterface, QueryRunner } from 'typeorm'
|
||||||
|
|
||||||
|
export class removeDateIndexes1669636497932 implements MigrationInterface {
|
||||||
|
name = 'removeDateIndexes1669636497932'
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query('DROP INDEX `created_at` ON `revisions`')
|
||||||
|
await queryRunner.query('DROP INDEX `creation_date` ON `revisions`')
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query('CREATE INDEX `creation_date` ON `revisions` (`creation_date`)')
|
||||||
|
await queryRunner.query('CREATE INDEX `created_at` ON `revisions` (`created_at`)')
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
import { MigrationInterface, QueryRunner } from 'typeorm'
|
||||||
|
|
||||||
|
export class makeUserUuidNullable1669735585016 implements MigrationInterface {
|
||||||
|
name = 'makeUserUuidNullable1669735585016'
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query('ALTER TABLE `revisions` CHANGE `user_uuid` `user_uuid` varchar(36) NULL')
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query('ALTER TABLE `revisions` CHANGE `user_uuid` `user_uuid` varchar(36) NOT NULL')
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@standardnotes/revisions-server",
|
"name": "@standardnotes/revisions-server",
|
||||||
"version": "1.2.2",
|
"version": "1.9.0",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=18.0.0 <19.0.0"
|
"node": ">=18.0.0 <19.0.0"
|
||||||
},
|
},
|
||||||
@@ -23,7 +23,6 @@
|
|||||||
"worker": "yarn node dist/bin/worker.js"
|
"worker": "yarn node dist/bin/worker.js"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@newrelic/native-metrics": "^9.0.0",
|
|
||||||
"@newrelic/winston-enricher": "^4.0.0",
|
"@newrelic/winston-enricher": "^4.0.0",
|
||||||
"@sentry/node": "^7.19.0",
|
"@sentry/node": "^7.19.0",
|
||||||
"@standardnotes/api": "^1.19.0",
|
"@standardnotes/api": "^1.19.0",
|
||||||
@@ -33,7 +32,7 @@
|
|||||||
"@standardnotes/domain-events-infra": "workspace:*",
|
"@standardnotes/domain-events-infra": "workspace:*",
|
||||||
"@standardnotes/security": "workspace:^",
|
"@standardnotes/security": "workspace:^",
|
||||||
"@standardnotes/time": "workspace:^",
|
"@standardnotes/time": "workspace:^",
|
||||||
"aws-sdk": "^2.1253.0",
|
"aws-sdk": "^2.1260.0",
|
||||||
"cors": "2.8.5",
|
"cors": "2.8.5",
|
||||||
"dotenv": "^16.0.1",
|
"dotenv": "^16.0.1",
|
||||||
"express": "^4.18.2",
|
"express": "^4.18.2",
|
||||||
|
|||||||
@@ -35,6 +35,13 @@ import { RevisionPersistenceMapper } from '../Mapping/RevisionPersistenceMapper'
|
|||||||
import { ItemDumpedEventHandler } from '../Domain/Handler/ItemDumpedEventHandler'
|
import { ItemDumpedEventHandler } from '../Domain/Handler/ItemDumpedEventHandler'
|
||||||
import { DumpRepositoryInterface } from '../Domain/Dump/DumpRepositoryInterface'
|
import { DumpRepositoryInterface } from '../Domain/Dump/DumpRepositoryInterface'
|
||||||
import { S3DumpRepository } from '../Infra/S3/S3ItemDumpRepository'
|
import { S3DumpRepository } from '../Infra/S3/S3ItemDumpRepository'
|
||||||
|
import { FSDumpRepository } from '../Infra/FS/FSDumpRepository'
|
||||||
|
import { GetRevision } from '../Domain/UseCase/GetRevision/GetRevision'
|
||||||
|
import { DeleteRevision } from '../Domain/UseCase/DeleteRevision/DeleteRevision'
|
||||||
|
import { AccountDeletionRequestedEventHandler } from '../Domain/Handler/AccountDeletionRequestedEventHandler'
|
||||||
|
import { RevisionsCopyRequestedEventHandler } from '../Domain/Handler/RevisionsCopyRequestedEventHandler'
|
||||||
|
import { CopyRevisions } from '../Domain/UseCase/CopyRevisions/CopyRevisions'
|
||||||
|
import { RevisionsOwnershipUpdateRequestedEventHandler } from '../Domain/Handler/RevisionsOwnershipUpdateRequestedEventHandler'
|
||||||
|
|
||||||
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
||||||
const newrelicFormatter = require('@newrelic/winston-enricher')
|
const newrelicFormatter = require('@newrelic/winston-enricher')
|
||||||
@@ -72,13 +79,18 @@ export class ContainerConfigLoader {
|
|||||||
})
|
})
|
||||||
container.bind<winston.Logger>(TYPES.Logger).toConstantValue(logger)
|
container.bind<winston.Logger>(TYPES.Logger).toConstantValue(logger)
|
||||||
|
|
||||||
if (env.get('SQS_AWS_REGION', true)) {
|
if (env.get('SQS_QUEUE_URL', true)) {
|
||||||
container.bind<AWS.SQS>(TYPES.SQS).toConstantValue(
|
const sqsConfig: AWS.SQS.Types.ClientConfiguration = {
|
||||||
new AWS.SQS({
|
apiVersion: 'latest',
|
||||||
apiVersion: 'latest',
|
region: env.get('SQS_AWS_REGION', true),
|
||||||
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
|
let s3Client = undefined
|
||||||
@@ -126,25 +138,47 @@ export class ContainerConfigLoader {
|
|||||||
container.get(TYPES.RevisionPersistenceMapper),
|
container.get(TYPES.RevisionPersistenceMapper),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
container
|
if (env.get('S3_AWS_REGION', true)) {
|
||||||
.bind<DumpRepositoryInterface>(TYPES.DumpRepository)
|
container
|
||||||
.toConstantValue(
|
.bind<DumpRepositoryInterface>(TYPES.DumpRepository)
|
||||||
new S3DumpRepository(
|
.toConstantValue(
|
||||||
container.get(TYPES.S3_BACKUP_BUCKET_NAME),
|
new S3DumpRepository(
|
||||||
container.get(TYPES.S3),
|
container.get(TYPES.S3_BACKUP_BUCKET_NAME),
|
||||||
container.get(TYPES.RevisionItemStringMapper),
|
container.get(TYPES.S3),
|
||||||
),
|
container.get(TYPES.RevisionItemStringMapper),
|
||||||
)
|
),
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
container
|
||||||
|
.bind<DumpRepositoryInterface>(TYPES.DumpRepository)
|
||||||
|
.toConstantValue(new FSDumpRepository(container.get(TYPES.RevisionItemStringMapper)))
|
||||||
|
}
|
||||||
|
|
||||||
// use cases
|
// use cases
|
||||||
container
|
container
|
||||||
.bind<GetRevisionsMetada>(TYPES.GetRevisionsMetada)
|
.bind<GetRevisionsMetada>(TYPES.GetRevisionsMetada)
|
||||||
.toConstantValue(new GetRevisionsMetada(container.get(TYPES.RevisionRepository)))
|
.toConstantValue(new GetRevisionsMetada(container.get(TYPES.RevisionRepository)))
|
||||||
|
container
|
||||||
|
.bind<GetRevision>(TYPES.GetRevision)
|
||||||
|
.toConstantValue(new GetRevision(container.get(TYPES.RevisionRepository)))
|
||||||
|
container
|
||||||
|
.bind<DeleteRevision>(TYPES.DeleteRevision)
|
||||||
|
.toConstantValue(new DeleteRevision(container.get(TYPES.RevisionRepository)))
|
||||||
|
container
|
||||||
|
.bind<CopyRevisions>(TYPES.CopyRevisions)
|
||||||
|
.toConstantValue(new CopyRevisions(container.get(TYPES.RevisionRepository)))
|
||||||
|
|
||||||
// Controller
|
// Controller
|
||||||
container
|
container
|
||||||
.bind<RevisionsController>(TYPES.RevisionsController)
|
.bind<RevisionsController>(TYPES.RevisionsController)
|
||||||
.toConstantValue(new RevisionsController(container.get(TYPES.GetRevisionsMetada), container.get(TYPES.Logger)))
|
.toConstantValue(
|
||||||
|
new RevisionsController(
|
||||||
|
container.get(TYPES.GetRevisionsMetada),
|
||||||
|
container.get(TYPES.GetRevision),
|
||||||
|
container.get(TYPES.DeleteRevision),
|
||||||
|
container.get(TYPES.Logger),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
// Handlers
|
// Handlers
|
||||||
container
|
container
|
||||||
@@ -152,6 +186,19 @@ export class ContainerConfigLoader {
|
|||||||
.toConstantValue(
|
.toConstantValue(
|
||||||
new ItemDumpedEventHandler(container.get(TYPES.DumpRepository), container.get(TYPES.RevisionRepository)),
|
new ItemDumpedEventHandler(container.get(TYPES.DumpRepository), container.get(TYPES.RevisionRepository)),
|
||||||
)
|
)
|
||||||
|
container
|
||||||
|
.bind<AccountDeletionRequestedEventHandler>(TYPES.AccountDeletionRequestedEventHandler)
|
||||||
|
.toConstantValue(
|
||||||
|
new AccountDeletionRequestedEventHandler(container.get(TYPES.RevisionRepository), container.get(TYPES.Logger)),
|
||||||
|
)
|
||||||
|
container
|
||||||
|
.bind<RevisionsCopyRequestedEventHandler>(TYPES.RevisionsCopyRequestedEventHandler)
|
||||||
|
.toConstantValue(
|
||||||
|
new RevisionsCopyRequestedEventHandler(container.get(TYPES.CopyRevisions), container.get(TYPES.Logger)),
|
||||||
|
)
|
||||||
|
container
|
||||||
|
.bind<RevisionsOwnershipUpdateRequestedEventHandler>(TYPES.RevisionsOwnershipUpdateRequestedEventHandler)
|
||||||
|
.toConstantValue(new RevisionsOwnershipUpdateRequestedEventHandler(container.get(TYPES.RevisionRepository)))
|
||||||
|
|
||||||
// Services
|
// Services
|
||||||
container
|
container
|
||||||
@@ -165,6 +212,9 @@ export class ContainerConfigLoader {
|
|||||||
|
|
||||||
const eventHandlers: Map<string, DomainEventHandlerInterface> = new Map([
|
const eventHandlers: Map<string, DomainEventHandlerInterface> = new Map([
|
||||||
['ITEM_DUMPED', container.get(TYPES.ItemDumpedEventHandler)],
|
['ITEM_DUMPED', container.get(TYPES.ItemDumpedEventHandler)],
|
||||||
|
['ACCOUNT_DELETION_REQUESTED', container.get(TYPES.AccountDeletionRequestedEventHandler)],
|
||||||
|
['REVISIONS_COPY_REQUESTED', container.get(TYPES.RevisionsCopyRequestedEventHandler)],
|
||||||
|
['REVISIONS_OWNERSHIP_UPDATE_REQUESTED', container.get(TYPES.RevisionsOwnershipUpdateRequestedEventHandler)],
|
||||||
])
|
])
|
||||||
|
|
||||||
if (env.get('SQS_QUEUE_URL', true)) {
|
if (env.get('SQS_QUEUE_URL', true)) {
|
||||||
|
|||||||
@@ -25,10 +25,16 @@ const TYPES = {
|
|||||||
VERSION: Symbol.for('VERSION'),
|
VERSION: Symbol.for('VERSION'),
|
||||||
// use cases
|
// use cases
|
||||||
GetRevisionsMetada: Symbol.for('GetRevisionsMetada'),
|
GetRevisionsMetada: Symbol.for('GetRevisionsMetada'),
|
||||||
|
GetRevision: Symbol.for('GetRevision'),
|
||||||
|
DeleteRevision: Symbol.for('DeleteRevision'),
|
||||||
|
CopyRevisions: Symbol.for('CopyRevisions'),
|
||||||
// Controller
|
// Controller
|
||||||
RevisionsController: Symbol.for('RevisionsController'),
|
RevisionsController: Symbol.for('RevisionsController'),
|
||||||
// Handlers
|
// Handlers
|
||||||
ItemDumpedEventHandler: Symbol.for('ItemDumpedEventHandler'),
|
ItemDumpedEventHandler: Symbol.for('ItemDumpedEventHandler'),
|
||||||
|
AccountDeletionRequestedEventHandler: Symbol.for('AccountDeletionRequestedEventHandler'),
|
||||||
|
RevisionsCopyRequestedEventHandler: Symbol.for('RevisionsCopyRequestedEventHandler'),
|
||||||
|
RevisionsOwnershipUpdateRequestedEventHandler: Symbol.for('RevisionsOwnershipUpdateRequestedEventHandler'),
|
||||||
// Services
|
// Services
|
||||||
CrossServiceTokenDecoder: Symbol.for('CrossServiceTokenDecoder'),
|
CrossServiceTokenDecoder: Symbol.for('CrossServiceTokenDecoder'),
|
||||||
DomainEventSubscriberFactory: Symbol.for('DomainEventSubscriberFactory'),
|
DomainEventSubscriberFactory: Symbol.for('DomainEventSubscriberFactory'),
|
||||||
|
|||||||
@@ -1,33 +1,69 @@
|
|||||||
import { Result } from '@standardnotes/domain-core'
|
import { Result } from '@standardnotes/domain-core'
|
||||||
import { Logger } from 'winston'
|
import { Logger } from 'winston'
|
||||||
|
|
||||||
|
import { DeleteRevision } from '../Domain/UseCase/DeleteRevision/DeleteRevision'
|
||||||
|
import { GetRevision } from '../Domain/UseCase/GetRevision/GetRevision'
|
||||||
import { GetRevisionsMetada } from '../Domain/UseCase/GetRevisionsMetada/GetRevisionsMetada'
|
import { GetRevisionsMetada } from '../Domain/UseCase/GetRevisionsMetada/GetRevisionsMetada'
|
||||||
|
|
||||||
import { RevisionsController } from './RevisionsController'
|
import { RevisionsController } from './RevisionsController'
|
||||||
|
|
||||||
describe('RevisionsController', () => {
|
describe('RevisionsController', () => {
|
||||||
let getRevisionsMetadata: GetRevisionsMetada
|
let getRevisionsMetadata: GetRevisionsMetada
|
||||||
|
let getRevision: GetRevision
|
||||||
|
let deleteRevision: DeleteRevision
|
||||||
let logger: Logger
|
let logger: Logger
|
||||||
|
|
||||||
const createController = () => new RevisionsController(getRevisionsMetadata, logger)
|
const createController = () => new RevisionsController(getRevisionsMetadata, getRevision, deleteRevision, logger)
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
getRevisionsMetadata = {} as jest.Mocked<GetRevisionsMetada>
|
getRevisionsMetadata = {} as jest.Mocked<GetRevisionsMetada>
|
||||||
getRevisionsMetadata.execute = jest.fn().mockReturnValue(Result.ok())
|
getRevisionsMetadata.execute = jest.fn().mockReturnValue(Result.ok())
|
||||||
|
|
||||||
|
getRevision = {} as jest.Mocked<GetRevision>
|
||||||
|
getRevision.execute = jest.fn().mockReturnValue(Result.ok())
|
||||||
|
|
||||||
|
deleteRevision = {} as jest.Mocked<DeleteRevision>
|
||||||
|
deleteRevision.execute = jest.fn().mockReturnValue(Result.ok())
|
||||||
|
|
||||||
logger = {} as jest.Mocked<Logger>
|
logger = {} as jest.Mocked<Logger>
|
||||||
logger.warn = jest.fn()
|
logger.warn = jest.fn()
|
||||||
})
|
})
|
||||||
|
|
||||||
it('should get revisions list', async () => {
|
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)
|
expect(response.status).toEqual(200)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('should indicate failure to get revisions list', async () => {
|
it('should indicate failure to get revisions list', async () => {
|
||||||
getRevisionsMetadata.execute = jest.fn().mockReturnValue(Result.fail('Oops'))
|
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)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should get revision', async () => {
|
||||||
|
const response = await createController().getRevision({ revisionUuid: '1-2-3', userUuid: '1-2-3' })
|
||||||
|
|
||||||
|
expect(response.status).toEqual(200)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should indicate failure to get revision', async () => {
|
||||||
|
getRevision.execute = jest.fn().mockReturnValue(Result.fail('Oops'))
|
||||||
|
const response = await createController().getRevision({ revisionUuid: '1-2-3', userUuid: '1-2-3' })
|
||||||
|
|
||||||
|
expect(response.status).toEqual(400)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should delete revision', async () => {
|
||||||
|
const response = await createController().deleteRevision({ revisionUuid: '1-2-3', userUuid: '1-2-3' })
|
||||||
|
|
||||||
|
expect(response.status).toEqual(200)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should indicate failure to delete revision', async () => {
|
||||||
|
deleteRevision.execute = jest.fn().mockReturnValue(Result.fail('Oops'))
|
||||||
|
const response = await createController().deleteRevision({ revisionUuid: '1-2-3', userUuid: '1-2-3' })
|
||||||
|
|
||||||
expect(response.status).toEqual(400)
|
expect(response.status).toEqual(400)
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -3,12 +3,24 @@ import { HttpResponse, HttpStatusCode } from '@standardnotes/api'
|
|||||||
|
|
||||||
import { GetRevisionsMetada } from '../Domain/UseCase/GetRevisionsMetada/GetRevisionsMetada'
|
import { GetRevisionsMetada } from '../Domain/UseCase/GetRevisionsMetada/GetRevisionsMetada'
|
||||||
import { GetRevisionsMetadataRequestParams } from '../Infra/Http/GetRevisionsMetadataRequestParams'
|
import { GetRevisionsMetadataRequestParams } from '../Infra/Http/GetRevisionsMetadataRequestParams'
|
||||||
|
import { GetRevisionRequestParams } from '../Infra/Http/GetRevisionRequestParams'
|
||||||
|
import { GetRevision } from '../Domain/UseCase/GetRevision/GetRevision'
|
||||||
|
import { DeleteRevision } from '../Domain/UseCase/DeleteRevision/DeleteRevision'
|
||||||
|
import { DeleteRevisionRequestParams } from '../Infra/Http/DeleteRevisionRequestParams'
|
||||||
|
|
||||||
export class RevisionsController {
|
export class RevisionsController {
|
||||||
constructor(private getRevisionsMetadata: GetRevisionsMetada, private logger: Logger) {}
|
constructor(
|
||||||
|
private getRevisionsMetadata: GetRevisionsMetada,
|
||||||
|
private doGetRevision: GetRevision,
|
||||||
|
private doDeleteRevision: DeleteRevision,
|
||||||
|
private logger: Logger,
|
||||||
|
) {}
|
||||||
|
|
||||||
async getRevisions(params: GetRevisionsMetadataRequestParams): Promise<HttpResponse> {
|
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()) {
|
if (revisionMetadataOrError.isFailed()) {
|
||||||
this.logger.warn(revisionMetadataOrError.getError())
|
this.logger.warn(revisionMetadataOrError.getError())
|
||||||
@@ -28,4 +40,54 @@ export class RevisionsController {
|
|||||||
data: { revisions: revisionMetadataOrError.getValue() },
|
data: { revisions: revisionMetadataOrError.getValue() },
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async getRevision(params: GetRevisionRequestParams): Promise<HttpResponse> {
|
||||||
|
const revisionOrError = await this.doGetRevision.execute({
|
||||||
|
revisionUuid: params.revisionUuid,
|
||||||
|
userUuid: params.userUuid,
|
||||||
|
})
|
||||||
|
|
||||||
|
if (revisionOrError.isFailed()) {
|
||||||
|
this.logger.warn(revisionOrError.getError())
|
||||||
|
|
||||||
|
return {
|
||||||
|
status: HttpStatusCode.BadRequest,
|
||||||
|
data: {
|
||||||
|
error: {
|
||||||
|
message: 'Could not retrieve revision.',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
status: HttpStatusCode.Success,
|
||||||
|
data: { revision: revisionOrError.getValue() },
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async deleteRevision(params: DeleteRevisionRequestParams): Promise<HttpResponse> {
|
||||||
|
const revisionOrError = await this.doDeleteRevision.execute({
|
||||||
|
revisionUuid: params.revisionUuid,
|
||||||
|
userUuid: params.userUuid,
|
||||||
|
})
|
||||||
|
|
||||||
|
if (revisionOrError.isFailed()) {
|
||||||
|
this.logger.warn(revisionOrError.getError())
|
||||||
|
|
||||||
|
return {
|
||||||
|
status: HttpStatusCode.BadRequest,
|
||||||
|
data: {
|
||||||
|
error: {
|
||||||
|
message: 'Could not delete revision.',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
status: HttpStatusCode.Success,
|
||||||
|
data: { message: revisionOrError.getValue() },
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,45 @@
|
|||||||
|
import 'reflect-metadata'
|
||||||
|
|
||||||
|
import { AccountDeletionRequestedEvent } from '@standardnotes/domain-events'
|
||||||
|
import { Logger } from 'winston'
|
||||||
|
import { AccountDeletionRequestedEventHandler } from './AccountDeletionRequestedEventHandler'
|
||||||
|
import { RevisionRepositoryInterface } from '../Revision/RevisionRepositoryInterface'
|
||||||
|
|
||||||
|
describe('AccountDeletionRequestedEventHandler', () => {
|
||||||
|
let revisionRepository: RevisionRepositoryInterface
|
||||||
|
let logger: Logger
|
||||||
|
let event: AccountDeletionRequestedEvent
|
||||||
|
|
||||||
|
const createHandler = () => new AccountDeletionRequestedEventHandler(revisionRepository, logger)
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
revisionRepository = {} as jest.Mocked<RevisionRepositoryInterface>
|
||||||
|
revisionRepository.removeByUserUuid = jest.fn()
|
||||||
|
|
||||||
|
logger = {} as jest.Mocked<Logger>
|
||||||
|
logger.info = jest.fn()
|
||||||
|
logger.warn = jest.fn()
|
||||||
|
|
||||||
|
event = {} as jest.Mocked<AccountDeletionRequestedEvent>
|
||||||
|
event.createdAt = new Date(1)
|
||||||
|
event.payload = {
|
||||||
|
userUuid: '2-3-4',
|
||||||
|
userCreatedAtTimestamp: 1,
|
||||||
|
regularSubscriptionUuid: '1-2-3',
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should remove all revisions for a user', async () => {
|
||||||
|
event.payload.userUuid = '84c0f8e8-544a-4c7e-9adf-26209303bc1d'
|
||||||
|
|
||||||
|
await createHandler().handle(event)
|
||||||
|
|
||||||
|
expect(revisionRepository.removeByUserUuid).toHaveBeenCalled()
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should not remove all revisions for an invalid user uuid', async () => {
|
||||||
|
await createHandler().handle(event)
|
||||||
|
|
||||||
|
expect(revisionRepository.removeByUserUuid).not.toHaveBeenCalled()
|
||||||
|
})
|
||||||
|
})
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
import { Uuid } from '@standardnotes/domain-core'
|
||||||
|
import { AccountDeletionRequestedEvent, DomainEventHandlerInterface } from '@standardnotes/domain-events'
|
||||||
|
import { Logger } from 'winston'
|
||||||
|
|
||||||
|
import { RevisionRepositoryInterface } from '../Revision/RevisionRepositoryInterface'
|
||||||
|
|
||||||
|
export class AccountDeletionRequestedEventHandler implements DomainEventHandlerInterface {
|
||||||
|
constructor(private revisionRepository: RevisionRepositoryInterface, private logger: Logger) {}
|
||||||
|
|
||||||
|
async handle(event: AccountDeletionRequestedEvent): Promise<void> {
|
||||||
|
const userUuidOrError = Uuid.create(event.payload.userUuid)
|
||||||
|
if (userUuidOrError.isFailed()) {
|
||||||
|
this.logger.warn(`Failed account cleanup: ${userUuidOrError.getError()}`)
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const userUuid = userUuidOrError.getValue()
|
||||||
|
|
||||||
|
await this.revisionRepository.removeByUserUuid(userUuid)
|
||||||
|
|
||||||
|
this.logger.info(`Finished account cleanup for user: ${event.payload.userUuid}`)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
import { Result } from '@standardnotes/domain-core'
|
||||||
|
import { RevisionsCopyRequestedEvent } from '@standardnotes/domain-events'
|
||||||
|
import { Logger } from 'winston'
|
||||||
|
|
||||||
|
import { CopyRevisions } from '../UseCase/CopyRevisions/CopyRevisions'
|
||||||
|
import { RevisionsCopyRequestedEventHandler } from './RevisionsCopyRequestedEventHandler'
|
||||||
|
|
||||||
|
describe('RevisionsCopyRequestedEventHandler', () => {
|
||||||
|
let copyRevisions: CopyRevisions
|
||||||
|
let logger: Logger
|
||||||
|
let event: RevisionsCopyRequestedEvent
|
||||||
|
|
||||||
|
const createHandler = () => new RevisionsCopyRequestedEventHandler(copyRevisions, logger)
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
copyRevisions = {} as jest.Mocked<CopyRevisions>
|
||||||
|
copyRevisions.execute = jest.fn().mockReturnValue(Result.ok())
|
||||||
|
|
||||||
|
logger = {} as jest.Mocked<Logger>
|
||||||
|
logger.error = jest.fn()
|
||||||
|
|
||||||
|
event = {} as jest.Mocked<RevisionsCopyRequestedEvent>
|
||||||
|
event.payload = {
|
||||||
|
newItemUuid: '1-2-3',
|
||||||
|
originalItemUuid: '2-3-4',
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should copy revisions', async () => {
|
||||||
|
await createHandler().handle(event)
|
||||||
|
|
||||||
|
expect(copyRevisions.execute).toHaveBeenCalled()
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should indicate if copying revisions fail', async () => {
|
||||||
|
copyRevisions.execute = jest.fn().mockReturnValue(Result.fail('Oops'))
|
||||||
|
|
||||||
|
await createHandler().handle(event)
|
||||||
|
|
||||||
|
expect(logger.error).toHaveBeenCalled()
|
||||||
|
})
|
||||||
|
})
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
import { DomainEventHandlerInterface, RevisionsCopyRequestedEvent } from '@standardnotes/domain-events'
|
||||||
|
import { Logger } from 'winston'
|
||||||
|
import { CopyRevisions } from '../UseCase/CopyRevisions/CopyRevisions'
|
||||||
|
|
||||||
|
export class RevisionsCopyRequestedEventHandler implements DomainEventHandlerInterface {
|
||||||
|
constructor(private copyRevisions: CopyRevisions, private logger: Logger) {}
|
||||||
|
|
||||||
|
async handle(event: RevisionsCopyRequestedEvent): Promise<void> {
|
||||||
|
const result = await this.copyRevisions.execute({
|
||||||
|
newItemUuid: event.payload.newItemUuid,
|
||||||
|
originalItemUuid: event.payload.originalItemUuid,
|
||||||
|
})
|
||||||
|
|
||||||
|
if (result.isFailed()) {
|
||||||
|
this.logger.error(`Could not copy revisions: ${result.getError()}`)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+25
@@ -0,0 +1,25 @@
|
|||||||
|
/* istanbul ignore file */
|
||||||
|
|
||||||
|
import { Uuid } from '@standardnotes/domain-core'
|
||||||
|
import { DomainEventHandlerInterface, RevisionsOwnershipUpdateRequestedEvent } from '@standardnotes/domain-events'
|
||||||
|
import { RevisionRepositoryInterface } from '../Revision/RevisionRepositoryInterface'
|
||||||
|
|
||||||
|
export class RevisionsOwnershipUpdateRequestedEventHandler implements DomainEventHandlerInterface {
|
||||||
|
constructor(private revisionRepository: RevisionRepositoryInterface) {}
|
||||||
|
|
||||||
|
async handle(event: RevisionsOwnershipUpdateRequestedEvent): Promise<void> {
|
||||||
|
const userUuidOrError = Uuid.create(event.payload.userUuid)
|
||||||
|
if (userUuidOrError.isFailed()) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const userUuid = userUuidOrError.getValue()
|
||||||
|
|
||||||
|
const itemUuidOrError = Uuid.create(event.payload.itemUuid)
|
||||||
|
if (itemUuidOrError.isFailed()) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const itemUuid = itemUuidOrError.getValue()
|
||||||
|
|
||||||
|
await this.revisionRepository.updateUserUuid(itemUuid, userUuid)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
import { ContentType } from './ContentType'
|
||||||
|
|
||||||
|
describe('ContentType', () => {
|
||||||
|
it('should create a value obejct', () => {
|
||||||
|
const valueOrError = ContentType.create('Note')
|
||||||
|
|
||||||
|
expect(valueOrError.isFailed()).toBeFalsy()
|
||||||
|
expect(valueOrError.getValue().value).not.toBeNull()
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should fail to create a value obejct', () => {
|
||||||
|
const valueOrError = ContentType.create('test')
|
||||||
|
|
||||||
|
expect(valueOrError.isFailed()).toBeTruthy()
|
||||||
|
})
|
||||||
|
})
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
import { Timestamps, Uuid } from '@standardnotes/domain-core'
|
||||||
|
import { ContentType } from './ContentType'
|
||||||
|
import { Revision } from './Revision'
|
||||||
|
|
||||||
|
describe('Revision', () => {
|
||||||
|
it('should create an entity', () => {
|
||||||
|
const entityOrError = Revision.create({
|
||||||
|
itemUuid: Uuid.create('84c0f8e8-544a-4c7e-9adf-26209303bc1d').getValue(),
|
||||||
|
userUuid: Uuid.create('84c0f8e8-544a-4c7e-9adf-26209303bc1d').getValue(),
|
||||||
|
content: 'test',
|
||||||
|
contentType: ContentType.create('Note').getValue(),
|
||||||
|
itemsKeyId: 'test',
|
||||||
|
encItemKey: 'test',
|
||||||
|
authHash: 'test',
|
||||||
|
creationDate: new Date(1),
|
||||||
|
timestamps: Timestamps.create(new Date(1), new Date(2)).getValue(),
|
||||||
|
})
|
||||||
|
|
||||||
|
expect(entityOrError.isFailed()).toBeFalsy()
|
||||||
|
expect(entityOrError.getValue().id).not.toBeNull()
|
||||||
|
})
|
||||||
|
})
|
||||||
@@ -4,6 +4,7 @@ import { ContentType } from './ContentType'
|
|||||||
|
|
||||||
export interface RevisionProps {
|
export interface RevisionProps {
|
||||||
itemUuid: Uuid
|
itemUuid: Uuid
|
||||||
|
userUuid: Uuid | null
|
||||||
content: string | null
|
content: string | null
|
||||||
contentType: ContentType
|
contentType: ContentType
|
||||||
itemsKeyId: string | null
|
itemsKeyId: string | null
|
||||||
|
|||||||
@@ -4,6 +4,11 @@ import { Revision } from './Revision'
|
|||||||
import { RevisionMetadata } from './RevisionMetadata'
|
import { RevisionMetadata } from './RevisionMetadata'
|
||||||
|
|
||||||
export interface RevisionRepositoryInterface {
|
export interface RevisionRepositoryInterface {
|
||||||
findMetadataByItemId(itemUuid: Uuid): Promise<Array<RevisionMetadata>>
|
removeByUserUuid(userUuid: Uuid): Promise<void>
|
||||||
|
removeOneByUuid(revisionUuid: Uuid, userUuid: Uuid): Promise<void>
|
||||||
|
findOneByUuid(revisionUuid: Uuid, userUuid: Uuid): Promise<Revision | null>
|
||||||
|
findByItemUuid(itemUuid: Uuid): Promise<Array<Revision>>
|
||||||
|
findMetadataByItemId(itemUuid: Uuid, userUuid: Uuid): Promise<Array<RevisionMetadata>>
|
||||||
|
updateUserUuid(itemUuid: Uuid, userUuid: Uuid): Promise<void>
|
||||||
save(revision: Revision): Promise<Revision>
|
save(revision: Revision): Promise<Revision>
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,59 @@
|
|||||||
|
import { Result } from '@standardnotes/domain-core'
|
||||||
|
import { Revision } from '../../Revision/Revision'
|
||||||
|
import { RevisionRepositoryInterface } from '../../Revision/RevisionRepositoryInterface'
|
||||||
|
import { CopyRevisions } from './CopyRevisions'
|
||||||
|
|
||||||
|
describe('CopyRevisions', () => {
|
||||||
|
let revisionRepository: RevisionRepositoryInterface
|
||||||
|
|
||||||
|
const createUseCase = () => new CopyRevisions(revisionRepository)
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
revisionRepository = {} as jest.Mocked<RevisionRepositoryInterface>
|
||||||
|
revisionRepository.findByItemUuid = jest.fn().mockReturnValue([{} as jest.Mocked<Revision>])
|
||||||
|
revisionRepository.save = jest.fn()
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should not copy revisions to new item if revision creation fails', async () => {
|
||||||
|
const revisionMock = jest.spyOn(Revision, 'create')
|
||||||
|
revisionMock.mockImplementation(() => Result.fail('Oops'))
|
||||||
|
|
||||||
|
const result = await createUseCase().execute({
|
||||||
|
originalItemUuid: '84c0f8e8-544a-4c7e-9adf-26209303bc1d',
|
||||||
|
newItemUuid: '84c0f8e8-544a-4c7e-9adf-26209303bc1d',
|
||||||
|
})
|
||||||
|
|
||||||
|
expect(result.isFailed()).toBeTruthy()
|
||||||
|
|
||||||
|
revisionMock.mockRestore()
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should copy revisions to new item', async () => {
|
||||||
|
const result = await createUseCase().execute({
|
||||||
|
originalItemUuid: '84c0f8e8-544a-4c7e-9adf-26209303bc1d',
|
||||||
|
newItemUuid: '84c0f8e8-544a-4c7e-9adf-26209303bc1d',
|
||||||
|
})
|
||||||
|
|
||||||
|
expect(result.isFailed()).toBeFalsy()
|
||||||
|
expect(revisionRepository.save).toHaveBeenCalled()
|
||||||
|
expect(result.getValue()).toEqual('Revisions copied')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should not copy revisions for an invalid item uuid', async () => {
|
||||||
|
const result = await createUseCase().execute({
|
||||||
|
originalItemUuid: '1-2-3',
|
||||||
|
newItemUuid: '84c0f8e8-544a-4c7e-9adf-26209303bc1d',
|
||||||
|
})
|
||||||
|
|
||||||
|
expect(result.isFailed()).toBeTruthy()
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should not delete revision for a an invalid new item uuid', async () => {
|
||||||
|
const result = await createUseCase().execute({
|
||||||
|
newItemUuid: '1-2-3',
|
||||||
|
originalItemUuid: '84c0f8e8-544a-4c7e-9adf-26209303bc1d',
|
||||||
|
})
|
||||||
|
|
||||||
|
expect(result.isFailed()).toBeTruthy()
|
||||||
|
})
|
||||||
|
})
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
import { Result, UseCaseInterface, Uuid } from '@standardnotes/domain-core'
|
||||||
|
|
||||||
|
import { Revision } from '../../Revision/Revision'
|
||||||
|
import { RevisionRepositoryInterface } from '../../Revision/RevisionRepositoryInterface'
|
||||||
|
|
||||||
|
import { CopyRevisionsDTO } from './CopyRevisionsDTO'
|
||||||
|
|
||||||
|
export class CopyRevisions implements UseCaseInterface<string> {
|
||||||
|
constructor(private revisionRepository: RevisionRepositoryInterface) {}
|
||||||
|
|
||||||
|
async execute(dto: CopyRevisionsDTO): Promise<Result<string>> {
|
||||||
|
const orignalItemUuidOrError = Uuid.create(dto.originalItemUuid)
|
||||||
|
if (orignalItemUuidOrError.isFailed()) {
|
||||||
|
return Result.fail<string>(`Could not copy revisions: ${orignalItemUuidOrError.getError()}`)
|
||||||
|
}
|
||||||
|
const originalItemUuid = orignalItemUuidOrError.getValue()
|
||||||
|
|
||||||
|
const newItemUuidOrError = Uuid.create(dto.newItemUuid)
|
||||||
|
if (newItemUuidOrError.isFailed()) {
|
||||||
|
return Result.fail<string>(`Could not copy revisions: ${newItemUuidOrError.getError()}`)
|
||||||
|
}
|
||||||
|
const newItemUuid = newItemUuidOrError.getValue()
|
||||||
|
|
||||||
|
const revisions = await this.revisionRepository.findByItemUuid(originalItemUuid)
|
||||||
|
|
||||||
|
for (const existingRevision of revisions) {
|
||||||
|
const revisionCopyOrError = Revision.create({
|
||||||
|
...existingRevision.props,
|
||||||
|
itemUuid: newItemUuid,
|
||||||
|
})
|
||||||
|
|
||||||
|
if (revisionCopyOrError.isFailed()) {
|
||||||
|
return Result.fail<string>(`Could not create revision copy: ${revisionCopyOrError.getError()}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
const revisionCopy = revisionCopyOrError.getValue()
|
||||||
|
|
||||||
|
await this.revisionRepository.save(revisionCopy)
|
||||||
|
}
|
||||||
|
|
||||||
|
return Result.ok<string>('Revisions copied')
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
export interface CopyRevisionsDTO {
|
||||||
|
originalItemUuid: string
|
||||||
|
newItemUuid: string
|
||||||
|
}
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
import { RevisionRepositoryInterface } from '../../Revision/RevisionRepositoryInterface'
|
||||||
|
import { DeleteRevision } from './DeleteRevision'
|
||||||
|
|
||||||
|
describe('DeleteRevision', () => {
|
||||||
|
let revisionRepository: RevisionRepositoryInterface
|
||||||
|
|
||||||
|
const createUseCase = () => new DeleteRevision(revisionRepository)
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
revisionRepository = {} as jest.Mocked<RevisionRepositoryInterface>
|
||||||
|
revisionRepository.removeOneByUuid = jest.fn()
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should delete revision', async () => {
|
||||||
|
const result = await createUseCase().execute({
|
||||||
|
revisionUuid: '84c0f8e8-544a-4c7e-9adf-26209303bc1d',
|
||||||
|
userUuid: '84c0f8e8-544a-4c7e-9adf-26209303bc1d',
|
||||||
|
})
|
||||||
|
|
||||||
|
expect(result.isFailed()).toBeFalsy()
|
||||||
|
expect(result.getValue()).toEqual('Revision removed')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should not delete revision for an invalid item uuid', async () => {
|
||||||
|
const result = await createUseCase().execute({
|
||||||
|
revisionUuid: '1-2-3',
|
||||||
|
userUuid: '84c0f8e8-544a-4c7e-9adf-26209303bc1d',
|
||||||
|
})
|
||||||
|
|
||||||
|
expect(result.isFailed()).toBeTruthy()
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should not delete revision for a an invalid user uuid', async () => {
|
||||||
|
const result = await createUseCase().execute({
|
||||||
|
userUuid: '1-2-3',
|
||||||
|
revisionUuid: '84c0f8e8-544a-4c7e-9adf-26209303bc1d',
|
||||||
|
})
|
||||||
|
|
||||||
|
expect(result.isFailed()).toBeTruthy()
|
||||||
|
})
|
||||||
|
})
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
import { Result, UseCaseInterface, Uuid } from '@standardnotes/domain-core'
|
||||||
|
|
||||||
|
import { RevisionRepositoryInterface } from '../../Revision/RevisionRepositoryInterface'
|
||||||
|
import { DeleteRevisionDTO } from './DeleteRevisionDTO'
|
||||||
|
|
||||||
|
export class DeleteRevision implements UseCaseInterface<string> {
|
||||||
|
constructor(private revisionRepository: RevisionRepositoryInterface) {}
|
||||||
|
|
||||||
|
async execute(dto: DeleteRevisionDTO): Promise<Result<string>> {
|
||||||
|
const revisionUuidOrError = Uuid.create(dto.revisionUuid)
|
||||||
|
if (revisionUuidOrError.isFailed()) {
|
||||||
|
return Result.fail<string>(`Could not delete revision: ${revisionUuidOrError.getError()}`)
|
||||||
|
}
|
||||||
|
const revisionUuid = revisionUuidOrError.getValue()
|
||||||
|
|
||||||
|
const userUuidOrError = Uuid.create(dto.userUuid)
|
||||||
|
if (userUuidOrError.isFailed()) {
|
||||||
|
return Result.fail<string>(`Could not delete revision: ${userUuidOrError.getError()}`)
|
||||||
|
}
|
||||||
|
const userUuid = userUuidOrError.getValue()
|
||||||
|
|
||||||
|
await this.revisionRepository.removeOneByUuid(revisionUuid, userUuid)
|
||||||
|
|
||||||
|
return Result.ok<string>('Revision removed')
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
export interface DeleteRevisionDTO {
|
||||||
|
userUuid: string
|
||||||
|
revisionUuid: string
|
||||||
|
}
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
import { Revision } from '../../Revision/Revision'
|
||||||
|
import { RevisionRepositoryInterface } from '../../Revision/RevisionRepositoryInterface'
|
||||||
|
import { GetRevision } from './GetRevision'
|
||||||
|
|
||||||
|
describe('GetRevision', () => {
|
||||||
|
let revisionRepository: RevisionRepositoryInterface
|
||||||
|
|
||||||
|
const createUseCase = () => new GetRevision(revisionRepository)
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
revisionRepository = {} as jest.Mocked<RevisionRepositoryInterface>
|
||||||
|
revisionRepository.findOneByUuid = jest.fn().mockReturnValue({} as jest.Mocked<Revision>)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should return revision for a given item', async () => {
|
||||||
|
const result = await createUseCase().execute({
|
||||||
|
revisionUuid: '84c0f8e8-544a-4c7e-9adf-26209303bc1d',
|
||||||
|
userUuid: '84c0f8e8-544a-4c7e-9adf-26209303bc1d',
|
||||||
|
})
|
||||||
|
|
||||||
|
expect(result.isFailed()).toBeFalsy()
|
||||||
|
expect(result.getValue()).not.toBeNull()
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should not return revision for a given item if not found', async () => {
|
||||||
|
revisionRepository.findOneByUuid = jest.fn().mockReturnValue(null)
|
||||||
|
|
||||||
|
const result = await createUseCase().execute({
|
||||||
|
revisionUuid: '84c0f8e8-544a-4c7e-9adf-26209303bc1d',
|
||||||
|
userUuid: '84c0f8e8-544a-4c7e-9adf-26209303bc1d',
|
||||||
|
})
|
||||||
|
|
||||||
|
expect(result.isFailed()).toBeTruthy()
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should not return revision for a an invalid item uuid', async () => {
|
||||||
|
const result = await createUseCase().execute({
|
||||||
|
revisionUuid: '1-2-3',
|
||||||
|
userUuid: '84c0f8e8-544a-4c7e-9adf-26209303bc1d',
|
||||||
|
})
|
||||||
|
|
||||||
|
expect(result.isFailed()).toBeTruthy()
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should not return revision for a an invalid user uuid', async () => {
|
||||||
|
const result = await createUseCase().execute({
|
||||||
|
userUuid: '1-2-3',
|
||||||
|
revisionUuid: '84c0f8e8-544a-4c7e-9adf-26209303bc1d',
|
||||||
|
})
|
||||||
|
|
||||||
|
expect(result.isFailed()).toBeTruthy()
|
||||||
|
})
|
||||||
|
})
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
import { Result, UseCaseInterface, Uuid } from '@standardnotes/domain-core'
|
||||||
|
|
||||||
|
import { Revision } from '../../Revision/Revision'
|
||||||
|
import { RevisionRepositoryInterface } from '../../Revision/RevisionRepositoryInterface'
|
||||||
|
import { GetRevisionDTO } from './GetRevisionDTO'
|
||||||
|
|
||||||
|
export class GetRevision implements UseCaseInterface<Revision> {
|
||||||
|
constructor(private revisionRepository: RevisionRepositoryInterface) {}
|
||||||
|
|
||||||
|
async execute(dto: GetRevisionDTO): Promise<Result<Revision>> {
|
||||||
|
const revisionUuidOrError = Uuid.create(dto.revisionUuid)
|
||||||
|
if (revisionUuidOrError.isFailed()) {
|
||||||
|
return Result.fail<Revision>(`Could not get revision: ${revisionUuidOrError.getError()}`)
|
||||||
|
}
|
||||||
|
const revisionUuid = revisionUuidOrError.getValue()
|
||||||
|
|
||||||
|
const userUuidOrError = Uuid.create(dto.userUuid)
|
||||||
|
if (userUuidOrError.isFailed()) {
|
||||||
|
return Result.fail<Revision>(`Could not get revision: ${userUuidOrError.getError()}`)
|
||||||
|
}
|
||||||
|
const userUuid = userUuidOrError.getValue()
|
||||||
|
|
||||||
|
const revision = await this.revisionRepository.findOneByUuid(revisionUuid, userUuid)
|
||||||
|
|
||||||
|
if (revision === null) {
|
||||||
|
return Result.fail<Revision>(`Could not find revision with uuid: ${revisionUuid.value}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
return Result.ok<Revision>(revision)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
export interface GetRevisionDTO {
|
||||||
|
userUuid: string
|
||||||
|
revisionUuid: string
|
||||||
|
}
|
||||||
+17
-2
@@ -13,14 +13,29 @@ describe('GetRevisionsMetada', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
it('should return revisions metadata for a given item', async () => {
|
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.isFailed()).toBeFalsy()
|
||||||
expect(result.getValue().length).toEqual(1)
|
expect(result.getValue().length).toEqual(1)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('should not return revisions metadata for a an invalid item uuid', async () => {
|
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()
|
expect(result.isFailed()).toBeTruthy()
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -14,7 +14,15 @@ export class GetRevisionsMetada implements UseCaseInterface<RevisionMetadata[]>
|
|||||||
return Result.fail<RevisionMetadata[]>(`Could not get revisions: ${itemUuidOrError.getError()}`)
|
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)
|
return Result.ok<RevisionMetadata[]>(revisionsMetdata)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
export interface GetRevisionsMetadaDTO {
|
export interface GetRevisionsMetadaDTO {
|
||||||
itemUuid: string
|
itemUuid: string
|
||||||
|
userUuid: string
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
export interface DeleteRevisionRequestParams {
|
||||||
|
revisionUuid: string
|
||||||
|
userUuid: string
|
||||||
|
}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
export interface GetRevisionRequestParams {
|
||||||
|
revisionUuid: string
|
||||||
|
userUuid: string
|
||||||
|
}
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
export interface GetRevisionsMetadataRequestParams {
|
export interface GetRevisionsMetadataRequestParams {
|
||||||
itemUuid: string
|
itemUuid: string
|
||||||
|
userUuid: string
|
||||||
}
|
}
|
||||||
|
|||||||
+24
-3
@@ -1,5 +1,5 @@
|
|||||||
import { Request } from 'express'
|
import { Request, Response } from 'express'
|
||||||
import { BaseHttpController, controller, httpGet, results } from 'inversify-express-utils'
|
import { BaseHttpController, controller, httpDelete, httpGet, results } from 'inversify-express-utils'
|
||||||
import { inject } from 'inversify'
|
import { inject } from 'inversify'
|
||||||
|
|
||||||
import TYPES from '../../Bootstrap/Types'
|
import TYPES from '../../Bootstrap/Types'
|
||||||
@@ -12,9 +12,30 @@ export class InversifyExpressRevisionsController extends BaseHttpController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@httpGet('/')
|
@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({
|
const result = await this.revisionsController.getRevisions({
|
||||||
itemUuid: req.params.itemUuid,
|
itemUuid: req.params.itemUuid,
|
||||||
|
userUuid: response.locals.user.uuid,
|
||||||
|
})
|
||||||
|
|
||||||
|
return this.json(result.data, result.status)
|
||||||
|
}
|
||||||
|
|
||||||
|
@httpGet('/:uuid')
|
||||||
|
public async getRevision(req: Request, response: Response): Promise<results.JsonResult> {
|
||||||
|
const result = await this.revisionsController.getRevision({
|
||||||
|
revisionUuid: req.params.uuid,
|
||||||
|
userUuid: response.locals.user.uuid,
|
||||||
|
})
|
||||||
|
|
||||||
|
return this.json(result.data, result.status)
|
||||||
|
}
|
||||||
|
|
||||||
|
@httpDelete('/:uuid')
|
||||||
|
public async deleteRevision(req: Request, response: Response): Promise<results.JsonResult> {
|
||||||
|
const result = await this.revisionsController.deleteRevision({
|
||||||
|
revisionUuid: req.params.uuid,
|
||||||
|
userUuid: response.locals.user.uuid,
|
||||||
})
|
})
|
||||||
|
|
||||||
return this.json(result.data, result.status)
|
return this.json(result.data, result.status)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { MapperInterface, Uuid } from '@standardnotes/domain-core'
|
import { MapperInterface, Uuid } from '@standardnotes/domain-core'
|
||||||
import { Repository } from 'typeorm'
|
import { Repository } from 'typeorm'
|
||||||
import { Revision } from '../../Domain/Revision/Revision'
|
|
||||||
|
|
||||||
|
import { Revision } from '../../Domain/Revision/Revision'
|
||||||
import { RevisionMetadata } from '../../Domain/Revision/RevisionMetadata'
|
import { RevisionMetadata } from '../../Domain/Revision/RevisionMetadata'
|
||||||
import { RevisionRepositoryInterface } from '../../Domain/Revision/RevisionRepositoryInterface'
|
import { RevisionRepositoryInterface } from '../../Domain/Revision/RevisionRepositoryInterface'
|
||||||
import { TypeORMRevision } from '../TypeORM/TypeORMRevision'
|
import { TypeORMRevision } from '../TypeORM/TypeORMRevision'
|
||||||
@@ -13,6 +13,66 @@ export class MySQLRevisionRepository implements RevisionRepositoryInterface {
|
|||||||
private revisionMapper: MapperInterface<Revision, TypeORMRevision>,
|
private revisionMapper: MapperInterface<Revision, TypeORMRevision>,
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
|
async updateUserUuid(itemUuid: Uuid, userUuid: Uuid): Promise<void> {
|
||||||
|
await this.ormRepository
|
||||||
|
.createQueryBuilder()
|
||||||
|
.update()
|
||||||
|
.set({
|
||||||
|
userUuid: userUuid.value,
|
||||||
|
})
|
||||||
|
.where('item_uuid = :itemUuid', { itemUuid: itemUuid.value })
|
||||||
|
.execute()
|
||||||
|
}
|
||||||
|
|
||||||
|
async findByItemUuid(itemUuid: Uuid): Promise<Revision[]> {
|
||||||
|
const typeormRevisions = await this.ormRepository
|
||||||
|
.createQueryBuilder()
|
||||||
|
.where('item_uuid = :itemUuid', { itemUuid: itemUuid.value })
|
||||||
|
.getMany()
|
||||||
|
|
||||||
|
const revisions = []
|
||||||
|
for (const revision of typeormRevisions) {
|
||||||
|
revisions.push(this.revisionMapper.toDomain(revision))
|
||||||
|
}
|
||||||
|
|
||||||
|
return revisions
|
||||||
|
}
|
||||||
|
|
||||||
|
async removeByUserUuid(userUuid: Uuid): Promise<void> {
|
||||||
|
await this.ormRepository
|
||||||
|
.createQueryBuilder()
|
||||||
|
.delete()
|
||||||
|
.from('revisions')
|
||||||
|
.where('user_uuid = :userUuid', { userUuid: userUuid.value })
|
||||||
|
.execute()
|
||||||
|
}
|
||||||
|
|
||||||
|
async removeOneByUuid(revisionUuid: Uuid, userUuid: Uuid): Promise<void> {
|
||||||
|
await this.ormRepository
|
||||||
|
.createQueryBuilder()
|
||||||
|
.delete()
|
||||||
|
.from('revisions')
|
||||||
|
.where('uuid = :revisionUuid AND user_uuid = :userUuid', {
|
||||||
|
userUuid: userUuid.value,
|
||||||
|
revisionUuid: revisionUuid.value,
|
||||||
|
})
|
||||||
|
.execute()
|
||||||
|
}
|
||||||
|
|
||||||
|
async findOneByUuid(revisionUuid: Uuid, userUuid: Uuid): Promise<Revision | null> {
|
||||||
|
const typeormRevision = await this.ormRepository
|
||||||
|
.createQueryBuilder()
|
||||||
|
.where('uuid = :revisionUuid', { revisionUuid: revisionUuid.value })
|
||||||
|
.andWhere('user_uuid = :userUuid', { userUuid: userUuid.value })
|
||||||
|
.getOne()
|
||||||
|
|
||||||
|
if (typeormRevision === null) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.revisionMapper.toDomain(typeormRevision)
|
||||||
|
}
|
||||||
|
|
||||||
async save(revision: Revision): Promise<Revision> {
|
async save(revision: Revision): Promise<Revision> {
|
||||||
const typeormRevision = this.revisionMapper.toProjection(revision)
|
const typeormRevision = this.revisionMapper.toProjection(revision)
|
||||||
|
|
||||||
@@ -21,16 +81,15 @@ export class MySQLRevisionRepository implements RevisionRepositoryInterface {
|
|||||||
return revision
|
return revision
|
||||||
}
|
}
|
||||||
|
|
||||||
async findMetadataByItemId(itemUuid: Uuid): Promise<Array<RevisionMetadata>> {
|
async findMetadataByItemId(itemUuid: Uuid, userUuid: Uuid): Promise<Array<RevisionMetadata>> {
|
||||||
const queryBuilder = this.ormRepository
|
const queryBuilder = this.ormRepository
|
||||||
.createQueryBuilder()
|
.createQueryBuilder()
|
||||||
.select('uuid', 'uuid')
|
.select('uuid', 'uuid')
|
||||||
.addSelect('content_type', 'contentType')
|
.addSelect('content_type', 'contentType')
|
||||||
.addSelect('created_at', 'createdAt')
|
.addSelect('created_at', 'createdAt')
|
||||||
.addSelect('updated_at', 'updatedAt')
|
.addSelect('updated_at', 'updatedAt')
|
||||||
.where('item_uuid = :item_uuid', {
|
.where('item_uuid = :itemUuid', { itemUuid: itemUuid.value })
|
||||||
item_uuid: itemUuid,
|
.andWhere('user_uuid = :userUuid', { userUuid: userUuid.value })
|
||||||
})
|
|
||||||
.orderBy('created_at', 'DESC')
|
.orderBy('created_at', 'DESC')
|
||||||
|
|
||||||
const simplifiedRevisions = await queryBuilder.getMany()
|
const simplifiedRevisions = await queryBuilder.getMany()
|
||||||
|
|||||||
@@ -9,8 +9,18 @@ export class TypeORMRevision {
|
|||||||
name: 'item_uuid',
|
name: 'item_uuid',
|
||||||
length: 36,
|
length: 36,
|
||||||
})
|
})
|
||||||
|
@Index('item_uuid')
|
||||||
declare itemUuid: string
|
declare itemUuid: string
|
||||||
|
|
||||||
|
@Column({
|
||||||
|
name: 'user_uuid',
|
||||||
|
length: 36,
|
||||||
|
type: 'varchar',
|
||||||
|
nullable: true,
|
||||||
|
})
|
||||||
|
@Index('user_uuid')
|
||||||
|
declare userUuid: string | null
|
||||||
|
|
||||||
@Column({
|
@Column({
|
||||||
type: 'mediumtext',
|
type: 'mediumtext',
|
||||||
nullable: true,
|
nullable: true,
|
||||||
@@ -53,7 +63,6 @@ export class TypeORMRevision {
|
|||||||
type: 'date',
|
type: 'date',
|
||||||
nullable: true,
|
nullable: true,
|
||||||
})
|
})
|
||||||
@Index('index_revisions_on_creation_date')
|
|
||||||
declare creationDate: Date
|
declare creationDate: Date
|
||||||
|
|
||||||
@Column({
|
@Column({
|
||||||
@@ -62,7 +71,6 @@ export class TypeORMRevision {
|
|||||||
precision: 6,
|
precision: 6,
|
||||||
nullable: true,
|
nullable: true,
|
||||||
})
|
})
|
||||||
@Index('index_revisions_on_created_at')
|
|
||||||
declare createdAt: Date
|
declare createdAt: Date
|
||||||
|
|
||||||
@Column({
|
@Column({
|
||||||
|
|||||||
@@ -5,22 +5,29 @@ import { Revision } from '../Domain/Revision/Revision'
|
|||||||
|
|
||||||
export class RevisionItemStringMapper implements MapperInterface<Revision, string> {
|
export class RevisionItemStringMapper implements MapperInterface<Revision, string> {
|
||||||
toDomain(projection: string): Revision {
|
toDomain(projection: string): Revision {
|
||||||
const item = JSON.parse(projection)
|
const item = JSON.parse(projection).item
|
||||||
|
|
||||||
const contentTypeOrError = ContentType.create(item.content_type)
|
const contentTypeOrError = ContentType.create(item.content_type)
|
||||||
if (contentTypeOrError.isFailed()) {
|
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 contentType = contentTypeOrError.getValue()
|
||||||
|
|
||||||
const itemUuidOrError = Uuid.create(item.uuid)
|
const itemUuidOrError = Uuid.create(item.uuid)
|
||||||
if (itemUuidOrError.isFailed()) {
|
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 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({
|
const revisionOrError = Revision.create({
|
||||||
itemUuid,
|
itemUuid,
|
||||||
|
userUuid,
|
||||||
authHash: item.auth_hash,
|
authHash: item.auth_hash,
|
||||||
content: item.content,
|
content: item.content,
|
||||||
contentType,
|
contentType,
|
||||||
@@ -31,7 +38,7 @@ export class RevisionItemStringMapper implements MapperInterface<Revision, strin
|
|||||||
})
|
})
|
||||||
|
|
||||||
if (revisionOrError.isFailed()) {
|
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()
|
return revisionOrError.getValue()
|
||||||
|
|||||||
@@ -23,6 +23,15 @@ export class RevisionPersistenceMapper implements MapperInterface<Revision, Type
|
|||||||
}
|
}
|
||||||
const itemUuid = itemUuidOrError.getValue()
|
const itemUuid = itemUuidOrError.getValue()
|
||||||
|
|
||||||
|
let userUuid = null
|
||||||
|
if (projection.userUuid !== null) {
|
||||||
|
const userUuidOrError = Uuid.create(projection.userUuid)
|
||||||
|
if (userUuidOrError.isFailed()) {
|
||||||
|
throw new Error(`Could not map typeorm revision to domain revision: ${userUuidOrError.getError()}`)
|
||||||
|
}
|
||||||
|
userUuid = userUuidOrError.getValue()
|
||||||
|
}
|
||||||
|
|
||||||
const revisionOrError = Revision.create(
|
const revisionOrError = Revision.create(
|
||||||
{
|
{
|
||||||
authHash: projection.authHash,
|
authHash: projection.authHash,
|
||||||
@@ -32,6 +41,7 @@ export class RevisionPersistenceMapper implements MapperInterface<Revision, Type
|
|||||||
encItemKey: projection.encItemKey,
|
encItemKey: projection.encItemKey,
|
||||||
itemsKeyId: projection.itemsKeyId,
|
itemsKeyId: projection.itemsKeyId,
|
||||||
itemUuid,
|
itemUuid,
|
||||||
|
userUuid,
|
||||||
timestamps,
|
timestamps,
|
||||||
},
|
},
|
||||||
new UniqueEntityId(projection.uuid),
|
new UniqueEntityId(projection.uuid),
|
||||||
@@ -55,6 +65,7 @@ export class RevisionPersistenceMapper implements MapperInterface<Revision, Type
|
|||||||
typeormRevision.encItemKey = domain.props.encItemKey
|
typeormRevision.encItemKey = domain.props.encItemKey
|
||||||
typeormRevision.itemUuid = domain.props.itemUuid.value
|
typeormRevision.itemUuid = domain.props.itemUuid.value
|
||||||
typeormRevision.itemsKeyId = domain.props.itemsKeyId
|
typeormRevision.itemsKeyId = domain.props.itemsKeyId
|
||||||
|
typeormRevision.userUuid = domain.props.userUuid ? domain.props.userUuid.value : null
|
||||||
typeormRevision.uuid = domain.id.toString()
|
typeormRevision.uuid = domain.id.toString()
|
||||||
|
|
||||||
return typeormRevision
|
return typeormRevision
|
||||||
|
|||||||
@@ -3,6 +3,32 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.13.33](https://github.com/standardnotes/server/compare/@standardnotes/scheduler-server@1.13.32...@standardnotes/scheduler-server@1.13.33) (2022-11-30)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @standardnotes/scheduler-server
|
||||||
|
|
||||||
|
## [1.13.32](https://github.com/standardnotes/server/compare/@standardnotes/scheduler-server@1.13.31...@standardnotes/scheduler-server@1.13.32) (2022-11-28)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @standardnotes/scheduler-server
|
||||||
|
|
||||||
|
## [1.13.31](https://github.com/standardnotes/server/compare/@standardnotes/scheduler-server@1.13.30...@standardnotes/scheduler-server@1.13.31) (2022-11-25)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @standardnotes/scheduler-server
|
||||||
|
|
||||||
|
## [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)
|
## [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
|
**Note:** Version bump only for package @standardnotes/scheduler-server
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@standardnotes/scheduler-server",
|
"name": "@standardnotes/scheduler-server",
|
||||||
"version": "1.13.27",
|
"version": "1.13.33",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=18.0.0 <19.0.0"
|
"node": ">=18.0.0 <19.0.0"
|
||||||
},
|
},
|
||||||
@@ -24,7 +24,6 @@
|
|||||||
"upgrade:snjs": "yarn ncu -u '@standardnotes/*'"
|
"upgrade:snjs": "yarn ncu -u '@standardnotes/*'"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@newrelic/native-metrics": "^9.0.0",
|
|
||||||
"@newrelic/winston-enricher": "^4.0.0",
|
"@newrelic/winston-enricher": "^4.0.0",
|
||||||
"@sentry/node": "^7.19.0",
|
"@sentry/node": "^7.19.0",
|
||||||
"@standardnotes/common": "workspace:*",
|
"@standardnotes/common": "workspace:*",
|
||||||
@@ -32,7 +31,7 @@
|
|||||||
"@standardnotes/domain-events-infra": "workspace:*",
|
"@standardnotes/domain-events-infra": "workspace:*",
|
||||||
"@standardnotes/predicates": "workspace:*",
|
"@standardnotes/predicates": "workspace:*",
|
||||||
"@standardnotes/time": "workspace:*",
|
"@standardnotes/time": "workspace:*",
|
||||||
"aws-sdk": "^2.1253.0",
|
"aws-sdk": "^2.1260.0",
|
||||||
"dayjs": "^1.11.6",
|
"dayjs": "^1.11.6",
|
||||||
"dotenv": "^16.0.1",
|
"dotenv": "^16.0.1",
|
||||||
"inversify": "^6.0.1",
|
"inversify": "^6.0.1",
|
||||||
|
|||||||
@@ -74,13 +74,24 @@ export class ContainerConfigLoader {
|
|||||||
})
|
})
|
||||||
container.bind<winston.Logger>(TYPES.Logger).toConstantValue(logger)
|
container.bind<winston.Logger>(TYPES.Logger).toConstantValue(logger)
|
||||||
|
|
||||||
if (env.get('SNS_AWS_REGION', true)) {
|
if (env.get('SNS_TOPIC_ARN', true)) {
|
||||||
container.bind<AWS.SNS>(TYPES.SNS).toConstantValue(
|
const snsConfig: AWS.SNS.Types.ClientConfiguration = {
|
||||||
new AWS.SNS({
|
apiVersion: 'latest',
|
||||||
apiVersion: 'latest',
|
region: env.get('SNS_AWS_REGION', true),
|
||||||
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)) {
|
if (env.get('SQS_QUEUE_URL', true)) {
|
||||||
|
|||||||
@@ -3,6 +3,10 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.7.2](https://github.com/standardnotes/server/compare/@standardnotes/security@1.7.1...@standardnotes/security@1.7.2) (2022-11-25)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @standardnotes/security
|
||||||
|
|
||||||
## [1.7.1](https://github.com/standardnotes/server/compare/@standardnotes/security@1.7.0...@standardnotes/security@1.7.1) (2022-11-22)
|
## [1.7.1](https://github.com/standardnotes/server/compare/@standardnotes/security@1.7.0...@standardnotes/security@1.7.1) (2022-11-22)
|
||||||
|
|
||||||
**Note:** Version bump only for package @standardnotes/security
|
**Note:** Version bump only for package @standardnotes/security
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@standardnotes/security",
|
"name": "@standardnotes/security",
|
||||||
"version": "1.7.1",
|
"version": "1.7.2",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=18.0.0 <19.0.0"
|
"node": ">=18.0.0 <19.0.0"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -3,6 +3,10 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.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)
|
## [1.18.3](https://github.com/standardnotes/server/compare/@standardnotes/settings@1.18.0...@standardnotes/settings@1.18.3) (2022-11-14)
|
||||||
|
|
||||||
### Bug Fixes
|
### Bug Fixes
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@standardnotes/settings",
|
"name": "@standardnotes/settings",
|
||||||
"version": "1.18.3",
|
"version": "1.18.4",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=18.0.0 <19.0.0"
|
"node": ">=18.0.0 <19.0.0"
|
||||||
},
|
},
|
||||||
@@ -29,7 +29,6 @@
|
|||||||
"typescript": "^4.8.4"
|
"typescript": "^4.8.4"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@newrelic/native-metrics": "^9.0.0",
|
|
||||||
"reflect-metadata": "^0.1.13"
|
"reflect-metadata": "^0.1.13"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,3 +42,6 @@ NEW_RELIC_NO_CONFIG_FILE=true
|
|||||||
NEW_RELIC_DISTRIBUTED_TRACING_ENABLED=false
|
NEW_RELIC_DISTRIBUTED_TRACING_ENABLED=false
|
||||||
NEW_RELIC_LOG_ENABLED=false
|
NEW_RELIC_LOG_ENABLED=false
|
||||||
NEW_RELIC_LOG_LEVEL=info
|
NEW_RELIC_LOG_LEVEL=info
|
||||||
|
|
||||||
|
# (Optional) Revision Dumps
|
||||||
|
FILE_UPLOAD_PATH=
|
||||||
|
|||||||
@@ -3,6 +3,88 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.19.1](https://github.com/standardnotes/syncing-server-js/compare/@standardnotes/syncing-server@1.19.0...@standardnotes/syncing-server@1.19.1) (2022-11-30)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @standardnotes/syncing-server
|
||||||
|
|
||||||
|
# [1.19.0](https://github.com/standardnotes/syncing-server-js/compare/@standardnotes/syncing-server@1.18.12...@standardnotes/syncing-server@1.19.0) (2022-11-28)
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **revisions:** add copying revisions on duplicated items ([7bb698e](https://github.com/standardnotes/syncing-server-js/commit/7bb698e44222ef128d9642d625e96b7d26ee4dbf))
|
||||||
|
|
||||||
|
## [1.18.12](https://github.com/standardnotes/syncing-server-js/compare/@standardnotes/syncing-server@1.18.11...@standardnotes/syncing-server@1.18.12) (2022-11-25)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @standardnotes/syncing-server
|
||||||
|
|
||||||
|
## [1.18.11](https://github.com/standardnotes/syncing-server-js/compare/@standardnotes/syncing-server@1.18.10...@standardnotes/syncing-server@1.18.11) (2022-11-24)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @standardnotes/syncing-server
|
||||||
|
|
||||||
|
## [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)
|
## [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
|
**Note:** Version bump only for package @standardnotes/syncing-server
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@standardnotes/syncing-server",
|
"name": "@standardnotes/syncing-server",
|
||||||
"version": "1.16.1",
|
"version": "1.19.1",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=18.0.0 <19.0.0"
|
"node": ">=18.0.0 <19.0.0"
|
||||||
},
|
},
|
||||||
@@ -25,7 +25,6 @@
|
|||||||
"upgrade:snjs": "yarn ncu -u '@standardnotes/*'"
|
"upgrade:snjs": "yarn ncu -u '@standardnotes/*'"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@newrelic/native-metrics": "^9.0.0",
|
|
||||||
"@newrelic/winston-enricher": "^4.0.0",
|
"@newrelic/winston-enricher": "^4.0.0",
|
||||||
"@sentry/node": "^7.19.0",
|
"@sentry/node": "^7.19.0",
|
||||||
"@standardnotes/common": "workspace:*",
|
"@standardnotes/common": "workspace:*",
|
||||||
@@ -37,7 +36,7 @@
|
|||||||
"@standardnotes/security": "workspace:*",
|
"@standardnotes/security": "workspace:*",
|
||||||
"@standardnotes/settings": "workspace:*",
|
"@standardnotes/settings": "workspace:*",
|
||||||
"@standardnotes/time": "workspace:*",
|
"@standardnotes/time": "workspace:*",
|
||||||
"aws-sdk": "^2.1253.0",
|
"aws-sdk": "^2.1260.0",
|
||||||
"axios": "^1.1.3",
|
"axios": "^1.1.3",
|
||||||
"cors": "2.8.5",
|
"cors": "2.8.5",
|
||||||
"dotenv": "^16.0.1",
|
"dotenv": "^16.0.1",
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user