feat: 시스템 필드 수정/삭제 정책 개선
- 예약어 필드(is_active 등)도 수정 가능하도록 변경 - field_key 변경만 차단, 나머지 속성은 수정 허용 - 예약어 필드 삭제 차단 (403 에러)
This commit is contained in:
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user