feat: Phase 3.10 EventTriggerService Raw Query 전환 완료
6개 Prisma 호출을 모두 Raw Query로 전환 - JSON 필드 검색 (JSONB 연산자 활용) - 동적 INSERT 쿼리 (PostgreSQL 플레이스홀더) - 동적 UPDATE 쿼리 (WHERE 조건 + 플레이스홀더) - 동적 DELETE 쿼리 (WHERE 조건) - UPSERT 쿼리 (ON CONFLICT) - 다이어그램 단건 조회 (findUnique → queryOne) 주요 기술적 해결: - JSON 필드 검색 ($queryRaw → query) - category::text = '"data-save"' - category::jsonb ? 'data-save' - category::jsonb @> '["data-save"]' - MySQL 플레이스홀더(?) → PostgreSQL 플레이스홀더($1, $2, ...) - 동적 테이블 INSERT/UPDATE/DELETE (보안 강화) - ON CONFLICT를 사용한 UPSERT - 조건부 실행 로직 유지 TypeScript 컴파일 성공 Prisma import 완전 제거 Phase 3 진행률: 120/162 (74.1%) 전체 진행률: 371/444 (83.6%)
This commit is contained in:
@@ -1,8 +1,6 @@
|
||||
import { PrismaClient } from "@prisma/client";
|
||||
import { query, queryOne } from "../database/db";
|
||||
import { logger } from "../utils/logger";
|
||||
|
||||
const prisma = new PrismaClient();
|
||||
|
||||
// 조건 노드 타입 정의
|
||||
interface ConditionNode {
|
||||
id: string; // 고유 ID
|
||||
@@ -92,15 +90,16 @@ export class EventTriggerService {
|
||||
|
||||
try {
|
||||
// 🔥 수정: Raw SQL을 사용하여 JSON 배열 검색
|
||||
const diagrams = (await prisma.$queryRaw`
|
||||
SELECT * FROM dataflow_diagrams
|
||||
WHERE company_code = ${companyCode}
|
||||
AND (
|
||||
category::text = '"data-save"' OR
|
||||
category::jsonb ? 'data-save' OR
|
||||
category::jsonb @> '["data-save"]'
|
||||
)
|
||||
`) as any[];
|
||||
const diagrams = await query<any>(
|
||||
`SELECT * FROM dataflow_diagrams
|
||||
WHERE company_code = $1
|
||||
AND (
|
||||
category::text = '"data-save"' OR
|
||||
category::jsonb ? 'data-save' OR
|
||||
category::jsonb @> '["data-save"]'
|
||||
)`,
|
||||
[companyCode]
|
||||
);
|
||||
|
||||
// 각 관계도에서 해당 테이블을 소스로 하는 데이터 저장 관계들 필터링
|
||||
const matchingDiagrams = diagrams.filter((diagram) => {
|
||||
@@ -537,13 +536,14 @@ export class EventTriggerService {
|
||||
data: Record<string, any>
|
||||
): Promise<void> {
|
||||
// 동적 테이블 INSERT 실행
|
||||
const sql = `INSERT INTO ${tableName} (${Object.keys(data).join(", ")}) VALUES (${Object.keys(
|
||||
data
|
||||
)
|
||||
.map(() => "?")
|
||||
.join(", ")})`;
|
||||
// PostgreSQL 파라미터 플레이스홀더로 변경 (? → $1, $2, ...)
|
||||
const values = Object.values(data);
|
||||
const placeholders = values.map((_, i) => `$${i + 1}`).join(", ");
|
||||
const sql = `INSERT INTO ${tableName} (${Object.keys(data).join(
|
||||
", "
|
||||
)}) VALUES (${placeholders})`;
|
||||
|
||||
await prisma.$executeRawUnsafe(sql, ...Object.values(data));
|
||||
await query(sql, values);
|
||||
logger.info(`Inserted data into ${tableName}:`, data);
|
||||
}
|
||||
|
||||
@@ -563,14 +563,15 @@ export class EventTriggerService {
|
||||
}
|
||||
|
||||
// 동적 테이블 UPDATE 실행
|
||||
const values = Object.values(data);
|
||||
const setClause = Object.keys(data)
|
||||
.map((key) => `${key} = ?`)
|
||||
.map((key, i) => `${key} = $${i + 1}`)
|
||||
.join(", ");
|
||||
const whereClause = this.buildWhereClause(conditions);
|
||||
|
||||
const sql = `UPDATE ${tableName} SET ${setClause} WHERE ${whereClause}`;
|
||||
|
||||
await prisma.$executeRawUnsafe(sql, ...Object.values(data));
|
||||
await query(sql, values);
|
||||
logger.info(`Updated data in ${tableName}:`, data);
|
||||
}
|
||||
|
||||
@@ -593,7 +594,7 @@ export class EventTriggerService {
|
||||
const whereClause = this.buildWhereClause(conditions);
|
||||
const sql = `DELETE FROM ${tableName} WHERE ${whereClause}`;
|
||||
|
||||
await prisma.$executeRawUnsafe(sql);
|
||||
await query(sql, []);
|
||||
logger.info(`Deleted data from ${tableName} with conditions`);
|
||||
}
|
||||
|
||||
@@ -608,15 +609,16 @@ export class EventTriggerService {
|
||||
const columns = Object.keys(data);
|
||||
const values = Object.values(data);
|
||||
const conflictColumns = ["id", "company_code"]; // 기본 충돌 컬럼
|
||||
const placeholders = values.map((_, i) => `$${i + 1}`).join(", ");
|
||||
|
||||
const sql = `
|
||||
INSERT INTO ${tableName} (${columns.join(", ")})
|
||||
VALUES (${columns.map(() => "?").join(", ")})
|
||||
VALUES (${placeholders})
|
||||
ON CONFLICT (${conflictColumns.join(", ")})
|
||||
DO UPDATE SET ${columns.map((col) => `${col} = EXCLUDED.${col}`).join(", ")}
|
||||
`;
|
||||
|
||||
await prisma.$executeRawUnsafe(sql, ...values);
|
||||
await query(sql, values);
|
||||
logger.info(`Upserted data into ${tableName}:`, data);
|
||||
}
|
||||
|
||||
@@ -678,9 +680,10 @@ export class EventTriggerService {
|
||||
companyCode: string
|
||||
): Promise<{ conditionMet: boolean; result?: ExecutionResult }> {
|
||||
try {
|
||||
const diagram = await prisma.dataflow_diagrams.findUnique({
|
||||
where: { diagram_id: diagramId },
|
||||
});
|
||||
const diagram = await queryOne<any>(
|
||||
`SELECT * FROM dataflow_diagrams WHERE diagram_id = $1`,
|
||||
[diagramId]
|
||||
);
|
||||
|
||||
if (!diagram) {
|
||||
throw new Error(`Diagram ${diagramId} not found`);
|
||||
|
||||
Reference in New Issue
Block a user