277 lines
7.2 KiB
TypeScript
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();
|