Merge branch 'dev' of http://39.117.244.52:3000/kjs/ERP-node into dataflowMng
This commit is contained in:
@@ -204,7 +204,15 @@ class ComponentStandardController {
|
||||
});
|
||||
return;
|
||||
} catch (error) {
|
||||
console.error("컴포넌트 수정 실패:", error);
|
||||
const { component_code } = req.params;
|
||||
const updateData = req.body;
|
||||
|
||||
console.error("컴포넌트 수정 실패 [상세]:", {
|
||||
component_code,
|
||||
updateData,
|
||||
error: error instanceof Error ? error.message : error,
|
||||
stack: error instanceof Error ? error.stack : undefined,
|
||||
});
|
||||
res.status(400).json({
|
||||
success: false,
|
||||
message: "컴포넌트 수정에 실패했습니다.",
|
||||
@@ -382,6 +390,52 @@ class ComponentStandardController {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 컴포넌트 코드 중복 체크
|
||||
*/
|
||||
async checkDuplicate(
|
||||
req: AuthenticatedRequest,
|
||||
res: Response
|
||||
): Promise<void> {
|
||||
try {
|
||||
const { component_code } = req.params;
|
||||
|
||||
if (!component_code) {
|
||||
res.status(400).json({
|
||||
success: false,
|
||||
message: "컴포넌트 코드가 필요합니다.",
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
const isDuplicate = await componentStandardService.checkDuplicate(
|
||||
component_code,
|
||||
req.user?.companyCode
|
||||
);
|
||||
|
||||
console.log(
|
||||
`🔍 중복 체크 결과: component_code=${component_code}, company_code=${req.user?.companyCode}, isDuplicate=${isDuplicate}`
|
||||
);
|
||||
|
||||
res.status(200).json({
|
||||
success: true,
|
||||
data: { isDuplicate, component_code },
|
||||
message: isDuplicate
|
||||
? "이미 사용 중인 컴포넌트 코드입니다."
|
||||
: "사용 가능한 컴포넌트 코드입니다.",
|
||||
});
|
||||
return;
|
||||
} catch (error) {
|
||||
console.error("컴포넌트 코드 중복 체크 실패:", error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: "컴포넌트 코드 중복 체크에 실패했습니다.",
|
||||
error: error instanceof Error ? error.message : "알 수 없는 오류",
|
||||
});
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export default new ComponentStandardController();
|
||||
|
||||
276
backend-node/src/controllers/layoutController.ts
Normal file
276
backend-node/src/controllers/layoutController.ts
Normal file
@@ -0,0 +1,276 @@
|
||||
import { Request, Response } from "express";
|
||||
import { layoutService } from "../services/layoutService";
|
||||
import {
|
||||
CreateLayoutRequest,
|
||||
UpdateLayoutRequest,
|
||||
GetLayoutsRequest,
|
||||
DuplicateLayoutRequest,
|
||||
} from "../types/layout";
|
||||
|
||||
export class LayoutController {
|
||||
/**
|
||||
* 레이아웃 목록 조회
|
||||
*/
|
||||
async getLayouts(req: Request, res: Response): Promise<void> {
|
||||
try {
|
||||
const { user } = req as any;
|
||||
const {
|
||||
page = 1,
|
||||
size = 20,
|
||||
category,
|
||||
layoutType,
|
||||
searchTerm,
|
||||
includePublic = true,
|
||||
} = req.query as any;
|
||||
|
||||
const params = {
|
||||
page: parseInt(page, 10),
|
||||
size: parseInt(size, 10),
|
||||
category,
|
||||
layoutType,
|
||||
searchTerm,
|
||||
companyCode: user.companyCode,
|
||||
includePublic: includePublic === "true",
|
||||
};
|
||||
|
||||
const result = await layoutService.getLayouts(params);
|
||||
|
||||
const response = {
|
||||
...result,
|
||||
page: params.page,
|
||||
size: params.size,
|
||||
totalPages: Math.ceil(result.total / params.size),
|
||||
};
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
data: response,
|
||||
});
|
||||
} catch (error) {
|
||||
console.error("레이아웃 목록 조회 오류:", error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: "레이아웃 목록 조회에 실패했습니다.",
|
||||
error: error instanceof Error ? error.message : "Unknown error",
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 레이아웃 상세 조회
|
||||
*/
|
||||
async getLayoutById(req: Request, res: Response): Promise<void> {
|
||||
try {
|
||||
const { user } = req as any;
|
||||
const { id: layoutCode } = req.params;
|
||||
|
||||
const layout = await layoutService.getLayoutById(
|
||||
layoutCode,
|
||||
user.companyCode
|
||||
);
|
||||
|
||||
if (!layout) {
|
||||
res.status(404).json({
|
||||
success: false,
|
||||
message: "레이아웃을 찾을 수 없습니다.",
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
data: layout,
|
||||
});
|
||||
} catch (error) {
|
||||
console.error("레이아웃 상세 조회 오류:", error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: "레이아웃 상세 조회에 실패했습니다.",
|
||||
error: error instanceof Error ? error.message : "Unknown error",
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 레이아웃 생성
|
||||
*/
|
||||
async createLayout(req: Request, res: Response): Promise<void> {
|
||||
try {
|
||||
const { user } = req as any;
|
||||
const layoutRequest: CreateLayoutRequest = req.body;
|
||||
|
||||
// 요청 데이터 검증
|
||||
if (
|
||||
!layoutRequest.layoutName ||
|
||||
!layoutRequest.layoutType ||
|
||||
!layoutRequest.category
|
||||
) {
|
||||
res.status(400).json({
|
||||
success: false,
|
||||
message:
|
||||
"필수 필드가 누락되었습니다. (layoutName, layoutType, category)",
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
if (!layoutRequest.layoutConfig || !layoutRequest.zonesConfig) {
|
||||
res.status(400).json({
|
||||
success: false,
|
||||
message: "레이아웃 설정과 존 설정은 필수입니다.",
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
const layout = await layoutService.createLayout(
|
||||
layoutRequest,
|
||||
user.companyCode,
|
||||
user.userId
|
||||
);
|
||||
|
||||
res.status(201).json({
|
||||
success: true,
|
||||
data: layout,
|
||||
message: "레이아웃이 성공적으로 생성되었습니다.",
|
||||
});
|
||||
} catch (error) {
|
||||
console.error("레이아웃 생성 오류:", error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: "레이아웃 생성에 실패했습니다.",
|
||||
error: error instanceof Error ? error.message : "Unknown error",
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 레이아웃 수정
|
||||
*/
|
||||
async updateLayout(req: Request, res: Response): Promise<void> {
|
||||
try {
|
||||
const { user } = req as any;
|
||||
const { id: layoutCode } = req.params;
|
||||
const updateRequest: Partial<CreateLayoutRequest> = req.body;
|
||||
|
||||
const updatedLayout = await layoutService.updateLayout(
|
||||
{ ...updateRequest, layoutCode },
|
||||
user.companyCode,
|
||||
user.userId
|
||||
);
|
||||
|
||||
if (!updatedLayout) {
|
||||
res.status(404).json({
|
||||
success: false,
|
||||
message: "레이아웃을 찾을 수 없거나 수정 권한이 없습니다.",
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
data: updatedLayout,
|
||||
message: "레이아웃이 성공적으로 수정되었습니다.",
|
||||
});
|
||||
} catch (error) {
|
||||
console.error("레이아웃 수정 오류:", error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: "레이아웃 수정에 실패했습니다.",
|
||||
error: error instanceof Error ? error.message : "Unknown error",
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 레이아웃 삭제
|
||||
*/
|
||||
async deleteLayout(req: Request, res: Response): Promise<void> {
|
||||
try {
|
||||
const { user } = req as any;
|
||||
const { id: layoutCode } = req.params;
|
||||
|
||||
await layoutService.deleteLayout(
|
||||
layoutCode,
|
||||
user.companyCode,
|
||||
user.userId
|
||||
);
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
message: "레이아웃이 성공적으로 삭제되었습니다.",
|
||||
});
|
||||
} catch (error) {
|
||||
console.error("레이아웃 삭제 오류:", error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: "레이아웃 삭제에 실패했습니다.",
|
||||
error: error instanceof Error ? error.message : "Unknown error",
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 레이아웃 복제
|
||||
*/
|
||||
async duplicateLayout(req: Request, res: Response): Promise<void> {
|
||||
try {
|
||||
const { user } = req as any;
|
||||
const { id: layoutCode } = req.params;
|
||||
const { newName }: DuplicateLayoutRequest = req.body;
|
||||
|
||||
if (!newName) {
|
||||
res.status(400).json({
|
||||
success: false,
|
||||
message: "새 레이아웃 이름이 필요합니다.",
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
const duplicatedLayout = await layoutService.duplicateLayout(
|
||||
layoutCode,
|
||||
newName,
|
||||
user.companyCode,
|
||||
user.userId
|
||||
);
|
||||
|
||||
res.status(201).json({
|
||||
success: true,
|
||||
data: duplicatedLayout,
|
||||
message: "레이아웃이 성공적으로 복제되었습니다.",
|
||||
});
|
||||
} catch (error) {
|
||||
console.error("레이아웃 복제 오류:", error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: "레이아웃 복제에 실패했습니다.",
|
||||
error: error instanceof Error ? error.message : "Unknown error",
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 카테고리별 레이아웃 개수 조회
|
||||
*/
|
||||
async getLayoutCountsByCategory(req: Request, res: Response): Promise<void> {
|
||||
try {
|
||||
const { user } = req as any;
|
||||
|
||||
const counts = await layoutService.getLayoutCountsByCategory(
|
||||
user.companyCode
|
||||
);
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
data: counts,
|
||||
});
|
||||
} catch (error) {
|
||||
console.error("카테고리별 레이아웃 개수 조회 오류:", error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: "카테고리별 레이아웃 개수 조회에 실패했습니다.",
|
||||
error: error instanceof Error ? error.message : "Unknown error",
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export const layoutController = new LayoutController();
|
||||
@@ -1,8 +1,14 @@
|
||||
import { Response } from "express";
|
||||
import { AuthenticatedRequest } from "../types/auth";
|
||||
import { Request, Response } from "express";
|
||||
import { templateStandardService } from "../services/templateStandardService";
|
||||
import { handleError } from "../utils/errorHandler";
|
||||
import { checkMissingFields } from "../utils/validation";
|
||||
|
||||
interface AuthenticatedRequest extends Request {
|
||||
user?: {
|
||||
userId: string;
|
||||
companyCode: string;
|
||||
company_code?: string;
|
||||
[key: string]: any;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* 템플릿 표준 관리 컨트롤러
|
||||
@@ -11,26 +17,26 @@ export class TemplateStandardController {
|
||||
/**
|
||||
* 템플릿 목록 조회
|
||||
*/
|
||||
async getTemplates(req: AuthenticatedRequest, res: Response) {
|
||||
async getTemplates(req: AuthenticatedRequest, res: Response): Promise<void> {
|
||||
try {
|
||||
const {
|
||||
active = "Y",
|
||||
category,
|
||||
search,
|
||||
companyCode,
|
||||
company_code,
|
||||
is_public = "Y",
|
||||
page = "1",
|
||||
limit = "50",
|
||||
} = req.query;
|
||||
|
||||
const user = req.user;
|
||||
const userCompanyCode = user?.companyCode || "DEFAULT";
|
||||
const userCompanyCode = user?.company_code || "DEFAULT";
|
||||
|
||||
const result = await templateStandardService.getTemplates({
|
||||
active: active as string,
|
||||
category: category as string,
|
||||
search: search as string,
|
||||
company_code: (companyCode as string) || userCompanyCode,
|
||||
company_code: (company_code as string) || userCompanyCode,
|
||||
is_public: is_public as string,
|
||||
page: parseInt(page as string),
|
||||
limit: parseInt(limit as string),
|
||||
@@ -47,23 +53,24 @@ export class TemplateStandardController {
|
||||
},
|
||||
});
|
||||
} catch (error) {
|
||||
return handleError(
|
||||
res,
|
||||
error,
|
||||
"템플릿 목록 조회 중 오류가 발생했습니다."
|
||||
);
|
||||
console.error("템플릿 목록 조회 중 오류:", error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: "템플릿 목록 조회 중 오류가 발생했습니다.",
|
||||
error: error instanceof Error ? error.message : "알 수 없는 오류",
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 템플릿 상세 조회
|
||||
*/
|
||||
async getTemplate(req: AuthenticatedRequest, res: Response) {
|
||||
async getTemplate(req: AuthenticatedRequest, res: Response): Promise<void> {
|
||||
try {
|
||||
const { templateCode } = req.params;
|
||||
|
||||
if (!templateCode) {
|
||||
return res.status(400).json({
|
||||
res.status(400).json({
|
||||
success: false,
|
||||
error: "템플릿 코드가 필요합니다.",
|
||||
});
|
||||
@@ -72,7 +79,7 @@ export class TemplateStandardController {
|
||||
const template = await templateStandardService.getTemplate(templateCode);
|
||||
|
||||
if (!template) {
|
||||
return res.status(404).json({
|
||||
res.status(404).json({
|
||||
success: false,
|
||||
error: "템플릿을 찾을 수 없습니다.",
|
||||
});
|
||||
@@ -83,40 +90,46 @@ export class TemplateStandardController {
|
||||
data: template,
|
||||
});
|
||||
} catch (error) {
|
||||
return handleError(res, error, "템플릿 조회 중 오류가 발생했습니다.");
|
||||
console.error("템플릿 조회 중 오류:", error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: "템플릿 조회 중 오류가 발생했습니다.",
|
||||
error: error instanceof Error ? error.message : "알 수 없는 오류",
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 템플릿 생성
|
||||
*/
|
||||
async createTemplate(req: AuthenticatedRequest, res: Response) {
|
||||
async createTemplate(
|
||||
req: AuthenticatedRequest,
|
||||
res: Response
|
||||
): Promise<void> {
|
||||
try {
|
||||
const user = req.user;
|
||||
const templateData = req.body;
|
||||
|
||||
// 필수 필드 검증
|
||||
const requiredFields = [
|
||||
"template_code",
|
||||
"template_name",
|
||||
"category",
|
||||
"layout_config",
|
||||
];
|
||||
const missingFields = checkMissingFields(templateData, requiredFields);
|
||||
|
||||
if (missingFields.length > 0) {
|
||||
return res.status(400).json({
|
||||
if (
|
||||
!templateData.template_code ||
|
||||
!templateData.template_name ||
|
||||
!templateData.category ||
|
||||
!templateData.layout_config
|
||||
) {
|
||||
res.status(400).json({
|
||||
success: false,
|
||||
error: `필수 필드가 누락되었습니다: ${missingFields.join(", ")}`,
|
||||
message:
|
||||
"필수 필드가 누락되었습니다. (template_code, template_name, category, layout_config)",
|
||||
});
|
||||
}
|
||||
|
||||
// 회사 코드와 생성자 정보 추가
|
||||
const templateWithMeta = {
|
||||
...templateData,
|
||||
company_code: user?.companyCode || "DEFAULT",
|
||||
created_by: user?.userId || "system",
|
||||
updated_by: user?.userId || "system",
|
||||
company_code: user?.company_code || "DEFAULT",
|
||||
created_by: user?.user_id || "system",
|
||||
updated_by: user?.user_id || "system",
|
||||
};
|
||||
|
||||
const newTemplate =
|
||||
@@ -128,21 +141,29 @@ export class TemplateStandardController {
|
||||
message: "템플릿이 성공적으로 생성되었습니다.",
|
||||
});
|
||||
} catch (error) {
|
||||
return handleError(res, error, "템플릿 생성 중 오류가 발생했습니다.");
|
||||
console.error("템플릿 생성 중 오류:", error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: "템플릿 생성 중 오류가 발생했습니다.",
|
||||
error: error instanceof Error ? error.message : "알 수 없는 오류",
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 템플릿 수정
|
||||
*/
|
||||
async updateTemplate(req: AuthenticatedRequest, res: Response) {
|
||||
async updateTemplate(
|
||||
req: AuthenticatedRequest,
|
||||
res: Response
|
||||
): Promise<void> {
|
||||
try {
|
||||
const { templateCode } = req.params;
|
||||
const templateData = req.body;
|
||||
const user = req.user;
|
||||
|
||||
if (!templateCode) {
|
||||
return res.status(400).json({
|
||||
res.status(400).json({
|
||||
success: false,
|
||||
error: "템플릿 코드가 필요합니다.",
|
||||
});
|
||||
@@ -151,7 +172,7 @@ export class TemplateStandardController {
|
||||
// 수정자 정보 추가
|
||||
const templateWithMeta = {
|
||||
...templateData,
|
||||
updated_by: user?.userId || "system",
|
||||
updated_by: user?.user_id || "system",
|
||||
};
|
||||
|
||||
const updatedTemplate = await templateStandardService.updateTemplate(
|
||||
@@ -160,7 +181,7 @@ export class TemplateStandardController {
|
||||
);
|
||||
|
||||
if (!updatedTemplate) {
|
||||
return res.status(404).json({
|
||||
res.status(404).json({
|
||||
success: false,
|
||||
error: "템플릿을 찾을 수 없습니다.",
|
||||
});
|
||||
@@ -172,19 +193,27 @@ export class TemplateStandardController {
|
||||
message: "템플릿이 성공적으로 수정되었습니다.",
|
||||
});
|
||||
} catch (error) {
|
||||
return handleError(res, error, "템플릿 수정 중 오류가 발생했습니다.");
|
||||
console.error("템플릿 수정 중 오류:", error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: "템플릿 수정 중 오류가 발생했습니다.",
|
||||
error: error instanceof Error ? error.message : "알 수 없는 오류",
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 템플릿 삭제
|
||||
*/
|
||||
async deleteTemplate(req: AuthenticatedRequest, res: Response) {
|
||||
async deleteTemplate(
|
||||
req: AuthenticatedRequest,
|
||||
res: Response
|
||||
): Promise<void> {
|
||||
try {
|
||||
const { templateCode } = req.params;
|
||||
|
||||
if (!templateCode) {
|
||||
return res.status(400).json({
|
||||
res.status(400).json({
|
||||
success: false,
|
||||
error: "템플릿 코드가 필요합니다.",
|
||||
});
|
||||
@@ -194,7 +223,7 @@ export class TemplateStandardController {
|
||||
await templateStandardService.deleteTemplate(templateCode);
|
||||
|
||||
if (!deleted) {
|
||||
return res.status(404).json({
|
||||
res.status(404).json({
|
||||
success: false,
|
||||
error: "템플릿을 찾을 수 없습니다.",
|
||||
});
|
||||
@@ -205,19 +234,27 @@ export class TemplateStandardController {
|
||||
message: "템플릿이 성공적으로 삭제되었습니다.",
|
||||
});
|
||||
} catch (error) {
|
||||
return handleError(res, error, "템플릿 삭제 중 오류가 발생했습니다.");
|
||||
console.error("템플릿 삭제 중 오류:", error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: "템플릿 삭제 중 오류가 발생했습니다.",
|
||||
error: error instanceof Error ? error.message : "알 수 없는 오류",
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 템플릿 정렬 순서 일괄 업데이트
|
||||
*/
|
||||
async updateSortOrder(req: AuthenticatedRequest, res: Response) {
|
||||
async updateSortOrder(
|
||||
req: AuthenticatedRequest,
|
||||
res: Response
|
||||
): Promise<void> {
|
||||
try {
|
||||
const { templates } = req.body;
|
||||
|
||||
if (!Array.isArray(templates)) {
|
||||
return res.status(400).json({
|
||||
res.status(400).json({
|
||||
success: false,
|
||||
error: "templates는 배열이어야 합니다.",
|
||||
});
|
||||
@@ -230,25 +267,29 @@ export class TemplateStandardController {
|
||||
message: "템플릿 정렬 순서가 성공적으로 업데이트되었습니다.",
|
||||
});
|
||||
} catch (error) {
|
||||
return handleError(
|
||||
res,
|
||||
error,
|
||||
"템플릿 정렬 순서 업데이트 중 오류가 발생했습니다."
|
||||
);
|
||||
console.error("템플릿 정렬 순서 업데이트 중 오류:", error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: "템플릿 정렬 순서 업데이트 중 오류가 발생했습니다.",
|
||||
error: error instanceof Error ? error.message : "알 수 없는 오류",
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 템플릿 복제
|
||||
*/
|
||||
async duplicateTemplate(req: AuthenticatedRequest, res: Response) {
|
||||
async duplicateTemplate(
|
||||
req: AuthenticatedRequest,
|
||||
res: Response
|
||||
): Promise<void> {
|
||||
try {
|
||||
const { templateCode } = req.params;
|
||||
const { new_template_code, new_template_name } = req.body;
|
||||
const user = req.user;
|
||||
|
||||
if (!templateCode || !new_template_code || !new_template_name) {
|
||||
return res.status(400).json({
|
||||
res.status(400).json({
|
||||
success: false,
|
||||
error: "필수 필드가 누락되었습니다.",
|
||||
});
|
||||
@@ -259,8 +300,8 @@ export class TemplateStandardController {
|
||||
originalCode: templateCode,
|
||||
newCode: new_template_code,
|
||||
newName: new_template_name,
|
||||
company_code: user?.companyCode || "DEFAULT",
|
||||
created_by: user?.userId || "system",
|
||||
company_code: user?.company_code || "DEFAULT",
|
||||
created_by: user?.user_id || "system",
|
||||
});
|
||||
|
||||
res.status(201).json({
|
||||
@@ -269,17 +310,22 @@ export class TemplateStandardController {
|
||||
message: "템플릿이 성공적으로 복제되었습니다.",
|
||||
});
|
||||
} catch (error) {
|
||||
return handleError(res, error, "템플릿 복제 중 오류가 발생했습니다.");
|
||||
console.error("템플릿 복제 중 오류:", error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: "템플릿 복제 중 오류가 발생했습니다.",
|
||||
error: error instanceof Error ? error.message : "알 수 없는 오류",
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 템플릿 카테고리 목록 조회
|
||||
*/
|
||||
async getCategories(req: AuthenticatedRequest, res: Response) {
|
||||
async getCategories(req: AuthenticatedRequest, res: Response): Promise<void> {
|
||||
try {
|
||||
const user = req.user;
|
||||
const companyCode = user?.companyCode || "DEFAULT";
|
||||
const companyCode = user?.company_code || "DEFAULT";
|
||||
|
||||
const categories =
|
||||
await templateStandardService.getCategories(companyCode);
|
||||
@@ -289,24 +335,28 @@ export class TemplateStandardController {
|
||||
data: categories,
|
||||
});
|
||||
} catch (error) {
|
||||
return handleError(
|
||||
res,
|
||||
error,
|
||||
"템플릿 카테고리 조회 중 오류가 발생했습니다."
|
||||
);
|
||||
console.error("템플릿 카테고리 조회 중 오류:", error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: "템플릿 카테고리 조회 중 오류가 발생했습니다.",
|
||||
error: error instanceof Error ? error.message : "알 수 없는 오류",
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 템플릿 가져오기 (JSON 파일에서)
|
||||
*/
|
||||
async importTemplate(req: AuthenticatedRequest, res: Response) {
|
||||
async importTemplate(
|
||||
req: AuthenticatedRequest,
|
||||
res: Response
|
||||
): Promise<void> {
|
||||
try {
|
||||
const user = req.user;
|
||||
const templateData = req.body;
|
||||
|
||||
if (!templateData.layout_config) {
|
||||
return res.status(400).json({
|
||||
res.status(400).json({
|
||||
success: false,
|
||||
error: "유효한 템플릿 데이터가 아닙니다.",
|
||||
});
|
||||
@@ -315,9 +365,9 @@ export class TemplateStandardController {
|
||||
// 회사 코드와 생성자 정보 추가
|
||||
const templateWithMeta = {
|
||||
...templateData,
|
||||
company_code: user?.companyCode || "DEFAULT",
|
||||
created_by: user?.userId || "system",
|
||||
updated_by: user?.userId || "system",
|
||||
company_code: user?.company_code || "DEFAULT",
|
||||
created_by: user?.user_id || "system",
|
||||
updated_by: user?.user_id || "system",
|
||||
};
|
||||
|
||||
const importedTemplate =
|
||||
@@ -329,31 +379,41 @@ export class TemplateStandardController {
|
||||
message: "템플릿이 성공적으로 가져왔습니다.",
|
||||
});
|
||||
} catch (error) {
|
||||
return handleError(res, error, "템플릿 가져오기 중 오류가 발생했습니다.");
|
||||
console.error("템플릿 가져오기 중 오류:", error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: "템플릿 가져오기 중 오류가 발생했습니다.",
|
||||
error: error instanceof Error ? error.message : "알 수 없는 오류",
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 템플릿 내보내기 (JSON 형태로)
|
||||
*/
|
||||
async exportTemplate(req: AuthenticatedRequest, res: Response) {
|
||||
async exportTemplate(
|
||||
req: AuthenticatedRequest,
|
||||
res: Response
|
||||
): Promise<void> {
|
||||
try {
|
||||
const { templateCode } = req.params;
|
||||
|
||||
if (!templateCode) {
|
||||
return res.status(400).json({
|
||||
res.status(400).json({
|
||||
success: false,
|
||||
error: "템플릿 코드가 필요합니다.",
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
const template = await templateStandardService.getTemplate(templateCode);
|
||||
|
||||
if (!template) {
|
||||
return res.status(404).json({
|
||||
res.status(404).json({
|
||||
success: false,
|
||||
error: "템플릿을 찾을 수 없습니다.",
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
// 내보내기용 데이터 (메타데이터 제외)
|
||||
@@ -373,7 +433,12 @@ export class TemplateStandardController {
|
||||
data: exportData,
|
||||
});
|
||||
} catch (error) {
|
||||
return handleError(res, error, "템플릿 내보내기 중 오류가 발생했습니다.");
|
||||
console.error("템플릿 내보내기 중 오류:", error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: "템플릿 내보내기 중 오류가 발생했습니다.",
|
||||
error: error instanceof Error ? error.message : "알 수 없는 오류",
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user