Compare commits

..

18 Commits

Author SHA1 Message Date
standardci
f565f1d950 chore(release): publish new version
- @standardnotes/analytics@2.25.8
 - @standardnotes/api-gateway@1.69.3
 - @standardnotes/auth-server@1.129.0
 - @standardnotes/domain-events-infra@1.12.10
 - @standardnotes/domain-events@2.114.0
 - @standardnotes/event-store@1.11.15
 - @standardnotes/files-server@1.19.18
 - @standardnotes/home-server@1.13.28
 - @standardnotes/revisions-server@1.26.2
 - @standardnotes/scheduler-server@1.20.17
 - @standardnotes/syncing-server@1.75.3
 - @standardnotes/websockets-server@1.10.12
2023-08-03 10:34:26 +00:00
Karol Sójko
8e35dfa4b7 feat(auth): add handling payments account deleted events STA-1769 (#682)
* feat(auth): add handling payments account deleted events

* fix(auth): result type for accounts already deleted

---------

Co-authored-by: Karol Sójko <karolsojko@proton.me>
2023-08-03 12:01:42 +02:00
standardci
f911473be9 chore(release): publish new version
- @standardnotes/analytics@2.25.7
 - @standardnotes/api-gateway@1.69.2
 - @standardnotes/auth-server@1.128.1
 - @standardnotes/domain-core@1.24.2
 - @standardnotes/event-store@1.11.14
 - @standardnotes/files-server@1.19.17
 - @standardnotes/home-server@1.13.27
 - @standardnotes/revisions-server@1.26.1
 - @standardnotes/scheduler-server@1.20.16
 - @standardnotes/settings@1.21.21
 - @standardnotes/syncing-server@1.75.2
 - @standardnotes/websockets-server@1.10.11
2023-08-02 15:51:56 +00:00
Karol Sójko
71624f1897 fix(domain-core): remove unused content types 2023-08-02 17:34:40 +02:00
standardci
17de6ea7e1 chore(release): publish new version
- @standardnotes/home-server@1.13.26
 - @standardnotes/syncing-server@1.75.1
2023-08-02 11:41:20 +00:00
Karol Sójko
6aad7cd207 fix(syncing-server): update unknown content type on items migration 2023-08-02 13:24:14 +02:00
standardci
63af335877 chore(release): publish new version
- @standardnotes/auth-server@1.128.0
 - @standardnotes/home-server@1.13.25
 - @standardnotes/revisions-server@1.26.0
 - @standardnotes/syncing-server@1.75.0
2023-08-02 08:09:24 +00:00
Karol Sójko
8cd7a138ab feat: enable Write Ahead Log mode for SQLite (#681)
Co-authored-by: Karol Sójko <karolsojko@proton.me>
2023-08-02 09:47:37 +02:00
standardci
f69cdc7b03 chore(release): publish new version
- @standardnotes/home-server@1.13.24
 - @standardnotes/syncing-server@1.74.1
 - @standardnotes/websockets-server@1.10.10
2023-08-02 07:35:12 +00:00
Karol Sójko
2ca649cf31 fix(syncing-server): encapsulate delete queries into transactions 2023-08-02 08:35:19 +02:00
Mo
f2ada08201 chore: remove unused package (#680) 2023-08-02 07:46:10 +02:00
Mo
54ba1f69e5 chore: bump mocha timeout 2023-08-01 16:46:19 -05:00
standardci
f13a99f5fd chore(release): publish new version
- @standardnotes/home-server@1.13.23
 - @standardnotes/syncing-server@1.74.0
2023-08-01 16:32:29 +00:00
Karol Sójko
e9bba6fd3a feat(syncing-server): remove legacy privileges items (#679)
Co-authored-by: Karol Sójko <karolsojko@proton.me>
2023-08-01 18:15:16 +02:00
standardci
f0d1a70c87 chore(release): publish new version
- @standardnotes/auth-server@1.127.2
 - @standardnotes/files-server@1.19.16
 - @standardnotes/home-server@1.13.22
 - @standardnotes/revisions-server@1.25.7
 - @standardnotes/syncing-server@1.73.1
 - @standardnotes/websockets-server@1.10.9
2023-08-01 07:53:07 +00:00
Karol Sójko
56f0aef21d fix: controller naming (#678)
* fix: rename home server controllers to base controllers

* fix: rename inversify express controllers to annotated controllers
2023-08-01 09:34:52 +02:00
standardci
75e266cb9e chore(release): publish new version
- @standardnotes/home-server@1.13.21
 - @standardnotes/syncing-server@1.73.0
2023-08-01 05:16:33 +00:00
Karol Sójko
b9bb83c0ce feat(syncing-server): add shared vault snjs filter (#677)
Co-authored-by: Mo <mo@standardnotes.com>
2023-08-01 07:00:14 +02:00
144 changed files with 1026 additions and 355 deletions

View File

@@ -50,7 +50,7 @@ jobs:
run: docker/is-available.sh http://localhost:3123 $(pwd)/logs
- name: Run E2E Test Suite
run: yarn dlx mocha-headless-chrome --timeout 1200000 -f http://localhost:9001/mocha/test.html
run: yarn dlx mocha-headless-chrome --timeout 1800000 -f http://localhost:9001/mocha/test.html
- name: Show logs on failure
if: ${{ failure() }}
@@ -145,7 +145,7 @@ jobs:
run: for i in {1..30}; do curl -s http://localhost:3123/healthcheck && break || sleep 1; done
- name: Run E2E Test Suite
run: yarn dlx mocha-headless-chrome --timeout 1200000 -f http://localhost:9001/mocha/test.html
run: yarn dlx mocha-headless-chrome --timeout 1800000 -f http://localhost:9001/mocha/test.html
- name: Show logs on failure
if: ${{ failure() }}

1
.pnp.cjs generated
View File

@@ -5259,7 +5259,6 @@ const RAW_RUNTIME_STATE =
["@standardnotes/domain-events-infra", "workspace:packages/domain-events-infra"],\
["@standardnotes/responses", "npm:1.13.27"],\
["@standardnotes/security", "workspace:packages/security"],\
["@standardnotes/utils", "npm:1.17.5"],\
["@types/cors", "npm:2.8.13"],\
["@types/express", "npm:4.17.17"],\
["@types/ioredis", "npm:5.0.0"],\

View File

@@ -12,6 +12,7 @@
},
"scripts": {
"lint": "yarn workspaces foreach -p -j 10 --verbose run lint",
"lint:fix": "yarn workspaces foreach -p -j 10 --verbose run lint:fix",
"clean": "yarn workspaces foreach -p --verbose run clean",
"setup:env": "cp .env.sample .env && yarn workspaces foreach -p --verbose run setup:env",
"release": "lerna version --conventional-graduate --conventional-commits --yes -m \"chore(release): publish new version\"",

View File

@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [2.25.8](https://github.com/standardnotes/server/compare/@standardnotes/analytics@2.25.7...@standardnotes/analytics@2.25.8) (2023-08-03)
**Note:** Version bump only for package @standardnotes/analytics
## [2.25.7](https://github.com/standardnotes/server/compare/@standardnotes/analytics@2.25.6...@standardnotes/analytics@2.25.7) (2023-08-02)
**Note:** Version bump only for package @standardnotes/analytics
## [2.25.6](https://github.com/standardnotes/server/compare/@standardnotes/analytics@2.25.5...@standardnotes/analytics@2.25.6) (2023-07-27)
**Note:** Version bump only for package @standardnotes/analytics

View File

@@ -1,6 +1,6 @@
{
"name": "@standardnotes/analytics",
"version": "2.25.6",
"version": "2.25.8",
"engines": {
"node": ">=18.0.0 <21.0.0"
},

View File

@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.69.3](https://github.com/standardnotes/api-gateway/compare/@standardnotes/api-gateway@1.69.2...@standardnotes/api-gateway@1.69.3) (2023-08-03)
**Note:** Version bump only for package @standardnotes/api-gateway
## [1.69.2](https://github.com/standardnotes/api-gateway/compare/@standardnotes/api-gateway@1.69.1...@standardnotes/api-gateway@1.69.2) (2023-08-02)
**Note:** Version bump only for package @standardnotes/api-gateway
## [1.69.1](https://github.com/standardnotes/api-gateway/compare/@standardnotes/api-gateway@1.69.0...@standardnotes/api-gateway@1.69.1) (2023-07-31)
### Bug Fixes

View File

@@ -1,6 +1,6 @@
{
"name": "@standardnotes/api-gateway",
"version": "1.69.1",
"version": "1.69.3",
"engines": {
"node": ">=18.0.0 <21.0.0"
},

View File

@@ -3,6 +3,28 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [1.129.0](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.128.1...@standardnotes/auth-server@1.129.0) (2023-08-03)
### Features
* **auth:** add handling payments account deleted events STA-1769 ([#682](https://github.com/standardnotes/server/issues/682)) ([8e35dfa](https://github.com/standardnotes/server/commit/8e35dfa4b77256f4c0a3294b296a5526fd1020ad))
## [1.128.1](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.128.0...@standardnotes/auth-server@1.128.1) (2023-08-02)
**Note:** Version bump only for package @standardnotes/auth-server
# [1.128.0](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.127.2...@standardnotes/auth-server@1.128.0) (2023-08-02)
### Features
* enable Write Ahead Log mode for SQLite ([#681](https://github.com/standardnotes/server/issues/681)) ([8cd7a13](https://github.com/standardnotes/server/commit/8cd7a138ab56f6a2b0d6c06ef6041ab9b85ae540))
## [1.127.2](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.127.1...@standardnotes/auth-server@1.127.2) (2023-08-01)
### Bug Fixes
* controller naming ([#678](https://github.com/standardnotes/server/issues/678)) ([56f0aef](https://github.com/standardnotes/server/commit/56f0aef21d3fcec7ac7e968cb1c1b071becbbe26))
## [1.127.1](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.127.0...@standardnotes/auth-server@1.127.1) (2023-07-31)
### Bug Fixes

View File

@@ -1,23 +1,23 @@
import 'reflect-metadata'
import '../src/Infra/InversifyExpressUtils/InversifyExpressAuthController'
import '../src/Infra/InversifyExpressUtils/InversifyExpressAuthenticatorsController'
import '../src/Infra/InversifyExpressUtils/InversifyExpressSessionsController'
import '../src/Infra/InversifyExpressUtils/InversifyExpressSubscriptionInvitesController'
import '../src/Infra/InversifyExpressUtils/InversifyExpressUserRequestsController'
import '../src/Infra/InversifyExpressUtils/InversifyExpressWebSocketsController'
import '../src/Infra/InversifyExpressUtils/InversifyExpressUsersController'
import '../src/Infra/InversifyExpressUtils/InversifyExpressValetTokenController'
import '../src/Infra/InversifyExpressUtils/InversifyExpressAdminController'
import '../src/Infra/InversifyExpressUtils/InversifyExpressSubscriptionTokensController'
import '../src/Infra/InversifyExpressUtils/InversifyExpressSubscriptionSettingsController'
import '../src/Infra/InversifyExpressUtils/InversifyExpressSettingsController'
import '../src/Infra/InversifyExpressUtils/InversifyExpressSessionController'
import '../src/Infra/InversifyExpressUtils/InversifyExpressOfflineController'
import '../src/Infra/InversifyExpressUtils/InversifyExpressListedController'
import '../src/Infra/InversifyExpressUtils/InversifyExpressInternalController'
import '../src/Infra/InversifyExpressUtils/InversifyExpressHealthCheckController'
import '../src/Infra/InversifyExpressUtils/InversifyExpressFeaturesController'
import '../src/Infra/InversifyExpressUtils/AnnotatedAuthController'
import '../src/Infra/InversifyExpressUtils/AnnotatedAuthenticatorsController'
import '../src/Infra/InversifyExpressUtils/AnnotatedSessionsController'
import '../src/Infra/InversifyExpressUtils/AnnotatedSubscriptionInvitesController'
import '../src/Infra/InversifyExpressUtils/AnnotatedUserRequestsController'
import '../src/Infra/InversifyExpressUtils/AnnotatedWebSocketsController'
import '../src/Infra/InversifyExpressUtils/AnnotatedUsersController'
import '../src/Infra/InversifyExpressUtils/AnnotatedValetTokenController'
import '../src/Infra/InversifyExpressUtils/AnnotatedAdminController'
import '../src/Infra/InversifyExpressUtils/AnnotatedSubscriptionTokensController'
import '../src/Infra/InversifyExpressUtils/AnnotatedSubscriptionSettingsController'
import '../src/Infra/InversifyExpressUtils/AnnotatedSettingsController'
import '../src/Infra/InversifyExpressUtils/AnnotatedSessionController'
import '../src/Infra/InversifyExpressUtils/AnnotatedOfflineController'
import '../src/Infra/InversifyExpressUtils/AnnotatedListedController'
import '../src/Infra/InversifyExpressUtils/AnnotatedInternalController'
import '../src/Infra/InversifyExpressUtils/AnnotatedHealthCheckController'
import '../src/Infra/InversifyExpressUtils/AnnotatedFeaturesController'
import * as cors from 'cors'
import { urlencoded, json, Request, Response, NextFunction } from 'express'

View File

@@ -1,6 +1,6 @@
{
"name": "@standardnotes/auth-server",
"version": "1.127.1",
"version": "1.129.0",
"engines": {
"node": ">=18.0.0 <21.0.0"
},

View File

@@ -234,24 +234,25 @@ import { OfflineUserAuthMiddleware } from '../Infra/InversifyExpressUtils/Middle
import { LockMiddleware } from '../Infra/InversifyExpressUtils/Middleware/LockMiddleware'
import { RequiredCrossServiceTokenMiddleware } from '../Infra/InversifyExpressUtils/Middleware/RequiredCrossServiceTokenMiddleware'
import { OptionalCrossServiceTokenMiddleware } from '../Infra/InversifyExpressUtils/Middleware/OptionalCrossServiceTokenMiddleware'
import { HomeServerSettingsController } from '../Infra/InversifyExpressUtils/HomeServer/HomeServerSettingsController'
import { HomeServerAdminController } from '../Infra/InversifyExpressUtils/HomeServer/HomeServerAdminController'
import { HomeServerAuthController } from '../Infra/InversifyExpressUtils/HomeServer/HomeServerAuthController'
import { HomeServerAuthenticatorsController } from '../Infra/InversifyExpressUtils/HomeServer/HomeServerAuthenticatorsController'
import { HomeServerFeaturesController } from '../Infra/InversifyExpressUtils/HomeServer/HomeServerFeaturesController'
import { HomeServerListedController } from '../Infra/InversifyExpressUtils/HomeServer/HomeServerListedController'
import { HomeServerOfflineController } from '../Infra/InversifyExpressUtils/HomeServer/HomeServerOfflineController'
import { HomeServerSessionController } from '../Infra/InversifyExpressUtils/HomeServer/HomeServerSessionController'
import { HomeServerSubscriptionInvitesController } from '../Infra/InversifyExpressUtils/HomeServer/HomeServerSubscriptionInvitesController'
import { HomeServerSubscriptionSettingsController } from '../Infra/InversifyExpressUtils/HomeServer/HomeServerSubscriptionSettingsController'
import { HomeServerSubscriptionTokensController } from '../Infra/InversifyExpressUtils/HomeServer/HomeServerSubscriptionTokensController'
import { HomeServerUserRequestsController } from '../Infra/InversifyExpressUtils/HomeServer/HomeServerUserRequestsController'
import { HomeServerUsersController } from '../Infra/InversifyExpressUtils/HomeServer/HomeServerUsersController'
import { HomeServerValetTokenController } from '../Infra/InversifyExpressUtils/HomeServer/HomeServerValetTokenController'
import { HomeServerWebSocketsController } from '../Infra/InversifyExpressUtils/HomeServer/HomeServerWebSocketsController'
import { HomeServerSessionsController } from '../Infra/InversifyExpressUtils/HomeServer/HomeServerSessionsController'
import { BaseSettingsController } from '../Infra/InversifyExpressUtils/Base/BaseSettingsController'
import { BaseAdminController } from '../Infra/InversifyExpressUtils/Base/BaseAdminController'
import { BaseAuthController } from '../Infra/InversifyExpressUtils/Base/BaseAuthController'
import { BaseAuthenticatorsController } from '../Infra/InversifyExpressUtils/Base/BaseAuthenticatorsController'
import { BaseFeaturesController } from '../Infra/InversifyExpressUtils/Base/BaseFeaturesController'
import { BaseListedController } from '../Infra/InversifyExpressUtils/Base/BaseListedController'
import { BaseOfflineController } from '../Infra/InversifyExpressUtils/Base/BaseOfflineController'
import { BaseSessionController } from '../Infra/InversifyExpressUtils/Base/BaseSessionController'
import { BaseSubscriptionInvitesController } from '../Infra/InversifyExpressUtils/Base/BaseSubscriptionInvitesController'
import { BaseSubscriptionSettingsController } from '../Infra/InversifyExpressUtils/Base/BaseSubscriptionSettingsController'
import { BaseSubscriptionTokensController } from '../Infra/InversifyExpressUtils/Base/BaseSubscriptionTokensController'
import { BaseUserRequestsController } from '../Infra/InversifyExpressUtils/Base/BaseUserRequestsController'
import { BaseUsersController } from '../Infra/InversifyExpressUtils/Base/BaseUsersController'
import { BaseValetTokenController } from '../Infra/InversifyExpressUtils/Base/BaseValetTokenController'
import { BaseWebSocketsController } from '../Infra/InversifyExpressUtils/Base/BaseWebSocketsController'
import { BaseSessionsController } from '../Infra/InversifyExpressUtils/Base/BaseSessionsController'
import { Transform } from 'stream'
import { ActivatePremiumFeatures } from '../Domain/UseCase/ActivatePremiumFeatures/ActivatePremiumFeatures'
import { PaymentsAccountDeletedEventHandler } from '../Domain/Handler/PaymentsAccountDeletedEventHandler'
export class ContainerConfigLoader {
async load(configuration?: {
@@ -978,6 +979,14 @@ export class ContainerConfigLoader {
container.get(TYPES.Auth_SettingService),
),
)
container
.bind<PaymentsAccountDeletedEventHandler>(TYPES.Auth_PaymentsAccountDeletedEventHandler)
.toConstantValue(
new PaymentsAccountDeletedEventHandler(
container.get(TYPES.Auth_DeleteAccount),
container.get(TYPES.Auth_Logger),
),
)
const eventHandlers: Map<string, DomainEventHandlerInterface> = new Map([
['USER_REGISTERED', container.get(TYPES.Auth_UserRegisteredEventHandler)],
@@ -1005,6 +1014,7 @@ export class ContainerConfigLoader {
],
['PREDICATE_VERIFICATION_REQUESTED', container.get(TYPES.Auth_PredicateVerificationRequestedEventHandler)],
['EMAIL_SUBSCRIPTION_UNSUBSCRIBED', container.get(TYPES.Auth_EmailSubscriptionUnsubscribedEventHandler)],
['PAYMENTS_ACCOUNT_DELETED', container.get(TYPES.Auth_PaymentsAccountDeletedEventHandler)],
])
if (isConfiguredForHomeServer) {
@@ -1037,9 +1047,9 @@ export class ContainerConfigLoader {
}
container
.bind<HomeServerAuthController>(TYPES.Auth_HomeServerAuthController)
.bind<BaseAuthController>(TYPES.Auth_BaseAuthController)
.toConstantValue(
new HomeServerAuthController(
new BaseAuthController(
container.get(TYPES.Auth_VerifyMFA),
container.get(TYPES.Auth_SignIn),
container.get(TYPES.Auth_GetUserKeyParams),
@@ -1054,42 +1064,42 @@ export class ContainerConfigLoader {
// Inversify Controllers
if (isConfiguredForHomeServer) {
container
.bind<HomeServerAuthenticatorsController>(TYPES.Auth_HomeServerAuthenticatorsController)
.bind<BaseAuthenticatorsController>(TYPES.Auth_BaseAuthenticatorsController)
.toConstantValue(
new HomeServerAuthenticatorsController(
new BaseAuthenticatorsController(
container.get(TYPES.Auth_AuthenticatorsController),
container.get(TYPES.Auth_ControllerContainer),
),
)
container
.bind<HomeServerSubscriptionInvitesController>(TYPES.Auth_HomeServerSubscriptionInvitesController)
.bind<BaseSubscriptionInvitesController>(TYPES.Auth_BaseSubscriptionInvitesController)
.toConstantValue(
new HomeServerSubscriptionInvitesController(
new BaseSubscriptionInvitesController(
container.get(TYPES.Auth_SubscriptionInvitesController),
container.get(TYPES.Auth_ControllerContainer),
),
)
container
.bind<HomeServerUserRequestsController>(TYPES.Auth_HomeServerUserRequestsController)
.bind<BaseUserRequestsController>(TYPES.Auth_BaseUserRequestsController)
.toConstantValue(
new HomeServerUserRequestsController(
new BaseUserRequestsController(
container.get(TYPES.Auth_UserRequestsController),
container.get(TYPES.Auth_ControllerContainer),
),
)
container
.bind<HomeServerWebSocketsController>(TYPES.Auth_HomeServerWebSocketsController)
.bind<BaseWebSocketsController>(TYPES.Auth_BaseWebSocketsController)
.toConstantValue(
new HomeServerWebSocketsController(
new BaseWebSocketsController(
container.get(TYPES.Auth_CreateCrossServiceToken),
container.get(TYPES.Auth_WebSocketConnectionTokenDecoder),
container.get(TYPES.Auth_ControllerContainer),
),
)
container
.bind<HomeServerSessionsController>(TYPES.Auth_HomeServerSessionsController)
.bind<BaseSessionsController>(TYPES.Auth_BaseSessionsController)
.toConstantValue(
new HomeServerSessionsController(
new BaseSessionsController(
container.get(TYPES.Auth_GetActiveSessionsForUser),
container.get(TYPES.Auth_AuthenticateRequest),
container.get(TYPES.Auth_SessionProjector),
@@ -1098,17 +1108,17 @@ export class ContainerConfigLoader {
),
)
container
.bind<HomeServerValetTokenController>(TYPES.Auth_HomeServerValetTokenController)
.bind<BaseValetTokenController>(TYPES.Auth_BaseValetTokenController)
.toConstantValue(
new HomeServerValetTokenController(
new BaseValetTokenController(
container.get(TYPES.Auth_CreateValetToken),
container.get(TYPES.Auth_ControllerContainer),
),
)
container
.bind<HomeServerUsersController>(TYPES.Auth_HomeServerUsersController)
.bind<BaseUsersController>(TYPES.Auth_BaseUsersController)
.toConstantValue(
new HomeServerUsersController(
new BaseUsersController(
container.get(TYPES.Auth_UpdateUser),
container.get(TYPES.Auth_GetUserKeyParams),
container.get(TYPES.Auth_DeleteAccount),
@@ -1120,9 +1130,9 @@ export class ContainerConfigLoader {
),
)
container
.bind<HomeServerAdminController>(TYPES.Auth_HomeServerAdminController)
.bind<BaseAdminController>(TYPES.Auth_BaseAdminController)
.toConstantValue(
new HomeServerAdminController(
new BaseAdminController(
container.get(TYPES.Auth_DeleteSetting),
container.get(TYPES.Auth_UserRepository),
container.get(TYPES.Auth_CreateSubscriptionToken),
@@ -1131,9 +1141,9 @@ export class ContainerConfigLoader {
),
)
container
.bind<HomeServerSubscriptionTokensController>(TYPES.Auth_HomeServerSubscriptionTokensController)
.bind<BaseSubscriptionTokensController>(TYPES.Auth_BaseSubscriptionTokensController)
.toConstantValue(
new HomeServerSubscriptionTokensController(
new BaseSubscriptionTokensController(
container.get(TYPES.Auth_CreateSubscriptionToken),
container.get(TYPES.Auth_AuthenticateSubscriptionToken),
container.get(TYPES.Auth_SettingService),
@@ -1145,17 +1155,17 @@ export class ContainerConfigLoader {
),
)
container
.bind<HomeServerSubscriptionSettingsController>(TYPES.Auth_HomeServerSubscriptionSettingsController)
.bind<BaseSubscriptionSettingsController>(TYPES.Auth_BaseSubscriptionSettingsController)
.toConstantValue(
new HomeServerSubscriptionSettingsController(
new BaseSubscriptionSettingsController(
container.get(TYPES.Auth_GetSetting),
container.get(TYPES.Auth_ControllerContainer),
),
)
container
.bind<HomeServerSettingsController>(TYPES.Auth_HomeServerSettingsController)
.bind<BaseSettingsController>(TYPES.Auth_BaseSettingsController)
.toConstantValue(
new HomeServerSettingsController(
new BaseSettingsController(
container.get(TYPES.Auth_GetSettings),
container.get(TYPES.Auth_GetSetting),
container.get(TYPES.Auth_UpdateSetting),
@@ -1164,9 +1174,9 @@ export class ContainerConfigLoader {
),
)
container
.bind<HomeServerSessionController>(TYPES.Auth_HomeServerSessionController)
.bind<BaseSessionController>(TYPES.Auth_BaseSessionController)
.toConstantValue(
new HomeServerSessionController(
new BaseSessionController(
container.get(TYPES.Auth_DeleteSessionForUser),
container.get(TYPES.Auth_DeletePreviousSessionsForUser),
container.get(TYPES.Auth_RefreshSessionToken),
@@ -1174,9 +1184,9 @@ export class ContainerConfigLoader {
),
)
container
.bind<HomeServerOfflineController>(TYPES.Auth_HomeServerOfflineController)
.bind<BaseOfflineController>(TYPES.Auth_BaseOfflineController)
.toConstantValue(
new HomeServerOfflineController(
new BaseOfflineController(
container.get(TYPES.Auth_GetUserFeatures),
container.get(TYPES.Auth_GetUserOfflineSubscription),
container.get(TYPES.Auth_CreateOfflineSubscriptionToken),
@@ -1188,17 +1198,17 @@ export class ContainerConfigLoader {
),
)
container
.bind<HomeServerListedController>(TYPES.Auth_HomeServerListedController)
.bind<BaseListedController>(TYPES.Auth_BaseListedController)
.toConstantValue(
new HomeServerListedController(
new BaseListedController(
container.get(TYPES.Auth_CreateListedAccount),
container.get(TYPES.Auth_ControllerContainer),
),
)
container
.bind<HomeServerFeaturesController>(TYPES.Auth_HomeServerFeaturesController)
.bind<BaseFeaturesController>(TYPES.Auth_BaseFeaturesController)
.toConstantValue(
new HomeServerFeaturesController(
new BaseFeaturesController(
container.get(TYPES.Auth_GetUserFeatures),
container.get(TYPES.Auth_ControllerContainer),
),

View File

@@ -114,6 +114,8 @@ export class AppDataSource {
...commonDataSourceOptions,
type: 'sqlite',
database: this.env.get('DB_SQLITE_DATABASE_PATH'),
enableWAL: true,
busyErrorRetry: 2000,
}
this._dataSource = new DataSource(sqliteDataSourceOptions)

View File

@@ -176,6 +176,7 @@ const TYPES = {
),
Auth_PredicateVerificationRequestedEventHandler: Symbol.for('Auth_PredicateVerificationRequestedEventHandler'),
Auth_EmailSubscriptionUnsubscribedEventHandler: Symbol.for('Auth_EmailSubscriptionUnsubscribedEventHandler'),
Auth_PaymentsAccountDeletedEventHandler: Symbol.for('Auth_PaymentsAccountDeletedEventHandler'),
// Services
Auth_DeviceDetector: Symbol.for('Auth_DeviceDetector'),
Auth_SessionService: Symbol.for('Auth_SessionService'),
@@ -217,22 +218,22 @@ const TYPES = {
Auth_ProtocolVersionSelector: Symbol.for('Auth_ProtocolVersionSelector'),
Auth_BooleanSelector: Symbol.for('Auth_BooleanSelector'),
Auth_UserSubscriptionService: Symbol.for('Auth_UserSubscriptionService'),
Auth_HomeServerAuthController: Symbol.for('Auth_HomeServerAuthController'),
Auth_HomeServerAuthenticatorsController: Symbol.for('Auth_HomeServerAuthenticatorsController'),
Auth_HomeServerSubscriptionInvitesController: Symbol.for('Auth_HomeServerSubscriptionInvitesController'),
Auth_HomeServerUserRequestsController: Symbol.for('Auth_HomeServerUserRequestsController'),
Auth_HomeServerWebSocketsController: Symbol.for('Auth_HomeServerWebSocketsController'),
Auth_HomeServerSessionsController: Symbol.for('Auth_HomeServerSessionsController'),
Auth_HomeServerValetTokenController: Symbol.for('Auth_HomeServerValetTokenController'),
Auth_HomeServerUsersController: Symbol.for('Auth_HomeServerUsersController'),
Auth_HomeServerAdminController: Symbol.for('Auth_HomeServerAdminController'),
Auth_HomeServerSubscriptionTokensController: Symbol.for('Auth_HomeServerSubscriptionTokensController'),
Auth_HomeServerSubscriptionSettingsController: Symbol.for('Auth_HomeServerSubscriptionSettingsController'),
Auth_HomeServerSettingsController: Symbol.for('Auth_HomeServerSettingsController'),
Auth_HomeServerSessionController: Symbol.for('Auth_HomeServerSessionController'),
Auth_HomeServerOfflineController: Symbol.for('Auth_HomeServerOfflineController'),
Auth_HomeServerListedController: Symbol.for('Auth_HomeServerListedController'),
Auth_HomeServerFeaturesController: Symbol.for('Auth_HomeServerFeaturesController'),
Auth_BaseAuthController: Symbol.for('Auth_BaseAuthController'),
Auth_BaseAuthenticatorsController: Symbol.for('Auth_BaseAuthenticatorsController'),
Auth_BaseSubscriptionInvitesController: Symbol.for('Auth_BaseSubscriptionInvitesController'),
Auth_BaseUserRequestsController: Symbol.for('Auth_BaseUserRequestsController'),
Auth_BaseWebSocketsController: Symbol.for('Auth_BaseWebSocketsController'),
Auth_BaseSessionsController: Symbol.for('Auth_BaseSessionsController'),
Auth_BaseValetTokenController: Symbol.for('Auth_BaseValetTokenController'),
Auth_BaseUsersController: Symbol.for('Auth_BaseUsersController'),
Auth_BaseAdminController: Symbol.for('Auth_BaseAdminController'),
Auth_BaseSubscriptionTokensController: Symbol.for('Auth_BaseSubscriptionTokensController'),
Auth_BaseSubscriptionSettingsController: Symbol.for('Auth_BaseSubscriptionSettingsController'),
Auth_BaseSettingsController: Symbol.for('Auth_BaseSettingsController'),
Auth_BaseSessionController: Symbol.for('Auth_BaseSessionController'),
Auth_BaseOfflineController: Symbol.for('Auth_BaseOfflineController'),
Auth_BaseListedController: Symbol.for('Auth_BaseListedController'),
Auth_BaseFeaturesController: Symbol.for('Auth_BaseFeaturesController'),
}
export default TYPES

View File

@@ -0,0 +1,48 @@
import { Logger } from 'winston'
import { Result } from '@standardnotes/domain-core'
import { PaymentsAccountDeletedEvent } from '@standardnotes/domain-events'
import { DeleteAccount } from '../UseCase/DeleteAccount/DeleteAccount'
import { PaymentsAccountDeletedEventHandler } from './PaymentsAccountDeletedEventHandler'
describe('PaymentsAccountDeletedEventHandler', () => {
let deleteAccountUseCase: DeleteAccount
let logger: Logger
let event: PaymentsAccountDeletedEvent
const createHandler = () => new PaymentsAccountDeletedEventHandler(deleteAccountUseCase, logger)
beforeEach(() => {
deleteAccountUseCase = {} as jest.Mocked<DeleteAccount>
deleteAccountUseCase.execute = jest.fn().mockResolvedValue(Result.ok('success'))
logger = {} as jest.Mocked<Logger>
logger.error = jest.fn()
event = {
payload: {
username: 'username',
},
} as jest.Mocked<PaymentsAccountDeletedEvent>
})
it('should delete account', async () => {
const handler = createHandler()
await handler.handle(event)
expect(deleteAccountUseCase.execute).toHaveBeenCalledWith({
username: 'username',
})
})
it('should log error if delete account fails', async () => {
const handler = createHandler()
deleteAccountUseCase.execute = jest.fn().mockResolvedValue(Result.fail('error'))
await handler.handle(event)
expect(logger.error).toHaveBeenCalledWith('Failed to delete account for user username: error')
})
})

View File

@@ -0,0 +1,18 @@
import { DomainEventHandlerInterface, PaymentsAccountDeletedEvent } from '@standardnotes/domain-events'
import { Logger } from 'winston'
import { DeleteAccount } from '../UseCase/DeleteAccount/DeleteAccount'
export class PaymentsAccountDeletedEventHandler implements DomainEventHandlerInterface {
constructor(private deleteAccountUseCase: DeleteAccount, private logger: Logger) {}
async handle(event: PaymentsAccountDeletedEvent): Promise<void> {
const result = await this.deleteAccountUseCase.execute({
username: event.payload.username,
})
if (result.isFailed()) {
this.logger.error(`Failed to delete account for user ${event.payload.username}: ${result.getError()}`)
}
}
}

View File

@@ -35,6 +35,7 @@ describe('DeleteAccount', () => {
userRepository = {} as jest.Mocked<UserRepositoryInterface>
userRepository.findOneByUuid = jest.fn().mockReturnValue(user)
userRepository.findOneByUsernameOrEmail = jest.fn().mockReturnValue(user)
userSubscriptionService = {} as jest.Mocked<UserSubscriptionServiceInterface>
userSubscriptionService.findRegularSubscriptionForUserUuid = jest
@@ -53,65 +54,124 @@ describe('DeleteAccount', () => {
timer.convertDateToMicroseconds = jest.fn().mockReturnValue(1)
})
it('should trigger account deletion - no subscription', async () => {
userSubscriptionService.findRegularSubscriptionForUserUuid = jest
.fn()
.mockReturnValue({ regularSubscription: null, sharedSubscription: null })
describe('when user uuid is provided', () => {
it('should trigger account deletion - no subscription', async () => {
userSubscriptionService.findRegularSubscriptionForUserUuid = jest
.fn()
.mockReturnValue({ regularSubscription: null, sharedSubscription: null })
expect(await createUseCase().execute({ userUuid: '00000000-0000-0000-0000-000000000000' })).toEqual({
message: 'Successfully deleted user',
responseCode: 200,
success: true,
const result = await createUseCase().execute({ userUuid: '00000000-0000-0000-0000-000000000000' })
expect(result.isFailed()).toBeFalsy()
expect(domainEventPublisher.publish).toHaveBeenCalledTimes(1)
expect(domainEventFactory.createAccountDeletionRequestedEvent).toHaveBeenLastCalledWith({
userUuid: '1-2-3',
userCreatedAtTimestamp: 1,
regularSubscriptionUuid: undefined,
})
})
expect(domainEventPublisher.publish).toHaveBeenCalledTimes(1)
expect(domainEventFactory.createAccountDeletionRequestedEvent).toHaveBeenLastCalledWith({
userUuid: '1-2-3',
userCreatedAtTimestamp: 1,
regularSubscriptionUuid: undefined,
it('should trigger account deletion - subscription present', async () => {
userSubscriptionService.findRegularSubscriptionForUserUuid = jest
.fn()
.mockReturnValue({ regularSubscription, sharedSubscription: null })
const result = await createUseCase().execute({ userUuid: '00000000-0000-0000-0000-000000000000' })
expect(result.isFailed()).toBeFalsy()
expect(domainEventPublisher.publish).toHaveBeenCalledTimes(1)
expect(domainEventFactory.createAccountDeletionRequestedEvent).toHaveBeenLastCalledWith({
userUuid: '1-2-3',
userCreatedAtTimestamp: 1,
regularSubscriptionUuid: '1-2-3',
})
})
it('should not trigger account deletion if user is not found', async () => {
userRepository.findOneByUuid = jest.fn().mockReturnValue(null)
const result = await createUseCase().execute({ userUuid: '00000000-0000-0000-0000-000000000000' })
expect(result.isFailed()).toBeFalsy()
expect(domainEventPublisher.publish).not.toHaveBeenCalled()
expect(domainEventFactory.createAccountDeletionRequestedEvent).not.toHaveBeenCalled()
})
it('should not trigger account deletion if user uuid is invalid', async () => {
const result = await createUseCase().execute({ userUuid: 'invalid' })
expect(result.isFailed()).toBeTruthy()
expect(domainEventPublisher.publish).not.toHaveBeenCalled()
expect(domainEventFactory.createAccountDeletionRequestedEvent).not.toHaveBeenCalled()
})
})
it('should trigger account deletion - subscription present', async () => {
userSubscriptionService.findRegularSubscriptionForUserUuid = jest
.fn()
.mockReturnValue({ regularSubscription, sharedSubscription: null })
describe('when username is provided', () => {
it('should trigger account deletion - no subscription', async () => {
userSubscriptionService.findRegularSubscriptionForUserUuid = jest
.fn()
.mockReturnValue({ regularSubscription: null, sharedSubscription: null })
expect(await createUseCase().execute({ userUuid: '00000000-0000-0000-0000-000000000000' })).toEqual({
message: 'Successfully deleted user',
responseCode: 200,
success: true,
const result = await createUseCase().execute({ username: 'test@test.te' })
expect(result.isFailed()).toBeFalsy()
expect(domainEventPublisher.publish).toHaveBeenCalledTimes(1)
expect(domainEventFactory.createAccountDeletionRequestedEvent).toHaveBeenLastCalledWith({
userUuid: '1-2-3',
userCreatedAtTimestamp: 1,
regularSubscriptionUuid: undefined,
})
})
expect(domainEventPublisher.publish).toHaveBeenCalledTimes(1)
expect(domainEventFactory.createAccountDeletionRequestedEvent).toHaveBeenLastCalledWith({
userUuid: '1-2-3',
userCreatedAtTimestamp: 1,
regularSubscriptionUuid: '1-2-3',
it('should trigger account deletion - subscription present', async () => {
userSubscriptionService.findRegularSubscriptionForUserUuid = jest
.fn()
.mockReturnValue({ regularSubscription, sharedSubscription: null })
const result = await createUseCase().execute({ username: 'test@test.te' })
expect(result.isFailed()).toBeFalsy()
expect(domainEventPublisher.publish).toHaveBeenCalledTimes(1)
expect(domainEventFactory.createAccountDeletionRequestedEvent).toHaveBeenLastCalledWith({
userUuid: '1-2-3',
userCreatedAtTimestamp: 1,
regularSubscriptionUuid: '1-2-3',
})
})
it('should not trigger account deletion if user is not found', async () => {
userRepository.findOneByUsernameOrEmail = jest.fn().mockReturnValue(null)
const result = await createUseCase().execute({ username: 'test@test.te' })
expect(result.isFailed()).toBeFalsy()
expect(domainEventPublisher.publish).not.toHaveBeenCalled()
expect(domainEventFactory.createAccountDeletionRequestedEvent).not.toHaveBeenCalled()
})
it('should not trigger account deletion if username is invalid', async () => {
const result = await createUseCase().execute({ username: '' })
expect(result.isFailed()).toBeTruthy()
expect(domainEventPublisher.publish).not.toHaveBeenCalled()
expect(domainEventFactory.createAccountDeletionRequestedEvent).not.toHaveBeenCalled()
})
})
it('should not trigger account deletion if user is not found', async () => {
userRepository.findOneByUuid = jest.fn().mockReturnValue(null)
describe('when neither user uuid nor username is provided', () => {
it('should not trigger account deletion', async () => {
const result = await createUseCase().execute({})
expect(await createUseCase().execute({ userUuid: '00000000-0000-0000-0000-000000000000' })).toEqual({
message: 'User not found',
responseCode: 404,
success: false,
expect(result.isFailed()).toBeTruthy()
expect(domainEventPublisher.publish).not.toHaveBeenCalled()
expect(domainEventFactory.createAccountDeletionRequestedEvent).not.toHaveBeenCalled()
})
expect(domainEventPublisher.publish).not.toHaveBeenCalled()
expect(domainEventFactory.createAccountDeletionRequestedEvent).not.toHaveBeenCalled()
})
it('should not trigger account deletion if user uuid is invalid', async () => {
expect(await createUseCase().execute({ userUuid: '' })).toEqual({
message: 'Given value is not a valid uuid: ',
responseCode: 400,
success: false,
})
expect(domainEventPublisher.publish).not.toHaveBeenCalled()
expect(domainEventFactory.createAccountDeletionRequestedEvent).not.toHaveBeenCalled()
})
})

View File

@@ -1,4 +1,4 @@
import { Uuid } from '@standardnotes/domain-core'
import { Result, UseCaseInterface, Username, Uuid } from '@standardnotes/domain-core'
import { DomainEventPublisherInterface } from '@standardnotes/domain-events'
import { TimerInterface } from '@standardnotes/time'
import { inject, injectable } from 'inversify'
@@ -7,13 +7,12 @@ import TYPES from '../../../Bootstrap/Types'
import { DomainEventFactoryInterface } from '../../Event/DomainEventFactoryInterface'
import { UserSubscriptionServiceInterface } from '../../Subscription/UserSubscriptionServiceInterface'
import { UserRepositoryInterface } from '../../User/UserRepositoryInterface'
import { UseCaseInterface } from '../UseCaseInterface'
import { DeleteAccountDTO } from './DeleteAccountDTO'
import { DeleteAccountResponse } from './DeleteAccountResponse'
import { User } from '../../User/User'
@injectable()
export class DeleteAccount implements UseCaseInterface {
export class DeleteAccount implements UseCaseInterface<string> {
constructor(
@inject(TYPES.Auth_UserRepository) private userRepository: UserRepositoryInterface,
@inject(TYPES.Auth_UserSubscriptionService) private userSubscriptionService: UserSubscriptionServiceInterface,
@@ -22,25 +21,30 @@ export class DeleteAccount implements UseCaseInterface {
@inject(TYPES.Auth_Timer) private timer: TimerInterface,
) {}
async execute(dto: DeleteAccountDTO): Promise<DeleteAccountResponse> {
const uuidOrError = Uuid.create(dto.userUuid)
if (uuidOrError.isFailed()) {
return {
success: false,
responseCode: 400,
message: uuidOrError.getError(),
async execute(dto: DeleteAccountDTO): Promise<Result<string>> {
let user: User | null = null
if (dto.userUuid !== undefined) {
const uuidOrError = Uuid.create(dto.userUuid)
if (uuidOrError.isFailed()) {
return Result.fail(uuidOrError.getError())
}
}
const uuid = uuidOrError.getValue()
const uuid = uuidOrError.getValue()
const user = await this.userRepository.findOneByUuid(uuid)
user = await this.userRepository.findOneByUuid(uuid)
} else if (dto.username !== undefined) {
const usernameOrError = Username.create(dto.username)
if (usernameOrError.isFailed()) {
return Result.fail(usernameOrError.getError())
}
const username = usernameOrError.getValue()
user = await this.userRepository.findOneByUsernameOrEmail(username)
} else {
return Result.fail('Either userUuid or username must be provided.')
}
if (user === null) {
return {
success: false,
responseCode: 404,
message: 'User not found',
}
return Result.ok('User already deleted.')
}
let regularSubscriptionUuid = undefined
@@ -57,10 +61,6 @@ export class DeleteAccount implements UseCaseInterface {
}),
)
return {
success: true,
message: 'Successfully deleted user',
responseCode: 200,
}
return Result.ok('Successfully deleted account.')
}
}

View File

@@ -1,3 +1,4 @@
export type DeleteAccountDTO = {
userUuid: string
userUuid?: string
username?: string
}

View File

@@ -1,5 +0,0 @@
export type DeleteAccountResponse = {
success: boolean
responseCode: number
message: string
}

View File

@@ -1,6 +1,6 @@
import 'reflect-metadata'
import { InversifyExpressAdminController } from './InversifyExpressAdminController'
import { AnnotatedAdminController } from './AnnotatedAdminController'
import { results } from 'inversify-express-utils'
import { User } from '../../Domain/User/User'
import { UserRepositoryInterface } from '../../Domain/User/UserRepositoryInterface'
@@ -9,7 +9,7 @@ import { DeleteSetting } from '../../Domain/UseCase/DeleteSetting/DeleteSetting'
import { CreateSubscriptionToken } from '../../Domain/UseCase/CreateSubscriptionToken/CreateSubscriptionToken'
import { CreateOfflineSubscriptionToken } from '../../Domain/UseCase/CreateOfflineSubscriptionToken/CreateOfflineSubscriptionToken'
describe('InversifyExpressAdminController', () => {
describe('AnnotatedAdminController', () => {
let deleteSetting: DeleteSetting
let userRepository: UserRepositoryInterface
let createSubscriptionToken: CreateSubscriptionToken
@@ -18,12 +18,7 @@ describe('InversifyExpressAdminController', () => {
let user: User
const createController = () =>
new InversifyExpressAdminController(
deleteSetting,
userRepository,
createSubscriptionToken,
createOfflineSubscriptionToken,
)
new AnnotatedAdminController(deleteSetting, userRepository, createSubscriptionToken, createOfflineSubscriptionToken)
beforeEach(() => {
user = {} as jest.Mocked<User>

View File

@@ -9,14 +9,14 @@ import {
results,
} from 'inversify-express-utils'
import TYPES from '../../Bootstrap/Types'
import { HomeServerAdminController } from './HomeServer/HomeServerAdminController'
import { BaseAdminController } from './Base/BaseAdminController'
import { CreateOfflineSubscriptionToken } from '../../Domain/UseCase/CreateOfflineSubscriptionToken/CreateOfflineSubscriptionToken'
import { CreateSubscriptionToken } from '../../Domain/UseCase/CreateSubscriptionToken/CreateSubscriptionToken'
import { DeleteSetting } from '../../Domain/UseCase/DeleteSetting/DeleteSetting'
import { UserRepositoryInterface } from '../../Domain/User/UserRepositoryInterface'
@controller('/admin')
export class InversifyExpressAdminController extends HomeServerAdminController {
export class AnnotatedAdminController extends BaseAdminController {
constructor(
@inject(TYPES.Auth_DeleteSetting) override doDeleteSetting: DeleteSetting,
@inject(TYPES.Auth_UserRepository) override userRepository: UserRepositoryInterface,

View File

@@ -16,10 +16,10 @@ import { Logger } from 'winston'
import { GetUserKeyParams } from '../../Domain/UseCase/GetUserKeyParams/GetUserKeyParams'
import { AuthController } from '../../Controller/AuthController'
import { inject } from 'inversify'
import { HomeServerAuthController } from './HomeServer/HomeServerAuthController'
import { BaseAuthController } from './Base/BaseAuthController'
@controller('/auth')
export class InversifyExpressAuthController extends HomeServerAuthController {
export class AnnotatedAuthController extends BaseAuthController {
constructor(
@inject(TYPES.Auth_VerifyMFA) override verifyMFA: VerifyMFA,
@inject(TYPES.Auth_SignIn) override signInUseCase: SignIn,

View File

@@ -10,10 +10,10 @@ import {
import TYPES from '../../Bootstrap/Types'
import { AuthenticatorsController } from '../../Controller/AuthenticatorsController'
import { inject } from 'inversify'
import { HomeServerAuthenticatorsController } from './HomeServer/HomeServerAuthenticatorsController'
import { BaseAuthenticatorsController } from './Base/BaseAuthenticatorsController'
@controller('/authenticators')
export class InversifyExpressAuthenticatorsController extends HomeServerAuthenticatorsController {
export class AnnotatedAuthenticatorsController extends BaseAuthenticatorsController {
constructor(
@inject(TYPES.Auth_AuthenticatorsController) override authenticatorsController: AuthenticatorsController,
) {

View File

@@ -2,19 +2,19 @@ import 'reflect-metadata'
import * as express from 'express'
import { InversifyExpressFeaturesController } from './InversifyExpressFeaturesController'
import { AnnotatedFeaturesController } from './AnnotatedFeaturesController'
import { results } from 'inversify-express-utils'
import { User } from '../../Domain/User/User'
import { GetUserFeatures } from '../../Domain/UseCase/GetUserFeatures/GetUserFeatures'
describe('InversifyExpressFeaturesController', () => {
describe('AnnotatedFeaturesController', () => {
let getUserFeatures: GetUserFeatures
let request: express.Request
let response: express.Response
let user: User
const createController = () => new InversifyExpressFeaturesController(getUserFeatures)
const createController = () => new AnnotatedFeaturesController(getUserFeatures)
beforeEach(() => {
user = {} as jest.Mocked<User>

View File

@@ -8,10 +8,10 @@ import {
} from 'inversify-express-utils'
import TYPES from '../../Bootstrap/Types'
import { GetUserFeatures } from '../../Domain/UseCase/GetUserFeatures/GetUserFeatures'
import { HomeServerFeaturesController } from './HomeServer/HomeServerFeaturesController'
import { BaseFeaturesController } from './Base/BaseFeaturesController'
@controller('/users/:userUuid/features')
export class InversifyExpressFeaturesController extends HomeServerFeaturesController {
export class AnnotatedFeaturesController extends BaseFeaturesController {
constructor(@inject(TYPES.Auth_GetUserFeatures) override doGetUserFeatures: GetUserFeatures) {
super(doGetUserFeatures)
}

View File

@@ -1,7 +1,7 @@
import { controller, httpGet } from 'inversify-express-utils'
@controller('/healthcheck')
export class InversifyExpressHealthCheckController {
export class AnnotatedHealthCheckController {
@httpGet('/')
public async get(): Promise<string> {
return 'OK'

View File

@@ -2,13 +2,13 @@ import 'reflect-metadata'
import * as express from 'express'
import { InversifyExpressInternalController } from './InversifyExpressInternalController'
import { AnnotatedInternalController } from './AnnotatedInternalController'
import { results } from 'inversify-express-utils'
import { User } from '../../Domain/User/User'
import { GetUserFeatures } from '../../Domain/UseCase/GetUserFeatures/GetUserFeatures'
import { GetSetting } from '../../Domain/UseCase/GetSetting/GetSetting'
describe('InversifyExpressInternalController', () => {
describe('AnnotatedInternalController', () => {
let getUserFeatures: GetUserFeatures
let getSetting: GetSetting
@@ -16,7 +16,7 @@ describe('InversifyExpressInternalController', () => {
let response: express.Response
let user: User
const createController = () => new InversifyExpressInternalController(getUserFeatures, getSetting)
const createController = () => new AnnotatedInternalController(getUserFeatures, getSetting)
beforeEach(() => {
user = {} as jest.Mocked<User>

View File

@@ -12,7 +12,7 @@ import { GetSetting } from '../../Domain/UseCase/GetSetting/GetSetting'
import { GetUserFeatures } from '../../Domain/UseCase/GetUserFeatures/GetUserFeatures'
@controller('/internal')
export class InversifyExpressInternalController extends BaseHttpController {
export class AnnotatedInternalController extends BaseHttpController {
constructor(
@inject(TYPES.Auth_GetUserFeatures) private doGetUserFeatures: GetUserFeatures,
@inject(TYPES.Auth_GetSetting) private doGetSetting: GetSetting,

View File

@@ -3,18 +3,18 @@ import 'reflect-metadata'
import * as express from 'express'
import { results } from 'inversify-express-utils'
import { InversifyExpressListedController } from './InversifyExpressListedController'
import { AnnotatedListedController } from './AnnotatedListedController'
import { User } from '../../Domain/User/User'
import { CreateListedAccount } from '../../Domain/UseCase/CreateListedAccount/CreateListedAccount'
describe('InversifyExpressListedController', () => {
describe('AnnotatedListedController', () => {
let createListedAccount: CreateListedAccount
let request: express.Request
let response: express.Response
let user: User
const createController = () => new InversifyExpressListedController(createListedAccount)
const createController = () => new AnnotatedListedController(createListedAccount)
beforeEach(() => {
user = {} as jest.Mocked<User>

View File

@@ -4,10 +4,10 @@ import { controller, httpPost, results } from 'inversify-express-utils'
import { Request, Response } from 'express'
import TYPES from '../../Bootstrap/Types'
import { CreateListedAccount } from '../../Domain/UseCase/CreateListedAccount/CreateListedAccount'
import { HomeServerListedController } from './HomeServer/HomeServerListedController'
import { BaseListedController } from './Base/BaseListedController'
@controller('/listed')
export class InversifyExpressListedController extends HomeServerListedController {
export class AnnotatedListedController extends BaseListedController {
constructor(@inject(TYPES.Auth_CreateListedAccount) override doCreateListedAccount: CreateListedAccount) {
super(doCreateListedAccount)
}

View File

@@ -2,7 +2,7 @@ import 'reflect-metadata'
import * as express from 'express'
import { InversifyExpressOfflineController } from './InversifyExpressOfflineController'
import { AnnotatedOfflineController } from './AnnotatedOfflineController'
import { results } from 'inversify-express-utils'
import { User } from '../../Domain/User/User'
import { GetUserFeatures } from '../../Domain/UseCase/GetUserFeatures/GetUserFeatures'
@@ -15,7 +15,7 @@ import { OfflineUserTokenData, TokenEncoderInterface } from '@standardnotes/secu
import { SubscriptionName } from '@standardnotes/common'
import { Logger } from 'winston'
describe('InversifyExpressOfflineController', () => {
describe('AnnotatedOfflineController', () => {
let getUserFeatures: GetUserFeatures
let getUserOfflineSubscription: GetUserOfflineSubscription
let createOfflineSubscriptionToken: CreateOfflineSubscriptionToken
@@ -29,7 +29,7 @@ describe('InversifyExpressOfflineController', () => {
let user: User
const createController = () =>
new InversifyExpressOfflineController(
new AnnotatedOfflineController(
getUserFeatures,
getUserOfflineSubscription,
createOfflineSubscriptionToken,

View File

@@ -14,10 +14,10 @@ import { AuthenticateOfflineSubscriptionToken } from '../../Domain/UseCase/Authe
import { CreateOfflineSubscriptionToken } from '../../Domain/UseCase/CreateOfflineSubscriptionToken/CreateOfflineSubscriptionToken'
import { GetUserFeatures } from '../../Domain/UseCase/GetUserFeatures/GetUserFeatures'
import { GetUserOfflineSubscription } from '../../Domain/UseCase/GetUserOfflineSubscription/GetUserOfflineSubscription'
import { HomeServerOfflineController } from './HomeServer/HomeServerOfflineController'
import { BaseOfflineController } from './Base/BaseOfflineController'
@controller('/offline')
export class InversifyExpressOfflineController extends HomeServerOfflineController {
export class AnnotatedOfflineController extends BaseOfflineController {
constructor(
@inject(TYPES.Auth_GetUserFeatures) override doGetUserFeatures: GetUserFeatures,
@inject(TYPES.Auth_GetUserOfflineSubscription) override getUserOfflineSubscription: GetUserOfflineSubscription,

View File

@@ -2,13 +2,13 @@ import 'reflect-metadata'
import * as express from 'express'
import { InversifyExpressSessionController } from './InversifyExpressSessionController'
import { AnnotatedSessionController } from './AnnotatedSessionController'
import { results } from 'inversify-express-utils'
import { DeletePreviousSessionsForUser } from '../../Domain/UseCase/DeletePreviousSessionsForUser'
import { DeleteSessionForUser } from '../../Domain/UseCase/DeleteSessionForUser'
import { RefreshSessionToken } from '../../Domain/UseCase/RefreshSessionToken'
describe('InversifyExpressSessionController', () => {
describe('AnnotatedSessionController', () => {
let deleteSessionForUser: DeleteSessionForUser
let deletePreviousSessionsForUser: DeletePreviousSessionsForUser
let refreshSessionToken: RefreshSessionToken
@@ -16,7 +16,7 @@ describe('InversifyExpressSessionController', () => {
let response: express.Response
const createController = () =>
new InversifyExpressSessionController(deleteSessionForUser, deletePreviousSessionsForUser, refreshSessionToken)
new AnnotatedSessionController(deleteSessionForUser, deletePreviousSessionsForUser, refreshSessionToken)
beforeEach(() => {
deleteSessionForUser = {} as jest.Mocked<DeleteSessionForUser>

View File

@@ -11,10 +11,10 @@ import TYPES from '../../Bootstrap/Types'
import { DeletePreviousSessionsForUser } from '../../Domain/UseCase/DeletePreviousSessionsForUser'
import { DeleteSessionForUser } from '../../Domain/UseCase/DeleteSessionForUser'
import { RefreshSessionToken } from '../../Domain/UseCase/RefreshSessionToken'
import { HomeServerSessionController } from './HomeServer/HomeServerSessionController'
import { BaseSessionController } from './Base/BaseSessionController'
@controller('/session')
export class InversifyExpressSessionController extends HomeServerSessionController {
export class AnnotatedSessionController extends BaseSessionController {
constructor(
@inject(TYPES.Auth_DeleteSessionForUser) override deleteSessionForUser: DeleteSessionForUser,
@inject(TYPES.Auth_DeletePreviousSessionsForUser)

View File

@@ -2,7 +2,7 @@ import 'reflect-metadata'
import * as express from 'express'
import { InversifyExpressSessionsController } from './InversifyExpressSessionsController'
import { AnnotatedSessionsController } from './AnnotatedSessionsController'
import { results } from 'inversify-express-utils'
import { User } from '@standardnotes/responses'
@@ -12,7 +12,7 @@ import { GetActiveSessionsForUser } from '../../Domain/UseCase/GetActiveSessions
import { ProjectorInterface } from '../../Projection/ProjectorInterface'
import { Session } from '../../Domain/Session/Session'
describe('InversifyExpressSessionsController', () => {
describe('AnnotatedSessionsController', () => {
let getActiveSessionsForUser: GetActiveSessionsForUser
let authenticateRequest: AuthenticateRequest
let sessionProjector: ProjectorInterface<Session>
@@ -23,7 +23,7 @@ describe('InversifyExpressSessionsController', () => {
let createCrossServiceToken: CreateCrossServiceToken
const createController = () =>
new InversifyExpressSessionsController(
new AnnotatedSessionsController(
getActiveSessionsForUser,
authenticateRequest,
sessionProjector,

View File

@@ -14,10 +14,10 @@ import { CreateCrossServiceToken } from '../../Domain/UseCase/CreateCrossService
import { GetActiveSessionsForUser } from '../../Domain/UseCase/GetActiveSessionsForUser'
import { ProjectorInterface } from '../../Projection/ProjectorInterface'
import { Session } from '../../Domain/Session/Session'
import { HomeServerSessionsController } from './HomeServer/HomeServerSessionsController'
import { BaseSessionsController } from './Base/BaseSessionsController'
@controller('/sessions')
export class InversifyExpressSessionsController extends HomeServerSessionsController {
export class AnnotatedSessionsController extends BaseSessionsController {
constructor(
@inject(TYPES.Auth_GetActiveSessionsForUser) override getActiveSessionsForUser: GetActiveSessionsForUser,
@inject(TYPES.Auth_AuthenticateRequest) override authenticateRequest: AuthenticateRequest,

View File

@@ -2,7 +2,7 @@ import 'reflect-metadata'
import * as express from 'express'
import { InversifyExpressSettingsController } from './InversifyExpressSettingsController'
import { AnnotatedSettingsController } from './AnnotatedSettingsController'
import { results } from 'inversify-express-utils'
import { EncryptionVersion } from '../../Domain/Encryption/EncryptionVersion'
import { DeleteSetting } from '../../Domain/UseCase/DeleteSetting/DeleteSetting'
@@ -11,7 +11,7 @@ import { GetSettings } from '../../Domain/UseCase/GetSettings/GetSettings'
import { UpdateSetting } from '../../Domain/UseCase/UpdateSetting/UpdateSetting'
import { User } from '../../Domain/User/User'
describe('InversifyExpressSettingsController', () => {
describe('AnnotatedSettingsController', () => {
let deleteSetting: DeleteSetting
let getSettings: GetSettings
let getSetting: GetSetting
@@ -21,8 +21,7 @@ describe('InversifyExpressSettingsController', () => {
let response: express.Response
let user: User
const createController = () =>
new InversifyExpressSettingsController(getSettings, getSetting, updateSetting, deleteSetting)
const createController = () => new AnnotatedSettingsController(getSettings, getSetting, updateSetting, deleteSetting)
beforeEach(() => {
deleteSetting = {} as jest.Mocked<DeleteSetting>

View File

@@ -13,10 +13,10 @@ import { DeleteSetting } from '../../Domain/UseCase/DeleteSetting/DeleteSetting'
import { GetSetting } from '../../Domain/UseCase/GetSetting/GetSetting'
import { GetSettings } from '../../Domain/UseCase/GetSettings/GetSettings'
import { UpdateSetting } from '../../Domain/UseCase/UpdateSetting/UpdateSetting'
import { HomeServerSettingsController } from './HomeServer/HomeServerSettingsController'
import { BaseSettingsController } from './Base/BaseSettingsController'
@controller('/users/:userUuid')
export class InversifyExpressSettingsController extends HomeServerSettingsController {
export class AnnotatedSettingsController extends BaseSettingsController {
constructor(
@inject(TYPES.Auth_GetSettings) override doGetSettings: GetSettings,
@inject(TYPES.Auth_GetSetting) override doGetSetting: GetSetting,

View File

@@ -11,10 +11,10 @@ import { inject } from 'inversify'
import TYPES from '../../Bootstrap/Types'
import { SubscriptionInvitesController } from '../../Controller/SubscriptionInvitesController'
import { HomeServerSubscriptionInvitesController } from './HomeServer/HomeServerSubscriptionInvitesController'
import { BaseSubscriptionInvitesController } from './Base/BaseSubscriptionInvitesController'
@controller('/subscription-invites')
export class InversifyExpressSubscriptionInvitesController extends HomeServerSubscriptionInvitesController {
export class AnnotatedSubscriptionInvitesController extends BaseSubscriptionInvitesController {
constructor(
@inject(TYPES.Auth_SubscriptionInvitesController)
override subscriptionInvitesController: SubscriptionInvitesController,

View File

@@ -3,18 +3,18 @@ import 'reflect-metadata'
import * as express from 'express'
import { results } from 'inversify-express-utils'
import { InversifyExpressSubscriptionSettingsController } from './InversifyExpressSubscriptionSettingsController'
import { AnnotatedSubscriptionSettingsController } from './AnnotatedSubscriptionSettingsController'
import { User } from '../../Domain/User/User'
import { GetSetting } from '../../Domain/UseCase/GetSetting/GetSetting'
describe('InversifyExpressSubscriptionSettingsController', () => {
describe('AnnotatedSubscriptionSettingsController', () => {
let getSetting: GetSetting
let request: express.Request
let response: express.Response
let user: User
const createController = () => new InversifyExpressSubscriptionSettingsController(getSetting)
const createController = () => new AnnotatedSubscriptionSettingsController(getSetting)
beforeEach(() => {
user = {} as jest.Mocked<User>

View File

@@ -8,10 +8,10 @@ import {
} from 'inversify-express-utils'
import TYPES from '../../Bootstrap/Types'
import { GetSetting } from '../../Domain/UseCase/GetSetting/GetSetting'
import { HomeServerSubscriptionSettingsController } from './HomeServer/HomeServerSubscriptionSettingsController'
import { BaseSubscriptionSettingsController } from './Base/BaseSubscriptionSettingsController'
@controller('/users/:userUuid')
export class InversifyExpressSubscriptionSettingsController extends HomeServerSubscriptionSettingsController {
export class AnnotatedSubscriptionSettingsController extends BaseSubscriptionSettingsController {
constructor(@inject(TYPES.Auth_GetSetting) override doGetSetting: GetSetting) {
super(doGetSetting)
}

View File

@@ -3,7 +3,7 @@ import 'reflect-metadata'
import * as express from 'express'
import { results } from 'inversify-express-utils'
import { InversifyExpressSubscriptionTokensController } from './InversifyExpressSubscriptionTokensController'
import { AnnotatedSubscriptionTokensController } from './AnnotatedSubscriptionTokensController'
import { CrossServiceTokenData, TokenEncoderInterface } from '@standardnotes/security'
import { Setting } from '../../Domain/Setting/Setting'
@@ -15,7 +15,7 @@ import { ProjectorInterface } from '../../Projection/ProjectorInterface'
import { User } from '../../Domain/User/User'
import { Role } from '../../Domain/Role/Role'
describe('InversifyExpressSubscriptionTokensController', () => {
describe('AnnotatedSubscriptionTokensController', () => {
let createSubscriptionToken: CreateSubscriptionToken
let authenticateToken: AuthenticateSubscriptionToken
const jwtTTL = 60
@@ -31,7 +31,7 @@ describe('InversifyExpressSubscriptionTokensController', () => {
let role: Role
const createController = () =>
new InversifyExpressSubscriptionTokensController(
new AnnotatedSubscriptionTokensController(
createSubscriptionToken,
authenticateToken,
settingService,

View File

@@ -15,10 +15,10 @@ import { AuthenticateSubscriptionToken } from '../../Domain/UseCase/Authenticate
import { CreateSubscriptionToken } from '../../Domain/UseCase/CreateSubscriptionToken/CreateSubscriptionToken'
import { User } from '../../Domain/User/User'
import { ProjectorInterface } from '../../Projection/ProjectorInterface'
import { HomeServerSubscriptionTokensController } from './HomeServer/HomeServerSubscriptionTokensController'
import { BaseSubscriptionTokensController } from './Base/BaseSubscriptionTokensController'
@controller('/subscription-tokens')
export class InversifyExpressSubscriptionTokensController extends HomeServerSubscriptionTokensController {
export class AnnotatedSubscriptionTokensController extends BaseSubscriptionTokensController {
constructor(
@inject(TYPES.Auth_CreateSubscriptionToken) override createSubscriptionToken: CreateSubscriptionToken,
@inject(TYPES.Auth_AuthenticateSubscriptionToken) override authenticateToken: AuthenticateSubscriptionToken,

View File

@@ -4,10 +4,10 @@ import { results, httpPost, controller } from 'inversify-express-utils'
import TYPES from '../../Bootstrap/Types'
import { UserRequestsController } from '../../Controller/UserRequestsController'
import { inject } from 'inversify'
import { HomeServerUserRequestsController } from './HomeServer/HomeServerUserRequestsController'
import { BaseUserRequestsController } from './Base/BaseUserRequestsController'
@controller('/users/:userUuid/requests')
export class InversifyExpressUserRequestsController extends HomeServerUserRequestsController {
export class AnnotatedUserRequestsController extends BaseUserRequestsController {
constructor(@inject(TYPES.Auth_UserRequestsController) override userRequestsController: UserRequestsController) {
super(userRequestsController)
}

View File

@@ -2,9 +2,9 @@ import 'reflect-metadata'
import * as express from 'express'
import { InversifyExpressUsersController } from './InversifyExpressUsersController'
import { AnnotatedUsersController } from './AnnotatedUsersController'
import { results } from 'inversify-express-utils'
import { Username } from '@standardnotes/domain-core'
import { Result, Username } from '@standardnotes/domain-core'
import { DeleteAccount } from '../../Domain/UseCase/DeleteAccount/DeleteAccount'
import { ChangeCredentials } from '../../Domain/UseCase/ChangeCredentials/ChangeCredentials'
import { ClearLoginAttempts } from '../../Domain/UseCase/ClearLoginAttempts'
@@ -15,7 +15,7 @@ import { InviteToSharedSubscription } from '../../Domain/UseCase/InviteToSharedS
import { UpdateUser } from '../../Domain/UseCase/UpdateUser'
import { User } from '../../Domain/User/User'
describe('InversifyExpressUsersController', () => {
describe('AnnotatedUsersController', () => {
let updateUser: UpdateUser
let deleteAccount: DeleteAccount
let getUserKeyParams: GetUserKeyParams
@@ -30,7 +30,7 @@ describe('InversifyExpressUsersController', () => {
let user: User
const createController = () =>
new InversifyExpressUsersController(
new AnnotatedUsersController(
updateUser,
getUserKeyParams,
deleteAccount,
@@ -45,7 +45,7 @@ describe('InversifyExpressUsersController', () => {
updateUser.execute = jest.fn()
deleteAccount = {} as jest.Mocked<DeleteAccount>
deleteAccount.execute = jest.fn().mockReturnValue({ success: true, message: 'A OK', responseCode: 200 })
deleteAccount.execute = jest.fn().mockReturnValue(Result.ok('success'))
user = {} as jest.Mocked<User>
user.uuid = '123'
@@ -181,7 +181,22 @@ describe('InversifyExpressUsersController', () => {
expect(deleteAccount.execute).toHaveBeenCalledWith({ userUuid: '1-2-3' })
expect(result.statusCode).toEqual(200)
expect(await result.content.readAsStringAsync()).toEqual('{"message":"A OK"}')
})
it('should indicate failure when deleting user', async () => {
request.params.userUuid = '1-2-3'
response.locals.user = {
uuid: '1-2-3',
}
deleteAccount.execute = jest.fn().mockReturnValue(Result.fail('Something bad happened'))
const httpResponse = <results.JsonResult>await createController().deleteAccount(request, response)
const result = await httpResponse.executeAsync()
expect(deleteAccount.execute).toHaveBeenCalledWith({ userUuid: '1-2-3' })
expect(result.statusCode).toEqual(400)
})
it('should not delete user if user uuid is different than the one in the session', async () => {

View File

@@ -17,10 +17,10 @@ import { GetUserSubscription } from '../../Domain/UseCase/GetUserSubscription/Ge
import { ClearLoginAttempts } from '../../Domain/UseCase/ClearLoginAttempts'
import { IncreaseLoginAttempts } from '../../Domain/UseCase/IncreaseLoginAttempts'
import { ChangeCredentials } from '../../Domain/UseCase/ChangeCredentials/ChangeCredentials'
import { HomeServerUsersController } from './HomeServer/HomeServerUsersController'
import { BaseUsersController } from './Base/BaseUsersController'
@controller('/users')
export class InversifyExpressUsersController extends HomeServerUsersController {
export class AnnotatedUsersController extends BaseUsersController {
constructor(
@inject(TYPES.Auth_UpdateUser) override updateUser: UpdateUser,
@inject(TYPES.Auth_GetUserKeyParams) override getUserKeyParams: GetUserKeyParams,

View File

@@ -2,15 +2,15 @@ import 'reflect-metadata'
import { Request, Response } from 'express'
import { results } from 'inversify-express-utils'
import { InversifyExpressValetTokenController } from './InversifyExpressValetTokenController'
import { AnnotatedValetTokenController } from './AnnotatedValetTokenController'
import { CreateValetToken } from '../../Domain/UseCase/CreateValetToken/CreateValetToken'
describe('InversifyExpressValetTokenController', () => {
describe('AnnotatedValetTokenController', () => {
let createValetToken: CreateValetToken
let request: Request
let response: Response
const createController = () => new InversifyExpressValetTokenController(createValetToken)
const createController = () => new AnnotatedValetTokenController(createValetToken)
beforeEach(() => {
createValetToken = {} as jest.Mocked<CreateValetToken>

View File

@@ -8,10 +8,10 @@ import {
} from 'inversify-express-utils'
import TYPES from '../../Bootstrap/Types'
import { CreateValetToken } from '../../Domain/UseCase/CreateValetToken/CreateValetToken'
import { HomeServerValetTokenController } from './HomeServer/HomeServerValetTokenController'
import { BaseValetTokenController } from './Base/BaseValetTokenController'
@controller('/valet-tokens', TYPES.Auth_RequiredCrossServiceTokenMiddleware)
export class InversifyExpressValetTokenController extends HomeServerValetTokenController {
export class AnnotatedValetTokenController extends BaseValetTokenController {
constructor(@inject(TYPES.Auth_CreateValetToken) override createValetKey: CreateValetToken) {
super(createValetKey)
}

View File

@@ -9,10 +9,10 @@ import {
import { CreateCrossServiceToken } from '../../Domain/UseCase/CreateCrossServiceToken/CreateCrossServiceToken'
import { inject } from 'inversify'
import TYPES from '../../Bootstrap/Types'
import { HomeServerWebSocketsController } from './HomeServer/HomeServerWebSocketsController'
import { BaseWebSocketsController } from './Base/BaseWebSocketsController'
@controller('/sockets')
export class InversifyExpressWebSocketsController extends HomeServerWebSocketsController {
export class AnnotatedWebSocketsController extends BaseWebSocketsController {
constructor(
@inject(TYPES.Auth_CreateCrossServiceToken) override createCrossServiceToken: CreateCrossServiceToken,
@inject(TYPES.Auth_WebSocketConnectionTokenDecoder)

View File

@@ -8,7 +8,7 @@ import { CreateSubscriptionToken } from '../../../Domain/UseCase/CreateSubscript
import { DeleteSetting } from '../../../Domain/UseCase/DeleteSetting/DeleteSetting'
import { UserRepositoryInterface } from '../../../Domain/User/UserRepositoryInterface'
export class HomeServerAdminController extends BaseHttpController {
export class BaseAdminController extends BaseHttpController {
constructor(
protected doDeleteSetting: DeleteSetting,
protected userRepository: UserRepositoryInterface,

View File

@@ -10,7 +10,7 @@ import { VerifyMFA } from '../../../Domain/UseCase/VerifyMFA'
import { AuthController } from '../../../Controller/AuthController'
import { BaseHttpController, results } from 'inversify-express-utils'
export class HomeServerAuthController extends BaseHttpController {
export class BaseAuthController extends BaseHttpController {
constructor(
protected verifyMFA: VerifyMFA,
protected signInUseCase: SignIn,

View File

@@ -4,7 +4,7 @@ import { Request, Response } from 'express'
import { AuthenticatorsController } from '../../../Controller/AuthenticatorsController'
import { BaseHttpController, results } from 'inversify-express-utils'
export class HomeServerAuthenticatorsController extends BaseHttpController {
export class BaseAuthenticatorsController extends BaseHttpController {
constructor(
protected authenticatorsController: AuthenticatorsController,
private controllerContainer?: ControllerContainerInterface,

View File

@@ -4,7 +4,7 @@ import { Request, Response } from 'express'
import { GetUserFeatures } from '../../../Domain/UseCase/GetUserFeatures/GetUserFeatures'
import { BaseHttpController, results } from 'inversify-express-utils'
export class HomeServerFeaturesController extends BaseHttpController {
export class BaseFeaturesController extends BaseHttpController {
constructor(
protected doGetUserFeatures: GetUserFeatures,
private controllerContainer?: ControllerContainerInterface,

View File

@@ -5,7 +5,7 @@ import { Request, Response } from 'express'
import { CreateListedAccount } from '../../../Domain/UseCase/CreateListedAccount/CreateListedAccount'
import { BaseHttpController, results } from 'inversify-express-utils'
export class HomeServerListedController extends BaseHttpController {
export class BaseListedController extends BaseHttpController {
constructor(
protected doCreateListedAccount: CreateListedAccount,
private controllerContainer?: ControllerContainerInterface,

View File

@@ -9,7 +9,7 @@ import { CreateOfflineSubscriptionToken } from '../../../Domain/UseCase/CreateOf
import { GetUserFeatures } from '../../../Domain/UseCase/GetUserFeatures/GetUserFeatures'
import { GetUserOfflineSubscription } from '../../../Domain/UseCase/GetUserOfflineSubscription/GetUserOfflineSubscription'
export class HomeServerOfflineController extends BaseHttpController {
export class BaseOfflineController extends BaseHttpController {
constructor(
protected doGetUserFeatures: GetUserFeatures,
protected getUserOfflineSubscription: GetUserOfflineSubscription,

View File

@@ -7,7 +7,7 @@ import { DeletePreviousSessionsForUser } from '../../../Domain/UseCase/DeletePre
import { DeleteSessionForUser } from '../../../Domain/UseCase/DeleteSessionForUser'
import { RefreshSessionToken } from '../../../Domain/UseCase/RefreshSessionToken'
export class HomeServerSessionController extends BaseHttpController {
export class BaseSessionController extends BaseHttpController {
constructor(
protected deleteSessionForUser: DeleteSessionForUser,
protected deletePreviousSessionsForUser: DeletePreviousSessionsForUser,

View File

@@ -10,7 +10,7 @@ import { BaseHttpController, results } from 'inversify-express-utils'
import { User } from '../../../Domain/User/User'
import { SessionProjector } from '../../../Projection/SessionProjector'
export class HomeServerSessionsController extends BaseHttpController {
export class BaseSessionsController extends BaseHttpController {
constructor(
protected getActiveSessionsForUser: GetActiveSessionsForUser,
protected authenticateRequest: AuthenticateRequest,

View File

@@ -9,7 +9,7 @@ import { UpdateSetting } from '../../../Domain/UseCase/UpdateSetting/UpdateSetti
import { BaseHttpController, results } from 'inversify-express-utils'
import { EncryptionVersion } from '../../../Domain/Encryption/EncryptionVersion'
export class HomeServerSettingsController extends BaseHttpController {
export class BaseSettingsController extends BaseHttpController {
constructor(
protected doGetSettings: GetSettings,
protected doGetSetting: GetSetting,

View File

@@ -6,7 +6,7 @@ import { ApiVersion } from '@standardnotes/api'
import { SubscriptionInvitesController } from '../../../Controller/SubscriptionInvitesController'
import { Role } from '../../../Domain/Role/Role'
export class HomeServerSubscriptionInvitesController extends BaseHttpController {
export class BaseSubscriptionInvitesController extends BaseHttpController {
constructor(
protected subscriptionInvitesController: SubscriptionInvitesController,
private controllerContainer?: ControllerContainerInterface,

View File

@@ -4,7 +4,7 @@ import { Request, Response } from 'express'
import { GetSetting } from '../../../Domain/UseCase/GetSetting/GetSetting'
export class HomeServerSubscriptionSettingsController extends BaseHttpController {
export class BaseSubscriptionSettingsController extends BaseHttpController {
constructor(protected doGetSetting: GetSetting, private controllerContainer?: ControllerContainerInterface) {
super()

View File

@@ -11,7 +11,7 @@ import { ProjectorInterface } from '../../../Projection/ProjectorInterface'
import { SettingName } from '@standardnotes/settings'
import { User } from '../../../Domain/User/User'
export class HomeServerSubscriptionTokensController extends BaseHttpController {
export class BaseSubscriptionTokensController extends BaseHttpController {
constructor(
protected createSubscriptionToken: CreateSubscriptionToken,
protected authenticateToken: AuthenticateSubscriptionToken,

View File

@@ -4,7 +4,7 @@ import { Request, Response } from 'express'
import { UserRequestsController } from '../../../Controller/UserRequestsController'
export class HomeServerUserRequestsController extends BaseHttpController {
export class BaseUserRequestsController extends BaseHttpController {
constructor(
protected userRequestsController: UserRequestsController,
private controllerContainer?: ControllerContainerInterface,

View File

@@ -11,7 +11,7 @@ import { IncreaseLoginAttempts } from '../../../Domain/UseCase/IncreaseLoginAtte
import { UpdateUser } from '../../../Domain/UseCase/UpdateUser'
import { ErrorTag } from '@standardnotes/responses'
export class HomeServerUsersController extends BaseHttpController {
export class BaseUsersController extends BaseHttpController {
constructor(
protected updateUser: UpdateUser,
protected getUserKeyParams: GetUserKeyParams,
@@ -119,7 +119,18 @@ export class HomeServerUsersController extends BaseHttpController {
userUuid: request.params.userUuid,
})
return this.json({ message: result.message }, result.responseCode)
if (result.isFailed()) {
return this.json(
{
error: {
message: result.getError(),
},
},
400,
)
}
return this.json({ message: result.getValue() }, 200)
}
async getSubscription(request: Request, response: Response): Promise<results.JsonResult> {

View File

@@ -7,7 +7,7 @@ import { ValetTokenOperation } from '@standardnotes/security'
import { CreateValetToken } from '../../../Domain/UseCase/CreateValetToken/CreateValetToken'
import { CreateValetTokenPayload } from '../../../Domain/ValetToken/CreateValetTokenPayload'
export class HomeServerValetTokenController extends BaseHttpController {
export class BaseValetTokenController extends BaseHttpController {
constructor(protected createValetKey: CreateValetToken, private controllerContainer?: ControllerContainerInterface) {
super()

View File

@@ -6,7 +6,7 @@ import { BaseHttpController, results } from 'inversify-express-utils'
import { CreateCrossServiceToken } from '../../../Domain/UseCase/CreateCrossServiceToken/CreateCrossServiceToken'
import { ErrorTag } from '@standardnotes/responses'
export class HomeServerWebSocketsController extends BaseHttpController {
export class BaseWebSocketsController extends BaseHttpController {
constructor(
protected createCrossServiceToken: CreateCrossServiceToken,
protected tokenDecoder: TokenDecoderInterface<WebSocketConnectionTokenData>,

View File

@@ -3,6 +3,12 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.24.2](https://github.com/standardnotes/server/compare/@standardnotes/domain-core@1.24.1...@standardnotes/domain-core@1.24.2) (2023-08-02)
### Bug Fixes
* **domain-core:** remove unused content types ([71624f1](https://github.com/standardnotes/server/commit/71624f18979ed9254fafeeced733e598cd66cbeb))
## [1.24.1](https://github.com/standardnotes/server/compare/@standardnotes/domain-core@1.24.0...@standardnotes/domain-core@1.24.1) (2023-07-27)
### Bug Fixes

View File

@@ -1,6 +1,6 @@
{
"name": "@standardnotes/domain-core",
"version": "1.24.1",
"version": "1.24.2",
"engines": {
"node": ">=18.0.0 <21.0.0"
},

View File

@@ -31,9 +31,9 @@ describe('ContentType', () => {
})
it('should fallback to the value if the display name is not found', () => {
const valueOrError = ContentType.create(ContentType.TYPES.Unknown)
const valueOrError = ContentType.create(ContentType.TYPES.EncryptedStorage)
expect(valueOrError.isFailed()).toBeFalsy()
expect(valueOrError.getValue().getDisplayName()).toEqual('Unknown')
expect(valueOrError.getValue().getDisplayName()).toEqual('SN|EncryptedStorage')
})
})

View File

@@ -14,7 +14,6 @@ export class ContentType extends ValueObject<ContentTypeProps> {
RootKey: 'SN|RootKey|NoSync',
ItemsKey: 'SN|ItemsKey',
EncryptedStorage: 'SN|EncryptedStorage',
Privileges: 'SN|Privileges',
Note: 'Note',
Tag: 'Tag',
SmartView: 'SN|SmartTag',
@@ -29,7 +28,6 @@ export class ContentType extends ValueObject<ContentTypeProps> {
FilesafeFileMetadata: 'SN|FileSafe|FileMetadata',
FilesafeIntegration: 'SN|FileSafe|Integration',
ExtensionRepo: 'SN|ExtensionRepo',
Unknown: 'Unknown',
}
private readonly displayNamesMap: Partial<Record<string, string>> = {

View File

@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.12.10](https://github.com/standardnotes/server/compare/@standardnotes/domain-events-infra@1.12.9...@standardnotes/domain-events-infra@1.12.10) (2023-08-03)
**Note:** Version bump only for package @standardnotes/domain-events-infra
## [1.12.9](https://github.com/standardnotes/server/compare/@standardnotes/domain-events-infra@1.12.8...@standardnotes/domain-events-infra@1.12.9) (2023-07-07)
**Note:** Version bump only for package @standardnotes/domain-events-infra

View File

@@ -1,6 +1,6 @@
{
"name": "@standardnotes/domain-events-infra",
"version": "1.12.9",
"version": "1.12.10",
"engines": {
"node": ">=18.0.0 <21.0.0"
},

View File

@@ -3,6 +3,12 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [2.114.0](https://github.com/standardnotes/server/compare/@standardnotes/domain-events@2.113.1...@standardnotes/domain-events@2.114.0) (2023-08-03)
### Features
* **auth:** add handling payments account deleted events STA-1769 ([#682](https://github.com/standardnotes/server/issues/682)) ([8e35dfa](https://github.com/standardnotes/server/commit/8e35dfa4b77256f4c0a3294b296a5526fd1020ad))
## [2.113.1](https://github.com/standardnotes/server/compare/@standardnotes/domain-events@2.113.0...@standardnotes/domain-events@2.113.1) (2023-07-07)
### Bug Fixes

View File

@@ -1,6 +1,6 @@
{
"name": "@standardnotes/domain-events",
"version": "2.113.1",
"version": "2.114.0",
"engines": {
"node": ">=18.0.0 <21.0.0"
},

View File

@@ -0,0 +1,8 @@
import { DomainEventInterface } from './DomainEventInterface'
import { PaymentsAccountDeletedEventPayload } from './PaymentsAccountDeletedEventPayload'
export interface PaymentsAccountDeletedEvent extends DomainEventInterface {
type: 'PAYMENTS_ACCOUNT_DELETED'
payload: PaymentsAccountDeletedEventPayload
}

View File

@@ -0,0 +1,3 @@
export interface PaymentsAccountDeletedEventPayload {
username: string
}

View File

@@ -44,6 +44,8 @@ export * from './Event/MuteEmailsSettingChangedEvent'
export * from './Event/MuteEmailsSettingChangedEventPayload'
export * from './Event/PaymentFailedEvent'
export * from './Event/PaymentFailedEventPayload'
export * from './Event/PaymentsAccountDeletedEvent'
export * from './Event/PaymentsAccountDeletedEventPayload'
export * from './Event/PaymentSuccessEvent'
export * from './Event/PaymentSuccessEventPayload'
export * from './Event/PredicateVerificationRequestedEvent'

View File

@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.11.15](https://github.com/standardnotes/server/compare/@standardnotes/event-store@1.11.14...@standardnotes/event-store@1.11.15) (2023-08-03)
**Note:** Version bump only for package @standardnotes/event-store
## [1.11.14](https://github.com/standardnotes/server/compare/@standardnotes/event-store@1.11.13...@standardnotes/event-store@1.11.14) (2023-08-02)
**Note:** Version bump only for package @standardnotes/event-store
## [1.11.13](https://github.com/standardnotes/server/compare/@standardnotes/event-store@1.11.12...@standardnotes/event-store@1.11.13) (2023-07-27)
**Note:** Version bump only for package @standardnotes/event-store

View File

@@ -1,6 +1,6 @@
{
"name": "@standardnotes/event-store",
"version": "1.11.13",
"version": "1.11.15",
"description": "Event Store Service",
"private": true,
"main": "dist/src/index.js",

View File

@@ -3,6 +3,20 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.19.18](https://github.com/standardnotes/files/compare/@standardnotes/files-server@1.19.17...@standardnotes/files-server@1.19.18) (2023-08-03)
**Note:** Version bump only for package @standardnotes/files-server
## [1.19.17](https://github.com/standardnotes/files/compare/@standardnotes/files-server@1.19.16...@standardnotes/files-server@1.19.17) (2023-08-02)
**Note:** Version bump only for package @standardnotes/files-server
## [1.19.16](https://github.com/standardnotes/files/compare/@standardnotes/files-server@1.19.15...@standardnotes/files-server@1.19.16) (2023-08-01)
### Bug Fixes
* controller naming ([#678](https://github.com/standardnotes/files/issues/678)) ([56f0aef](https://github.com/standardnotes/files/commit/56f0aef21d3fcec7ac7e968cb1c1b071becbbe26))
## [1.19.15](https://github.com/standardnotes/files/compare/@standardnotes/files-server@1.19.14...@standardnotes/files-server@1.19.15) (2023-07-27)
**Note:** Version bump only for package @standardnotes/files-server

View File

@@ -2,9 +2,9 @@ import 'reflect-metadata'
import * as busboy from 'connect-busboy'
import '../src/Infra/InversifyExpress/InversifyExpressHealthCheckController'
import '../src/Infra/InversifyExpress/InversifyExpressFilesController'
import '../src/Infra/InversifyExpress/InversifyExpressSharedVaultFilesController'
import '../src/Infra/InversifyExpress/AnnotatedHealthCheckController'
import '../src/Infra/InversifyExpress/AnnotatedFilesController'
import '../src/Infra/InversifyExpress/AnnotatedSharedVaultFilesController'
import helmet from 'helmet'
import * as cors from 'cors'

View File

@@ -1,6 +1,6 @@
{
"name": "@standardnotes/files-server",
"version": "1.19.15",
"version": "1.19.18",
"engines": {
"node": ">=18.0.0 <21.0.0"
},

View File

@@ -7,7 +7,7 @@ import { UploadFileChunk } from '../../Domain/UseCase/UploadFileChunk/UploadFile
import { Request, Response } from 'express'
import { Writable, Readable } from 'stream'
import { InversifyExpressFilesController } from './InversifyExpressFilesController'
import { AnnotatedFilesController } from './AnnotatedFilesController'
import { GetFileMetadata } from '../../Domain/UseCase/GetFileMetadata/GetFileMetadata'
import { results } from 'inversify-express-utils'
import { RemoveFile } from '../../Domain/UseCase/RemoveFile/RemoveFile'
@@ -15,7 +15,7 @@ import { ValetTokenOperation } from '@standardnotes/security'
import { BadRequestErrorMessageResult } from 'inversify-express-utils/lib/results'
import { Result } from '@standardnotes/domain-core'
describe('InversifyExpressFilesController', () => {
describe('AnnotatedFilesController', () => {
let uploadFileChunk: UploadFileChunk
let createUploadSession: CreateUploadSession
let finishUploadSession: FinishUploadSession
@@ -28,7 +28,7 @@ describe('InversifyExpressFilesController', () => {
const maxChunkBytes = 100_000
const createController = () =>
new InversifyExpressFilesController(
new AnnotatedFilesController(
uploadFileChunk,
createUploadSession,
finishUploadSession,

View File

@@ -12,7 +12,7 @@ import { RemoveFile } from '../../Domain/UseCase/RemoveFile/RemoveFile'
import { ValetTokenOperation } from '@standardnotes/security'
@controller('/v1/files', TYPES.Files_ValetTokenAuthMiddleware)
export class InversifyExpressFilesController extends BaseHttpController {
export class AnnotatedFilesController extends BaseHttpController {
constructor(
@inject(TYPES.Files_UploadFileChunk) private uploadFileChunk: UploadFileChunk,
@inject(TYPES.Files_CreateUploadSession) private createUploadSession: CreateUploadSession,

View File

@@ -0,0 +1,12 @@
import 'reflect-metadata'
import { AnnotatedHealthCheckController } from './AnnotatedHealthCheckController'
describe('AnnotatedHealthCheckController', () => {
const createController = () => new AnnotatedHealthCheckController()
it('should return OK', async () => {
const response = (await createController().get()) as string
expect(response).toEqual('OK')
})
})

View File

@@ -1,7 +1,7 @@
import { controller, httpGet } from 'inversify-express-utils'
@controller('/healthcheck')
export class InversifyExpressHealthCheckController {
export class AnnotatedHealthCheckController {
@httpGet('/')
public async get(): Promise<string> {
return 'OK'

View File

@@ -14,7 +14,7 @@ import { StreamDownloadFile } from '../../Domain/UseCase/StreamDownloadFile/Stre
import { UploadFileChunk } from '../../Domain/UseCase/UploadFileChunk/UploadFileChunk'
@controller('/v1/shared-vault/files', TYPES.Files_SharedVaultValetTokenAuthMiddleware)
export class InversifyExpressSharedVaultFilesController extends BaseHttpController {
export class AnnotatedSharedVaultFilesController extends BaseHttpController {
constructor(
@inject(TYPES.Files_UploadFileChunk) private uploadFileChunk: UploadFileChunk,
@inject(TYPES.Files_CreateUploadSession) private createUploadSession: CreateUploadSession,

View File

@@ -1,12 +0,0 @@
import 'reflect-metadata'
import { InversifyExpressHealthCheckController } from './InversifyExpressHealthCheckController'
describe('InversifyExpressHealthCheckController', () => {
const createController = () => new InversifyExpressHealthCheckController()
it('should return OK', async () => {
const response = (await createController().get()) as string
expect(response).toEqual('OK')
})
})

View File

@@ -1 +1,2 @@
export * from './InversifyExpressFilesController'
export * from './AnnotatedFilesController'
export * from './AnnotatedSharedVaultFilesController'

View File

@@ -3,6 +3,38 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.13.28](https://github.com/standardnotes/server/compare/@standardnotes/home-server@1.13.27...@standardnotes/home-server@1.13.28) (2023-08-03)
**Note:** Version bump only for package @standardnotes/home-server
## [1.13.27](https://github.com/standardnotes/server/compare/@standardnotes/home-server@1.13.26...@standardnotes/home-server@1.13.27) (2023-08-02)
**Note:** Version bump only for package @standardnotes/home-server
## [1.13.26](https://github.com/standardnotes/server/compare/@standardnotes/home-server@1.13.25...@standardnotes/home-server@1.13.26) (2023-08-02)
**Note:** Version bump only for package @standardnotes/home-server
## [1.13.25](https://github.com/standardnotes/server/compare/@standardnotes/home-server@1.13.24...@standardnotes/home-server@1.13.25) (2023-08-02)
**Note:** Version bump only for package @standardnotes/home-server
## [1.13.24](https://github.com/standardnotes/server/compare/@standardnotes/home-server@1.13.23...@standardnotes/home-server@1.13.24) (2023-08-02)
**Note:** Version bump only for package @standardnotes/home-server
## [1.13.23](https://github.com/standardnotes/server/compare/@standardnotes/home-server@1.13.22...@standardnotes/home-server@1.13.23) (2023-08-01)
**Note:** Version bump only for package @standardnotes/home-server
## [1.13.22](https://github.com/standardnotes/server/compare/@standardnotes/home-server@1.13.21...@standardnotes/home-server@1.13.22) (2023-08-01)
**Note:** Version bump only for package @standardnotes/home-server
## [1.13.21](https://github.com/standardnotes/server/compare/@standardnotes/home-server@1.13.20...@standardnotes/home-server@1.13.21) (2023-08-01)
**Note:** Version bump only for package @standardnotes/home-server
## [1.13.20](https://github.com/standardnotes/server/compare/@standardnotes/home-server@1.13.19...@standardnotes/home-server@1.13.20) (2023-07-31)
**Note:** Version bump only for package @standardnotes/home-server

View File

@@ -1,6 +1,6 @@
{
"name": "@standardnotes/home-server",
"version": "1.13.20",
"version": "1.13.28",
"engines": {
"node": ">=18.0.0 <21.0.0"
},

View File

@@ -3,6 +3,26 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.26.2](https://github.com/standardnotes/server/compare/@standardnotes/revisions-server@1.26.1...@standardnotes/revisions-server@1.26.2) (2023-08-03)
**Note:** Version bump only for package @standardnotes/revisions-server
## [1.26.1](https://github.com/standardnotes/server/compare/@standardnotes/revisions-server@1.26.0...@standardnotes/revisions-server@1.26.1) (2023-08-02)
**Note:** Version bump only for package @standardnotes/revisions-server
# [1.26.0](https://github.com/standardnotes/server/compare/@standardnotes/revisions-server@1.25.7...@standardnotes/revisions-server@1.26.0) (2023-08-02)
### Features
* enable Write Ahead Log mode for SQLite ([#681](https://github.com/standardnotes/server/issues/681)) ([8cd7a13](https://github.com/standardnotes/server/commit/8cd7a138ab56f6a2b0d6c06ef6041ab9b85ae540))
## [1.25.7](https://github.com/standardnotes/server/compare/@standardnotes/revisions-server@1.25.6...@standardnotes/revisions-server@1.25.7) (2023-08-01)
### Bug Fixes
* controller naming ([#678](https://github.com/standardnotes/server/issues/678)) ([56f0aef](https://github.com/standardnotes/server/commit/56f0aef21d3fcec7ac7e968cb1c1b071becbbe26))
## [1.25.6](https://github.com/standardnotes/server/compare/@standardnotes/revisions-server@1.25.5...@standardnotes/revisions-server@1.25.6) (2023-07-27)
**Note:** Version bump only for package @standardnotes/revisions-server

View File

@@ -9,8 +9,8 @@ import TYPES from '../src/Bootstrap/Types'
import { Env } from '../src/Bootstrap/Env'
import { ContainerConfigLoader } from '../src/Bootstrap/Container'
import '../src/Infra/InversifyExpress/InversifyExpressRevisionsController'
import '../src/Infra/InversifyExpress/InversifyExpressHealthCheckController'
import '../src/Infra/InversifyExpress/AnnotatedRevisionsController'
import '../src/Infra/InversifyExpress/AnnotatedHealthCheckController'
const container = new ContainerConfigLoader()
void container.load().then((container) => {

View File

@@ -1,6 +1,6 @@
{
"name": "@standardnotes/revisions-server",
"version": "1.25.6",
"version": "1.26.2",
"engines": {
"node": ">=18.0.0 <21.0.0"
},

View File

@@ -45,7 +45,7 @@ import { CopyRevisions } from '../Domain/UseCase/CopyRevisions/CopyRevisions'
import { FSDumpRepository } from '../Infra/FS/FSDumpRepository'
import { S3DumpRepository } from '../Infra/S3/S3ItemDumpRepository'
import { RevisionItemStringMapper } from '../Mapping/RevisionItemStringMapper'
import { HomeServerRevisionsController } from '../Infra/InversifyExpress/HomeServer/HomeServerRevisionsController'
import { BaseRevisionsController } from '../Infra/InversifyExpress/Base/BaseRevisionsController'
import { Transform } from 'stream'
export class ContainerConfigLoader {
@@ -343,9 +343,9 @@ export class ContainerConfigLoader {
// Inversify Controllers
if (isConfiguredForHomeServer) {
container
.bind<HomeServerRevisionsController>(TYPES.Revisions_HomeServerRevisionsController)
.bind<BaseRevisionsController>(TYPES.Revisions_BaseRevisionsController)
.toConstantValue(
new HomeServerRevisionsController(
new BaseRevisionsController(
container.get(TYPES.Revisions_RevisionsController),
container.get(TYPES.Revisions_ControllerContainer),
),

View File

@@ -80,6 +80,8 @@ export class AppDataSource {
...commonDataSourceOptions,
type: 'sqlite',
database: this.env.get('DB_SQLITE_DATABASE_PATH'),
enableWAL: true,
busyErrorRetry: 2000,
}
this.dataSource = new DataSource(sqliteDataSourceOptions)

View File

@@ -43,7 +43,7 @@ const TYPES = {
Revisions_DomainEventMessageHandler: Symbol.for('Revisions_DomainEventMessageHandler'),
Revisions_Timer: Symbol.for('Revisions_Timer'),
// Inversify Express Controllers
Revisions_HomeServerRevisionsController: Symbol.for('Revisions_HomeServerRevisionsController'),
Revisions_BaseRevisionsController: Symbol.for('Revisions_BaseRevisionsController'),
}
export default TYPES

View File

@@ -1,7 +1,7 @@
import { BaseHttpController, controller, httpGet } from 'inversify-express-utils'
@controller('/healthcheck')
export class InversifyExpressHealthCheckController extends BaseHttpController {
export class AnnotatedHealthCheckController extends BaseHttpController {
@httpGet('/')
public async get(): Promise<string> {
return 'OK'

View File

@@ -4,10 +4,10 @@ import { inject } from 'inversify'
import TYPES from '../../Bootstrap/Types'
import { RevisionsController } from '../../Controller/RevisionsController'
import { HomeServerRevisionsController } from './HomeServer/HomeServerRevisionsController'
import { BaseRevisionsController } from './Base/BaseRevisionsController'
@controller('/items/:itemUuid/revisions', TYPES.Revisions_ApiGatewayAuthMiddleware)
export class InversifyExpressRevisionsController extends HomeServerRevisionsController {
export class AnnotatedRevisionsController extends BaseRevisionsController {
constructor(@inject(TYPES.Revisions_RevisionsController) override revisionsController: RevisionsController) {
super(revisionsController)
}

View File

@@ -4,7 +4,7 @@ import { ControllerContainerInterface } from '@standardnotes/domain-core'
import { RevisionsController } from '../../../Controller/RevisionsController'
export class HomeServerRevisionsController extends BaseHttpController {
export class BaseRevisionsController extends BaseHttpController {
constructor(
protected revisionsController: RevisionsController,
private controllerContainer?: ControllerContainerInterface,

View File

@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.20.17](https://github.com/standardnotes/server/compare/@standardnotes/scheduler-server@1.20.16...@standardnotes/scheduler-server@1.20.17) (2023-08-03)
**Note:** Version bump only for package @standardnotes/scheduler-server
## [1.20.16](https://github.com/standardnotes/server/compare/@standardnotes/scheduler-server@1.20.15...@standardnotes/scheduler-server@1.20.16) (2023-08-02)
**Note:** Version bump only for package @standardnotes/scheduler-server
## [1.20.15](https://github.com/standardnotes/server/compare/@standardnotes/scheduler-server@1.20.14...@standardnotes/scheduler-server@1.20.15) (2023-07-27)
**Note:** Version bump only for package @standardnotes/scheduler-server

Some files were not shown because too many files have changed in this diff Show More