From 6211cd72f51204ca2d5ddbb8066a8c105b2cc4e7 Mon Sep 17 00:00:00 2001 From: fo Date: Fri, 21 Nov 2025 15:59:16 +0000 Subject: [PATCH 1/5] Add endpoint for ID/BFDB status Right now returns last time subjects and names were updated from ID's activity stream --- util-service/server.js | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/util-service/server.js b/util-service/server.js index 00f528d..c78d199 100644 --- a/util-service/server.js +++ b/util-service/server.js @@ -2070,6 +2070,7 @@ app.post("/validate/:loc", async (request, response) => { let endpoint = "/controllers/xqapi-validate-resource.xqy" var url = "https://" + VALIDATIONURL.trim() + endpoint; + console.log("validating against: ", url) let loc = request.params.loc if (loc == 'stage'){ url = url.replace("preprod", "preprod-8299") @@ -3373,6 +3374,43 @@ app.get('/prefs/:user', (request, response) => { }) +app.get('/status', async (request, response) => { + // Get the status of different parts of the ID/BFDB + let baseURL = "https://preprod-8080.id.loc.gov/authorities//activitystreams/feed/1.json" + + // Get the last update for Names & Subjects + let subjectResults = await fetch(baseURL.replace("", "subjects"), { + "headers": { + "accept": "application/json", + "cache-control": "no-cache", + }, + "method": "GET" + }) + + let nameResults = await fetch(baseURL.replace("", "names"), { + "headers": { + "accept": "application/json", + "cache-control": "no-cache", + }, + "method": "GET" + }) + + let names = await nameResults.json() + let subjects = await subjectResults.json() + + let subjectLastUpdateDate = subjects.orderedItems[0].object.updated + let nameLastUpdateDate = names.orderedItems[0].object.updated + + let updates = {'lastUpdateNames': nameLastUpdateDate, 'lastUpdateSubject': subjectLastUpdateDate} + try { + response.status(200).json({'status': {"updates": updates}}); + } catch(err) { + let msg = "Failed to get status: " + err + response.status(500).json({'result': msg}); + } +}); + + From 0f26904f4a2e5c77dcae3e11317b08c17206abcb Mon Sep 17 00:00:00 2001 From: fo Date: Fri, 21 Nov 2025 16:32:59 +0000 Subject: [PATCH 2/5] Separate status data from response Getting the status happens every 15 minutes and the data is held in local variables. The client won't need to make a request to ID/BFDB all the time. --- util-service/server.js | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/util-service/server.js b/util-service/server.js index c78d199..b1a8ce6 100644 --- a/util-service/server.js +++ b/util-service/server.js @@ -90,6 +90,9 @@ let ageLimitForAllRecords = 15 //days let NACO_START = 2025700001 let nacoIdObj = null +let lastUpdateNames = null +let lastUpdateSubjects = null + const uri = 'mongodb://mongo:27017/'; MongoClient.connect(uri, function(err, client) { @@ -3373,9 +3376,10 @@ app.get('/prefs/:user', (request, response) => { }); }) +async function getStatus(){ + console.log("GET STATUS") -app.get('/status', async (request, response) => { - // Get the status of different parts of the ID/BFDB + // Get status information from ID/BFDB let baseURL = "https://preprod-8080.id.loc.gov/authorities//activitystreams/feed/1.json" // Get the last update for Names & Subjects @@ -3398,10 +3402,18 @@ app.get('/status', async (request, response) => { let names = await nameResults.json() let subjects = await subjectResults.json() - let subjectLastUpdateDate = subjects.orderedItems[0].object.updated - let nameLastUpdateDate = names.orderedItems[0].object.updated + lastUpdateNames = names.orderedItems[0].object.updated + lastUpdateSubjects = subjects.orderedItems[0].object.updated + + // repeat 15 minutes this so the data is current. + setTimeout(getStatus, 15*60*1000) +} + + +app.get('/status', (request, response) => { + // Send the status information + let updates = {'lastUpdateNames': lastUpdateNames, 'lastUpdateSubject': lastUpdateSubjects} - let updates = {'lastUpdateNames': nameLastUpdateDate, 'lastUpdateSubject': subjectLastUpdateDate} try { response.status(200).json({'status': {"updates": updates}}); } catch(err) { @@ -3410,6 +3422,9 @@ app.get('/status', async (request, response) => { } }); +// Call getStatus +getStatus() + From b9dd80a6e7be33ec779e44cf4a61d14f21551a0b Mon Sep 17 00:00:00 2001 From: fo Date: Fri, 21 Nov 2025 16:53:04 +0000 Subject: [PATCH 3/5] Update subject label --- util-service/server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util-service/server.js b/util-service/server.js index b1a8ce6..7a03924 100644 --- a/util-service/server.js +++ b/util-service/server.js @@ -3412,7 +3412,7 @@ async function getStatus(){ app.get('/status', (request, response) => { // Send the status information - let updates = {'lastUpdateNames': lastUpdateNames, 'lastUpdateSubject': lastUpdateSubjects} + let updates = {'lastUpdateNames': lastUpdateNames, 'lastUpdateSubjects': lastUpdateSubjects} try { response.status(200).json({'status': {"updates": updates}}); From 5019eaba37b743686a0ea128d7f0edf654ffa5e6 Mon Sep 17 00:00:00 2001 From: fo Date: Mon, 24 Nov 2025 15:35:42 +0000 Subject: [PATCH 4/5] Get time for names use the 005 for the first record in the name activity stream --- util-service/server.js | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/util-service/server.js b/util-service/server.js index 7a03924..75d93b8 100644 --- a/util-service/server.js +++ b/util-service/server.js @@ -3400,13 +3400,39 @@ async function getStatus(){ }) let names = await nameResults.json() + let mostRecentName = names.orderedItems[0].object.id + let mostRecentNameURL = mostRecentName.replace("id.loc.gov", "preprod-8080.id.loc.gov") + ".marcxml.xml" + + let recentName = await fetch(mostRecentNameURL, { + "headers": { + "accept": "application/xml", + "cache-control": "no-cache", + }, + "method": "GET" + }) + let subjects = await subjectResults.json() + let recentNameXML = await recentName.text() + + // The Names can be updated more often than once a day, so we'll check the 005 for the most recent record to get the + const pattern = /tag="005">(?.*)<\// + let match = recentNameXML.match(pattern) + + let date = match.groups.date + if (date.endsWith(".0")){ + date = date.slice(0, -2) + } + + let recentDateTime = new Date(date.replace( + /^(\d{4})(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)$/, + '$4:$5:$6 $2/$3/$1' + )); - lastUpdateNames = names.orderedItems[0].object.updated - lastUpdateSubjects = subjects.orderedItems[0].object.updated + lastUpdateNames = recentDateTime.toLocaleString() + lastUpdateSubjects = subjects.orderedItems[0].object.updated.replace("-", "/") - // repeat 15 minutes this so the data is current. - setTimeout(getStatus, 15*60*1000) + // repeat 5 minutes this so the data is current. + setTimeout(getStatus, 5*60*1000) } From 691162c72cecb066896db83bba7f50d87f5eca5c Mon Sep 17 00:00:00 2001 From: fo Date: Mon, 24 Nov 2025 16:09:14 +0000 Subject: [PATCH 5/5] Match date formats --- util-service/server.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/util-service/server.js b/util-service/server.js index 75d93b8..2c2b407 100644 --- a/util-service/server.js +++ b/util-service/server.js @@ -3427,9 +3427,13 @@ async function getStatus(){ /^(\d{4})(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)$/, '$4:$5:$6 $2/$3/$1' )); + let subjectDate = new Date(subjects.orderedItems[0].object.updated.replace( + /^(\d{4})(\d\d)(\d\d)$/, + '$2/$3/$1' + )) lastUpdateNames = recentDateTime.toLocaleString() - lastUpdateSubjects = subjects.orderedItems[0].object.updated.replace("-", "/") + lastUpdateSubjects = subjectDate.toLocaleDateString() // repeat 5 minutes this so the data is current. setTimeout(getStatus, 5*60*1000)