"use server"; // Next.js 서버 액션에서 직접 import하려면 (선택) import { revalidateTag, unstable_noStore } from "next/cache"; import db from "@/db/db"; import { unstable_cache } from "@/lib/unstable-cache"; import { GetFormListsSchema } from "./validation"; import { filterColumns } from "@/lib/filter-columns"; import { formListsView } from "@/db/schema/vendorData"; import { asc, desc, ilike, inArray, and, gte, lte, not, or } from "drizzle-orm"; import { countFormLists, selectFormLists } from "./repository"; import { projects } from "@/db/schema"; export async function getFormLists(input: GetFormListsSchema) { return unstable_cache( async () => { try { const offset = (input.page - 1) * input.perPage; const advancedTable = true; // advancedTable 모드면 filterColumns()로 where 절 구성 const advancedWhere = filterColumns({ table: formListsView, // 뷰 테이블 사용 filters: input.filters, joinOperator: input.joinOperator, }); let globalWhere; if (input.search) { const s = `%${input.search}%`; globalWhere = or( ilike(formListsView.formCode, s), ilike(formListsView.formName, s), ilike(formListsView.tagTypeLabel, s), ilike(formListsView.classLabel, s), ilike(formListsView.projectName, s), // 뷰 테이블의 projectName 사용 ilike(formListsView.projectCode, s), // 뷰 테이블의 projectCode 사용 ); } const finalWhere = and( advancedWhere, globalWhere ); const where = finalWhere; const orderBy = input.sort.length > 0 ? input.sort.map((item) => { // 뷰 테이블은 모든 필드가 포함되어 있으므로 간단하게 처리 return item.desc ? desc(formListsView[item.id]) : asc(formListsView[item.id]); }) : [asc(formListsView.createdAt)]; // 트랜잭션 내부에서 Repository 호출 const { data, total } = await db.transaction(async (tx) => { // 뷰 테이블을 사용하는 새로운 select 함수 const data = await selectFormLists(tx, { where, orderBy, offset, limit: input.perPage, }); // 뷰 테이블을 사용하는 새로운 count 함수 const total = await countFormLists(tx, where); return { data, total }; }); const pageCount = Math.ceil(total / input.perPage); return { data, pageCount }; } catch (err) { console.log(err) // 에러 발생 시 디폴트 return { data: [], pageCount: 0 }; } }, [JSON.stringify(input)], // 캐싱 키 { revalidate: 3600, tags: ["form-lists"], } )(); }