tenantId(); $query = ItemPage::with([ 'sections' => function ($query) { $query->orderBy('order_no'); }, 'sections.fields' => function ($query) { $query->orderBy('order_no'); }, 'sections.bomItems', ]) ->where('tenant_id', $tenantId) ->where('is_active', 1); if ($itemType) { $query->where('item_type', strtoupper($itemType)); } return $query->get(); } /** * 페이지 생성 */ public function store(array $data): ItemPage { $tenantId = $this->tenantId(); $userId = $this->apiUserId(); $page = ItemPage::create([ 'tenant_id' => $tenantId, 'page_name' => $data['page_name'], 'item_type' => $data['item_type'], 'absolute_path' => $data['absolute_path'] ?? null, 'is_active' => true, 'created_by' => $userId, ]); // 관계 로드 $page->load(['sections']); return $page; } /** * 페이지 수정 */ public function update(int $id, array $data): ItemPage { $tenantId = $this->tenantId(); $userId = $this->apiUserId(); $page = ItemPage::where('tenant_id', $tenantId) ->where('id', $id) ->first(); if (! $page) { throw new NotFoundHttpException(__('error.not_found')); } $page->update([ 'page_name' => $data['page_name'] ?? $page->page_name, 'absolute_path' => $data['absolute_path'] ?? $page->absolute_path, 'updated_by' => $userId, ]); $page->load(['sections.fields', 'sections.bomItems']); return $page; } /** * 페이지 삭제 (Soft Delete) */ public function destroy(int $id): void { $tenantId = $this->tenantId(); $userId = $this->apiUserId(); $page = ItemPage::where('tenant_id', $tenantId) ->where('id', $id) ->first(); if (! $page) { throw new NotFoundHttpException(__('error.not_found')); } $page->update(['deleted_by' => $userId]); $page->delete(); // Cascade: 하위 섹션/필드도 Soft Delete foreach ($page->sections as $section) { $section->update(['deleted_by' => $userId]); $section->delete(); foreach ($section->fields as $field) { $field->update(['deleted_by' => $userId]); $field->delete(); } foreach ($section->bomItems as $bomItem) { $bomItem->update(['deleted_by' => $userId]); $bomItem->delete(); } } } }