summaryrefslogtreecommitdiff
path: root/lib/forms/services.ts
diff options
context:
space:
mode:
authordujinkim <dujin.kim@dtsolution.co.kr>2025-04-08 03:08:19 +0000
committerdujinkim <dujin.kim@dtsolution.co.kr>2025-04-08 03:08:19 +0000
commit9ceed79cf32c896f8a998399bf1b296506b2cd4a (patch)
treef84750fa6cac954d5e31221fc47a54c655fc06a9 /lib/forms/services.ts
parent230ce796836c25df26c130dbcd616ef97d12b2ec (diff)
로그인 및 미들웨어 처리. 구조 변경
Diffstat (limited to 'lib/forms/services.ts')
-rw-r--r--lib/forms/services.ts70
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는 배열