import { Injectable } from "@nestjs/common"; import { and, desc, eq, isNull } from "drizzle-orm"; import { DatabaseService } from "../../database/database.service"; import { comments, users } from "../../database/schemas"; import type { NewCommentInDb } from "../../database/schemas/comments"; @Injectable() export class CommentsRepository { constructor(private readonly databaseService: DatabaseService) {} async create(data: NewCommentInDb) { const results = await this.databaseService.db .insert(comments) .values(data) .returning(); return results[0]; } async findAllByContentId(contentId: string) { return this.databaseService.db .select({ id: comments.id, text: comments.text, parentId: comments.parentId, createdAt: comments.createdAt, updatedAt: comments.updatedAt, user: { uuid: users.uuid, username: users.username, displayName: users.displayName, avatarUrl: users.avatarUrl, }, }) .from(comments) .innerJoin(users, eq(comments.userId, users.uuid)) .where(and(eq(comments.contentId, contentId), isNull(comments.deletedAt))) .orderBy(desc(comments.createdAt)); } async findOne(id: string) { const results = await this.databaseService.db .select() .from(comments) .where(and(eq(comments.id, id), isNull(comments.deletedAt))); return results[0]; } async delete(id: string) { await this.databaseService.db .update(comments) .set({ deletedAt: new Date() }) .where(eq(comments.id, id)); } }