primary-keys-definition-validator.js 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import {Service} from '../../../service/index.js';
  2. import {InvalidArgumentError} from '../../../errors/index.js';
  3. import {DEFAULT_PRIMARY_KEY_PROPERTY_NAME as DEF_PK} from '../model-definition-utils.js';
  4. /**
  5. * Primary keys definition validator.
  6. */
  7. export class PrimaryKeysDefinitionValidator extends Service {
  8. /**
  9. * Validate.
  10. *
  11. * @param modelName
  12. * @param propDefs
  13. */
  14. validate(modelName, propDefs) {
  15. const propNames = Object.keys(propDefs).filter(propName => {
  16. const propDef = propDefs[propName];
  17. return propDef && typeof propDef === 'object' && propDef.primaryKey;
  18. });
  19. if (propNames.length < 1) {
  20. const isDefaultPrimaryKeyAlreadyInUse =
  21. Object.keys(propDefs).includes(DEF_PK);
  22. if (isDefaultPrimaryKeyAlreadyInUse)
  23. throw new InvalidArgumentError(
  24. 'The property name %v of the model %v is defined as a regular property. ' +
  25. 'In this case, a primary key should be defined explicitly. ' +
  26. 'Do use the option "primaryKey" to specify the primary key.',
  27. DEF_PK,
  28. modelName,
  29. );
  30. return;
  31. }
  32. if (propNames.length > 1)
  33. throw new InvalidArgumentError(
  34. 'The model definition %v should not have ' +
  35. 'multiple primary keys, but %v keys given.',
  36. modelName,
  37. propNames.length,
  38. );
  39. const pkPropName = propNames[0];
  40. const pkPropDef = propDefs[pkPropName];
  41. if (
  42. pkPropDef &&
  43. typeof pkPropDef === 'object' &&
  44. pkPropDef.default !== undefined
  45. ) {
  46. throw new InvalidArgumentError(
  47. 'Do not specify a default value for the ' +
  48. 'primary key %v of the model %v.',
  49. pkPropName,
  50. modelName,
  51. );
  52. }
  53. }
  54. }