tenantId(); $userId = $this->apiUserId(); // order_no 자동 계산 (해당 페이지의 마지막 섹션 + 1) $maxOrder = ItemSection::where('tenant_id', $tenantId) ->where('page_id', $pageId) ->max('order_no'); $section = ItemSection::create([ 'tenant_id' => $tenantId, 'page_id' => $pageId, 'title' => $data['title'], 'type' => $data['type'], 'order_no' => ($maxOrder ?? -1) + 1, 'created_by' => $userId, ]); $section->load(['fields', 'bomItems']); return $section; } /** * 섹션 수정 */ public function update(int $id, array $data): ItemSection { $tenantId = $this->tenantId(); $userId = $this->apiUserId(); $section = ItemSection::where('tenant_id', $tenantId) ->where('id', $id) ->first(); if (! $section) { throw new NotFoundHttpException(__('error.not_found')); } $section->update([ 'title' => $data['title'] ?? $section->title, 'updated_by' => $userId, ]); $section->load(['fields', 'bomItems']); return $section; } /** * 섹션 삭제 (Soft Delete) */ public function destroy(int $id): void { $tenantId = $this->tenantId(); $userId = $this->apiUserId(); $section = ItemSection::where('tenant_id', $tenantId) ->where('id', $id) ->first(); if (! $section) { throw new NotFoundHttpException(__('error.not_found')); } $section->update(['deleted_by' => $userId]); $section->delete(); // Cascade: 하위 필드도 Soft 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(); } } /** * 섹션 순서 변경 * * @param array $items [['id' => 1, 'order_no' => 0], ['id' => 2, 'order_no' => 1], ...] */ public function reorder(int $pageId, array $items): void { $tenantId = $this->tenantId(); $userId = $this->apiUserId(); foreach ($items as $item) { ItemSection::where('tenant_id', $tenantId) ->where('page_id', $pageId) ->where('id', $item['id']) ->update([ 'order_no' => $item['order_no'], 'updated_by' => $userId, ]); } } }