datacite/bracco

View on GitHub
app/validators/related-item-identifier-format.js

Summary

Maintainability
B
4 hrs
Test Coverage
/* eslint-disable no-useless-escape */
import BaseValidator from 'ember-cp-validations/validators/base';
import { isURL, isISBN } from 'validator';

const RelatedItemIdentifierFormat = BaseValidator.extend({
  validate(value, options, model) {
    const ark = /^ark:\/[0-9]{5}\/\S+$/;
    const lsid =
      /^[uU][rR][nN]:[lL][sS][iI][dD]:(A-Za-z0-9][A-Za-z0-9()+,-.=@;$_!*'"%]):(A-Za-z0-9][A-Za-z0-9()+,-.=@;$_!*'"%]):(A-Za-z0-9][A-Za-z0-9()+,-.=@;$_!*'"%])[:]?(A-Za-z0-9][A-Za-z0-9()+,-.=@;$_!*'"%])?$/;
    const purl = {
      require_host: true,
      host_whitelist: ['purl.org', 'oclc.org']
    };
    const arxiv =
      /^(arXiv:)(\d{4}.\d{4,5}|[a-z\-]+(\.[A-Z]{2})?\/\d{7})(v\d+)?/;
    const doi = /^(10\.\d{4,5}\/.+)/;
    const bibcode = /\d{4}[A-Za-z\.\&]{5}[\w\.]{4}[ELPQ-Z\.][\d\.]{4}[A-Z]/;
    const urn = /^urn:[a-z0-9][a-z0-9-]{0,31}:[a-z0-9()+,\-.:=@;$_!*'%/?#]/;
    const types = [
      'EAN13',
      'EISSN',
      'Handle',
      'IGSN',
      'ISSN',
      'ISTC',
      'LISSN',
      'LSID',
      'PMID',
      'UPC',
      'w3id'
    ];

    switch (true) {
      case model.relatedItemIdentifierType == 'ARK':
        return ark.test(value) ? true : 'Please enter a valid ARK.';
      case model.relatedItemIdentifierType == 'arXiv':
        return arxiv.test(value) ? true : 'Please enter a valid arXiv.';
      case model.relatedItemIdentifierType == 'DOI':
        return doi.test(value) ? true : 'Please enter a valid DOI.';
      case model.relatedItemIdentifierType == 'bibcode':
        return bibcode.test(value) ? true : 'Please enter a valid bibcode.';
      case model.relatedItemIdentifierType == 'LSID':
        return lsid.test(value) ? true : 'Please enter a valid LSID.';
      case model.relatedItemIdentifierType == 'PURL':
        return isURL(value, purl) ? true : 'Please enter a valid PURL.';
      case model.relatedItemIdentifierType == 'URN':
        return urn.test(value) ? true : 'Please enter a valid URN.';
      case model.relatedItemIdentifierType == 'ISBN':
        return isISBN(value) ? true : 'Please enter a valid ISBN.';
      case model.relatedItemIdentifierType == 'URL':
        return isURL(value) ? true : 'Please enter a valid URL.';
      case types.includes(model.relatedItemIdentifierType):
        return true;
      default:
        return 'Please enter a Related Identedfier type.';
    }
  }
});

export default RelatedItemIdentifierFormat;