Merge pull request #14453 from strapi/fix/13893/collection-name-clash

Avoid content type `pluralName` DB clashes
This commit is contained in:
Jamie Howard 2022-10-27 16:45:10 +01:00 committed by GitHub
commit a3d182e045
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 32 additions and 16 deletions

View File

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

View File

@ -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(

View File

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