datacite/bracco

View on GitHub
app/components/doi-metadata.js

Summary

Maintainability
B
5 hrs
Test Coverage
import { inject as service } from '@ember/service';
import fetch from 'fetch';
import Component from '@ember/component';
import { isPresent } from '@ember/utils';
import vkbeautify from 'vkbeautify';
import ENV from 'bracco/config/environment';
import FileReader from 'ember-file-upload/system/file-reader';

export default Component.extend({
  currentUser: service(),

  tagName: 'div',
  hasMetadata: false,
  metadata: null,
  output: null,
  summary: true,

  didReceiveAttrs() {
    this._super(...arguments);

    // show metadata if at least one of these attributes is set
    if (
      isPresent(this.get('model.publicationYear')) ||
      isPresent(this.get('model.titles')) ||
      isPresent(this.get('model.publisher')) ||
      isPresent(this.get('model.creators')) ||
      (this.get('model.types') instanceof Object &&
        !!this.get('model.types.resourceTypeGeneral')) ||
      (this.get('model.types') instanceof Object &&
        !!this.get('model.types.resourceType'))
    ) {
      this.set('hasMetadata', true);
    }

    let formats = {
      summary: 'Summary View',
      datacite: 'DataCite XML',
      datacite_json: 'DataCite JSON',
      schema_org: 'Schema.org JSON-LD',
      citeproc: 'Citeproc JSON',
      codemeta: 'Codemeta JSON',
      bibtex: 'BibTeX',
      ris: 'RIS',
      jats: 'JATS XML'
    };
    this.set('formats', formats);
  },

  showMetadata(metadata) {
    if (metadata === 'summary') {
      this.set('output', '');
    } else {
      this.set('output', '');
      let self = this;
      let url = ENV.API_URL + '/dois/' + this.model.get('doi');
      let acceptHeaders = {
        datacite: 'application/vnd.datacite.datacite+xml',
        datacite_json: 'application/vnd.datacite.datacite+json',
        schema_org: 'application/vnd.schemaorg.ld+json',
        citeproc: 'application/vnd.citationstyles.csl+json',
        codemeta: 'application/vnd.codemeta.ld+json',
        bibtex: 'application/x-bibtex',
        ris: 'application/x-research-info-systems',
        jats: 'application/vnd.jats+xml'
      };
      let headers = { Accept: acceptHeaders[metadata] };
      if (this.currentUser.get('jwt')) {
        headers = {
          Authorization: 'Bearer ' + this.currentUser.get('jwt'),
          Accept: acceptHeaders[metadata]
        };
      }
      let result = fetch(url, {
        headers
      }).then(function (response) {
        if (response.ok) {
          return response.blob();
        } else {
          return response.statusText;
        }
      });

      result.then(function (response) {
        if (typeof response === 'string') {
          self.set('output', vkbeautify.json(JSON.stringify(response)));
        } else {
          let reader = new FileReader();
          reader.readAsText(response).then(
            (result) => {
              self.set('output', vkbeautify.xml(result));
            },
            (err) => {
              console.error(err);
            }
          );
        }
      });
    }
    // this.get('router').transitionTo({ queryParams: { metadata: metadata } });
  },

  actions: {
    selectMetadata(metadata) {
      this.showMetadata(metadata);
    }
  }
});