mirror of
https://github.com/strapi/strapi.git
synced 2025-12-27 15:13:21 +00:00
Merge pull request #14453 from strapi/fix/13893/collection-name-clash
Avoid content type `pluralName` DB clashes
This commit is contained in:
commit
a3d182e045
@ -4,12 +4,12 @@ import { translatedErrors as errorsTrads } from '@strapi/helper-plugin';
|
||||
import getTrad from '../../../utils/getTrad';
|
||||
import { createUid } from '../utils/createUid';
|
||||
|
||||
const createContentTypeSchema = (
|
||||
usedContentTypeNames,
|
||||
reservedNames,
|
||||
singularNames,
|
||||
pluralNames
|
||||
) => {
|
||||
const createContentTypeSchema = ({
|
||||
usedContentTypeNames = [],
|
||||
reservedModels = [],
|
||||
singularNames = [],
|
||||
pluralNames = [],
|
||||
}) => {
|
||||
const shape = {
|
||||
displayName: yup
|
||||
.string()
|
||||
@ -34,7 +34,7 @@ const createContentTypeSchema = (
|
||||
return false;
|
||||
}
|
||||
|
||||
return !reservedNames.includes(toLower(trim(value)));
|
||||
return !reservedModels.includes(toLower(trim(value)));
|
||||
},
|
||||
})
|
||||
.required(errorsTrads.required),
|
||||
@ -70,7 +70,7 @@ const createContentTypeSchema = (
|
||||
return false;
|
||||
}
|
||||
|
||||
return !reservedNames.includes(toLower(trim(value)));
|
||||
return !reservedModels.includes(toLower(trim(value)));
|
||||
},
|
||||
})
|
||||
.required(errorsTrads.required),
|
||||
@ -106,7 +106,7 @@ const createContentTypeSchema = (
|
||||
return false;
|
||||
}
|
||||
|
||||
return !reservedNames.includes(toLower(trim(value)));
|
||||
return !reservedModels.includes(toLower(trim(value)));
|
||||
},
|
||||
})
|
||||
.required(errorsTrads.required),
|
||||
|
||||
@ -163,7 +163,7 @@ const forms = {
|
||||
});
|
||||
|
||||
const pluralNames = Object.values(contentTypes).map((contentType) => {
|
||||
return contentType.schema.pluralNames;
|
||||
return get(contentType, ['schema', 'pluralName'], '');
|
||||
});
|
||||
|
||||
const takenNames = isEditing
|
||||
@ -186,12 +186,12 @@ const forms = {
|
||||
})
|
||||
: pluralNames;
|
||||
|
||||
const contentTypeShape = createContentTypeSchema(
|
||||
takenNames,
|
||||
reservedNames.models,
|
||||
takenSingularNames,
|
||||
takenPluralNames
|
||||
);
|
||||
const contentTypeShape = createContentTypeSchema({
|
||||
usedContentTypeNames: takenNames,
|
||||
reservedModels: reservedNames.models,
|
||||
singularNames: takenSingularNames,
|
||||
pluralNames: takenPluralNames,
|
||||
});
|
||||
|
||||
// FIXME
|
||||
return extensions.makeValidator(
|
||||
|
||||
@ -9,6 +9,21 @@ class Metadata extends Map {
|
||||
add(meta) {
|
||||
return this.set(meta.uid, meta);
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate the DB metadata, throwing an error if a duplicate DB table name is detected
|
||||
*/
|
||||
validate() {
|
||||
const seenTables = new Map();
|
||||
for (const meta of this.values()) {
|
||||
if (seenTables.get(meta.tableName)) {
|
||||
throw new Error(
|
||||
`DB table "${meta.tableName}" already exists. Change the collectionName of the related content type.`
|
||||
);
|
||||
}
|
||||
seenTables.set(meta.tableName, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: check if there isn't an attribute with an id already
|
||||
@ -81,6 +96,7 @@ const createMetadata = (models = []) => {
|
||||
meta.columnToAttribute = columnToAttribute;
|
||||
}
|
||||
|
||||
metadata.validate();
|
||||
return metadata;
|
||||
};
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user