mirror of
https://github.com/standardnotes/server
synced 2026-01-16 20:04:32 -05:00
feat(auth): add sqlite offline subscription token repository for home server (#579)
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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(),
|
||||
)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user