import { Injectable } from '@nestjs/common'; import { Insertable, Kysely, Updateable } from 'kysely'; import { InjectKysely } from 'nestjs-kysely'; import { DummyValue, GenerateSql } from 'src/decorators'; import { AlbumUserRole } from 'src/enum'; import { DB } from 'src/schema'; import { AlbumUserTable } from 'src/schema/tables/album-user.table'; export type AlbumPermissionId = { albumId: string; userId: string; }; @Injectable() export class AlbumUserRepository { constructor(@InjectKysely() private db: Kysely) {} @GenerateSql({ params: [{ userId: DummyValue.UUID, albumId: DummyValue.UUID }] }) create(albumUser: Insertable) { return this.db .insertInto('album_user') .values(albumUser) .returning(['userId', 'albumId', 'role']) .executeTakeFirstOrThrow(); } @GenerateSql({ params: [{ userId: DummyValue.UUID, albumId: DummyValue.UUID }, { role: AlbumUserRole.Viewer }] }) async update({ userId, albumId }: AlbumPermissionId, dto: Updateable) { await this.db .updateTable('album_user') .set(dto) .where('userId', '=', userId) .where('albumId', '=', albumId) .execute(); } @GenerateSql({ params: [{ userId: DummyValue.UUID, albumId: DummyValue.UUID }] }) async delete({ userId, albumId }: AlbumPermissionId): Promise { await this.db.deleteFrom('album_user').where('userId', '=', userId).where('albumId', '=', albumId).execute(); } }