source : doiService.js

(function (angular) {
    'use strict';
    /**
     * @memberof spApp
     * @ngdoc service
     * @name SpeciesAutoCompleteService
     * @description
     *   List species
     */
    angular.module('doi-service', [])
        .factory("DoiService", ["$http", "$rootScope", "$q", "BiocacheService", function ($http, $rootScope, $q, BiocacheService) {
            var config = {
                doiServiceUrl:$SH.doiServiceUrl,
                doiSearchFilter:$SH.doiSearchFilter,
                applicationName:$SH.applicationName,
                bieServiceUrl:$SH.bieServiceUrl
            };
            var _httpDescription = function (method, httpconfig) {
                if (httpconfig === undefined) {
                    httpconfig = {};
                }
                httpconfig.service = 'DoiService';
                httpconfig.method = method;
                return httpconfig;
            };
            var thiz = {
                isEnabled: function() {
                    return config.doiServiceUrl;
                },
                search: function (term, paginationParams) {
                    var params = angular.merge({
                        offset: 0,
                        max: 10,
                        sort: 'dateMinted',
                        order: 'asc'
                    }, paginationParams);
                    var url = $SH.proxyUrl+'?url=';
                    var doiUrl = config.doiServiceUrl + "/api/doi/search?max=" + params.max+ "&offset=" + params.offset + "&sort=" + params.sort + "&order=" + params.order;
                    url += encodeURIComponent(doiUrl);
                    url += "&q="+encodeURIComponent(term);
                    if (config.doiSearchFilter) {
                        url += "&fq="+encodeURIComponent(config.doiSearchFilter);
                    }
                    return $http.get(url, _httpDescription('search')).then(function (response) {
                        return response.data;
                        }, function(error) {
                            return error;
                    });
                },
                /**
                 * Extracts the query URL used to create the DOI from the DOI metadata.
                 */
                getQueryUrl: function(doiMetadata) {
                    return doiMetadata.applicationMetadata && doiMetadata.applicationMetadata.searchUrl;
                },
                /**
                 * Extracts the data from the supplied DOI to produce a query that will replicate the
                 * query used to create the DOI.
                 */
                buildQueryFromDoi: function(doi, queryParams) {
                    queryParams = queryParams || {};
                    // The query is expected to be an array
                    if (queryParams.q) {
                        queryParams.q = [queryParams.q];
                    }
                    queryParams.name = doi.title;
                    return queryParams;
                },
                /** Takes a DOI and constructs a string to display summary information about the DOI */
                buildInfoString: function(doi) {
                    var info = '';
                    if (doi.providerMetadata && doi.providerMetadata.contributors) {
                        for (var i=0; i<doi.providerMetadata.contributors.length; i++) {
                            if (doi.providerMetadata.contributors[i].type == 'Distributor') {
                                info += doi.providerMetadata.contributors[i].name;
                            }
                        }
                    }
                    if (doi.applicationMetadata) {
                        if (doi.applicationMetadata.queryTitle) {
                            if (info) {
                                info += ', ';
                            }
                            info += doi.applicationMetadata.queryTitle
                        }
                        if (doi.applicationMetadata.recordCount) {
                            if (info) {
                                info += ' ';
                            }
                            info += '('+doi.applicationMetadata.recordCount+' records)';
                        }
                    }
                    return info;
                },
                /** Takes a DOI and constructs a string to display a short summary information about the DOI */
                buildShortInfo: function (doi) {
                    var limit = 20;
                    var info = this.buildInfoString(doi);
                    if(info && info.length > limit)
                        return info.substr(0, limit) + '...';
                    else
                        return info;
                },
                /**
                 * Generate URL to view metadata on DOI server
                 * @param doi
                 * @returns https://doi-test.ala.org.au/doi/xxxxxx
                 */
                getDOIURL: function(doi){
                    if (doi && doi.uuid && config.doiServiceUrl) {
                        return  config.doiServiceUrl + '/doi/' + doi.uuid;
                    }
                },
                lsidLookup:function(lsid) {
                    var speciesUrl = config.bieServiceUrl+'/species/'+lsid+'.json';
                    return $http.get(speciesUrl).then(function(result) {
                        result = result && result.data;
                        var speciesInfo = {};
                        speciesInfo.name = result.taxonConcept && result.taxonConcept.nameString;
                        if (result.classification && result.classification.scientificName) {
                            speciesInfo.scientificName = result.classification.scientificName;
                        }
                        if (result.commonNames) {
                            var commonNames = [];
                            for (var i=0; i<result.commonNames.length; i++) {
                                commonNames.push(result.commonNames[i].nameString);
                            }
                            speciesInfo.commonNames = commonNames;
                        }
                        return speciesInfo;
                    });
                },
                assembleDoiMetadata: function(species, area, workflowData) {
                    var deferred = $q.defer();
                    var doiApplicationData = {
                        applicationName: config.applicationName || "CSDM",
                        organisation: workflowData.userOrganisation,
                        modeller: workflowData.userDisplayName,
                        workflowAnnotation: workflowData.workflowAnnotation,
                        workflowUrl: workflowData.workflowUrl,
                        dataSetAnnotation: workflowData.dataSetAnnotation
                    };
                    var q = species.q;
                    for (var i=0; i<q.length; i++) {
                        if (q[i].indexOf('lsid:') == 0) {
                            doiApplicationData.lsid = q[i].substring(5);
                        }
                    }
                    if (doiApplicationData.lsid) {
                        thiz.lsidLookup(doiApplicationData.lsid).then(function(names) {
                            for (var key in names) {
                                if (names.hasOwnProperty(key)) {
                                    doiApplicationData[key] = names[key];
                                }
                            }
                            deferred.resolve(doiApplicationData);
                        }, function(error) {
                            // This isn't fatal, we just won't have names to attach to the DOI.
                            deferred.resolve(doiApplicationData);
                        });
                    }
                    else {
                        deferred.resolve(doiApplicationData);
                    }
                    return deferred.promise;
                },
                mintDoi: function(species, area, workflowAnnotation) {
                    return this.assembleDoiMetadata(species, area, workflowAnnotation).then(function(doiMetadata) {
                        // Delegate to the BiocacheService to initiate the download and mint the DOI.
                        return BiocacheService.downloadAsync(species, area, doiMetadata);
                    });
                }
            };
            return thiz;
        }])
}(angular));