diff --git a/server/src/cores/storage.core.ts b/server/src/cores/storage.core.ts index c49175172d..d26829d633 100644 --- a/server/src/cores/storage.core.ts +++ b/server/src/cores/storage.core.ts @@ -183,7 +183,7 @@ export class StorageCore { return; } - move = await this.moveRepository.update({ id: move.id, oldPath: actualPath, newPath }); + move = await this.moveRepository.update(move.id, { id: move.id, oldPath: actualPath, newPath }); } else { move = await this.moveRepository.create({ entityId, pathType, oldPath, newPath }); } @@ -225,7 +225,7 @@ export class StorageCore { } await this.savePath(pathType, entityId, newPath); - await this.moveRepository.delete(move); + await this.moveRepository.delete(move.id); } private async verifyNewPathContentsMatchesExpected( diff --git a/server/src/interfaces/move.interface.ts b/server/src/interfaces/move.interface.ts index 0e79cfcadc..4356d9df8c 100644 --- a/server/src/interfaces/move.interface.ts +++ b/server/src/interfaces/move.interface.ts @@ -1,3 +1,5 @@ +import { Insertable, Updateable } from 'kysely'; +import { MoveHistory } from 'src/db'; import { MoveEntity } from 'src/entities/move.entity'; import { PathType } from 'src/enum'; @@ -6,8 +8,8 @@ export const IMoveRepository = 'IMoveRepository'; export type MoveCreate = Pick & Partial; export interface IMoveRepository { - create(entity: MoveCreate): Promise; - getByEntity(entityId: string, pathType: PathType): Promise; - update(entity: Partial): Promise; - delete(move: MoveEntity): Promise; + create(entity: Insertable): Promise; + getByEntity(entityId: string, pathType: PathType): Promise; + update(id: string, entity: Updateable): Promise; + delete(id: string): Promise; } diff --git a/server/src/queries/move.repository.sql b/server/src/queries/move.repository.sql index 3ce8c0ccdd..e51f2829df 100644 --- a/server/src/queries/move.repository.sql +++ b/server/src/queries/move.repository.sql @@ -1,18 +1,17 @@ -- NOTE: This file is auto generated by ./sql-generator -- MoveRepository.getByEntity -SELECT - "MoveEntity"."id" AS "MoveEntity_id", - "MoveEntity"."entityId" AS "MoveEntity_entityId", - "MoveEntity"."pathType" AS "MoveEntity_pathType", - "MoveEntity"."oldPath" AS "MoveEntity_oldPath", - "MoveEntity"."newPath" AS "MoveEntity_newPath" -FROM - "move_history" "MoveEntity" -WHERE - ( - ("MoveEntity"."entityId" = $1) - AND ("MoveEntity"."pathType" = $2) - ) -LIMIT - 1 +select + * +from + "move_history" +where + "entityId" = $1 + and "pathType" = $2 + +-- MoveRepository.delete +delete from "move_history" +where + "id" = $1 +returning + * diff --git a/server/src/repositories/move.repository.ts b/server/src/repositories/move.repository.ts index 16d9004014..c0177f3f30 100644 --- a/server/src/repositories/move.repository.ts +++ b/server/src/repositories/move.repository.ts @@ -1,29 +1,49 @@ import { Injectable } from '@nestjs/common'; -import { InjectRepository } from '@nestjs/typeorm'; +import { Insertable, Kysely, Updateable } from 'kysely'; +import { InjectKysely } from 'nestjs-kysely'; +import { DB, MoveHistory } from 'src/db'; import { DummyValue, GenerateSql } from 'src/decorators'; import { MoveEntity } from 'src/entities/move.entity'; import { PathType } from 'src/enum'; -import { IMoveRepository, MoveCreate } from 'src/interfaces/move.interface'; -import { Repository } from 'typeorm'; +import { IMoveRepository } from 'src/interfaces/move.interface'; @Injectable() export class MoveRepository implements IMoveRepository { - constructor(@InjectRepository(MoveEntity) private repository: Repository) {} + constructor(@InjectKysely() private db: Kysely) {} - create(entity: MoveCreate): Promise { - return this.repository.save(entity); + create(entity: Insertable): Promise { + return this.db + .insertInto('move_history') + .values(entity) + .returningAll() + .executeTakeFirstOrThrow() as Promise; } @GenerateSql({ params: [DummyValue.UUID, DummyValue.STRING] }) - getByEntity(entityId: string, pathType: PathType): Promise { - return this.repository.findOne({ where: { entityId, pathType } }); + getByEntity(entityId: string, pathType: PathType): Promise { + return this.db + .selectFrom('move_history') + .selectAll() + .where('entityId', '=', entityId) + .where('pathType', '=', pathType) + .executeTakeFirst() as Promise; } - update(entity: Partial): Promise { - return this.repository.save(entity); + update(id: string, entity: Updateable): Promise { + return this.db + .updateTable('move_history') + .set(entity) + .where('id', '=', id) + .returningAll() + .executeTakeFirstOrThrow() as unknown as Promise; } - delete(move: MoveEntity): Promise { - return this.repository.remove(move); + @GenerateSql({ params: [DummyValue.UUID] }) + delete(id: string): Promise { + return this.db + .deleteFrom('move_history') + .where('id', '=', id) + .returningAll() + .executeTakeFirstOrThrow() as unknown as Promise; } } diff --git a/server/src/services/storage-template.service.spec.ts b/server/src/services/storage-template.service.spec.ts index 728e891d05..46ec4f53e1 100644 --- a/server/src/services/storage-template.service.spec.ts +++ b/server/src/services/storage-template.service.spec.ts @@ -235,7 +235,7 @@ describe(StorageTemplateService.name, () => { expect(assetMock.getByIds).toHaveBeenCalledWith([assetStub.image.id], { exifInfo: true }); expect(storageMock.checkFileExists).toHaveBeenCalledTimes(3); expect(storageMock.rename).toHaveBeenCalledWith(assetStub.image.originalPath, newPath); - expect(moveMock.update).toHaveBeenCalledWith({ + expect(moveMock.update).toHaveBeenCalledWith('123', { id: '123', oldPath: assetStub.image.originalPath, newPath, @@ -277,7 +277,7 @@ describe(StorageTemplateService.name, () => { expect(storageMock.stat).toHaveBeenCalledWith(previousFailedNewPath); expect(storageMock.rename).toHaveBeenCalledWith(previousFailedNewPath, newPath); expect(storageMock.copyFile).not.toHaveBeenCalled(); - expect(moveMock.update).toHaveBeenCalledWith({ + expect(moveMock.update).toHaveBeenCalledWith('123', { id: '123', oldPath: previousFailedNewPath, newPath,