model/ModelValidation.js

  1. import { checkType } from '../lib/check'
  2. import Logger from '../logger/Logger'
  3. import Api from '../api/Api'
  4. import { getOwnedPropertyJSON } from './helpers/json'
  5. function extractValidationViolations(webmessage) {
  6. if (webmessage.response && webmessage.response.errorReports) {
  7. return webmessage.response.errorReports
  8. }
  9. throw new Error('Response was not a WebMessage with the expected format')
  10. }
  11. /**
  12. * Handles validation of Model objects based on their modelDefinition.
  13. *
  14. * @memberof module:model
  15. */
  16. class ModelValidation {
  17. constructor(providedLogger) {
  18. checkType(providedLogger, 'object', 'logger (Logger)')
  19. this.logger = providedLogger
  20. }
  21. /**
  22. * @deprecated Client side model validation is deprecated in favour of server side validation only.
  23. *
  24. * @returns {{status: boolean, messages: Array}} Returns {status: true, messages: []}
  25. */
  26. validate() {
  27. this.logger.warn('Client side model validation is deprecated')
  28. throw new Error('Client side model validation is deprecated')
  29. }
  30. /**
  31. * Sends a POST request against the `api/schemas` endpoint to check if the model is valid.
  32. *
  33. * @param {Model} model The model that should be validated.
  34. * @returns {Array} Returns an array with validation messages if there are any.
  35. *
  36. * @note {warn} Currently only checks
  37. */
  38. validateAgainstSchema(model) {
  39. if (!(model && model.modelDefinition && model.modelDefinition.name)) {
  40. return Promise.reject('model.modelDefinition.name can not be found')
  41. }
  42. const url = `schemas/${model.modelDefinition.name}`
  43. // TODO: The function getOwnedPropertyJSON should probably not be exposed, perhaps we could have a getJSONForModel(ownedPropertiesOnly=true) method.
  44. return Api.getApi()
  45. .post(url, getOwnedPropertyJSON(model))
  46. .then(webMessage => {
  47. if (webMessage.status === 'OK') {
  48. return []
  49. }
  50. return Promise.reject(webMessage)
  51. })
  52. .catch(extractValidationViolations)
  53. }
  54. /**
  55. * Returns the `ModelValidation` singleton. Creates a new one if it does not yet exist.
  56. * Grabs a logger instance by calling `Logger.getLogger`
  57. *
  58. * @returns {ModelValidation} New or memoized instance of `ModelInstance`
  59. */
  60. static getModelValidation() {
  61. if (this.modelValidation) {
  62. return this.modelValidation
  63. }
  64. return (this.modelValidation = new ModelValidation(
  65. Logger.getLogger(console)
  66. ))
  67. }
  68. }
  69. export default ModelValidation