import { SettingName } from '@standardnotes/settings' import { ReadStream } from 'fs' import { inject, injectable } from 'inversify' import { Repository } from 'typeorm' import TYPES from '../../Bootstrap/Types' import { Setting } from '../../Domain/Setting/Setting' import { SettingRepositoryInterface } from '../../Domain/Setting/SettingRepositoryInterface' import { DeleteSettingDto } from '../../Domain/UseCase/DeleteSetting/DeleteSettingDto' @injectable() export class MySQLSettingRepository implements SettingRepositoryInterface { constructor( @inject(TYPES.ORMSettingRepository) private ormRepository: Repository, ) {} async save(setting: Setting): Promise { return this.ormRepository.save(setting) } async findOneByUuidAndNames(uuid: string, names: SettingName[]): Promise { return this.ormRepository .createQueryBuilder('setting') .where('setting.uuid = :uuid AND setting.name IN (:...names)', { names, uuid, }) .getOne() } async streamAllByNameAndValue(name: SettingName, value: string): Promise { return this.ormRepository .createQueryBuilder('setting') .where('setting.name = :name AND setting.value = :value', { name, value, }) .orderBy('updated_at', 'ASC') .stream() } async findOneByUuid(uuid: string): Promise { return this.ormRepository .createQueryBuilder('setting') .where('setting.uuid = :uuid', { uuid, }) .getOne() } async findOneByNameAndUserUuid(name: string, userUuid: string): Promise { return this.ormRepository .createQueryBuilder('setting') .where('setting.name = :name AND setting.user_uuid = :user_uuid', { name, user_uuid: userUuid, }) .getOne() } async findLastByNameAndUserUuid(name: string, userUuid: string): Promise { const settings = await this.ormRepository .createQueryBuilder('setting') .where('setting.name = :name AND setting.user_uuid = :user_uuid', { name, user_uuid: userUuid, }) .orderBy('updated_at', 'DESC') .limit(1) .getMany() if (settings.length === 0) { return null } return settings.pop() as Setting } async findAllByUserUuid(userUuid: string): Promise { return this.ormRepository .createQueryBuilder('setting') .where('setting.user_uuid = :user_uuid', { user_uuid: userUuid, }) .getMany() } async deleteByUserUuid({ settingName, userUuid }: DeleteSettingDto): Promise { await this.ormRepository .createQueryBuilder('setting') .delete() .where('name = :name AND user_uuid = :user_uuid', { user_uuid: userUuid, name: settingName, }) .execute() } }