diff --git a/app/Services/ItemMaster/ItemFieldService.php b/app/Services/ItemMaster/ItemFieldService.php index fdee4a3..c9a4c19 100644 --- a/app/Services/ItemMaster/ItemFieldService.php +++ b/app/Services/ItemMaster/ItemFieldService.php @@ -300,15 +300,29 @@ public function update(int $id, array $data): ItemField 'updated_by' => $userId, ]; - // field_key 변경 시 시스템 필드 + 중복 검증 후 저장 + // field_key 변경 시 검증 if (array_key_exists('field_key', $data)) { - if ($data['field_key']) { - $sourceTable = $data['source_table'] ?? null; - $groupId = $field->group_id ?? 1; - $this->validateFieldKeyUnique($data['field_key'], $tenantId, $sourceTable, $groupId, $id); - $updateData['field_key'] = $data['field_key']; + $currentFieldKey = $field->field_key; + $newFieldKey = $data['field_key']; + $groupId = $field->group_id ?? 1; + + // 기존 field_key가 예약어인 경우: 변경 시도 차단 (다른 필드는 수정 가능) + if ($currentFieldKey && SystemFields::isReservedInGroup($currentFieldKey, $groupId)) { + if ($newFieldKey !== $currentFieldKey) { + throw ValidationException::withMessages([ + 'field_key' => [__('error.field_key_system_readonly')], + ]); + } + // 동일한 값이면 변경 없이 통과 (field_key 제외하고 나머지 수정 가능) } else { - $updateData['field_key'] = null; + // 일반 필드: 기존 검증 로직 유지 + if ($newFieldKey) { + $sourceTable = $data['source_table'] ?? null; + $this->validateFieldKeyUnique($newFieldKey, $tenantId, $sourceTable, $groupId, $id); + $updateData['field_key'] = $newFieldKey; + } else { + $updateData['field_key'] = null; + } } } @@ -349,6 +363,14 @@ public function destroy(int $id): void throw new NotFoundHttpException(__('error.not_found')); } + // 시스템 필드(예약어) 삭제 차단 + if ($field->field_key && SystemFields::isReservedInGroup($field->field_key, $field->group_id ?? 1)) { + throw new \Symfony\Component\HttpKernel\Exception\HttpException( + 403, + __('error.field_key_system_cannot_delete') + ); + } + // 잠금 체크: 이 필드가 잠금된 연결로 보호되고 있는지 확인 $this->checkCanDelete(EntityRelationship::TYPE_FIELD, $id);