feat: 시스템 필드 수정/삭제 정책 개선

- 예약어 필드(is_active 등)도 수정 가능하도록 변경
- field_key 변경만 차단, 나머지 속성은 수정 허용
- 예약어 필드 삭제 차단 (403 에러)
This commit is contained in:
2025-12-17 20:47:22 +09:00
parent ca5618be98
commit 0cf02550f0

View File

@@ -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);