Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
15 commits
Select commit Hold shift + click to select a range
01518a0
build(deps): bump qs from 6.15.2 to 6.16.0
dependabot[bot] Sep 3, 2026
9d5ebd3
Merge pull request #716 from UserOfficeProject/dependabot-npm_and_yar…
github-actions[bot] Sep 3, 2026
e82a2a4
build(deps-dev): bump @humanfs/node from 0.16.7 to 0.16.8
dependabot[bot] Sep 3, 2026
dbeabaf
Merge pull request #717 from UserOfficeProject/dependabot-npm_and_yar…
github-actions[bot] Sep 3, 2026
c07f8f2
build(deps-dev): bump brace-expansion from 1.1.13 to 1.1.18
dependabot[bot] Sep 3, 2026
6f5f5b0
Merge pull request #719 from UserOfficeProject/dependabot-npm_and_yar…
github-actions[bot] Sep 3, 2026
1dc5e6f
build(deps-dev): bump browserslist from 4.28.1 to 4.28.8
dependabot[bot] Sep 3, 2026
6b7ac70
Merge pull request #718 from UserOfficeProject/dependabot-npm_and_yar…
github-actions[bot] Sep 3, 2026
c5b5c6f
build(deps-dev): bump @babel/core from 7.29.0 to 7.29.7
dependabot[bot] Sep 7, 2026
b44c445
Merge pull request #720 from UserOfficeProject/dependabot-npm_and_yar…
github-actions[bot] Sep 7, 2026
19f3a77
build(deps-dev): bump js-yaml from 3.14.2 to 3.15.2
dependabot[bot] Sep 10, 2026
e7c4290
Merge pull request #721 from UserOfficeProject/dependabot-npm_and_yar…
github-actions[bot] Sep 10, 2026
29d02db
chore(oneidentity): include central account in missing person error (…
janosbabik Sep 11, 2026
d71d5f2
create new scicat experiments with default keywords
Junjiequan Sep 28, 2026
bd95628
Merge pull request #723 from UserOfficeProject/update-experiment
yoganandaness Sep 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
629 changes: 334 additions & 295 deletions package-lock.json

Large diffs are not rendered by default.

2 changes: 2 additions & 0 deletions sample.env
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ SCICAT_USERNAME=
SCICAT_PASSWORD=
SCICAT_PROPOSAL_TRIGGERING_STATUSES="SCHEDULING, ALLOCATED"
SCICAT_EXPERIMENT_TRIGGERING_STATUSES="ACTIVE"
# Keywords set on every new experiment, comma separated. Empty or unset: WF_01_00
SCICAT_NEW_EXPERIMENT_KEYWORDS="WF_01_00"
SCICAT_JWT=<token>

PROPOSAL_FOLDERS_CREATION_GROUP_PREFIX=""
Expand Down
1 change: 1 addition & 0 deletions src/config/validateEnv.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ function validateEnv() {
GRAYLOG_SERVER: str({ default: 'it-graylog.esss.lu.se' }),
GRAYLOG_PORT: port({ default: 12201 }),
SCICAT_PROPOSAL_TRIGGERING_STATUSES: str({ default: undefined }),
SCICAT_NEW_EXPERIMENT_KEYWORDS: str({ default: 'WF_01_00' }),
PROPOSAL_FOLDERS_CREATION_GROUP_PREFIX: str({ default: '' }),
PROPOSAL_FOLDERS_CREATION_COMMAND: str({ default: undefined }),
PROPOSAL_FOLDERS_CREATION_TRIGGERING_STATUSES: str({ default: undefined }),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -582,7 +582,9 @@ describe('syncVisitToOneIdentityHandler', () => {

await expect(
syncVisitToOneIdentityHandler(visitMessage, Event.VISIT_DELETED)
).rejects.toThrow('Person not found in One Identity');
).rejects.toThrow(
'Person with central account "visitor-oidc-sub" not found in One Identity'
);

expect(mockOneIdentity.login).toHaveBeenCalled();
expect(mockOneIdentity.getPerson).toHaveBeenCalledWith(
Expand Down Expand Up @@ -998,7 +1000,9 @@ describe('syncVisitToOneIdentityHandler', () => {

await expect(
syncVisitToOneIdentityHandler(visitMessage, Event.VISIT_UPDATED)
).rejects.toThrow('Person not found in One Identity');
).rejects.toThrow(
'Person with central account "visitor-oidc-sub" not found in One Identity'
);

expect(mockOneIdentity.login).toHaveBeenCalled();
expect(mockOneIdentity.getPerson).toHaveBeenCalledWith(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,9 @@ async function getScienceUser(
const person = await oneIdentity.getPerson(centralAccount);

if (!person) {
throw new Error('Person not found in One Identity');
throw new Error(
`Person with central account "${centralAccount}" not found in One Identity`
);
}

if (person.CCC_EmployeeSubType === IdentityType.ESSSCIENCEUSER)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@ Test Abstract",
"instrumentIds": [
"scicat-inst-1",
],
"keywords": [
"WF_01_00",
],
"lastname": "Doe",
"metadata": {
"instrument_name": {
Expand Down Expand Up @@ -111,6 +114,9 @@ Test Abstract",
"instrumentIds": [
"scicat-inst-1",
],
"keywords": [
"WF_01_00",
],
"lastname": "Doe",
"metadata": {
"instrument_name": {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,54 @@ describe('getCreateScicatExperimentDto', () => {
});
});

describe('keywords from SCICAT_NEW_EXPERIMENT_KEYWORDS', () => {
afterEach(() => {
delete process.env.SCICAT_NEW_EXPERIMENT_KEYWORDS;
});

it('sets the configured keyword on the new experiment', () => {
process.env.SCICAT_NEW_EXPERIMENT_KEYWORDS = 'WF_01_00';

const dto = getCreateScicatExperimentDto(
createBaseUoExperiment(),
instrumentIds
);

expect(dto.keywords).toEqual(['WF_01_00']);
});

it('accepts a comma separated list and trims spaces', () => {
process.env.SCICAT_NEW_EXPERIMENT_KEYWORDS = 'WF_01_00, WF_02_00 ,';

const dto = getCreateScicatExperimentDto(
createBaseUoExperiment(),
instrumentIds
);

expect(dto.keywords).toEqual(['WF_01_00', 'WF_02_00']);
});

it('falls back to WF_01_00 when the setting is not set', () => {
const dto = getCreateScicatExperimentDto(
createBaseUoExperiment(),
instrumentIds
);

expect(dto.keywords).toEqual(['WF_01_00']);
});

it('falls back to WF_01_00 when the setting is empty', () => {
process.env.SCICAT_NEW_EXPERIMENT_KEYWORDS = ' ';

const dto = getCreateScicatExperimentDto(
createBaseUoExperiment(),
instrumentIds
);

expect(dto.keywords).toEqual(['WF_01_00']);
});
});

it('skips visitor entries when user is null', () => {
const dto = getCreateScicatExperimentDto(
createBaseUoExperiment({
Expand Down Expand Up @@ -173,6 +221,18 @@ describe('getUpdateScicatExperimentDto', () => {
});
});

it('does not send keywords, so the workflow keywords are kept', () => {
process.env.SCICAT_NEW_EXPERIMENT_KEYWORDS = 'WF_01_00';

const dto = getUpdateScicatExperimentDto(
createBaseUoExperiment(),
instrumentIds
);

expect((dto as any).keywords).toBeUndefined();
delete process.env.SCICAT_NEW_EXPERIMENT_KEYWORDS;
});

it('should not include proposalId', () => {
const dto = getUpdateScicatExperimentDto(
createBaseUoExperiment(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,19 @@ import {
import { metadataEntry } from '../utils/common';
import { scicatApi } from '../utils/scicatApi';

// Keywords set on every new experiment, from SCICAT_NEW_EXPERIMENT_KEYWORDS (comma separated),
// WF_01_00 when none are given. Create only: SciCat replaces the whole keyword list on update.
const DEFAULT_NEW_EXPERIMENT_KEYWORDS = ['WF_01_00'];

const newExperimentKeywords = (): string[] => {
const keywords = (process.env.SCICAT_NEW_EXPERIMENT_KEYWORDS ?? '')
.split(',')
.map((keyword) => keyword.trim())
.filter(Boolean);

return keywords.length > 0 ? keywords : DEFAULT_NEW_EXPERIMENT_KEYWORDS;
};

// ──────────────────────────────────────────────────────────────────────────────
// ── Experiment ────────────────────────────────────────────────────────────────
// ──────────────────────────────────────────────────────────────────────────────
Expand Down Expand Up @@ -123,6 +136,7 @@ export const getCreateScicatExperimentDto = (
endTime: new Date(experiment.endsAt),
MeasurementPeriodList: [],
metadata: buildMetadata(experiment),
keywords: newExperimentKeywords(),
};
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ export type CreateScicatProposalDto = {
instrumentIds: string[];
MeasurementPeriodList: any[];
metadata?: Record<string, unknown>;
keywords?: string[];
};

export type UpdateScicatProposalDto = {
Expand Down
Loading