diff --git a/package-lock.json b/package-lock.json index f8c57a5..aee35af 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1804,10 +1804,11 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -1913,10 +1914,11 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -2475,9 +2477,10 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4090,10 +4093,11 @@ } }, "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -10328,9 +10332,9 @@ } }, "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "requires": { "balanced-match": "^1.0.0" @@ -10392,9 +10396,9 @@ }, "dependencies": { "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "requires": { "balanced-match": "^1.0.0" @@ -10808,9 +10812,9 @@ } }, "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -11942,9 +11946,9 @@ }, "dependencies": { "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "requires": { "balanced-match": "^1.0.0" diff --git a/src/models/ProposalMessage.ts b/src/models/ProposalMessage.ts index f33a8c2..b2955ae 100644 --- a/src/models/ProposalMessage.ts +++ b/src/models/ProposalMessage.ts @@ -42,8 +42,8 @@ export type ProposalMessageData = { newStatus?: ProposalStatusDefaultShortCodes; submitted: boolean; members: ProposalUser[]; - dataAccessUsers: ProposalUser[]; - visitors: ProposalUser[]; + dataAccessUsers?: ProposalUser[]; + visitors?: ProposalUser[]; proposer?: ProposalUser; instruments?: Instrument[]; }; diff --git a/src/queue/consumers/scicat/scicatProposal/consumerCallbacks/upsertProposalInScicat.ts b/src/queue/consumers/scicat/scicatProposal/consumerCallbacks/upsertProposalInScicat.ts index 63f0bbe..8b47c59 100644 --- a/src/queue/consumers/scicat/scicatProposal/consumerCallbacks/upsertProposalInScicat.ts +++ b/src/queue/consumers/scicat/scicatProposal/consumerCallbacks/upsertProposalInScicat.ts @@ -195,19 +195,32 @@ const checkProposalExists = async ( const getInstrumentIds = async (instruments: Instrument[]) => { const sciCatAccessToken = await getSciCatAccessToken(); - const shortCodes = JSON.stringify(instruments.map((inst) => inst.shortCode)); + const instrumentNames = instruments.map((inst) => inst.shortCode); - const url = `${sciCatBaseUrl}/Instruments?filter={"where":{"name":{"$in":${shortCodes}}}}`; + const instrumentIds = []; - const getInstrumentsResponse = await request(url, { - method: 'GET', - headers: { - 'Content-Type': 'application/json', - Authorization: `Bearer ${sciCatAccessToken}`, - }, - }); + for (const name of instrumentNames) { + const instrumentNameLowerCase = encodeURIComponent(name.toLowerCase()); + const url = `${sciCatBaseUrl}/Instruments?filter={"where":{"name":{"like":"${instrumentNameLowerCase}"}}}`; + + try { + const res = await request(url, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${sciCatAccessToken}`, + }, + }); + + instrumentIds.push(res[0].pid); + } catch (error) { + logger.logError(`Error fetching instrument ID from scicat for ${name}`, { + error, + }); + } + } - return getInstrumentsResponse.map((inst) => inst.pid); + return instrumentIds; }; const upsertProposalInScicat = async ( diff --git a/src/queue/consumers/visa/consumerCallbacks/syncVisaProposal.ts b/src/queue/consumers/visa/consumerCallbacks/syncVisaProposal.ts index 0dd0b74..cbb79e2 100644 --- a/src/queue/consumers/visa/consumerCallbacks/syncVisaProposal.ts +++ b/src/queue/consumers/visa/consumerCallbacks/syncVisaProposal.ts @@ -107,8 +107,8 @@ export async function syncVisaProposal( const experimenters = [ ...(proposalWithNewStatus.proposer ? [proposalWithNewStatus.proposer] : []), ...proposalWithNewStatus.members, - ...proposalWithNewStatus.dataAccessUsers, - ...proposalWithNewStatus.visitors, + ...(proposalWithNewStatus.dataAccessUsers || []), + ...(proposalWithNewStatus.visitors || []), ]; // Create new user for the Principal Investigator, Coproposers, Data Access Users and Visitors diff --git a/src/queue/consumers/visa/utils/sanitizeProposalMessage.ts b/src/queue/consumers/visa/utils/sanitizeProposalMessage.ts index 648cc0d..393ddf3 100644 --- a/src/queue/consumers/visa/utils/sanitizeProposalMessage.ts +++ b/src/queue/consumers/visa/utils/sanitizeProposalMessage.ts @@ -10,16 +10,20 @@ export function sanitizeProposalMessage(proposalMessage: ProposalMessageData) { oidcSub: member.oidcSub.toLowerCase(), email: member.email.toLowerCase(), })), - dataAccessUsers: proposalMessage.dataAccessUsers.map((user) => ({ - ...user, - oidcSub: user.oidcSub.toLowerCase(), - email: user.email.toLowerCase(), - })), - visitors: proposalMessage.visitors.map((visitor) => ({ - ...visitor, - oidcSub: visitor.oidcSub.toLowerCase(), - email: visitor.email.toLowerCase(), - })), + dataAccessUsers: proposalMessage.dataAccessUsers + ? proposalMessage.dataAccessUsers.map((user) => ({ + ...user, + oidcSub: user.oidcSub.toLowerCase(), + email: user.email.toLowerCase(), + })) + : [], + visitors: proposalMessage.visitors + ? proposalMessage.visitors.map((visitor) => ({ + ...visitor, + oidcSub: visitor.oidcSub.toLowerCase(), + email: visitor.email.toLowerCase(), + })) + : [], proposer: proposalMessage.proposer ? { ...proposalMessage.proposer,