diff options
| author | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-04-08 03:08:19 +0000 |
|---|---|---|
| committer | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-04-08 03:08:19 +0000 |
| commit | 9ceed79cf32c896f8a998399bf1b296506b2cd4a (patch) | |
| tree | f84750fa6cac954d5e31221fc47a54c655fc06a9 /lib/forms/services.ts | |
| parent | 230ce796836c25df26c130dbcd616ef97d12b2ec (diff) | |
로그인 및 미들웨어 처리. 구조 변경
Diffstat (limited to 'lib/forms/services.ts')
| -rw-r--r-- | lib/forms/services.ts | 70 |
1 files changed, 61 insertions, 9 deletions
diff --git a/lib/forms/services.ts b/lib/forms/services.ts index e3a8b2b2..d77f91d3 100644 --- a/lib/forms/services.ts +++ b/lib/forms/services.ts @@ -20,6 +20,7 @@ import { unstable_cache } from "next/cache"; import { revalidateTag } from "next/cache"; import { getErrorMessage } from "../handle-error"; import { DataTableColumnJSON } from "@/components/form-data/form-data-table-columns"; +import { contractItems, contracts, projects } from "@/db/schema"; export interface FormInfo { id: number; @@ -149,19 +150,45 @@ export async function getFormData(formCode: string, contractItemId: number) { // 1) unstable_cache로 전체 로직을 감싼다 const result = await unstable_cache( async () => { - // --- 기존 로직 시작 --- - // (1) form_metas 조회 (가정상 1개만 존재) + // --- 기존 로직 시작 (projectId 고려하도록 수정) --- + + // (0) contractItemId로부터 projectId 조회 + const contractItemResult = await db + .select({ + projectId: projects.id + }) + .from(contractItems) + .innerJoin(contracts, eq(contractItems.contractId, contracts.id)) + .innerJoin(projects, eq(contracts.projectId, projects.id)) + .where(eq(contractItems.id, contractItemId)) + .limit(1); + + if (contractItemResult.length === 0) { + console.warn(`[getFormData] No contract item found with ID: ${contractItemId}`); + return { columns: null, data: [] }; + } + + const projectId = contractItemResult[0].projectId; + + // (1) form_metas 조회 - 이제 projectId도 조건에 포함 const metaRows = await db .select() .from(formMetas) - .where(eq(formMetas.formCode, formCode)) + .where( + and( + eq(formMetas.formCode, formCode), + eq(formMetas.projectId, projectId) + ) + ) .orderBy(desc(formMetas.updatedAt)) .limit(1); const meta = metaRows[0] ?? null; if (!meta) { + console.warn(`[getFormData] No form meta found for formCode: ${formCode} and projectId: ${projectId}`); return { columns: null, data: [] }; } + // (2) form_entries에서 (formCode, contractItemId)에 해당하는 "가장 최신" 한 행 const entryRows = await db .select() @@ -205,7 +232,7 @@ export async function getFormData(formCode: string, contractItemId: number) { } } - return { columns, data }; + return { columns, data, projectId }; // projectId도 반환 (필요시) // --- 기존 로직 끝 --- }, [cacheKey], // 캐시 키 의존성 @@ -225,16 +252,40 @@ export async function getFormData(formCode: string, contractItemId: number) { `[getFormData] Fallback DB query for (${formCode}, ${contractItemId})` ); - // (1) form_metas + // (0) contractItemId로부터 projectId 조회 + const contractItemResult = await db + .select({ + projectId: projects.id + }) + .from(contractItems) + .innerJoin(contracts, eq(contractItems.contractId, contracts.id)) + .innerJoin(projects, eq(contracts.projectId, projects.id)) + .where(eq(contractItems.id, contractItemId)) + .limit(1); + + if (contractItemResult.length === 0) { + console.warn(`[getFormData] Fallback: No contract item found with ID: ${contractItemId}`); + return { columns: null, data: [] }; + } + + const projectId = contractItemResult[0].projectId; + + // (1) form_metas - projectId 고려 const metaRows = await db .select() .from(formMetas) - .where(eq(formMetas.formCode, formCode)) + .where( + and( + eq(formMetas.formCode, formCode), + eq(formMetas.projectId, projectId) + ) + ) .orderBy(desc(formMetas.updatedAt)) .limit(1); const meta = metaRows[0] ?? null; if (!meta) { + console.warn(`[getFormData] Fallback: No form meta found for formCode: ${formCode} and projectId: ${projectId}`); return { columns: null, data: [] }; } @@ -279,7 +330,7 @@ export async function getFormData(formCode: string, contractItemId: number) { } } - return { columns, data }; + return { columns, data, projectId }; // projectId도 반환 (필요시) } catch (dbError) { console.error(`[getFormData] Fallback DB query failed:`, dbError); return { columns: null, data: [] }; @@ -674,14 +725,15 @@ interface MetadataResult { * 없으면 null. */ export async function fetchFormMetadata( - formCode: string + formCode: string, + projectId: number ): Promise<MetadataResult | null> { try { // 기존 방식: select().from().where() const rows = await db .select() .from(formMetas) - .where(eq(formMetas.formCode, formCode)) + .where(and(eq(formMetas.formCode, formCode),eq(formMetas.projectId, projectId))) .limit(1); // rows는 배열 |
