feat: [interview] 인터뷰 시나리오 고도화 Phase 1 구현

- InterviewProject/Attachment/Knowledge 모델 3개 신규
- 기존 모델 확장 (Question, Answer, Session, Category)
- 서비스 확장: 프로젝트 CRUD, 첨부파일, 지식 관리
- 컨트롤러 확장: 프로젝트/첨부/지식 API 엔드포인트
- 라우트 20개 추가 (프로젝트, 첨부, 지식)
- InterviewQuestionMasterSeeder: 8개 도메인 80개 질문
- UI 확장: 프로젝트 모드/기존 모드 전환
  - 프로젝트 선택 바, 상태 바, 도메인 사이드바
  - 탭 구조 (질문편집/인터뷰/첨부파일/추출지식)
  - 구조화 답변 입력 (테이블, 수식, 다중선택 등)
  - 첨부파일 업로드/관리
  - 지식 수동 추가/검증/필터링
This commit is contained in:
김보곤
2026-02-28 20:02:47 +09:00
parent 0706617463
commit f74bd8960b
12 changed files with 2062 additions and 24 deletions

View File

@@ -1504,6 +1504,25 @@
Route::get('/api/sessions/{id}', [\App\Http\Controllers\Sales\InterviewScenarioController::class, 'showSession'])->name('api.sessions.show');
Route::post('/api/sessions/toggle-answer', [\App\Http\Controllers\Sales\InterviewScenarioController::class, 'toggleAnswer'])->name('api.sessions.toggle-answer');
Route::post('/api/sessions/{id}/complete', [\App\Http\Controllers\Sales\InterviewScenarioController::class, 'completeSession'])->name('api.sessions.complete');
Route::post('/api/sessions/save-answer', [\App\Http\Controllers\Sales\InterviewScenarioController::class, 'saveAnswer'])->name('api.sessions.save-answer');
// 프로젝트 API
Route::get('/api/projects', [\App\Http\Controllers\Sales\InterviewScenarioController::class, 'projects'])->name('api.projects');
Route::post('/api/projects', [\App\Http\Controllers\Sales\InterviewScenarioController::class, 'storeProject'])->name('api.projects.store');
Route::get('/api/projects/{id}', [\App\Http\Controllers\Sales\InterviewScenarioController::class, 'showProject'])->name('api.projects.show');
Route::put('/api/projects/{id}', [\App\Http\Controllers\Sales\InterviewScenarioController::class, 'updateProject'])->name('api.projects.update');
Route::delete('/api/projects/{id}', [\App\Http\Controllers\Sales\InterviewScenarioController::class, 'destroyProject'])->name('api.projects.destroy');
Route::get('/api/projects/{id}/tree', [\App\Http\Controllers\Sales\InterviewScenarioController::class, 'projectTree'])->name('api.projects.tree');
Route::post('/api/projects/{id}/progress', [\App\Http\Controllers\Sales\InterviewScenarioController::class, 'projectProgress'])->name('api.projects.progress');
// 첨부파일 API
Route::get('/api/projects/{projectId}/attachments', [\App\Http\Controllers\Sales\InterviewScenarioController::class, 'attachments'])->name('api.attachments');
Route::post('/api/projects/{projectId}/attachments', [\App\Http\Controllers\Sales\InterviewScenarioController::class, 'uploadAttachment'])->name('api.attachments.upload');
Route::delete('/api/attachments/{id}', [\App\Http\Controllers\Sales\InterviewScenarioController::class, 'destroyAttachment'])->name('api.attachments.destroy');
// 지식 API
Route::get('/api/projects/{projectId}/knowledge', [\App\Http\Controllers\Sales\InterviewScenarioController::class, 'knowledge'])->name('api.knowledge');
Route::post('/api/projects/{projectId}/knowledge', [\App\Http\Controllers\Sales\InterviewScenarioController::class, 'storeKnowledge'])->name('api.knowledge.store');
Route::put('/api/knowledge/{id}', [\App\Http\Controllers\Sales\InterviewScenarioController::class, 'updateKnowledge'])->name('api.knowledge.update');
Route::post('/api/knowledge/{id}/verify', [\App\Http\Controllers\Sales\InterviewScenarioController::class, 'verifyKnowledge'])->name('api.knowledge.verify');
Route::delete('/api/knowledge/{id}', [\App\Http\Controllers\Sales\InterviewScenarioController::class, 'destroyKnowledge'])->name('api.knowledge.destroy');
});
});