Skip to content
Merged
Show file tree
Hide file tree
Changes from 13 commits
Commits
Show all changes
84 commits
Select commit Hold shift + click to select a range
3fd77ec
Testing Feb 6
demariadaniel Feb 9, 2026
f7cd504
Import organize
demariadaniel Mar 9, 2026
3ea8145
Use Mongoose 8.23
demariadaniel Mar 10, 2026
ed200f1
Updated searchClient names, imports, & usage -- draft
demariadaniel Mar 16, 2026
650738e
Fixed configureSets
demariadaniel Mar 16, 2026
f53c403
mongoosastic, publish, and promise updates
demariadaniel Mar 19, 2026
05e748e
Genes searchClient & async updates
demariadaniel Mar 19, 2026
99cfd46
Use module imports pt 1
demariadaniel Mar 19, 2026
bdb209a
Revert "Use module imports pt 1"
demariadaniel Mar 19, 2026
18ba7a1
Replace use of logger.audit
demariadaniel Mar 19, 2026
115deae
Quick clean up
demariadaniel Mar 19, 2026
0569dcb
First Working Publish
demariadaniel Mar 19, 2026
92e2ae3
Fixed Unpublish
demariadaniel Mar 20, 2026
0ed00b0
Remove mongoosastic
demariadaniel Mar 23, 2026
72f6171
Fix lastUpdated index setup issue
demariadaniel Mar 23, 2026
fb35762
Fix cms client args
demariadaniel Mar 24, 2026
688cace
Fixed SelectAll Admin Table behaviour
demariadaniel Mar 24, 2026
9e00f8e
File import and organization changes
demariadaniel Mar 25, 2026
cbffa77
Fixed bulk publish/unpublish toggle all & counts
demariadaniel Mar 25, 2026
a637dc8
Update searchClient definition
demariadaniel Mar 26, 2026
4bf3c8e
Fix duplicate indexing bug
demariadaniel Mar 26, 2026
129c691
Fix Somatic Variant Search
demariadaniel Mar 26, 2026
1374d35
Merge branch 'develop' of https://github.com/nci-hcmi-catalog/portal …
demariadaniel Mar 30, 2026
fed215b
Genomic Variant falsy handling
demariadaniel Mar 30, 2026
d0b2bac
Fixed Matched Models Publishing
demariadaniel Apr 1, 2026
a0f784e
Merge branch 'develop' of https://github.com/nci-hcmi-catalog/portal …
demariadaniel Apr 1, 2026
d47660c
MatchedModels UI improvements
demariadaniel Apr 2, 2026
bca4b1f
Revised handling for Model document fields
demariadaniel Apr 3, 2026
6d2c337
Update lodash, remove elasticsearch, remove logging
demariadaniel Apr 6, 2026
ee34155
Update lodash & mongoos
demariadaniel Apr 6, 2026
393dffc
Fixed Matched Models Column
demariadaniel Apr 6, 2026
1e07988
Use Arranger Server 3.0.3-beta.1, updated comments
demariadaniel Apr 7, 2026
50a27bd
Revert testing port change
demariadaniel Apr 7, 2026
ea2d64c
Update docker-compose to use Opensearch
demariadaniel Apr 8, 2026
a5f5824
Use kebab case CMS folder name
demariadaniel Apr 8, 2026
dae22dd
Remove pnpm workspace, change function name casing
demariadaniel Apr 8, 2026
a41e205
Docker compose edits
demariadaniel Apr 8, 2026
ec859b0
Sync data formatting
demariadaniel Apr 8, 2026
e428b3c
Remove extra logging
demariadaniel Apr 9, 2026
593ba23
Fix republish import & add default index values
demariadaniel Apr 9, 2026
3064492
Additional comments for cleanMongoDoc
demariadaniel Apr 9, 2026
2955c66
Fix UpdatedAt field
demariadaniel Apr 10, 2026
1d24893
Fix Typo
demariadaniel Apr 10, 2026
283f690
Allow Nullable Fields
demariadaniel Apr 10, 2026
87f8632
Current UpdateAt Model on Save
demariadaniel Apr 16, 2026
06fb5f8
Use migrations config.js
demariadaniel Apr 17, 2026
f017073
Matched Models List value correction
demariadaniel Apr 17, 2026
b3b0dfb
Revert "Matched Models List value correction"
demariadaniel Apr 17, 2026
e9e5553
Matched Models List bug
demariadaniel Apr 20, 2026
65d8d14
Remove logging
demariadaniel Apr 21, 2026
4db4a4b
Minor doc updates
demariadaniel Apr 23, 2026
85e98d3
NODE_ENV in .schema, revert matched_models change
demariadaniel Apr 23, 2026
ac21e6d
Additional matched models publish bug
demariadaniel Apr 27, 2026
0d2fb1b
Arranger metadata fixes
demariadaniel Apr 27, 2026
42d5324
Additional searchClient config
demariadaniel Apr 27, 2026
c4b430d
Additional support for pm2 config
demariadaniel Apr 28, 2026
477a785
Handling for Mongo Collection in republish
demariadaniel May 1, 2026
32c3f8d
Update express-restify-mongoose to fix 'delete' bug
demariadaniel May 7, 2026
913867e
Address axios & multer vulnerabilities
demariadaniel May 12, 2026
257ee9d
Updated Arranger Server
demariadaniel May 13, 2026
07b69c7
Use arranger-components 3.0.7
demariadaniel May 13, 2026
ee7d7ed
New jenkinsfile
demariadaniel May 26, 2026
41c2b01
Update groovy comment
demariadaniel May 26, 2026
af15fa6
Updated URL regexes
demariadaniel Jun 9, 2026
8bf37c1
Update Google Sheets URL handling
demariadaniel Jun 10, 2026
ea6da01
Google Template - Handle undefined Variant.find
demariadaniel Jun 15, 2026
5649efc
Jenkinsfile Update
demariadaniel Jun 15, 2026
a7da422
First Draft - Arranger router updates
demariadaniel Jun 18, 2026
275628f
Arranger rc-2 updates pt1
demariadaniel Jun 19, 2026
2b28444
Fixes to Arranger & Google Sheets
demariadaniel Jun 19, 2026
d00a541
Use Arranger rc3
demariadaniel Jun 24, 2026
57dd452
Additional Support for pm2
demariadaniel Jun 24, 2026
240e039
SearchClient pm2 Handling
demariadaniel Jun 25, 2026
8e37bcb
lastUpdated changes
demariadaniel Jul 2, 2026
7244d41
Testing - Server updates to support Auth changes
demariadaniel Jul 7, 2026
1b81694
Update search client helper files
demariadaniel Jul 7, 2026
16e93bb
Update AWS Auth solution
demariadaniel Jul 9, 2026
5e459c9
Patch getClient pm2 usage
demariadaniel Jul 10, 2026
9469704
🐛 Fix Bulk Variant Upload Sheet Creation
mistryrn Jul 17, 2026
6a7f4e0
Use Arranger Router rc4, use separate pm2 file, update comments
demariadaniel Jul 21, 2026
8e321cf
CMS PM2 separate file
demariadaniel Jul 21, 2026
f9c35cf
Add flag for GraphQL introspection
demariadaniel Jul 27, 2026
f4f9828
Updated yarn.lock
demariadaniel Jul 27, 2026
e49c8d0
Fix Expanded column color contrast
demariadaniel Aug 6, 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
2 changes: 1 addition & 1 deletion api/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
"helmet": "^3.15.0",
"jszip": "^3.7.0",
"map-stream": "^0.0.7",
"mongoose": "7.8.7",
"mongoose": "^8.23.0",
"pino": "^9.13.1",
"pino-http": "^10.5.0",
"sharp": "0.34.4"
Expand Down
10 changes: 3 additions & 7 deletions api/src/health.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,9 @@
import express from 'express';
import elasticsearch from '@elastic/elasticsearch';

import _ from 'lodash';

const startTime = Date.now();

const client = new elasticsearch.Client({
node: process.env.ES_URL,
});
import getClient from './services/searchClient.ts';

const startTime = Date.now();
const healthRouter = express.Router();

healthRouter.get('/', async (req, res) => {
Expand All @@ -18,6 +13,7 @@ healthRouter.get('/', async (req, res) => {

healthRouter.get('/es', async (req, res) => {
try {
const client = await getClient();
const status = await client.ping();
if (_.get(status, 'statusCode') === 200) {
const response = _.omit(status, 'meta');
Expand Down
11 changes: 8 additions & 3 deletions api/src/lastUpdated.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
// @ts-check

import express from 'express';
import esClient from './services/elasticsearch';

import getClient from './services/searchClient.ts';
import getLogger from './logger';

const lastUpdatedRouter = express.Router();
const logger = getLogger('lastUpdated Router');

lastUpdatedRouter.get('/', async (req, res) => {
const searchClient = await getClient();
try {
const response = await esClient.search({
const response = await searchClient.search({
index: process.env.ES_UPDATE_INDEX,
body: {
query: {
Expand All @@ -23,8 +27,9 @@ lastUpdatedRouter.get('/', async (req, res) => {
],
},
});
return res.json(response.body.hits.hits[0]._source);
return res.json(response.body?.hits?.hits[0]?._source);
} catch (error) {
logger.error(`Error retrieving last updated date from Arranger: ${error}`);
return res.status(500).json({
error: error,
});
Expand Down
5 changes: 3 additions & 2 deletions api/src/search.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import express from 'express';
import esClient from './services/elasticsearch';
import getClient from './services/searchClient.ts';
import { get } from 'lodash';

const GENES_INDEX = 'genes';
Expand Down Expand Up @@ -28,7 +28,8 @@ geneSearchRouter.get('/gene', async (req, res) => {
},
};

const response = await esClient.search({
const searchClient = await getClient();
const response = await searchClient.search({
index: GENES_INDEX,
body: { query },
});
Expand Down
7 changes: 0 additions & 7 deletions api/src/services/elasticsearch.js

This file was deleted.

8 changes: 8 additions & 0 deletions api/src/services/searchClient.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { getSearchClient } from '@overture-stack/arranger-server';

const getClient = async () =>
await getSearchClient({
node: process.env.ES_URL || 'http://localhost:9200',
});

export default getClient;
1 change: 1 addition & 0 deletions cms/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
"lodash": "^4.17.21",
"map-stream": "^0.0.7",
"method-override": "^2.3.10",
"mongoosastic": "^5.0.0",
"mongoose": "7.8.7",
"mongoose-elasticsearch-xp": "^5.8.0",
"morgan": "^1.10.1",
Expand Down
43 changes: 23 additions & 20 deletions cms/src/helpers/dictionary.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,21 +35,21 @@ export const getDictionaryOptions = async () => {

const output = dictionary.reduce((acc, field) => {
let { name, values } = field;
acc[`${name}Options`] = values.map(i => i.value);
acc[`${name}Options`] = values.map((i) => i.value);
return acc;
}, {});
const ctd = dictionary.find(i => i.name === 'clinicalTumorDiagnosis');
const ctd = dictionary.find((i) => i.name === 'clinicalTumorDiagnosis');

const ctdDependentOptions = {};

ctd.dependentValues.forEach(val => (ctdDependentOptions[val] = {}));
ctd.dependentValues.forEach((val) => (ctdDependentOptions[val] = {}));

ctd.values.forEach(val => {
ctd.values.forEach((val) => {
const valueName = val.value;

val.dependents.forEach(dependent => {
val.dependents.forEach((dependent) => {
const dependentName = dependent.name;
const dependentValues = dependent.values.map(val => val.value);
const dependentValues = dependent.values.map((val) => val.value);

ctdDependentOptions[dependentName][valueName.toLowerCase()] = dependentValues;
});
Expand All @@ -63,7 +63,7 @@ export const resetDraft = async () => {
const dictionary = await Dictionary.findOne({}, {}, { sort: { created_at: -1 } });
const draft = new Draft({ fields: dictionary.fields });
await draft.save();
logger.audit({}, 'reset draft', 'Dictionary draft reset');
logger.info({}, 'reset draft', 'Dictionary draft reset');
return await Draft.findOne({}, {}, { sort: { created_at: -1 } });
};

Expand All @@ -77,12 +77,12 @@ export const publishDraft = async () => {

// find edited values
const edits = [];
draft.fields.forEach(field => {
draft.fields.forEach((field) => {
if (field.dependentValues.length > 0) {
// dependent field case
field.values.forEach(value => {
value.dependents.forEach(dependent => {
dependent.values.forEach(dependentValue => {
field.values.forEach((value) => {
value.dependents.forEach((dependent) => {
dependent.values.forEach((dependentValue) => {
if (dependentValue.status === draftStatus.edited) {
edits.push({
field: field.name,
Expand All @@ -97,7 +97,7 @@ export const publishDraft = async () => {
});
}
// basic field case
field.values.forEach(value => {
field.values.forEach((value) => {
if (value.status === draftStatus.edited) {
edits.push({
field: field.name,
Expand All @@ -119,19 +119,22 @@ export const publishDraft = async () => {

const dictionary = new Dictionary({ fields: draft.fields });
await dictionary.save();
logger.audit({ edits }, 'dictionary created', 'Created new dictionary from draft values');
logger.info({ edits }, 'dictionary created', 'Created new dictionary from draft values');

models.forEach(model => {
models.forEach((model) => {
// Find these values in the models.
let edited = false;
edits.forEach(edit => {
edits.forEach((edit) => {
const editField = edit.dependentName ? edit.dependentName : edit.field;

// - update those models and change their status
if (editField === 'therapy' && model.therapy.includes(edit.original)) {
// special case, therapy is an array

model.therapy.splice(model.therapy.indexOf(val => val === edit.original), 1);
model.therapy.splice(
model.therapy.indexOf((val) => val === edit.original),
1,
);
model.therapy.push(edit.value);
model.status =
model.status === modelStatus.published ? modelStatus.unpublishedChanges : model.status;
Expand All @@ -148,7 +151,7 @@ export const publishDraft = async () => {
});
if (edited) {
model.save();
logger.audit(
logger.info(
{ model: model.name },
'model saved',
'Model values updated due to dictionary publish',
Expand All @@ -160,7 +163,7 @@ export const publishDraft = async () => {
return { dictionary, updatedModels };
};

export const countDraftStats = draft => {
export const countDraftStats = (draft) => {
const output = { edited: 0, new: 0 };

const hasDependencies = draft.dependentValues && draft.dependentValues.length > 0;
Expand Down Expand Up @@ -202,12 +205,12 @@ export const editValue = (target, original, updated) => {
};

export const valueExists = (valuesList, value) => {
return !!valuesList.find(val => val.value === value);
return !!valuesList.find((val) => val.value === value);
};

export const removeValueIfNew = (valueList, value) => {
const index = valueList.indexOf(
valueList.find(i => i.status === draftStatus.new && i.value === value),
valueList.find((i) => i.status === draftStatus.new && i.value === value),
);
if (index >= 0) {
valueList.splice(index, 1);
Expand Down
16 changes: 8 additions & 8 deletions cms/src/helpers/genomicVariants.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import {
import getLogger from '../logger.js';
const logger = getLogger('helpers/genomicVariants');

export const clearGenomicVariants = async name => {
export const clearGenomicVariants = async (name) => {
// Stop any active imports, if any:
try {
await VariantImporter.stopImport(name);
Expand All @@ -37,8 +37,8 @@ export const clearGenomicVariants = async name => {
}
};

const titleCase = (text, filter = i => true) => {
return text.replace(/\w\S*/g, i => {
const titleCase = (text, filter = (i) => true) => {
return text.replace(/\w\S*/g, (i) => {
if (filter(i)) {
return i.charAt(0).toUpperCase() + i.substr(1);
}
Expand Down Expand Up @@ -68,9 +68,9 @@ const buildVariantId = ({
}
};

const buildModelUrl = caseId => `${BASE_GDC_URL}/cases/${caseId}`;
const buildMafUrl = fileId => `${BASE_GDC_URL}/files/${fileId}`;
const buildSequenceUrl = caseId => `${BASE_GDC_URL}/cases/${caseId}#files`;
const buildModelUrl = (caseId) => `${BASE_GDC_URL}/cases/${caseId}`;
const buildMafUrl = (fileId) => `${BASE_GDC_URL}/files/${fileId}`;
const buildSequenceUrl = (caseId) => `${BASE_GDC_URL}/cases/${caseId}#files`;

export const addGenomicVariantsFromMaf = async (name, mafData, { filename, fileId }, caseId) => {
const model = await Model.findOne({ name });
Expand Down Expand Up @@ -103,7 +103,7 @@ export const addGenomicVariantsFromMaf = async (name, mafData, { filename, fileI

// Properties originally from Reference that are temporarily taken from MAF - Jon Eubank 2020-09-29
const gene = row.Hugo_Symbol;
const gene_biotype = titleCase(row.BIOTYPE.replace(/_/g, ' '), i => !i.includes('RNA'));
const gene_biotype = titleCase(row.BIOTYPE.replace(/_/g, ' '), (i) => !i.includes('RNA'));
const name = `${row.Hugo_Symbol} ${aa_change}`;
const synonyms = [];

Expand Down Expand Up @@ -181,7 +181,7 @@ export const addGenomicVariantsFromMaf = async (name, mafData, { filename, fileI
}

await model.save();
logger.audit(
logger.info(
{
model: model.name,
genomic_variants: model.genomic_variants ? model.genomic_variants.length : 0,
Expand Down
Loading