326 lines
7.6 KiB
TypeScript
326 lines
7.6 KiB
TypeScript
|
|
import { Request, Response } from "express";
|
||
|
|
import { DataflowDiagramService } from "../services/dataflowDiagramService";
|
||
|
|
|
||
|
|
interface AuthenticatedRequest extends Request {
|
||
|
|
user?: {
|
||
|
|
userId: string;
|
||
|
|
companyCode: string;
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
const dataflowDiagramService = new DataflowDiagramService();
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 관계도 목록 조회
|
||
|
|
* GET /api/dataflow-diagrams
|
||
|
|
*/
|
||
|
|
export const getDataflowDiagrams = async (
|
||
|
|
req: AuthenticatedRequest,
|
||
|
|
res: Response
|
||
|
|
) => {
|
||
|
|
try {
|
||
|
|
const { page = 1, size = 20, searchTerm = "" } = req.query;
|
||
|
|
const companyCode = req.user?.companyCode;
|
||
|
|
|
||
|
|
if (!companyCode) {
|
||
|
|
return res.status(401).json({
|
||
|
|
success: false,
|
||
|
|
message: "인증 정보가 없습니다.",
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
const result = await dataflowDiagramService.getDataflowDiagrams(
|
||
|
|
companyCode,
|
||
|
|
parseInt(page as string),
|
||
|
|
parseInt(size as string),
|
||
|
|
searchTerm as string
|
||
|
|
);
|
||
|
|
|
||
|
|
res.json({
|
||
|
|
success: true,
|
||
|
|
message: "관계도 목록을 성공적으로 조회했습니다.",
|
||
|
|
data: result,
|
||
|
|
});
|
||
|
|
} catch (error) {
|
||
|
|
console.error("관계도 목록 조회 실패:", error);
|
||
|
|
res.status(500).json({
|
||
|
|
success: false,
|
||
|
|
message: "관계도 목록 조회 중 오류가 발생했습니다.",
|
||
|
|
});
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 특정 관계도 조회
|
||
|
|
* GET /api/dataflow-diagrams/:diagramId
|
||
|
|
*/
|
||
|
|
export const getDataflowDiagramById = async (
|
||
|
|
req: AuthenticatedRequest,
|
||
|
|
res: Response
|
||
|
|
) => {
|
||
|
|
try {
|
||
|
|
const { diagramId } = req.params;
|
||
|
|
const companyCode = req.user?.companyCode;
|
||
|
|
|
||
|
|
if (!companyCode) {
|
||
|
|
return res.status(401).json({
|
||
|
|
success: false,
|
||
|
|
message: "인증 정보가 없습니다.",
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
const diagram = await dataflowDiagramService.getDataflowDiagramById(
|
||
|
|
parseInt(diagramId),
|
||
|
|
companyCode
|
||
|
|
);
|
||
|
|
|
||
|
|
if (!diagram) {
|
||
|
|
return res.status(404).json({
|
||
|
|
success: false,
|
||
|
|
message: "관계도를 찾을 수 없습니다.",
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
res.json({
|
||
|
|
success: true,
|
||
|
|
message: "관계도를 성공적으로 조회했습니다.",
|
||
|
|
data: diagram,
|
||
|
|
});
|
||
|
|
} catch (error) {
|
||
|
|
console.error("관계도 조회 실패:", error);
|
||
|
|
res.status(500).json({
|
||
|
|
success: false,
|
||
|
|
message: "관계도 조회 중 오류가 발생했습니다.",
|
||
|
|
});
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 관계도 생성
|
||
|
|
* POST /api/dataflow-diagrams
|
||
|
|
*/
|
||
|
|
export const createDataflowDiagram = async (
|
||
|
|
req: AuthenticatedRequest,
|
||
|
|
res: Response
|
||
|
|
) => {
|
||
|
|
try {
|
||
|
|
const { diagram_name, relationships } = req.body;
|
||
|
|
const companyCode = req.user?.companyCode;
|
||
|
|
const userId = req.user?.userId;
|
||
|
|
|
||
|
|
if (!companyCode) {
|
||
|
|
return res.status(401).json({
|
||
|
|
success: false,
|
||
|
|
message: "인증 정보가 없습니다.",
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
if (!diagram_name || !relationships) {
|
||
|
|
return res.status(400).json({
|
||
|
|
success: false,
|
||
|
|
message: "관계도 이름과 관계 정보는 필수입니다.",
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
const diagram = await dataflowDiagramService.createDataflowDiagram({
|
||
|
|
diagram_name,
|
||
|
|
relationships,
|
||
|
|
company_code: companyCode,
|
||
|
|
created_by: userId,
|
||
|
|
});
|
||
|
|
|
||
|
|
res.status(201).json({
|
||
|
|
success: true,
|
||
|
|
message: "관계도가 성공적으로 생성되었습니다.",
|
||
|
|
data: diagram,
|
||
|
|
});
|
||
|
|
} catch (error: any) {
|
||
|
|
console.error("관계도 생성 실패:", error);
|
||
|
|
|
||
|
|
// 중복 이름 오류 처리
|
||
|
|
if (
|
||
|
|
error.code === "P2002" &&
|
||
|
|
error.meta?.target?.includes("diagram_name")
|
||
|
|
) {
|
||
|
|
return res.status(409).json({
|
||
|
|
success: false,
|
||
|
|
message: "같은 이름의 관계도가 이미 존재합니다.",
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
res.status(500).json({
|
||
|
|
success: false,
|
||
|
|
message: "관계도 생성 중 오류가 발생했습니다.",
|
||
|
|
});
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 관계도 수정
|
||
|
|
* PUT /api/dataflow-diagrams/:diagramId
|
||
|
|
*/
|
||
|
|
export const updateDataflowDiagram = async (
|
||
|
|
req: AuthenticatedRequest,
|
||
|
|
res: Response
|
||
|
|
) => {
|
||
|
|
try {
|
||
|
|
const { diagramId } = req.params;
|
||
|
|
const { diagram_name, relationships } = req.body;
|
||
|
|
const companyCode = req.user?.companyCode;
|
||
|
|
const userId = req.user?.userId;
|
||
|
|
|
||
|
|
if (!companyCode) {
|
||
|
|
return res.status(401).json({
|
||
|
|
success: false,
|
||
|
|
message: "인증 정보가 없습니다.",
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
const diagram = await dataflowDiagramService.updateDataflowDiagram(
|
||
|
|
parseInt(diagramId),
|
||
|
|
companyCode,
|
||
|
|
{
|
||
|
|
diagram_name,
|
||
|
|
relationships,
|
||
|
|
updated_by: userId,
|
||
|
|
}
|
||
|
|
);
|
||
|
|
|
||
|
|
if (!diagram) {
|
||
|
|
return res.status(404).json({
|
||
|
|
success: false,
|
||
|
|
message: "관계도를 찾을 수 없습니다.",
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
res.json({
|
||
|
|
success: true,
|
||
|
|
message: "관계도가 성공적으로 수정되었습니다.",
|
||
|
|
data: diagram,
|
||
|
|
});
|
||
|
|
} catch (error: any) {
|
||
|
|
console.error("관계도 수정 실패:", error);
|
||
|
|
|
||
|
|
// 중복 이름 오류 처리
|
||
|
|
if (
|
||
|
|
error.code === "P2002" &&
|
||
|
|
error.meta?.target?.includes("diagram_name")
|
||
|
|
) {
|
||
|
|
return res.status(409).json({
|
||
|
|
success: false,
|
||
|
|
message: "같은 이름의 관계도가 이미 존재합니다.",
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
res.status(500).json({
|
||
|
|
success: false,
|
||
|
|
message: "관계도 수정 중 오류가 발생했습니다.",
|
||
|
|
});
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 관계도 삭제
|
||
|
|
* DELETE /api/dataflow-diagrams/:diagramId
|
||
|
|
*/
|
||
|
|
export const deleteDataflowDiagram = async (
|
||
|
|
req: AuthenticatedRequest,
|
||
|
|
res: Response
|
||
|
|
) => {
|
||
|
|
try {
|
||
|
|
const { diagramId } = req.params;
|
||
|
|
const companyCode = req.user?.companyCode;
|
||
|
|
|
||
|
|
if (!companyCode) {
|
||
|
|
return res.status(401).json({
|
||
|
|
success: false,
|
||
|
|
message: "인증 정보가 없습니다.",
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
const deleted = await dataflowDiagramService.deleteDataflowDiagram(
|
||
|
|
parseInt(diagramId),
|
||
|
|
companyCode
|
||
|
|
);
|
||
|
|
|
||
|
|
if (!deleted) {
|
||
|
|
return res.status(404).json({
|
||
|
|
success: false,
|
||
|
|
message: "관계도를 찾을 수 없습니다.",
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
res.json({
|
||
|
|
success: true,
|
||
|
|
message: "관계도가 성공적으로 삭제되었습니다.",
|
||
|
|
});
|
||
|
|
} catch (error) {
|
||
|
|
console.error("관계도 삭제 실패:", error);
|
||
|
|
res.status(500).json({
|
||
|
|
success: false,
|
||
|
|
message: "관계도 삭제 중 오류가 발생했습니다.",
|
||
|
|
});
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 관계도 복제
|
||
|
|
* POST /api/dataflow-diagrams/:diagramId/copy
|
||
|
|
*/
|
||
|
|
export const copyDataflowDiagram = async (
|
||
|
|
req: AuthenticatedRequest,
|
||
|
|
res: Response
|
||
|
|
) => {
|
||
|
|
try {
|
||
|
|
const { diagramId } = req.params;
|
||
|
|
const { new_name } = req.body; // 선택적 새 이름
|
||
|
|
const companyCode = req.user?.companyCode;
|
||
|
|
const userId = req.user?.userId;
|
||
|
|
|
||
|
|
if (!companyCode) {
|
||
|
|
return res.status(401).json({
|
||
|
|
success: false,
|
||
|
|
message: "인증 정보가 없습니다.",
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
const copiedDiagram = await dataflowDiagramService.copyDataflowDiagram(
|
||
|
|
parseInt(diagramId),
|
||
|
|
companyCode,
|
||
|
|
new_name,
|
||
|
|
userId
|
||
|
|
);
|
||
|
|
|
||
|
|
if (!copiedDiagram) {
|
||
|
|
return res.status(404).json({
|
||
|
|
success: false,
|
||
|
|
message: "원본 관계도를 찾을 수 없습니다.",
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
res.status(201).json({
|
||
|
|
success: true,
|
||
|
|
message: "관계도가 성공적으로 복제되었습니다.",
|
||
|
|
data: copiedDiagram,
|
||
|
|
});
|
||
|
|
} catch (error: any) {
|
||
|
|
console.error("관계도 복제 실패:", error);
|
||
|
|
|
||
|
|
// 중복 이름 오류 처리
|
||
|
|
if (
|
||
|
|
error.code === "P2002" &&
|
||
|
|
error.meta?.target?.includes("diagram_name")
|
||
|
|
) {
|
||
|
|
return res.status(409).json({
|
||
|
|
success: false,
|
||
|
|
message: "같은 이름의 관계도가 이미 존재합니다.",
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
res.status(500).json({
|
||
|
|
success: false,
|
||
|
|
message: "관계도 복제 중 오류가 발생했습니다.",
|
||
|
|
});
|
||
|
|
}
|
||
|
|
};
|