Skip to content

Orcid disambiguation #112

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 9 commits into
base: develop
Choose a base branch
from
146 changes: 103 additions & 43 deletions app/Profile.php
Original file line number Diff line number Diff line change
Expand Up @@ -174,64 +174,124 @@ public function hasOrcidManagedPublications()
return $this->information()->where('data->orc_id_managed', '1')->exists();
}

/**
* Iterate over the publications retrieved from the ORCID API for a given profile and import the publication if it doesn't exist in the db already
*/
public function updateORCID()
{
$orc_id = $this->information()->get(array('data'))->toArray()[0]['data']['orc_id'];
$orc_id = $this->information()->get(array('data'))->toArray()[0]['data']['orc_id'];

if(is_null($orc_id)){
if(is_null($orc_id)){
//can't update if we don't know your ID
return false;
}
}

$orc_url = "https://pub.orcid.org/v2.0/" . $orc_id . "/activities";
$orc_url = "https://pub.orcid.org/v2.0/" . $orc_id . "/activities";

$client = new Client();
$client = new Client();

$res = $client->get($orc_url, [
'headers' => [
'Authorization' => 'Bearer ' . config('ORCID_TOKEN'),
'Accept' => 'application/json'
],
'http_errors' => false, // don't throw exceptions for 4xx,5xx responses
]);
$res = $client->get($orc_url, [
'headers' => [
'Authorization' => 'Bearer ' . config('ORCID_TOKEN'),
'Accept' => 'application/json'
],
'http_errors' => false, // don't throw exceptions for 4xx,5xx responses
]);

//an error of some sort
if($res->getStatusCode() != 200){
return false;
}
//an error of some sort
if($res->getStatusCode() != 200){
return false;
}

$datum = json_decode($res->getBody()->getContents(), true);

$sort_order = count($datum['works']['group'] ?? []) + 1;

Cache::tags(['profile-{$this->id}-current_publications'])->flush();

$current_publications = Cache::remember(
"profile-{$this->id}-current_publications",
15 * 60,
fn() => $this->publications()->get()
);

foreach($datum['works']['group'] as $record) {
$url = null;
$publications_found = null;
$existing_publication = false;

foreach($record['external-ids']['external-id'] as $ref){
if($ref['external-id-type'] == "eid"){
$url = "https://www.scopus.com/record/display.uri?origin=resultslist&eid=" . $ref['external-id-value'];
}
else if($ref['external-id-type'] == "doi"){
$url = "http://doi.org/" . $ref['external-id-value'];
$doi = $ref['external-id-value'];
}
}

if ($current_publications->count() > 0) {

$publications_found = $current_publications->filter(function ($elem) use ($ref) { return (isset($elem->data['doi'])) && ($elem->data['doi'] == $ref['external-id-value']); });

$existing_publication = $publications_found->count() > 0 ? true : false;

$datum = json_decode($res->getBody()->getContents(), true);
if (!$existing_publication) {

foreach($datum['works']['group'] as $record){
$url = NULL;
foreach($record['external-ids']['external-id'] as $ref){
if($ref['external-id-type'] == "eid"){
$url = "https://www.scopus.com/record/display.uri?origin=resultslist&eid=" . $ref['external-id-value'];
$publications_found = Profile::searchPublicationByTitleAndYear($record['work-summary'][0]['title']['title']['value'], $record['work-summary'][0]['publication-date']['year']['value'], $current_publications);

$existing_publication = empty($publications_found[1]) ? false : true;
}
}
else if($ref['external-id-type'] == "doi"){
$url = "http://doi.org/" . $ref['external-id-value'];

if (!$existing_publication) {
$record = ProfileData::create([
'profile_id' => $this->id,
'type' => 'publications',
'sort_order' => $sort_order--,
'data' => [
'url' => $url,
'title' => $record['work-summary'][0]['title']['title']['value'],
'year' => $record['work-summary'][0]['publication-date']['year']['value'] ?? null,
'type' => ucwords(strtolower(str_replace('_', ' ', $record['work-summary'][0]['type']))),
'status' => 'Published',
'doi' => $doi,
],
]);
}
}
$record = ProfileData::firstOrCreate([
'profile_id' => $this->id,
'type' => 'publications',
'data->title' => $record['work-summary'][0]['title']['title']['value'],
'sort_order' => $record['work-summary'][0]['publication-date']['year']['value'] ?? null,
],[
'data' => [
'url' => $url,
'title' => $record['work-summary'][0]['title']['title']['value'],
'year' => $record['work-summary'][0]['publication-date']['year']['value'] ?? null,
'type' => ucwords(strtolower(str_replace('_', ' ', $record['work-summary'][0]['type']))),
'status' => 'Published'
],
]);
}

Cache::tags(['profile_data'])->flush();
}

Cache::tags(['profile-{$this->id}-current_publications'])->flush();
Cache::tags(['profile_data'])->flush();

//ran through process successfully
return true;
}

/**
* Search for a publication by year and title within a given publications collection
* Return array with DOI and matching title
* @return Array
*/
public static function searchPublicationByTitleAndYear($title, $year, $publications)
{
$title = strip_tags(html_entity_decode($title));
$year = $year;
$publication_found = $aa_doi = $aa_title = null;

$publication_found = $publications->filter(function ($item) use ($title, $year) {
if (str_contains(strtolower($title), strtolower(strip_tags(html_entity_decode($item['data']['title'])))) and $year==$item['data']['year']) return true;
similar_text(strtolower($title), strtolower(strip_tags(html_entity_decode($item['data']['title']))), $percent);
if (($percent > 80) and ($year==$item['data']['year'])) return true;
});

if ($publication_found->count() == 1) {
$aa_doi = $publication_found->first()->doi;
$aa_title = $publication_found->first()->title;
}

//ran through process successfully
return true;
return [$aa_doi, $aa_title];
}

public function updateDatum($section, $request)
Expand Down
1 change: 1 addition & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading