mirror of
https://github.com/standardnotes/server
synced 2026-10-17 12:03:09 -04:00
feat(auth): add session traces cleanup procedure
This commit is contained in:
@@ -201,6 +201,7 @@ import { SessionTracePersistenceMapper } from '../Mapping/SessionTracePersistenc
|
||||
import { SessionTrace } from '../Domain/Session/SessionTrace'
|
||||
import { TypeORMSessionTrace } from '../Infra/TypeORM/TypeORMSessionTrace'
|
||||
import { TraceSession } from '../Domain/UseCase/TraceSession/TraceSession'
|
||||
import { CleanupSessionTraces } from '../Domain/UseCase/CleanupSessionTraces/CleanupSessionTraces'
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
||||
const newrelicFormatter = require('@newrelic/winston-enricher')
|
||||
@@ -499,6 +500,10 @@ export class ContainerConfigLoader {
|
||||
container.get(TYPES.SESSION_TRACE_DAYS_TTL),
|
||||
),
|
||||
)
|
||||
|
||||
container
|
||||
.bind<CleanupSessionTraces>(TYPES.CleanupSessionTraces)
|
||||
.toConstantValue(new CleanupSessionTraces(container.get(TYPES.SessionTraceRepository)))
|
||||
container.bind<AuthenticateUser>(TYPES.AuthenticateUser).to(AuthenticateUser)
|
||||
container.bind<AuthenticateRequest>(TYPES.AuthenticateRequest).to(AuthenticateRequest)
|
||||
container.bind<RefreshSessionToken>(TYPES.RefreshSessionToken).to(RefreshSessionToken)
|
||||
|
||||
@@ -125,6 +125,7 @@ const TYPES = {
|
||||
CreateCrossServiceToken: Symbol.for('CreateCrossServiceToken'),
|
||||
ProcessUserRequest: Symbol.for('ProcessUserRequest'),
|
||||
TraceSession: Symbol.for('TraceSession'),
|
||||
CleanupSessionTraces: Symbol.for('CleanupSessionTraces'),
|
||||
// Handlers
|
||||
UserRegisteredEventHandler: Symbol.for('UserRegisteredEventHandler'),
|
||||
AccountDeletionRequestedEventHandler: Symbol.for('AccountDeletionRequestedEventHandler'),
|
||||
|
||||
@@ -4,5 +4,6 @@ import { SessionTrace } from './SessionTrace'
|
||||
|
||||
export interface SessionTraceRepositoryInterface {
|
||||
save(sessionTrace: SessionTrace): Promise<void>
|
||||
removeExpiredBefore(date: Date): Promise<void>
|
||||
findOneByUserUuidAndDate(userUuid: Uuid, date: Date): Promise<SessionTrace | null>
|
||||
}
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
import { SessionTraceRepositoryInterface } from '../../Session/SessionTraceRepositoryInterface'
|
||||
import { CleanupSessionTraces } from './CleanupSessionTraces'
|
||||
|
||||
describe('CleanupSessionTraces', () => {
|
||||
let sessionTracesRepository: SessionTraceRepositoryInterface
|
||||
|
||||
const createUseCase = () => new CleanupSessionTraces(sessionTracesRepository)
|
||||
|
||||
beforeEach(() => {
|
||||
sessionTracesRepository = {} as jest.Mocked<SessionTraceRepositoryInterface>
|
||||
sessionTracesRepository.removeExpiredBefore = jest.fn()
|
||||
})
|
||||
|
||||
it('should remove stale session traces', async () => {
|
||||
await createUseCase().execute({ date: new Date() })
|
||||
|
||||
expect(sessionTracesRepository.removeExpiredBefore).toHaveBeenCalled()
|
||||
})
|
||||
})
|
||||
@@ -0,0 +1,14 @@
|
||||
import { Result, UseCaseInterface } from '@standardnotes/domain-core'
|
||||
|
||||
import { SessionTraceRepositoryInterface } from '../../Session/SessionTraceRepositoryInterface'
|
||||
import { CleanupSessionTracesDTO } from './CleanupSessionTracesDTO'
|
||||
|
||||
export class CleanupSessionTraces implements UseCaseInterface<string> {
|
||||
constructor(private sessionTracesRepository: SessionTraceRepositoryInterface) {}
|
||||
|
||||
async execute(dto: CleanupSessionTracesDTO): Promise<Result<string>> {
|
||||
await this.sessionTracesRepository.removeExpiredBefore(dto.date)
|
||||
|
||||
return Result.ok('Session traces removed')
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
export interface CleanupSessionTracesDTO {
|
||||
date: Date
|
||||
}
|
||||
@@ -10,6 +10,14 @@ export class MySQLSessionTraceRepository implements SessionTraceRepositoryInterf
|
||||
private mapper: MapperInterface<SessionTrace, TypeORMSessionTrace>,
|
||||
) {}
|
||||
|
||||
async removeExpiredBefore(date: Date): Promise<void> {
|
||||
await this.ormRepository
|
||||
.createQueryBuilder()
|
||||
.delete()
|
||||
.where('expires_at < :date', { date: date.toISOString() })
|
||||
.execute()
|
||||
}
|
||||
|
||||
async findOneByUserUuidAndDate(userUuid: Uuid, date: Date): Promise<SessionTrace | null> {
|
||||
const typeOrm = await this.ormRepository
|
||||
.createQueryBuilder('trace')
|
||||
|
||||
Reference in New Issue
Block a user