import { MapperInterface, Uuid } from '@standardnotes/domain-core' import { Repository } from 'typeorm' import { Revision } from '../../Domain/Revision/Revision' import { RevisionMetadata } from '../../Domain/Revision/RevisionMetadata' import { RevisionRepositoryInterface } from '../../Domain/Revision/RevisionRepositoryInterface' import { TypeORMRevision } from '../TypeORM/TypeORMRevision' export class MySQLRevisionRepository implements RevisionRepositoryInterface { constructor( private ormRepository: Repository, private revisionMetadataMapper: MapperInterface, private revisionMapper: MapperInterface, ) {} async save(revision: Revision): Promise { const typeormRevision = this.revisionMapper.toProjection(revision) await this.ormRepository.save(typeormRevision) return revision } async findMetadataByItemId(itemUuid: Uuid, userUuid: Uuid): Promise> { const queryBuilder = this.ormRepository .createQueryBuilder() .select('uuid', 'uuid') .addSelect('content_type', 'contentType') .addSelect('created_at', 'createdAt') .addSelect('updated_at', 'updatedAt') .where('item_uuid = :itemUuid', { itemUuid }) .andWhere('user_uuid = :userUuid', { userUuid }) .orderBy('created_at', 'DESC') const simplifiedRevisions = await queryBuilder.getMany() const metadata = [] for (const simplifiedRevision of simplifiedRevisions) { metadata.push(this.revisionMetadataMapper.toDomain(simplifiedRevision)) } return metadata } }