생성된 관계도 확인
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user