ERP-node/backend-node/src/controllers/layoutController.ts

277 lines
7.2 KiB
TypeScript

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();