fix(auth-files): validate aliases case-insensitively

This commit is contained in:
Supra4E8C
2026-07-10 03:10:21 +08:00
parent 2818921815
commit 4afba522a6
3 changed files with 43 additions and 2 deletions
@@ -28,6 +28,7 @@ import type {
DiagramLine,
SourceNode,
} from './ModelMappingDiagramTypes';
import { hasModelAliasConflict } from './aliasValidation';
import styles from './ModelMappingDiagram.module.scss';
export interface ModelMappingDiagramProps {
@@ -489,7 +490,12 @@ export const ModelMappingDiagram = forwardRef<ModelMappingDiagramRef, ModelMappi
setAddAliasError(t('oauth_model_alias.diagram_please_enter_alias'));
return;
}
if (aliasNodes.some((a) => a.alias === trimmed)) {
if (
hasModelAliasConflict(
aliasNodes.map((alias) => alias.alias),
trimmed
)
) {
setAddAliasError(t('oauth_model_alias.diagram_alias_exists'));
return;
}
@@ -514,7 +520,13 @@ export const ModelMappingDiagram = forwardRef<ModelMappingDiagramRef, ModelMappi
setRenameState(null);
return;
}
if (aliasNodes.some((a) => a.alias === trimmed)) {
if (
hasModelAliasConflict(
aliasNodes.map((alias) => alias.alias),
trimmed,
renameState?.oldAlias
)
) {
setRenameError(t('oauth_model_alias.diagram_alias_exists'));
return;
}
@@ -0,0 +1,19 @@
const normalizeModelAliasKey = (value: string): string => value.trim().toLowerCase();
export function hasModelAliasConflict(
aliases: string[],
candidate: string,
excludedAlias?: string
): boolean {
const candidateKey = normalizeModelAliasKey(candidate);
if (!candidateKey) return false;
let excluded = false;
return aliases.some((alias) => {
if (!excluded && excludedAlias !== undefined && alias === excludedAlias) {
excluded = true;
return false;
}
return normalizeModelAliasKey(alias) === candidateKey;
});
}
+10
View File
@@ -0,0 +1,10 @@
import { describe, expect, test } from 'bun:test';
import { hasModelAliasConflict } from '../src/components/modelAlias/aliasValidation';
describe('model alias validation', () => {
test('checks aliases case-insensitively while excluding the renamed node', () => {
expect(hasModelAliasConflict(['Foo'], ' foo ')).toBe(true);
expect(hasModelAliasConflict(['Foo'], 'foo', 'Foo')).toBe(false);
expect(hasModelAliasConflict(['Foo', 'Bar'], 'FOO', 'Bar')).toBe(true);
});
});