생성된 관계도 확인

This commit is contained in:
2025-09-09 11:35:05 +09:00
parent 989c118ad2
commit 7260ad733b
8 changed files with 1018 additions and 107 deletions

View File

@@ -608,3 +608,113 @@ export async function getTableData(req: Request, res: Response): Promise<void> {
res.status(500).json(response);
}
}
/**
* 관계도 그룹 목록 조회 (관계도 이름별로 그룹화)
*/
export async function getDataFlowDiagrams(
req: AuthenticatedRequest,
res: Response
): Promise<void> {
try {
logger.info("=== 관계도 목록 조회 시작 ===");
const { page = 1, size = 20, searchTerm = "" } = req.query;
// 사용자 정보에서 회사 코드 가져오기
const companyCode = (req.user as any)?.company_code || "*";
const pageNum = parseInt(page as string, 10);
const sizeNum = parseInt(size as string, 10);
const dataflowService = new DataflowService();
const result = await dataflowService.getDataFlowDiagrams(
companyCode,
pageNum,
sizeNum,
searchTerm as string
);
logger.info(`관계도 목록 조회 완료: ${result.total}`);
const response: ApiResponse<typeof result> = {
success: true,
message: "관계도 목록을 성공적으로 조회했습니다.",
data: result,
};
res.status(200).json(response);
} catch (error) {
logger.error("관계도 목록 조회 중 오류 발생:", error);
const response: ApiResponse<null> = {
success: false,
message: "관계도 목록 조회 중 오류가 발생했습니다.",
error: {
code: "DATAFLOW_DIAGRAMS_LIST_ERROR",
details: error instanceof Error ? error.message : "Unknown error",
},
};
res.status(500).json(response);
}
}
/**
* 특정 관계도의 모든 관계 조회
*/
export async function getDiagramRelationships(
req: AuthenticatedRequest,
res: Response
): Promise<void> {
try {
logger.info("=== 관계도 관계 조회 시작 ===");
const { diagramName } = req.params;
if (!diagramName) {
const response: ApiResponse<null> = {
success: false,
message: "관계도 이름이 필요합니다.",
error: {
code: "MISSING_DIAGRAM_NAME",
details: "diagramName 파라미터가 필요합니다.",
},
};
res.status(400).json(response);
return;
}
// 사용자 정보에서 회사 코드 가져오기
const companyCode = (req.user as any)?.company_code || "*";
const dataflowService = new DataflowService();
const relationships = await dataflowService.getDiagramRelationships(
companyCode,
decodeURIComponent(diagramName)
);
logger.info(`관계도 관계 조회 완료: ${relationships.length}`);
const response: ApiResponse<any[]> = {
success: true,
message: "관계도 관계를 성공적으로 조회했습니다.",
data: relationships,
};
res.status(200).json(response);
} catch (error) {
logger.error("관계도 관계 조회 중 오류 발생:", error);
const response: ApiResponse<null> = {
success: false,
message: "관계도 관계 조회 중 오류가 발생했습니다.",
error: {
code: "DIAGRAM_RELATIONSHIPS_GET_ERROR",
details: error instanceof Error ? error.message : "Unknown error",
},
};
res.status(500).json(response);
}
}

View File

@@ -10,6 +10,8 @@ import {
getLinkedDataByRelationship,
deleteDataLink,
getTableData,
getDataFlowDiagrams,
getDiagramRelationships,
} from "../controllers/dataflowController";
const router = express.Router();
@@ -78,4 +80,18 @@ router.delete("/data-links/:bridgeId", deleteDataLink);
*/
router.get("/table-data/:tableName", getTableData);
// ==================== 관계도 관리 라우트 ====================
/**
* 관계도 목록 조회 (관계도 이름별로 그룹화)
* GET /api/dataflow/diagrams
*/
router.get("/diagrams", getDataFlowDiagrams);
/**
* 특정 관계도의 모든 관계 조회
* GET /api/dataflow/diagrams/:diagramName/relationships
*/
router.get("/diagrams/:diagramName/relationships", getDiagramRelationships);
export default router;

View File

@@ -729,4 +729,164 @@ export class DataflowService {
throw error;
}
}
/**
* 관계도 그룹 목록 조회 (관계도 이름별로 그룹화)
*/
async getDataFlowDiagrams(
companyCode: string,
page: number = 1,
size: number = 20,
searchTerm: string = ""
) {
try {
logger.info(
`DataflowService: 관계도 목록 조회 시작 - ${companyCode}, page: ${page}, size: ${size}, search: ${searchTerm}`
);
// 관계도 이름별로 그룹화하여 조회
const whereCondition = {
company_code: companyCode,
is_active: "Y",
...(searchTerm && {
OR: [
{
relationship_name: {
contains: searchTerm,
mode: "insensitive" as any,
},
},
{
from_table_name: {
contains: searchTerm,
mode: "insensitive" as any,
},
},
{
to_table_name: {
contains: searchTerm,
mode: "insensitive" as any,
},
},
],
}),
};
// 관계도별로 그룹화된 데이터 조회 (관계도 이름을 기준으로)
const relationships = await prisma.table_relationships.findMany({
where: whereCondition,
select: {
relationship_name: true,
from_table_name: true,
to_table_name: true,
connection_type: true,
relationship_type: true,
created_date: true,
created_by: true,
updated_date: true,
updated_by: true,
},
orderBy: [{ relationship_name: "asc" }, { created_date: "desc" }],
});
// 관계도 이름별로 그룹화
const diagramMap = new Map<string, any>();
relationships.forEach((rel) => {
const diagramName = rel.relationship_name;
if (!diagramMap.has(diagramName)) {
diagramMap.set(diagramName, {
diagramName: diagramName,
connectionType: rel.connection_type,
relationshipType: rel.relationship_type,
tableCount: new Set<string>(),
relationshipCount: 0,
createdAt: rel.created_date,
createdBy: rel.created_by,
updatedAt: rel.updated_date,
updatedBy: rel.updated_by,
tables: [],
});
}
const diagram = diagramMap.get(diagramName);
diagram.tableCount.add(rel.from_table_name);
diagram.tableCount.add(rel.to_table_name);
diagram.relationshipCount++;
// 최신 업데이트 시간 유지
if (rel.updated_date && rel.updated_date > diagram.updatedAt) {
diagram.updatedAt = rel.updated_date;
diagram.updatedBy = rel.updated_by;
}
});
// Set을 배열로 변환하고 테이블 개수 계산
const diagrams = Array.from(diagramMap.values()).map((diagram) => ({
...diagram,
tableCount: diagram.tableCount.size,
tables: Array.from(diagram.tableCount),
}));
// 페이징 처리
const total = diagrams.length;
const startIndex = (page - 1) * size;
const endIndex = startIndex + size;
const paginatedDiagrams = diagrams.slice(startIndex, endIndex);
const result = {
diagrams: paginatedDiagrams,
total,
page,
size,
totalPages: Math.ceil(total / size),
hasNext: page < Math.ceil(total / size),
hasPrev: page > 1,
};
logger.info(
`DataflowService: 관계도 목록 조회 완료 - 총 ${total}개 관계도 중 ${paginatedDiagrams.length}개 조회`
);
return result;
} catch (error) {
logger.error("DataflowService: 관계도 목록 조회 실패", error);
throw error;
}
}
/**
* 특정 관계도의 모든 관계 조회
*/
async getDiagramRelationships(companyCode: string, diagramName: string) {
try {
logger.info(
`DataflowService: 관계도 관계 조회 시작 - ${companyCode}, diagram: ${diagramName}`
);
const relationships = await prisma.table_relationships.findMany({
where: {
company_code: companyCode,
relationship_name: diagramName,
is_active: "Y",
},
orderBy: {
created_date: "asc",
},
});
logger.info(
`DataflowService: 관계도 관계 조회 완료 - ${diagramName}, ${relationships.length}개 관계`
);
return relationships;
} catch (error) {
logger.error(
`DataflowService: 관계도 관계 조회 실패 - ${diagramName}`,
error
);
throw error;
}
}
}