import { desc, eq, and, sql } from "drizzle-orm" import db from "@/db/db" import { notice, users, type Notice, type NewNotice } from "@/db/schema" // 페이지 경로별 공지사항 조회 (활성화된 것만, 작성자 정보 포함) export async function getNoticesByPagePath(pagePath: string): Promise> { const result = await db .select({ id: notice.id, pagePath: notice.pagePath, title: notice.title, content: notice.content, authorId: notice.authorId, isActive: notice.isActive, createdAt: notice.createdAt, updatedAt: notice.updatedAt, authorName: users.name, authorEmail: users.email, }) .from(notice) .leftJoin(users, eq(notice.authorId, users.id)) .where(and( eq(notice.pagePath, pagePath), eq(notice.isActive, true) )) .orderBy(desc(notice.createdAt)) return result } // 공지사항 생성 export async function insertNotice(data: NewNotice): Promise { const result = await db .insert(notice) .values(data) .returning() return result[0] } // 공지사항 수정 export async function updateNotice(id: number, data: Partial): Promise { const result = await db .update(notice) .set({ ...data, updatedAt: new Date() }) .where(eq(notice.id, id)) .returning() return result[0] || null } // 공지사항 삭제 export async function deleteNoticeById(id: number): Promise { const result = await db .delete(notice) .where(eq(notice.id, id)) return (result.rowCount ?? 0) > 0 } // 공지사항 다중 삭제 export async function deleteNoticeByIds(ids: number[]): Promise { const result = await db .delete(notice) .where(sql`${notice.id} = ANY(${ids})`) return result.rowCount ?? 0 } // ID로 공지사항 조회 (작성자 정보 포함) export async function getNoticeById(id: number): Promise<(Notice & { authorName: string | null; authorEmail: string | null }) | null> { const result = await db .select({ id: notice.id, pagePath: notice.pagePath, title: notice.title, content: notice.content, authorId: notice.authorId, isActive: notice.isActive, createdAt: notice.createdAt, updatedAt: notice.updatedAt, authorName: users.name, authorEmail: users.email, }) .from(notice) .leftJoin(users, eq(notice.authorId, users.id)) .where(eq(notice.id, id)) .limit(1) return result[0] || null }