feat(auth): add sqlite offline subscription token repository for home server (#579)

This commit is contained in:
Karol Sójko
2023-05-01 13:50:24 +02:00
committed by GitHub
parent df5fcce769
commit 5fe6ed1462
2 changed files with 45 additions and 3 deletions

View File

@@ -225,6 +225,7 @@ import { CacheEntryPersistenceMapper } from '../Mapping/CacheEntryPersistenceMap
import { TypeORMLockRepository } from '../Infra/TypeORM/TypeORMLockRepository'
import { EphemeralSessionRepositoryInterface } from '../Domain/Session/EphemeralSessionRepositoryInterface'
import { TypeORMEphemeralSessionRepository } from '../Infra/TypeORM/TypeORMEphemeralSessionRepository'
import { TypeORMOfflineSubscriptionTokenRepository } from '../Infra/TypeORM/TypeORMOfflineSubscriptionTokenRepository'
// eslint-disable-next-line @typescript-eslint/no-var-requires
const newrelicFormatter = require('@newrelic/winston-enricher')
@@ -376,9 +377,6 @@ export class ContainerConfigLoader {
container
.bind<SubscriptionTokenRepositoryInterface>(TYPES.SubscriptionTokenRepository)
.to(RedisSubscriptionTokenRepository)
container
.bind<OfflineSubscriptionTokenRepositoryInterface>(TYPES.OfflineSubscriptionTokenRepository)
.to(RedisOfflineSubscriptionTokenRepository)
container
.bind<SharedSubscriptionInvitationRepositoryInterface>(TYPES.SharedSubscriptionInvitationRepository)
.to(TypeORMSharedSubscriptionInvitationRepository)
@@ -512,11 +510,22 @@ export class ContainerConfigLoader {
container.get(TYPES.Timer),
),
)
container
.bind<OfflineSubscriptionTokenRepositoryInterface>(TYPES.OfflineSubscriptionTokenRepository)
.toConstantValue(
new TypeORMOfflineSubscriptionTokenRepository(
container.get(TYPES.CacheEntryRepository),
container.get(TYPES.Timer),
),
)
} else {
container.bind<LockRepositoryInterface>(TYPES.LockRepository).to(LockRepository)
container
.bind<EphemeralSessionRepositoryInterface>(TYPES.EphemeralSessionRepository)
.to(RedisEphemeralSessionRepository)
container
.bind<OfflineSubscriptionTokenRepositoryInterface>(TYPES.OfflineSubscriptionTokenRepository)
.to(RedisOfflineSubscriptionTokenRepository)
}
// Services

View File

@@ -0,0 +1,33 @@
import { OfflineSubscriptionToken } from '../../Domain/Auth/OfflineSubscriptionToken'
import { OfflineSubscriptionTokenRepositoryInterface } from '../../Domain/Auth/OfflineSubscriptionTokenRepositoryInterface'
import { TimerInterface } from '@standardnotes/time'
import { CacheEntryRepositoryInterface } from '../../Domain/Cache/CacheEntryRepositoryInterface'
import { CacheEntry } from '../../Domain/Cache/CacheEntry'
export class TypeORMOfflineSubscriptionTokenRepository implements OfflineSubscriptionTokenRepositoryInterface {
private readonly PREFIX = 'offline-subscription-token'
constructor(private cacheEntryRepository: CacheEntryRepositoryInterface, private timer: TimerInterface) {}
async getUserEmailByToken(token: string): Promise<string | undefined> {
const userUuid = await this.cacheEntryRepository.findUnexpiredOneByKey(`${this.PREFIX}:${token}`)
if (!userUuid) {
return undefined
}
return userUuid.props.value
}
async save(offlineSubscriptionToken: OfflineSubscriptionToken): Promise<void> {
const key = `${this.PREFIX}:${offlineSubscriptionToken.token}`
await this.cacheEntryRepository.save(
CacheEntry.create({
key,
value: offlineSubscriptionToken.userEmail,
expiresAt: this.timer.convertMicrosecondsToDate(offlineSubscriptionToken.expiresAt),
}).getValue(),
)
}
}