Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
5 changes: 1 addition & 4 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,9 @@ node_modules
.env.production.local
.vscode/
cms/env
cms/variant-migrations/config.js

npm-debug.log*
yarn-debug.log*
yarn-error.log*

docker/mongo
docker/elasticsearch/data

docker/
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ To run the required migrations:

```
cd cms/variant-migrations
../../node_modules/.bin/migrate-mongo up -f migrate-mongo-config.js
../../node_modules/.bin/migrate-mongo up -f config.js
```

### Quickstart
Expand All @@ -59,7 +59,7 @@ yarn

```
cd cms/variant-migrations
../../node_modules/.bin/migrate-mongo up -f migrate-mongo-config.js
../../node_modules/.bin/migrate-mongo up -f config.js
```

4. Initialize ElasticSearch:
Expand Down
6 changes: 4 additions & 2 deletions api/.env.schema
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
ES_URL=
ES_USER=
ES_PASS=
ES_HOST=
PROJECT_ID=
PORT=
ES_UPDATE_INDEX=
ENABLE_ADMIN=
MONGODB_URI=mongodb://user@pass:localhost:27017/hcmi

LOG_LEVEL=
NODE_ENV=
SEARCH_CLIENT_TYPE=
2 changes: 1 addition & 1 deletion api/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@ require('@babel/register')({
],
});

require('./src/index');
require('./src/index.ts');
11 changes: 7 additions & 4 deletions api/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@hcmi-portal/api",
"version": "0.0.1",
"description": "``` npm i @overture-stack/arranger-server ```",
"description": "``` npm i @overture-stack/arranger-graphql-router ```",
"private": true,
"main": "index.js",
"scripts": {
Expand All @@ -11,8 +11,11 @@
"author": "",
"license": "ISC",
"dependencies": {
"@elastic/elasticsearch": "~7.17.0",
"@overture-stack/arranger-server": "^3.0.0",
"@aws-sdk/credential-provider-node": "^3.972.66",
"@opensearch-project/opensearch": "^3.6.0",
"@overture-stack/arranger-graphql-router": "1.0.0-rc.4",
"@overture-stack/arranger-types": "1.0.0-rc.3",
"@overture-stack/sqon-builder": "^1.1.0",
"JSONStream": "^1.3.5",
"babel-polyfill": "^6.26.0",
"dotenv": "^5.0.1",
Expand All @@ -21,7 +24,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
13 changes: 9 additions & 4 deletions api/src/dataExport.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import express from 'express';
import bodyParser from 'body-parser';
import expressSanitizer from 'express-sanitizer';
import { dataStream } from '@overture-stack/arranger-server/dist/download';
import getAllData from '@overture-stack/arranger-server/dist/utils/getAllData';
import { dataStream } from '@overture-stack/arranger-graphql-router/download';
import { getAllData } from '@overture-stack/arranger-graphql-router/utils';
import JSZip from 'jszip';
import map from 'map-stream';
import through2 from 'through2';
import getLogger from './logger';

import getLogger from './logger.js';

const logger = getLogger('dataExport');

Expand Down Expand Up @@ -48,7 +49,11 @@ dataExportRouter.post('/models', async (req, res) => {
* We can get a stream from arranger using the getAllData method and then can store the variant data for each model
* for future processing.
*/
const allDataStream = await getAllData({ sqon, maxRows: 100, mock: {}, ctx: req.context });
const allDataStream = await getAllData({
sqon,
maxRows: 100,
ctx: req.context,
});
const collectVariantData = through2.obj(function ({ hits }, enc, callback) {
hits.forEach((model) => {
if (model?.genomic_variants && model?.genomic_variants.length > 0) {
Expand Down
11 changes: 4 additions & 7 deletions api/src/health.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,10 @@
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 pm2 from './pm2.ts';
import getClient from './services/searchClient.ts';

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

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

healthRouter.get('/es', async (req, res) => {
try {
const client = getClient(pm2);
const status = await client.ping();
if (_.get(status, 'statusCode') === 200) {
const response = _.omit(status, 'meta');
Expand Down
53 changes: 0 additions & 53 deletions api/src/index.js

This file was deleted.

85 changes: 85 additions & 0 deletions api/src/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
import 'babel-polyfill';
import bodyParser from 'body-parser';
import cors from 'cors';
import express from 'express';
import expressSanitizer from 'express-sanitizer';
import helmet from 'helmet';
import { Server } from 'http';
import ArrangerRouter, { type ArrangerBaseContext } from '@overture-stack/arranger-graphql-router';
import type { ConfigsObject, DisplayType, ExtendedConfigs, FacetsConfigs, MatchBoxConfigs, TableConfigs } from '@overture-stack/arranger-types/configs';
import * as path from 'path';

import baseConfig from '../../elasticsearch/arranger_metadata/base.json' with { type: 'json' };
import extendedConfigFile from '../../elasticsearch/arranger_metadata/extended.json' with { type: 'json' };
import facetsConfigFile from '../../elasticsearch/arranger_metadata/facets.json' with { type: 'json' };
import matchboxConfigFile from '../../elasticsearch/arranger_metadata/matchbox.json' with { type: 'json' };
import tableConfigFile from '../../elasticsearch/arranger_metadata/table.json' with { type: 'json' };

import dataExportRouter from './dataExport.js';
import getClient from './services/searchClient.ts';
import getLogger from './logger.js';
import healthRouter from './health.js';
import lastUpdatedRouter from './lastUpdated.js';
import pm2 from './pm2.ts';
import searchRouter from './search.js';

const logger = getLogger('root');
const port = process.env.PORT || 5050;
const app = express();
const http = new Server(app);

app.use(helmet());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(expressSanitizer()); // each route is responsible for sanitization
app.use(cors());

// Swagger
app.use('/docs', (req, res) => {
res.sendFile(path.join(__dirname, '../redoc.html'));
});
app.use('/swagger', (req, res) => {
res.sendFile(path.join(__dirname, '../swagger.json'));
});

// Arranger Configs
const displayTypeValues: DisplayType[] = ['all' , 'bits' , 'boolean' , 'bytes' , 'date' , 'list' , 'nested' , 'number'];

const extendedConfigs: ExtendedConfigs[] = extendedConfigFile['extended'].map(configRecord => {
const {type: stringType} = configRecord;
const displayType = displayTypeValues.find(type => stringType === type) || 'all';
return {...configRecord, type: displayType};
});
const facetConfigs: FacetsConfigs = facetsConfigFile['facets'];
const matchboxConfigs: MatchBoxConfigs[] = matchboxConfigFile['matchbox'];
const tableConfigs: TableConfigs = tableConfigFile['table'];

const disableGraphQLIntrospection = process.env.DISABLE_GRAPHQL_INTROSPECTION === 'true' || pm2.DISABLE_GRAPHQL_INTROSPECTION || false;
const esHost = process.env.ES_HOST || pm2.ES_URL || 'http://localhost:9200';

const configs: Partial<ConfigsObject<ArrangerBaseContext>> = {
...baseConfig,
disableGraphQLIntrospection,
esHost,
esIndex: 'hcmi',
extended: extendedConfigs,
enableDebug: true,
facets: facetConfigs,
matchbox: matchboxConfigs,
maxDepth: 10,
table: tableConfigs
};

const esClient = getClient(pm2);

ArrangerRouter({ configs, esClient }).then((router) => {
app.use(router);
app.use('/last-updated', lastUpdatedRouter);
app.use('/health', healthRouter);
app.use('/search', searchRouter);
app.use('/export', dataExportRouter);

http.listen(port, async () => {
logger.info({ port }, 'API Started!');
});
});
14 changes: 10 additions & 4 deletions api/src/lastUpdated.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,19 @@
// @ts-check

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

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

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

lastUpdatedRouter.get('/', async (req, res) => {
const searchClient = getClient(pm2);
try {
const response = await esClient.search({
index: process.env.ES_UPDATE_INDEX,
const response = await searchClient?.search({
index: process.env.ES_UPDATE_INDEX || pm2.ES_UPDATE_INDEX || 'hcmi-update',
body: {
query: {
match_all: {},
Expand All @@ -23,8 +28,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
21 changes: 21 additions & 0 deletions api/src/pm2.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import pm2Config from './../pm2.config.js';

// PM2 Env Setup
type pm2EnvValues = 'dev' | 'prd' | 'staging';

const pm2EnvValues = ['dev', 'prd', 'staging'];
const pm2Env: pm2EnvValues =
process.env.ENV && pm2EnvValues.includes(process.env.ENV)
? (process.env.ENV as pm2EnvValues)
: 'dev';

const pm2ConfigGeneric =
(pm2Config && pm2Config.apps && pm2Config.apps[0] && pm2Config.apps[0].env) || {};
const pm2ConfigForEnv =
(pm2Config && pm2Config.apps && pm2Config.apps[0] && pm2Config.apps[0][`env_${pm2Env}`]) || {};

const pm2 = { ...pm2ConfigGeneric, ...pm2ConfigForEnv };

export type PM2Config = typeof pm2;

export default pm2;
16 changes: 10 additions & 6 deletions api/src/search.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import express from 'express';
import esClient from './services/elasticsearch';
import { get } from 'lodash';
import _ from 'lodash';

import pm2 from './pm2.ts';
import getClient from './services/searchClient.ts';

const GENES_INDEX = 'genes';
const VARIANTS_INDEX = 'genomic_variants';
Expand Down Expand Up @@ -28,11 +30,12 @@ geneSearchRouter.get('/gene', async (req, res) => {
},
};

const response = await esClient.search({
const searchClient = getClient(pm2);
const response = await searchClient.search({
index: GENES_INDEX,
body: { query },
});
const genes = get(response, 'body.hits.hits', []).map((i) => i._source);
const genes = _.get(response, 'body.hits.hits', []).map((i) => i._source);
res.status(200).json({ genes });
} catch (err) {
console.log('Failure performing gene search:', err);
Expand All @@ -57,11 +60,12 @@ geneSearchRouter.get('/variant', async (req, res) => {
},
};

const response = await esClient.search({
const searchClient = getClient(pm2);
const response = await searchClient.search({
index: VARIANTS_INDEX,
body: { query },
});
const genes = get(response, 'body.hits.hits', []).map((i) => i._source);
const genes = _.get(response, 'body.hits.hits', []).map((i) => i._source);
res.status(200).json({ genes });
} catch (err) {
console.log('Failure performing genomic variants search:', err);
Expand Down
7 changes: 0 additions & 7 deletions api/src/services/elasticsearch.js

This file was deleted.

Loading