mirror of
https://github.com/standardnotes/server
synced 2026-10-20 12:03:39 -04:00
feat(syncing-server): distinguish between legacy and current items model usage (#712)
* feat(syncing-server): turn mysql items model into legacy * fix: rename MySQL model to SQL model to include SQLite option * feat(syncing-server): distinguish between legacy and current items model usage
This commit is contained in:
@@ -158,6 +158,9 @@ import { TransitionItemsFromPrimaryToSecondaryDatabaseForUser } from '../Domain/
|
||||
import { SharedVaultFileMovedEventHandler } from '../Domain/Handler/SharedVaultFileMovedEventHandler'
|
||||
import { TransitionStatusUpdatedEventHandler } from '../Domain/Handler/TransitionStatusUpdatedEventHandler'
|
||||
import { TriggerTransitionFromPrimaryToSecondaryDatabaseForUser } from '../Domain/UseCase/Transition/TriggerTransitionFromPrimaryToSecondaryDatabaseForUser/TriggerTransitionFromPrimaryToSecondaryDatabaseForUser'
|
||||
import { SQLItem } from '../Infra/TypeORM/SQLItem'
|
||||
import { SQLItemPersistenceMapper } from '../Mapping/Persistence/SQLItemPersistenceMapper'
|
||||
import { SQLItemRepository } from '../Infra/TypeORM/SQLItemRepository'
|
||||
|
||||
export class ContainerConfigLoader {
|
||||
private readonly DEFAULT_CONTENT_SIZE_TRANSFER_LIMIT = 10_000_000
|
||||
@@ -305,6 +308,9 @@ export class ContainerConfigLoader {
|
||||
container
|
||||
.bind<MapperInterface<Item, SQLLegacyItem>>(TYPES.Sync_SQLLegacyItemPersistenceMapper)
|
||||
.toConstantValue(new SQLLegacyItemPersistenceMapper())
|
||||
container
|
||||
.bind<MapperInterface<Item, SQLItem>>(TYPES.Sync_SQLItemPersistenceMapper)
|
||||
.toConstantValue(new SQLItemPersistenceMapper())
|
||||
container
|
||||
.bind<MapperInterface<ItemHash, ItemHashHttpRepresentation>>(TYPES.Sync_ItemHashHttpMapper)
|
||||
.toConstantValue(new ItemHashHttpMapper())
|
||||
@@ -362,6 +368,9 @@ export class ContainerConfigLoader {
|
||||
container
|
||||
.bind<Repository<SQLLegacyItem>>(TYPES.Sync_ORMLegacyItemRepository)
|
||||
.toDynamicValue(() => appDataSource.getRepository(SQLLegacyItem))
|
||||
container
|
||||
.bind<Repository<SQLItem>>(TYPES.Sync_ORMItemRepository)
|
||||
.toConstantValue(appDataSource.getRepository(SQLItem))
|
||||
container
|
||||
.bind<Repository<TypeORMSharedVault>>(TYPES.Sync_ORMSharedVaultRepository)
|
||||
.toConstantValue(appDataSource.getRepository(TypeORMSharedVault))
|
||||
@@ -401,19 +410,25 @@ export class ContainerConfigLoader {
|
||||
|
||||
// Repositories
|
||||
container
|
||||
.bind<ItemRepositoryInterface>(TYPES.Sync_SQLLegacyItemRepository)
|
||||
.bind<ItemRepositoryInterface>(TYPES.Sync_SQLItemRepository)
|
||||
.toConstantValue(
|
||||
new SQLLegacyItemRepository(
|
||||
container.get<Repository<SQLLegacyItem>>(TYPES.Sync_ORMLegacyItemRepository),
|
||||
container.get<MapperInterface<Item, SQLLegacyItem>>(TYPES.Sync_SQLLegacyItemPersistenceMapper),
|
||||
container.get<Logger>(TYPES.Sync_Logger),
|
||||
),
|
||||
isConfiguredForHomeServer
|
||||
? new SQLItemRepository(
|
||||
container.get<Repository<SQLItem>>(TYPES.Sync_ORMItemRepository),
|
||||
container.get<MapperInterface<Item, SQLItem>>(TYPES.Sync_SQLItemPersistenceMapper),
|
||||
container.get<Logger>(TYPES.Sync_Logger),
|
||||
)
|
||||
: new SQLLegacyItemRepository(
|
||||
container.get<Repository<SQLLegacyItem>>(TYPES.Sync_ORMLegacyItemRepository),
|
||||
container.get<MapperInterface<Item, SQLLegacyItem>>(TYPES.Sync_SQLLegacyItemPersistenceMapper),
|
||||
container.get<Logger>(TYPES.Sync_Logger),
|
||||
),
|
||||
)
|
||||
container
|
||||
.bind<ItemRepositoryResolverInterface>(TYPES.Sync_ItemRepositoryResolver)
|
||||
.toConstantValue(
|
||||
new TypeORMItemRepositoryResolver(
|
||||
container.get<ItemRepositoryInterface>(TYPES.Sync_SQLLegacyItemRepository),
|
||||
container.get<ItemRepositoryInterface>(TYPES.Sync_SQLItemRepository),
|
||||
isSecondaryDatabaseEnabled ? container.get<ItemRepositoryInterface>(TYPES.Sync_MongoDBItemRepository) : null,
|
||||
),
|
||||
)
|
||||
@@ -777,7 +792,7 @@ export class ContainerConfigLoader {
|
||||
)
|
||||
.toConstantValue(
|
||||
new TransitionItemsFromPrimaryToSecondaryDatabaseForUser(
|
||||
container.get<ItemRepositoryInterface>(TYPES.Sync_SQLLegacyItemRepository),
|
||||
container.get<ItemRepositoryInterface>(TYPES.Sync_SQLItemRepository),
|
||||
isSecondaryDatabaseEnabled ? container.get<ItemRepositoryInterface>(TYPES.Sync_MongoDBItemRepository) : null,
|
||||
container.get<TimerInterface>(TYPES.Sync_Timer),
|
||||
container.get<Logger>(TYPES.Sync_Logger),
|
||||
@@ -843,7 +858,7 @@ export class ContainerConfigLoader {
|
||||
.bind<DuplicateItemSyncedEventHandler>(TYPES.Sync_DuplicateItemSyncedEventHandler)
|
||||
.toConstantValue(
|
||||
new DuplicateItemSyncedEventHandler(
|
||||
container.get<ItemRepositoryInterface>(TYPES.Sync_SQLLegacyItemRepository),
|
||||
container.get<ItemRepositoryInterface>(TYPES.Sync_SQLItemRepository),
|
||||
isSecondaryDatabaseEnabled ? container.get<ItemRepositoryInterface>(TYPES.Sync_MongoDBItemRepository) : null,
|
||||
container.get<DomainEventFactoryInterface>(TYPES.Sync_DomainEventFactory),
|
||||
container.get<DomainEventPublisherInterface>(TYPES.Sync_DomainEventPublisher),
|
||||
@@ -854,7 +869,7 @@ export class ContainerConfigLoader {
|
||||
.bind<AccountDeletionRequestedEventHandler>(TYPES.Sync_AccountDeletionRequestedEventHandler)
|
||||
.toConstantValue(
|
||||
new AccountDeletionRequestedEventHandler(
|
||||
container.get<ItemRepositoryInterface>(TYPES.Sync_SQLLegacyItemRepository),
|
||||
container.get<ItemRepositoryInterface>(TYPES.Sync_SQLItemRepository),
|
||||
isSecondaryDatabaseEnabled ? container.get<ItemRepositoryInterface>(TYPES.Sync_MongoDBItemRepository) : null,
|
||||
container.get<Logger>(TYPES.Sync_Logger),
|
||||
),
|
||||
@@ -863,7 +878,7 @@ export class ContainerConfigLoader {
|
||||
.bind<ItemRevisionCreationRequestedEventHandler>(TYPES.Sync_ItemRevisionCreationRequestedEventHandler)
|
||||
.toConstantValue(
|
||||
new ItemRevisionCreationRequestedEventHandler(
|
||||
container.get<ItemRepositoryInterface>(TYPES.Sync_SQLLegacyItemRepository),
|
||||
container.get<ItemRepositoryInterface>(TYPES.Sync_SQLItemRepository),
|
||||
isSecondaryDatabaseEnabled ? container.get<ItemRepositoryInterface>(TYPES.Sync_MongoDBItemRepository) : null,
|
||||
container.get<ItemBackupServiceInterface>(TYPES.Sync_ItemBackupService),
|
||||
container.get<DomainEventFactoryInterface>(TYPES.Sync_DomainEventFactory),
|
||||
@@ -918,7 +933,7 @@ export class ContainerConfigLoader {
|
||||
.toConstantValue(
|
||||
new ExtensionsHttpService(
|
||||
container.get<AxiosInstance>(TYPES.Sync_HTTPClient),
|
||||
container.get<ItemRepositoryInterface>(TYPES.Sync_SQLLegacyItemRepository),
|
||||
container.get<ItemRepositoryInterface>(TYPES.Sync_SQLItemRepository),
|
||||
isSecondaryDatabaseEnabled ? container.get<ItemRepositoryInterface>(TYPES.Sync_MongoDBItemRepository) : null,
|
||||
container.get<ContentDecoderInterface>(TYPES.Sync_ContentDecoder),
|
||||
container.get<DomainEventPublisherInterface>(TYPES.Sync_DomainEventPublisher),
|
||||
@@ -964,7 +979,7 @@ export class ContainerConfigLoader {
|
||||
.bind<EmailBackupRequestedEventHandler>(TYPES.Sync_EmailBackupRequestedEventHandler)
|
||||
.toConstantValue(
|
||||
new EmailBackupRequestedEventHandler(
|
||||
container.get<ItemRepositoryInterface>(TYPES.Sync_SQLLegacyItemRepository),
|
||||
container.get<ItemRepositoryInterface>(TYPES.Sync_SQLItemRepository),
|
||||
isSecondaryDatabaseEnabled
|
||||
? container.get<ItemRepositoryInterface>(TYPES.Sync_MongoDBItemRepository)
|
||||
: null,
|
||||
|
||||
@@ -9,6 +9,7 @@ import { TypeORMSharedVaultUser } from '../Infra/TypeORM/TypeORMSharedVaultUser'
|
||||
import { TypeORMSharedVaultInvite } from '../Infra/TypeORM/TypeORMSharedVaultInvite'
|
||||
import { TypeORMMessage } from '../Infra/TypeORM/TypeORMMessage'
|
||||
import { MongoDBItem } from '../Infra/TypeORM/MongoDBItem'
|
||||
import { SQLItem } from '../Infra/TypeORM/SQLItem'
|
||||
|
||||
export class AppDataSource {
|
||||
private _dataSource: DataSource | undefined
|
||||
@@ -67,22 +68,29 @@ export class AppDataSource {
|
||||
this.env.load()
|
||||
|
||||
const isConfiguredForMySQL = this.env.get('DB_TYPE') === 'mysql'
|
||||
const isConfiguredForHomeServer = this.env.get('MODE', true) === 'home-server'
|
||||
|
||||
const maxQueryExecutionTime = this.env.get('DB_MAX_QUERY_EXECUTION_TIME', true)
|
||||
? +this.env.get('DB_MAX_QUERY_EXECUTION_TIME', true)
|
||||
: 45_000
|
||||
|
||||
const migrationsSourceDirectoryName = isConfiguredForMySQL
|
||||
? isConfiguredForHomeServer
|
||||
? 'mysql'
|
||||
: 'mysql-legacy'
|
||||
: 'sqlite'
|
||||
|
||||
const commonDataSourceOptions = {
|
||||
maxQueryExecutionTime,
|
||||
entities: [
|
||||
SQLLegacyItem,
|
||||
isConfiguredForHomeServer ? SQLItem : SQLLegacyItem,
|
||||
TypeORMNotification,
|
||||
TypeORMSharedVault,
|
||||
TypeORMSharedVaultUser,
|
||||
TypeORMSharedVaultInvite,
|
||||
TypeORMMessage,
|
||||
],
|
||||
migrations: [`${__dirname}/../../migrations/${isConfiguredForMySQL ? 'mysql' : 'sqlite'}/*.js`],
|
||||
migrations: [`${__dirname}/../../migrations/${migrationsSourceDirectoryName}/*.js`],
|
||||
migrationsRun: true,
|
||||
logging: <LoggerOptions>this.env.get('DB_DEBUG_LEVEL', true) ?? 'info',
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@ const TYPES = {
|
||||
Sync_Env: Symbol.for('Sync_Env'),
|
||||
// Repositories
|
||||
Sync_ItemRepositoryResolver: Symbol.for('Sync_ItemRepositoryResolver'),
|
||||
Sync_SQLLegacyItemRepository: Symbol.for('Sync_SQLLegacyItemRepository'),
|
||||
Sync_SQLItemRepository: Symbol.for('Sync_SQLItemRepository'),
|
||||
Sync_MongoDBItemRepository: Symbol.for('Sync_MongoDBItemRepository'),
|
||||
Sync_SharedVaultRepository: Symbol.for('Sync_SharedVaultRepository'),
|
||||
Sync_SharedVaultInviteRepository: Symbol.for('Sync_SharedVaultInviteRepository'),
|
||||
@@ -16,6 +16,7 @@ const TYPES = {
|
||||
Sync_NotificationRepository: Symbol.for('Sync_NotificationRepository'),
|
||||
Sync_MessageRepository: Symbol.for('Sync_MessageRepository'),
|
||||
// ORM
|
||||
Sync_ORMItemRepository: Symbol.for('Sync_ORMItemRepository'),
|
||||
Sync_ORMLegacyItemRepository: Symbol.for('Sync_ORMLegacyItemRepository'),
|
||||
Sync_ORMSharedVaultRepository: Symbol.for('Sync_ORMSharedVaultRepository'),
|
||||
Sync_ORMSharedVaultInviteRepository: Symbol.for('Sync_ORMSharedVaultInviteRepository'),
|
||||
@@ -132,6 +133,7 @@ const TYPES = {
|
||||
Sync_MessageHttpMapper: Symbol.for('Sync_MessageHttpMapper'),
|
||||
Sync_NotificationHttpMapper: Symbol.for('Sync_NotificationHttpMapper'),
|
||||
Sync_SQLLegacyItemPersistenceMapper: Symbol.for('Sync_SQLLegacyItemPersistenceMapper'),
|
||||
Sync_SQLItemPersistenceMapper: Symbol.for('Sync_SQLItemPersistenceMapper'),
|
||||
Sync_MongoDBItemPersistenceMapper: Symbol.for('Sync_MongoDBItemPersistenceMapper'),
|
||||
Sync_ItemHttpMapper: Symbol.for('Sync_ItemHttpMapper'),
|
||||
Sync_ItemHashHttpMapper: Symbol.for('Sync_ItemHashHttpMapper'),
|
||||
|
||||
@@ -58,6 +58,7 @@ export class MongoDBItem {
|
||||
declare lastEditedBy: string | null
|
||||
|
||||
@Column()
|
||||
@Index('index_items_on_shared_vault_uuid')
|
||||
declare sharedVaultUuid: string | null
|
||||
|
||||
@Column()
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import { Column, Entity } from 'typeorm'
|
||||
import { Column, Entity, Index } from 'typeorm'
|
||||
|
||||
import { SQLLegacyItem } from './SQLLegacyItem'
|
||||
|
||||
@Entity({ name: 'items' })
|
||||
@@ -17,6 +18,7 @@ export class SQLItem extends SQLLegacyItem {
|
||||
length: 36,
|
||||
nullable: true,
|
||||
})
|
||||
@Index('index_items_on_shared_vault_uuid')
|
||||
declare sharedVaultUuid: string | null
|
||||
|
||||
@Column({
|
||||
|
||||
@@ -5,13 +5,13 @@ import { ItemRepositoryResolverInterface } from '../../Domain/Item/ItemRepositor
|
||||
|
||||
export class TypeORMItemRepositoryResolver implements ItemRepositoryResolverInterface {
|
||||
constructor(
|
||||
private SQLItemRepository: ItemRepositoryInterface,
|
||||
private sqlItemRepository: ItemRepositoryInterface,
|
||||
private mongoDbItemRepository: ItemRepositoryInterface | null,
|
||||
) {}
|
||||
|
||||
resolve(roleNames: RoleNameCollection): ItemRepositoryInterface {
|
||||
if (!this.mongoDbItemRepository) {
|
||||
return this.SQLItemRepository
|
||||
return this.sqlItemRepository
|
||||
}
|
||||
|
||||
const transitionRoleName = RoleName.create(RoleName.NAMES.TransitionUser).getValue()
|
||||
@@ -20,6 +20,6 @@ export class TypeORMItemRepositoryResolver implements ItemRepositoryResolverInte
|
||||
return this.mongoDbItemRepository
|
||||
}
|
||||
|
||||
return this.SQLItemRepository
|
||||
return this.sqlItemRepository
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user