/** * Drizzle Review Comment Repository Adapter * * Implements ReviewCommentRepository interface using Drizzle ORM. */ import { eq, asc } from 'drizzle-orm'; import { nanoid } from 'nanoid'; import type { DrizzleDatabase } from '../../index.js'; import { reviewComments, type ReviewComment } from '../../schema.js'; import type { ReviewCommentRepository, CreateReviewCommentData } from '../review-comment-repository.js'; export class DrizzleReviewCommentRepository implements ReviewCommentRepository { constructor(private db: DrizzleDatabase) {} async create(data: CreateReviewCommentData): Promise { const now = new Date(); const id = nanoid(); await this.db.insert(reviewComments).values({ id, phaseId: data.phaseId, filePath: data.filePath, lineNumber: data.lineNumber, lineType: data.lineType, body: data.body, author: data.author ?? 'you', resolved: false, createdAt: now, updatedAt: now, }); const rows = await this.db .select() .from(reviewComments) .where(eq(reviewComments.id, id)) .limit(1); return rows[0]!; } async findByPhaseId(phaseId: string): Promise { return this.db .select() .from(reviewComments) .where(eq(reviewComments.phaseId, phaseId)) .orderBy(asc(reviewComments.createdAt)); } async resolve(id: string): Promise { await this.db .update(reviewComments) .set({ resolved: true, updatedAt: new Date() }) .where(eq(reviewComments.id, id)); const rows = await this.db .select() .from(reviewComments) .where(eq(reviewComments.id, id)) .limit(1); return rows[0] ?? null; } async unresolve(id: string): Promise { await this.db .update(reviewComments) .set({ resolved: false, updatedAt: new Date() }) .where(eq(reviewComments.id, id)); const rows = await this.db .select() .from(reviewComments) .where(eq(reviewComments.id, id)) .limit(1); return rows[0] ?? null; } async delete(id: string): Promise { await this.db .delete(reviewComments) .where(eq(reviewComments.id, id)); } }