feat: 게시판 템플릿 기반 생성 기능 및 SVG 아이콘 적용
- 게시판 템플릿 설정 파일 추가 (config/board_templates.php) - 시스템 템플릿: 공지사항, 1:1문의, FAQ, 팝업공지 - 테넌트 템플릿: 자유게시판, 갤러리, 자료실, 공지사항, Q&A - BoardService 템플릿 관련 메서드 추가 - BoardController 템플릿 API 엔드포인트 추가 - 게시판 생성 UI 3단계 위자드로 개선 - 모든 템플릿 아이콘을 이모지에서 SVG path로 변경 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -281,4 +281,140 @@ public function reorderFields(Request $request, int $id): JsonResponse
|
||||
'message' => '필드 순서가 변경되었습니다.',
|
||||
]);
|
||||
}
|
||||
|
||||
// =========================================================================
|
||||
// 템플릿 API
|
||||
// =========================================================================
|
||||
|
||||
/**
|
||||
* 템플릿 목록 조회
|
||||
*/
|
||||
public function templates(Request $request): JsonResponse
|
||||
{
|
||||
$type = $request->get('type', 'all'); // system, tenant, all
|
||||
|
||||
$templates = $this->boardService->getTemplates($type);
|
||||
$baseFields = $this->boardService->getBaseFields();
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'data' => [
|
||||
'templates' => $templates,
|
||||
'base_fields' => $baseFields,
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 특정 템플릿 상세 조회
|
||||
*/
|
||||
public function templateDetail(string $type, string $key): JsonResponse
|
||||
{
|
||||
$template = $this->boardService->getTemplate($type, $key);
|
||||
|
||||
if (! $template) {
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => '템플릿을 찾을 수 없습니다.',
|
||||
], 404);
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'data' => $template,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 템플릿 기반 게시판 생성
|
||||
*/
|
||||
public function storeFromTemplate(Request $request): JsonResponse
|
||||
{
|
||||
$validated = $request->validate([
|
||||
'board_code' => 'required|string|max:50',
|
||||
'name' => 'required|string|max:100',
|
||||
'template_type' => 'nullable|string|in:system,tenant',
|
||||
'template_key' => 'nullable|string|max:50',
|
||||
'tenant_id' => 'nullable|integer|exists:tenants,id',
|
||||
'board_type' => 'nullable|string|max:50',
|
||||
'description' => 'nullable|string|max:500',
|
||||
'editor_type' => 'nullable|string|in:wysiwyg,markdown,text',
|
||||
'allow_files' => 'nullable|boolean',
|
||||
'max_file_count' => 'nullable|integer|min:0|max:100',
|
||||
'max_file_size' => 'nullable|integer|min:0',
|
||||
'extra_settings' => 'nullable|array',
|
||||
'is_active' => 'nullable|boolean',
|
||||
]);
|
||||
|
||||
// 코드 중복 체크
|
||||
if (! empty($validated['tenant_id'])) {
|
||||
// 테넌트 게시판
|
||||
if ($this->boardService->isTenantCodeExists($validated['board_code'], $validated['tenant_id'])) {
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => '해당 테넌트에서 이미 사용 중인 게시판 코드입니다.',
|
||||
], 422);
|
||||
}
|
||||
} else {
|
||||
// 시스템 게시판
|
||||
if ($this->boardService->isCodeExists($validated['board_code'])) {
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => '이미 사용 중인 게시판 코드입니다.',
|
||||
], 422);
|
||||
}
|
||||
}
|
||||
|
||||
$board = $this->boardService->createBoardFromTemplate(
|
||||
$validated,
|
||||
$validated['template_type'] ?? null,
|
||||
$validated['template_key'] ?? null
|
||||
);
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'message' => '게시판이 생성되었습니다.',
|
||||
'data' => $board,
|
||||
]);
|
||||
}
|
||||
|
||||
// =========================================================================
|
||||
// 테넌트 관련 API
|
||||
// =========================================================================
|
||||
|
||||
/**
|
||||
* 테넌트 목록 조회 (드롭다운용)
|
||||
*/
|
||||
public function tenants(): JsonResponse
|
||||
{
|
||||
$tenants = $this->boardService->getTenantList();
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'data' => $tenants,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 테넌트 게시판 코드 중복 체크
|
||||
*/
|
||||
public function checkTenantCode(Request $request): JsonResponse
|
||||
{
|
||||
$validated = $request->validate([
|
||||
'code' => 'required|string|max:50',
|
||||
'tenant_id' => 'required|integer|exists:tenants,id',
|
||||
'exclude_id' => 'nullable|integer',
|
||||
]);
|
||||
|
||||
$exists = $this->boardService->isTenantCodeExists(
|
||||
$validated['code'],
|
||||
$validated['tenant_id'],
|
||||
$validated['exclude_id'] ?? null
|
||||
);
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'data' => ['exists' => $exists],
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user