From 5d94cb053cc73f420f44d664662b7d9fa974a282 Mon Sep 17 00:00:00 2001 From: stefanbabukov Date: Mon, 11 Apr 2022 14:53:38 +0100 Subject: [PATCH 01/17] load and save done --- .../controllers/experimentController.js | 18 +++++ src/api.v2/model/experiment.js | 31 +++++++++ src/api.v2/routes/experiment.js | 11 +++- src/specs/api.v2.yaml | 65 +++++++++++++++++++ .../ProcessingConfig.v2.yaml | 24 +++++++ 5 files changed, 148 insertions(+), 1 deletion(-) create mode 100644 src/specs/models/experiment-bodies/ProcessingConfig.v2.yaml diff --git a/src/api.v2/controllers/experimentController.js b/src/api.v2/controllers/experimentController.js index 1f3131e55..dacb7744e 100644 --- a/src/api.v2/controllers/experimentController.js +++ b/src/api.v2/controllers/experimentController.js @@ -68,9 +68,27 @@ const updateSamplePosition = async (req, res) => { res.json(OK()); }; +const getProcessingConfig = async (req, res) => { + const { params: { experimentId } } = req; + logger.log('Getting processing config for experiment ', experimentId); + + const result = await experiment.getProcessingConfig(experimentId); + res.json(result); +}; + +const updateProcessingConfig = async (req, res) => { + const { params: { experimentId }, body } = req; + logger.log('Updating processing config for experiment ', experimentId, 'name ', body); + + await experiment.updateProcessingConfig(experimentId, body); + res.json(OK()); +}; + module.exports = { getExperiment, createExperiment, + updateProcessingConfig, patchExperiment, updateSamplePosition, + getProcessingConfig, }; diff --git a/src/api.v2/model/experiment.js b/src/api.v2/model/experiment.js index 76f959b8a..e112c45e8 100644 --- a/src/api.v2/model/experiment.js +++ b/src/api.v2/model/experiment.js @@ -92,8 +92,39 @@ const updateSamplePosition = async (experimentId, oldPosition, newPosition) => { } }; +const getProcessingConfig = async (experimentId) => { + const sql = sqlClient.get(); + + const result = await sql.select('processing_config') + .from(experimentTable) + .where('id', experimentId) + .first(); + + if (_.isEmpty(result)) { + throw new NotFoundError('Experiment not found'); + } + return result; +}; + +const updateProcessingConfig = async (experimentId, body) => { + const { name: stepName, body: change } = body[0]; + + const sql = sqlClient.get(); + const { processingConfig } = await getProcessingConfig(experimentId); + processingConfig[stepName] = change; + + await sql.select('processing_config') + .from(experimentTable) + .update( + { processing_config: processingConfig }, + ) + .where('id', experimentId); +}; + module.exports = { getExperimentData, updateSamplePosition, + getProcessingConfig, + updateProcessingConfig, ...basicModelFunctions, }; diff --git a/src/api.v2/routes/experiment.js b/src/api.v2/routes/experiment.js index 421a18bf4..be8f92091 100644 --- a/src/api.v2/routes/experiment.js +++ b/src/api.v2/routes/experiment.js @@ -1,5 +1,6 @@ const { - createExperiment, getExperiment, patchExperiment, updateSamplePosition, + createExperiment, getExperiment, patchExperiment, + updateSamplePosition, getProcessingConfig, updateProcessingConfig, } = require('../controllers/experimentController'); const { expressAuthenticationOnlyMiddleware, expressAuthorizationMiddleware } = require('../middlewares/authMiddlewares'); @@ -21,4 +22,12 @@ module.exports = { expressAuthorizationMiddleware, (req, res, next) => updateSamplePosition(req, res).catch(next), ], + 'experiment#getProcessingConfig': [ + expressAuthorizationMiddleware, + (req, res, next) => getProcessingConfig(req, res).catch(next), + ], + 'experiment#updateProcessingConfig': [ + expressAuthorizationMiddleware, + (req, res, next) => updateProcessingConfig(req, res).catch(next), + ], }; diff --git a/src/specs/api.v2.yaml b/src/specs/api.v2.yaml index 8dd70df2a..f627d7962 100644 --- a/src/specs/api.v2.yaml +++ b/src/specs/api.v2.yaml @@ -58,6 +58,69 @@ paths: - env - clusterEnv description: Returns a status on the health of the API. + '/experiments/{experimentId}/processingConfig': + get: + summary: Get processing configuration for an experiment + description: Get processing configuration for an experiment + operationId: getProcessingConfig + x-eov-operation-id: experiment#getProcessingConfig + x-eov-operation-handler: routes/experiment + responses: + '200': + description: get processing configuration for an experiment + content: + application/json: + schema: + $ref: '#/components/schemas/ProcessingConfig' + '404': + description: Not found error. + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '401': + description: The request lacks authentication credentials. + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + put: + summary: Update processing configuration for an experiment + description: Update processing configuration for an experiment + operationId: updateProcessingConfig + x-eov-operation-id: experiment#updateProcessingConfig + x-eov-operation-handler: routes/experiment + responses: + '200': + description: Processing configuration for an experiment + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPSuccess' + '404': + description: Not found error. + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '401': + description: The request lacks authentication credentials. + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' '/experiments/{experimentId}': get: summary: Get an experiment info @@ -210,6 +273,8 @@ components: $ref: './models/experiment-bodies/ExperimentInfo.v2.yaml' ExperimentPatch: $ref: './models/experiment-bodies/ExperimentPatch.v2.yaml' + ProcessingConfig: + $ref: './models/experiment-bodies/ProcessingConfig.v2.yaml' HTTPSuccess: $ref: './models/HTTPSuccess.v1.yaml' HTTPError: diff --git a/src/specs/models/experiment-bodies/ProcessingConfig.v2.yaml b/src/specs/models/experiment-bodies/ProcessingConfig.v2.yaml new file mode 100644 index 000000000..9a8a24f4f --- /dev/null +++ b/src/specs/models/experiment-bodies/ProcessingConfig.v2.yaml @@ -0,0 +1,24 @@ +title: Processing config +type: object +properties: + processingConfig: + type: object + properties: + classifier: + type: object + doubletScores: + type: object + dataIntegration: + type: object + numGenesVsNumUmis: + type: object + configureEmbedding: + type: object + cellSizeDistribution: + type: object + mitochondrialContent: + type: object + +required: + - processingConfig +additionalProperties: false \ No newline at end of file From ba27f8af35d7b9a7a1fa701d1ecbc7ad60f6844b Mon Sep 17 00:00:00 2001 From: stefanbabukov Date: Mon, 11 Apr 2022 14:56:15 +0100 Subject: [PATCH 02/17] remove body from log --- src/api.v2/controllers/experimentController.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/api.v2/controllers/experimentController.js b/src/api.v2/controllers/experimentController.js index dacb7744e..43ff601e8 100644 --- a/src/api.v2/controllers/experimentController.js +++ b/src/api.v2/controllers/experimentController.js @@ -78,7 +78,7 @@ const getProcessingConfig = async (req, res) => { const updateProcessingConfig = async (req, res) => { const { params: { experimentId }, body } = req; - logger.log('Updating processing config for experiment ', experimentId, 'name ', body); + logger.log('Updating processing config for experiment ', experimentId); await experiment.updateProcessingConfig(experimentId, body); res.json(OK()); From b639fe16695b433cbbde46f3a6c9438628456ba9 Mon Sep 17 00:00:00 2001 From: stefanbabukov Date: Wed, 13 Apr 2022 11:46:46 +0100 Subject: [PATCH 03/17] some tests added --- src/api.v2/model/__mocks__/Experiment.js | 2 + src/api.v2/routes/experiment.js | 4 +- .../controllers/experimentController.test.js | 32 ++ .../data/getProcessingConfigResponse.json | 342 ++++++++++++++++++ tests/api.v2/routes/experiment.test.js | 38 ++ 5 files changed, 416 insertions(+), 2 deletions(-) create mode 100644 tests/api.v2/mocks/data/getProcessingConfigResponse.json diff --git a/src/api.v2/model/__mocks__/Experiment.js b/src/api.v2/model/__mocks__/Experiment.js index cfc4dd365..351c445db 100644 --- a/src/api.v2/model/__mocks__/Experiment.js +++ b/src/api.v2/model/__mocks__/Experiment.js @@ -4,6 +4,8 @@ const stub = { getAllExperiments: jest.fn(), getExperimentData: jest.fn(), updateSamplePosition: jest.fn(), + updateProcessingConfig: jest.fn(), + getProcessingConfig: jest.fn(), addSample: jest.fn(), deleteSample: jest.fn(), ...BasicModel, diff --git a/src/api.v2/routes/experiment.js b/src/api.v2/routes/experiment.js index 2b0b84c93..3bc12956b 100644 --- a/src/api.v2/routes/experiment.js +++ b/src/api.v2/routes/experiment.js @@ -27,11 +27,11 @@ module.exports = { (req, res, next) => updateSamplePosition(req, res).catch(next), ], 'experiment#getProcessingConfig': [ - // expressAuthorizationMiddleware, + expressAuthorizationMiddleware, (req, res, next) => getProcessingConfig(req, res).catch(next), ], 'experiment#updateProcessingConfig': [ - // expressAuthorizationMiddleware, + expressAuthorizationMiddleware, (req, res, next) => updateProcessingConfig(req, res).catch(next), ], }; diff --git a/tests/api.v2/controllers/experimentController.test.js b/tests/api.v2/controllers/experimentController.test.js index 377e1bac1..e66cafa4b 100644 --- a/tests/api.v2/controllers/experimentController.test.js +++ b/tests/api.v2/controllers/experimentController.test.js @@ -172,4 +172,36 @@ describe('experimentController', () => { expect(experimentInstance.updateSamplePosition).not.toHaveBeenCalled(); }); + + it('getProcessingConfig works', async () => { + const mockReq = { + params: { + experimentId: mockExperiment.id, + }, + }; + experimentInstance.getProcessingConfig.mockImplementationOnce(() => Promise.resolve()); + + await experimentController.getProcessingConfig(mockReq, mockRes); + expect(experimentInstance.getProcessingConfig).toHaveBeenCalledWith(mockExperiment.id); + }); + + it('updateProcessingConfig works', async () => { + const mockReq = { + params: { + experimentId: mockExperiment.id, + }, + body: [{ + name: 'classifier', + body: { + someChangedField: 'a value', + }, + }], + }; + experimentInstance.updateProcessingConfig.mockImplementationOnce(() => Promise.resolve()); + + await experimentController.updateProcessingConfig(mockReq, mockRes); + expect(experimentInstance.updateProcessingConfig).toHaveBeenCalledWith( + mockExperiment.id, mockReq.body, + ); + }); }); diff --git a/tests/api.v2/mocks/data/getProcessingConfigResponse.json b/tests/api.v2/mocks/data/getProcessingConfigResponse.json new file mode 100644 index 000000000..feab4e666 --- /dev/null +++ b/tests/api.v2/mocks/data/getProcessingConfigResponse.json @@ -0,0 +1,342 @@ +{ + "processingConfig":{ + "classifier": { + "brandNewTries": "changing lmaolxdd" + }, + "doubletScores": { + "auto": true, + "enabled": true, + "filterSettings": { + "binStep": 0.05, + "probabilityThreshold": 0.5 + }, + "330390E9Cdc94C7FB68A0C51Fd059Dda": { + "auto": true, + "apiUrl": "http://api.api-default.svc.cluster.local:3000", + "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", + "enabled": true, + "filterSettings": { + "binStep": 0.05, + "probabilityThreshold": 0.3784758 + }, + "defaultFilterSettings": { + "binStep": 0.05, + "probabilityThreshold": 0.3784758 + } + }, + "46E6484545Dc4Aeb932DE1B43178Fe09": { + "auto": true, + "apiUrl": "http://api.api-default.svc.cluster.local:3000", + "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", + "enabled": true, + "filterSettings": { + "binStep": 0.05, + "probabilityThreshold": 0.4101394 + }, + "defaultFilterSettings": { + "binStep": 0.05, + "probabilityThreshold": 0.4101394 + } + }, + "7Ff6388CCa204325A30C0C29135E1D05": { + "auto": true, + "apiUrl": "http://api.api-default.svc.cluster.local:3000", + "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", + "enabled": true, + "filterSettings": { + "binStep": 0.05, + "probabilityThreshold": 0.7622447 + }, + "defaultFilterSettings": { + "binStep": 0.05, + "probabilityThreshold": 0.7622447 + } + } + }, + "dataIntegration": { + "apiUrl": "http://api.api-default.svc.cluster.local:3000", + "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", + "dataIntegration": { + "method": "harmony", + "methodSettings": { + "fastmnn": { + "numGenes": 2000, + "normalisation": "logNormalize" + }, + "harmony": { + "numGenes": 2000, + "normalisation": "logNormalize" + }, + "seuratv4": { + "numGenes": 2000, + "normalisation": "logNormalize" + }, + "unisample": { + "numGenes": 2000, + "normalisation": "logNormalize" + } + } + }, + "dimensionalityReduction": { + "method": "rpca", + "numPCs": 30, + "excludeGeneCategories": [] + } + }, + "numGenesVsNumUmis": { + "enabled": true, + "filterSettings": { + "regressionType": "gam", + "regressionTypeSettings": { + "gam": { + "pLevel": 0.001 + } + } + }, + "330390E9Cdc94C7FB68A0C51Fd059Dda": { + "auto": true, + "apiUrl": "http://api.api-default.svc.cluster.local:3000", + "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", + "enabled": true, + "filterSettings": { + "regressionType": "linear", + "regressionTypeSettings": { + "linear": { + "pLevel": 0.00009066183 + }, + "spline": { + "pLevel": 0.00009066183 + } + } + }, + "defaultFilterSettings": { + "regressionType": "linear", + "regressionTypeSettings": { + "linear": { + "pLevel": 0.00009066183 + }, + "spline": { + "pLevel": 0.00009066183 + } + } + } + }, + "46E6484545Dc4Aeb932DE1B43178Fe09": { + "auto": true, + "apiUrl": "http://api.api-default.svc.cluster.local:3000", + "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", + "enabled": true, + "filterSettings": { + "regressionType": "linear", + "regressionTypeSettings": { + "linear": { + "pLevel": 0.00009075234 + }, + "spline": { + "pLevel": 0.00009075234 + } + } + }, + "defaultFilterSettings": { + "regressionType": "linear", + "regressionTypeSettings": { + "linear": { + "pLevel": 0.00009075234 + }, + "spline": { + "pLevel": 0.00009075234 + } + } + } + }, + "7Ff6388CCa204325A30C0C29135E1D05": { + "auto": true, + "apiUrl": "http://api.api-default.svc.cluster.local:3000", + "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", + "enabled": true, + "filterSettings": { + "regressionType": "linear", + "regressionTypeSettings": { + "linear": { + "pLevel": 0.00009180207 + }, + "spline": { + "pLevel": 0.00009180207 + } + } + }, + "defaultFilterSettings": { + "regressionType": "linear", + "regressionTypeSettings": { + "linear": { + "pLevel": 0.00009180207 + }, + "spline": { + "pLevel": 0.00009180207 + } + } + } + } + }, + "configureEmbedding": { + "apiUrl": "http://api.api-default.svc.cluster.local:3000", + "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", + "embeddingSettings": { + "method": "umap", + "methodSettings": { + "tsne": { + "perplexity": 30, + "learningRate": 938.9167 + }, + "umap": { + "distanceMetric": "cosine", + "minimumDistance": 0.3 + } + } + }, + "clusteringSettings": { + "method": "louvain", + "methodSettings": { + "louvain": { + "resolution": 0.8 + } + } + } + }, + "cellSizeDistribution": { + "auto": true, + "enabled": false, + "filterSettings": { + "binStep": 200, + "minCellSize": 1080 + }, + "330390E9Cdc94C7FB68A0C51Fd059Dda": { + "auto": true, + "apiUrl": "http://api.api-default.svc.cluster.local:3000", + "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", + "enabled": false, + "filterSettings": { + "binStep": 200, + "minCellSize": 907 + }, + "defaultFilterSettings": { + "binStep": 200, + "minCellSize": 907 + } + }, + "46E6484545Dc4Aeb932DE1B43178Fe09": { + "auto": true, + "apiUrl": "http://api.api-default.svc.cluster.local:3000", + "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", + "enabled": false, + "filterSettings": { + "binStep": 200, + "minCellSize": 623 + }, + "defaultFilterSettings": { + "binStep": 200, + "minCellSize": 623 + } + }, + "7Ff6388CCa204325A30C0C29135E1D05": { + "auto": true, + "apiUrl": "http://api.api-default.svc.cluster.local:3000", + "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", + "enabled": false, + "filterSettings": { + "binStep": 200, + "minCellSize": 516 + }, + "defaultFilterSettings": { + "binStep": 200, + "minCellSize": 516 + } + } + }, + "mitochondrialContent": { + "auto": true, + "enabled": true, + "filterSettings": { + "method": "absolute_threshold", + "methodSettings": { + "absoluteThreshold": { + "binStep": 0.05, + "maxFraction": 0.1 + } + } + }, + "330390E9Cdc94C7FB68A0C51Fd059Dda": { + "auto": true, + "apiUrl": "http://api.api-default.svc.cluster.local:3000", + "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", + "enabled": true, + "filterSettings": { + "method": "absolute_threshold", + "methodSettings": { + "absoluteThreshold": { + "binStep": 0.05, + "maxFraction": 0.1 + } + } + }, + "defaultFilterSettings": { + "method": "absolute_threshold", + "methodSettings": { + "absoluteThreshold": { + "binStep": 0.05, + "maxFraction": 0.1 + } + } + } + }, + "46E6484545Dc4Aeb932DE1B43178Fe09": { + "auto": true, + "apiUrl": "http://api.api-default.svc.cluster.local:3000", + "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", + "enabled": true, + "filterSettings": { + "method": "absolute_threshold", + "methodSettings": { + "absoluteThreshold": { + "binStep": 0.05, + "maxFraction": 0.1 + } + } + }, + "defaultFilterSettings": { + "method": "absolute_threshold", + "methodSettings": { + "absoluteThreshold": { + "binStep": 0.05, + "maxFraction": 0.1 + } + } + } + }, + "7Ff6388CCa204325A30C0C29135E1D05": { + "auto": true, + "apiUrl": "http://api.api-default.svc.cluster.local:3000", + "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", + "enabled": true, + "filterSettings": { + "method": "absolute_threshold", + "methodSettings": { + "absoluteThreshold": { + "binStep": 0.05, + "maxFraction": 0.1 + } + } + }, + "defaultFilterSettings": { + "method": "absolute_threshold", + "methodSettings": { + "absoluteThreshold": { + "binStep": 0.05, + "maxFraction": 0.1 + } + } + } + } + } + } +} \ No newline at end of file diff --git a/tests/api.v2/routes/experiment.test.js b/tests/api.v2/routes/experiment.test.js index 4f2387409..ab9b06462 100644 --- a/tests/api.v2/routes/experiment.test.js +++ b/tests/api.v2/routes/experiment.test.js @@ -9,6 +9,7 @@ const experimentController = require('../../../src/api.v2/controllers/experiment const getExperimentResponse = require('../mocks/data/getExperimentResponse.json'); const getAllExperimentsResponse = require('../mocks/data/getAllExperimentsResponse.json'); +const getProcessingConfigResponse = require('../mocks/data/getProcessingConfigResponse.json'); jest.mock('../../../src/api.v2/controllers/experimentController', () => ({ getAllExperiments: jest.fn(), @@ -16,6 +17,8 @@ jest.mock('../../../src/api.v2/controllers/experimentController', () => ({ createExperiment: jest.fn(), patchExperiment: jest.fn(), updateSamplePosition: jest.fn(), + getProcessingConfig: jest.fn(), + updateProcessingConfig: jest.fn(), })); jest.mock('../../../src/api.v2/middlewares/authMiddlewares'); @@ -234,4 +237,39 @@ describe('tests for experiment route', () => { return done(); }); }); + + it('getProcessingConfig works', async (done) => { + const experimentId = 'experiment-id'; + experimentController.getProcessingConfig.mockImplementationOnce((req, res) => { + res.json(getProcessingConfigResponse); + return Promise.resolve(); + }); + request(app) + .get(`/v2/experiments/${experimentId}/processingConfig`) + .expect(200) + .end((err) => { + if (err) { + return done(err); + } + return done(); + }); + }); + + it('updateProcessingConfig works', async (done) => { + const experimentId = 'experiment-id'; + + experimentController.updateProcessingConfig.mockImplementationOnce((req, res) => { + res.json(OK()); + return Promise.resolve(); + }); + request(app) + .put(`/v2/experiments/${experimentId}/processingConfig`) + .expect(200) + .end((err) => { + if (err) { + return done(err); + } + return done(); + }); + }); }); From b687043be874220ec18cd91895f7505c3045f0f5 Mon Sep 17 00:00:00 2001 From: stefanbabukov Date: Wed, 13 Apr 2022 11:55:10 +0100 Subject: [PATCH 04/17] fix --- tests/api.v2/mocks/data/getProcessingConfigResponse.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/api.v2/mocks/data/getProcessingConfigResponse.json b/tests/api.v2/mocks/data/getProcessingConfigResponse.json index feab4e666..0c3633ee0 100644 --- a/tests/api.v2/mocks/data/getProcessingConfigResponse.json +++ b/tests/api.v2/mocks/data/getProcessingConfigResponse.json @@ -265,7 +265,7 @@ } } }, - "330390E9Cdc94C7FB68A0C51Fd059Dda": { + "330390E9Cdc94C7FB68A0C51Fd059Dda": { // pragma: allowlist secret "auto": true, "apiUrl": "http://api.api-default.svc.cluster.local:3000", "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", From bb81a147ccf78cfd422c5a2863d440dd7b94b526 Mon Sep 17 00:00:00 2001 From: stefanbabukov Date: Wed, 13 Apr 2022 11:56:46 +0100 Subject: [PATCH 05/17] remove comment from json --- tests/api.v2/mocks/data/getProcessingConfigResponse.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/api.v2/mocks/data/getProcessingConfigResponse.json b/tests/api.v2/mocks/data/getProcessingConfigResponse.json index 0c3633ee0..feab4e666 100644 --- a/tests/api.v2/mocks/data/getProcessingConfigResponse.json +++ b/tests/api.v2/mocks/data/getProcessingConfigResponse.json @@ -265,7 +265,7 @@ } } }, - "330390E9Cdc94C7FB68A0C51Fd059Dda": { // pragma: allowlist secret + "330390E9Cdc94C7FB68A0C51Fd059Dda": { "auto": true, "apiUrl": "http://api.api-default.svc.cluster.local:3000", "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", From de6251618e8dcdd99e0106ae268ca76b4aeb0da5 Mon Sep 17 00:00:00 2001 From: stefanbabukov Date: Wed, 13 Apr 2022 17:56:18 +0100 Subject: [PATCH 06/17] convert to use basic sql functions --- src/api.v2/model/experiment.js | 17 +++++------------ src/api.v2/routes/experiment.js | 2 +- tests/api.v2/model/Experiment.test.js | 11 ++++++++++- 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/api.v2/model/experiment.js b/src/api.v2/model/experiment.js index bd1ff5a83..53c70e838 100644 --- a/src/api.v2/model/experiment.js +++ b/src/api.v2/model/experiment.js @@ -145,15 +145,13 @@ class Experiment extends BasicModel { } async getProcessingConfig(experimentId) { - const result = await this.sql.select('processing_config') - .from(tableNames.EXPERIMENT) - .where('id', experimentId) - .first(); - + const result = await this.find({ id: experimentId }); if (_.isEmpty(result)) { throw new NotFoundError('Experiment not found'); } - return result; + console.log('RESULT IS ', result[0].processingConfig); + + return result[0].processingConfig; } async updateProcessingConfig(experimentId, body) { @@ -162,12 +160,7 @@ class Experiment extends BasicModel { const { processingConfig } = await this.getProcessingConfig(experimentId); processingConfig[stepName] = change; - await this.sql.select('processing_config') - .from(tableNames.EXPERIMENT) - .update( - { processing_config: processingConfig }, - ) - .where('id', experimentId); + await this.update(experimentId, { processingConfig }); } async addSample(experimentId, sampleId) { diff --git a/src/api.v2/routes/experiment.js b/src/api.v2/routes/experiment.js index 3bc12956b..7f76fa2c8 100644 --- a/src/api.v2/routes/experiment.js +++ b/src/api.v2/routes/experiment.js @@ -27,7 +27,7 @@ module.exports = { (req, res, next) => updateSamplePosition(req, res).catch(next), ], 'experiment#getProcessingConfig': [ - expressAuthorizationMiddleware, + // expressAuthorizationMiddleware, (req, res, next) => getProcessingConfig(req, res).catch(next), ], 'experiment#updateProcessingConfig': [ diff --git a/tests/api.v2/model/Experiment.test.js b/tests/api.v2/model/Experiment.test.js index e3b13d6e4..00bab97d6 100644 --- a/tests/api.v2/model/Experiment.test.js +++ b/tests/api.v2/model/Experiment.test.js @@ -4,7 +4,7 @@ const sqlClient = require('../../../src/sql/sqlClient'); const helpers = require('../../../src/sql/helpers'); const validSamplesOrderResult = ['sampleId1', 'sampleId2', 'sampleId3', 'sampleId4']; - +const getProcessingConfigResponse = require('../mocks/data/getProcessingConfigResponse'); const { mockSqlClient, mockTrx } = require('../mocks/getMockSqlClient')(); jest.mock('../../../src/sql/sqlClient', () => ({ @@ -184,4 +184,13 @@ describe('model/Experiment', () => { expect(mockSqlClient.raw).toHaveBeenCalledWith('samples_order - \'mockSampleId\''); expect(mockSqlClient.where).toHaveBeenCalledWith('id', 'mockExperimentId'); }); + + it('getProcessingConfig works', async () => { + mockSqlClient.first.mockImplementationOnce(() => Promise.resolve(getProcessingConfigResponse)); + mockSqlClient.where.mockImplementationOnce(() => { Promise.resolve(); }); + + await new Experiment().getProcessingConfig(mockExperimentId); + expect(mockSqlClient.first).toHaveBeenCalledWith(['processing_config']); + expect(mockSqlClient.where).toHaveBeenCalledWith('id', 'mockExperimentId'); + }); }); From 337336bfcbc69782bd7be552fb807fff6d1c2b2c Mon Sep 17 00:00:00 2001 From: stefanbabukov Date: Thu, 14 Apr 2022 12:39:11 +0100 Subject: [PATCH 07/17] tests done --- src/api.v2/model/experiment.js | 5 +- src/api.v2/routes/experiment.js | 2 +- .../data/getProcessingConfigResponse.json | 4 +- tests/api.v2/model/Experiment.test.js | 29 +- .../__snapshots__/Experiment.test.js.snap | 343 ++++++++++++++++++ tests/api/event-services/work-request.test.js | 2 +- 6 files changed, 373 insertions(+), 12 deletions(-) diff --git a/src/api.v2/model/experiment.js b/src/api.v2/model/experiment.js index 53c70e838..34fcdcae9 100644 --- a/src/api.v2/model/experiment.js +++ b/src/api.v2/model/experiment.js @@ -149,7 +149,6 @@ class Experiment extends BasicModel { if (_.isEmpty(result)) { throw new NotFoundError('Experiment not found'); } - console.log('RESULT IS ', result[0].processingConfig); return result[0].processingConfig; } @@ -157,10 +156,10 @@ class Experiment extends BasicModel { async updateProcessingConfig(experimentId, body) { const { name: stepName, body: change } = body[0]; - const { processingConfig } = await this.getProcessingConfig(experimentId); + const processingConfig = await this.getProcessingConfig(experimentId); processingConfig[stepName] = change; - await this.update(experimentId, { processingConfig }); + await this.update(experimentId, { processing_config: processingConfig }); } async addSample(experimentId, sampleId) { diff --git a/src/api.v2/routes/experiment.js b/src/api.v2/routes/experiment.js index 7f76fa2c8..2b0b84c93 100644 --- a/src/api.v2/routes/experiment.js +++ b/src/api.v2/routes/experiment.js @@ -31,7 +31,7 @@ module.exports = { (req, res, next) => getProcessingConfig(req, res).catch(next), ], 'experiment#updateProcessingConfig': [ - expressAuthorizationMiddleware, + // expressAuthorizationMiddleware, (req, res, next) => updateProcessingConfig(req, res).catch(next), ], }; diff --git a/tests/api.v2/mocks/data/getProcessingConfigResponse.json b/tests/api.v2/mocks/data/getProcessingConfigResponse.json index feab4e666..6099fb09e 100644 --- a/tests/api.v2/mocks/data/getProcessingConfigResponse.json +++ b/tests/api.v2/mocks/data/getProcessingConfigResponse.json @@ -1,4 +1,4 @@ -{ +[{ "processingConfig":{ "classifier": { "brandNewTries": "changing lmaolxdd" @@ -339,4 +339,4 @@ } } } -} \ No newline at end of file +}] \ No newline at end of file diff --git a/tests/api.v2/model/Experiment.test.js b/tests/api.v2/model/Experiment.test.js index 00bab97d6..431902312 100644 --- a/tests/api.v2/model/Experiment.test.js +++ b/tests/api.v2/model/Experiment.test.js @@ -6,6 +6,7 @@ const helpers = require('../../../src/sql/helpers'); const validSamplesOrderResult = ['sampleId1', 'sampleId2', 'sampleId3', 'sampleId4']; const getProcessingConfigResponse = require('../mocks/data/getProcessingConfigResponse'); const { mockSqlClient, mockTrx } = require('../mocks/getMockSqlClient')(); +const BasicModel = require('../../../src/api.v2/model/BasicModel'); jest.mock('../../../src/sql/sqlClient', () => ({ get: jest.fn(() => mockSqlClient), @@ -186,11 +187,29 @@ describe('model/Experiment', () => { }); it('getProcessingConfig works', async () => { - mockSqlClient.first.mockImplementationOnce(() => Promise.resolve(getProcessingConfigResponse)); - mockSqlClient.where.mockImplementationOnce(() => { Promise.resolve(); }); + const mockFind = jest.spyOn(BasicModel.prototype, 'find') + .mockImplementationOnce(() => Promise.resolve(getProcessingConfigResponse)); - await new Experiment().getProcessingConfig(mockExperimentId); - expect(mockSqlClient.first).toHaveBeenCalledWith(['processing_config']); - expect(mockSqlClient.where).toHaveBeenCalledWith('id', 'mockExperimentId'); + const result = await new Experiment().getProcessingConfig(mockExperimentId); + expect(mockFind).toHaveBeenCalledWith({ id: mockExperimentId }); + expect(result).toMatchSnapshot(); + }); + + it('updateProcessingConfig works', async () => { + const mockBody = [{ + name: 'classifier', + body: { + changedField: 'IamChanging so much', + }, + }]; + const mockFind = jest.spyOn(BasicModel.prototype, 'find') + .mockImplementationOnce(() => Promise.resolve(getProcessingConfigResponse)); + const mockUpdate = jest.spyOn(BasicModel.prototype, 'update') + .mockImplementationOnce(() => Promise.resolve()); + + await new Experiment().updateProcessingConfig(mockExperimentId, mockBody); + expect(mockFind).toHaveBeenCalled(); + expect(mockUpdate).toHaveBeenCalledWith(mockExperimentId, + { processing_config: getProcessingConfigResponse[0].processingConfig }); }); }); diff --git a/tests/api.v2/model/__snapshots__/Experiment.test.js.snap b/tests/api.v2/model/__snapshots__/Experiment.test.js.snap index e8fcfd911..ce29a0808 100644 --- a/tests/api.v2/model/__snapshots__/Experiment.test.js.snap +++ b/tests/api.v2/model/__snapshots__/Experiment.test.js.snap @@ -12,6 +12,349 @@ Array [ ] `; +exports[`model/Experiment getProcessingConfig works 1`] = ` +Object { + "cellSizeDistribution": Object { + "330390E9Cdc94C7FB68A0C51Fd059Dda": Object { + "apiUrl": "http://api.api-default.svc.cluster.local:3000", + "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", + "auto": true, + "defaultFilterSettings": Object { + "binStep": 200, + "minCellSize": 907, + }, + "enabled": false, + "filterSettings": Object { + "binStep": 200, + "minCellSize": 907, + }, + }, + "46E6484545Dc4Aeb932DE1B43178Fe09": Object { + "apiUrl": "http://api.api-default.svc.cluster.local:3000", + "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", + "auto": true, + "defaultFilterSettings": Object { + "binStep": 200, + "minCellSize": 623, + }, + "enabled": false, + "filterSettings": Object { + "binStep": 200, + "minCellSize": 623, + }, + }, + "7Ff6388CCa204325A30C0C29135E1D05": Object { + "apiUrl": "http://api.api-default.svc.cluster.local:3000", + "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", + "auto": true, + "defaultFilterSettings": Object { + "binStep": 200, + "minCellSize": 516, + }, + "enabled": false, + "filterSettings": Object { + "binStep": 200, + "minCellSize": 516, + }, + }, + "auto": true, + "enabled": false, + "filterSettings": Object { + "binStep": 200, + "minCellSize": 1080, + }, + }, + "classifier": Object { + "brandNewTries": "changing lmaolxdd", + }, + "configureEmbedding": Object { + "apiUrl": "http://api.api-default.svc.cluster.local:3000", + "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", + "clusteringSettings": Object { + "method": "louvain", + "methodSettings": Object { + "louvain": Object { + "resolution": 0.8, + }, + }, + }, + "embeddingSettings": Object { + "method": "umap", + "methodSettings": Object { + "tsne": Object { + "learningRate": 938.9167, + "perplexity": 30, + }, + "umap": Object { + "distanceMetric": "cosine", + "minimumDistance": 0.3, + }, + }, + }, + }, + "dataIntegration": Object { + "apiUrl": "http://api.api-default.svc.cluster.local:3000", + "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", + "dataIntegration": Object { + "method": "harmony", + "methodSettings": Object { + "fastmnn": Object { + "normalisation": "logNormalize", + "numGenes": 2000, + }, + "harmony": Object { + "normalisation": "logNormalize", + "numGenes": 2000, + }, + "seuratv4": Object { + "normalisation": "logNormalize", + "numGenes": 2000, + }, + "unisample": Object { + "normalisation": "logNormalize", + "numGenes": 2000, + }, + }, + }, + "dimensionalityReduction": Object { + "excludeGeneCategories": Array [], + "method": "rpca", + "numPCs": 30, + }, + }, + "doubletScores": Object { + "330390E9Cdc94C7FB68A0C51Fd059Dda": Object { + "apiUrl": "http://api.api-default.svc.cluster.local:3000", + "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", + "auto": true, + "defaultFilterSettings": Object { + "binStep": 0.05, + "probabilityThreshold": 0.3784758, + }, + "enabled": true, + "filterSettings": Object { + "binStep": 0.05, + "probabilityThreshold": 0.3784758, + }, + }, + "46E6484545Dc4Aeb932DE1B43178Fe09": Object { + "apiUrl": "http://api.api-default.svc.cluster.local:3000", + "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", + "auto": true, + "defaultFilterSettings": Object { + "binStep": 0.05, + "probabilityThreshold": 0.4101394, + }, + "enabled": true, + "filterSettings": Object { + "binStep": 0.05, + "probabilityThreshold": 0.4101394, + }, + }, + "7Ff6388CCa204325A30C0C29135E1D05": Object { + "apiUrl": "http://api.api-default.svc.cluster.local:3000", + "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", + "auto": true, + "defaultFilterSettings": Object { + "binStep": 0.05, + "probabilityThreshold": 0.7622447, + }, + "enabled": true, + "filterSettings": Object { + "binStep": 0.05, + "probabilityThreshold": 0.7622447, + }, + }, + "auto": true, + "enabled": true, + "filterSettings": Object { + "binStep": 0.05, + "probabilityThreshold": 0.5, + }, + }, + "mitochondrialContent": Object { + "330390E9Cdc94C7FB68A0C51Fd059Dda": Object { + "apiUrl": "http://api.api-default.svc.cluster.local:3000", + "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", + "auto": true, + "defaultFilterSettings": Object { + "method": "absolute_threshold", + "methodSettings": Object { + "absoluteThreshold": Object { + "binStep": 0.05, + "maxFraction": 0.1, + }, + }, + }, + "enabled": true, + "filterSettings": Object { + "method": "absolute_threshold", + "methodSettings": Object { + "absoluteThreshold": Object { + "binStep": 0.05, + "maxFraction": 0.1, + }, + }, + }, + }, + "46E6484545Dc4Aeb932DE1B43178Fe09": Object { + "apiUrl": "http://api.api-default.svc.cluster.local:3000", + "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", + "auto": true, + "defaultFilterSettings": Object { + "method": "absolute_threshold", + "methodSettings": Object { + "absoluteThreshold": Object { + "binStep": 0.05, + "maxFraction": 0.1, + }, + }, + }, + "enabled": true, + "filterSettings": Object { + "method": "absolute_threshold", + "methodSettings": Object { + "absoluteThreshold": Object { + "binStep": 0.05, + "maxFraction": 0.1, + }, + }, + }, + }, + "7Ff6388CCa204325A30C0C29135E1D05": Object { + "apiUrl": "http://api.api-default.svc.cluster.local:3000", + "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", + "auto": true, + "defaultFilterSettings": Object { + "method": "absolute_threshold", + "methodSettings": Object { + "absoluteThreshold": Object { + "binStep": 0.05, + "maxFraction": 0.1, + }, + }, + }, + "enabled": true, + "filterSettings": Object { + "method": "absolute_threshold", + "methodSettings": Object { + "absoluteThreshold": Object { + "binStep": 0.05, + "maxFraction": 0.1, + }, + }, + }, + }, + "auto": true, + "enabled": true, + "filterSettings": Object { + "method": "absolute_threshold", + "methodSettings": Object { + "absoluteThreshold": Object { + "binStep": 0.05, + "maxFraction": 0.1, + }, + }, + }, + }, + "numGenesVsNumUmis": Object { + "330390E9Cdc94C7FB68A0C51Fd059Dda": Object { + "apiUrl": "http://api.api-default.svc.cluster.local:3000", + "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", + "auto": true, + "defaultFilterSettings": Object { + "regressionType": "linear", + "regressionTypeSettings": Object { + "linear": Object { + "pLevel": 0.00009066183, + }, + "spline": Object { + "pLevel": 0.00009066183, + }, + }, + }, + "enabled": true, + "filterSettings": Object { + "regressionType": "linear", + "regressionTypeSettings": Object { + "linear": Object { + "pLevel": 0.00009066183, + }, + "spline": Object { + "pLevel": 0.00009066183, + }, + }, + }, + }, + "46E6484545Dc4Aeb932DE1B43178Fe09": Object { + "apiUrl": "http://api.api-default.svc.cluster.local:3000", + "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", + "auto": true, + "defaultFilterSettings": Object { + "regressionType": "linear", + "regressionTypeSettings": Object { + "linear": Object { + "pLevel": 0.00009075234, + }, + "spline": Object { + "pLevel": 0.00009075234, + }, + }, + }, + "enabled": true, + "filterSettings": Object { + "regressionType": "linear", + "regressionTypeSettings": Object { + "linear": Object { + "pLevel": 0.00009075234, + }, + "spline": Object { + "pLevel": 0.00009075234, + }, + }, + }, + }, + "7Ff6388CCa204325A30C0C29135E1D05": Object { + "apiUrl": "http://api.api-default.svc.cluster.local:3000", + "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", + "auto": true, + "defaultFilterSettings": Object { + "regressionType": "linear", + "regressionTypeSettings": Object { + "linear": Object { + "pLevel": 0.00009180207, + }, + "spline": Object { + "pLevel": 0.00009180207, + }, + }, + }, + "enabled": true, + "filterSettings": Object { + "regressionType": "linear", + "regressionTypeSettings": Object { + "linear": Object { + "pLevel": 0.00009180207, + }, + "spline": Object { + "pLevel": 0.00009180207, + }, + }, + }, + }, + "enabled": true, + "filterSettings": Object { + "regressionType": "gam", + "regressionTypeSettings": Object { + "gam": Object { + "pLevel": 0.001, + }, + }, + }, + }, +} +`; + exports[`model/Experiment updateSamplePosition rolls back if the parameters are invalid 1`] = ` Array [ "( diff --git a/tests/api/event-services/work-request.test.js b/tests/api/event-services/work-request.test.js index f1f3089ae..23ac8fd82 100644 --- a/tests/api/event-services/work-request.test.js +++ b/tests/api/event-services/work-request.test.js @@ -74,7 +74,7 @@ describe('handleWorkRequest', () => { await handleWorkRequest(workRequest); } catch (e) { expect(e.message).toMatch( - /^Error: distanceMetric must be one of the following/, + /^Error: distanceMetric is not set to an allowed value/, ); } }); From 9980e5ce47a07d9db94b585fcfdb47899448767f Mon Sep 17 00:00:00 2001 From: stefanbabukov Date: Thu, 14 Apr 2022 15:33:53 +0100 Subject: [PATCH 08/17] fix --- package-lock.json | 352 +++++++++--------- tests/api/event-services/work-request.test.js | 2 +- .../__snapshots__/experiment.test.js.snap | 24 ++ 3 files changed, 198 insertions(+), 180 deletions(-) diff --git a/package-lock.json b/package-lock.json index a7847f3cd..865cd8b0e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -65,25 +65,25 @@ "dev": true }, "@babel/core": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.8.tgz", - "integrity": "sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.9.tgz", + "integrity": "sha512-5ug+SfZCpDAkVp9SFIZAzlW18rlzsOcJGaetCjkySnrXXDUw9AR8cDUm1iByTmdWM6yxX6/zycaV76w3YTF2gw==", "dev": true, "requires": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.7", + "@babel/generator": "^7.17.9", "@babel/helper-compilation-targets": "^7.17.7", "@babel/helper-module-transforms": "^7.17.7", - "@babel/helpers": "^7.17.8", - "@babel/parser": "^7.17.8", + "@babel/helpers": "^7.17.9", + "@babel/parser": "^7.17.9", "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", + "@babel/traverse": "^7.17.9", "@babel/types": "^7.17.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", + "json5": "^2.2.1", "semver": "^6.3.0" }, "dependencies": { @@ -117,9 +117,9 @@ } }, "@babel/generator": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.7.tgz", - "integrity": "sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.9.tgz", + "integrity": "sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ==", "dev": true, "requires": { "@babel/types": "^7.17.0", @@ -165,23 +165,13 @@ } }, "@babel/helper-function-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", - "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", + "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.16.7", "@babel/template": "^7.16.7", - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", - "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.17.0" } }, "@babel/helper-hoist-variables": { @@ -255,20 +245,20 @@ "dev": true }, "@babel/helpers": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.8.tgz", - "integrity": "sha512-QcL86FGxpfSJwGtAvv4iG93UL6bmqBdmoVY0CMCU2g+oD2ezQse3PT5Pa+jiD6LJndBQi0EDlpzOWNlLuhz5gw==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.9.tgz", + "integrity": "sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==", "dev": true, "requires": { "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", + "@babel/traverse": "^7.17.9", "@babel/types": "^7.17.0" } }, "@babel/highlight": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", - "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz", + "integrity": "sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", @@ -335,9 +325,9 @@ } }, "@babel/parser": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.8.tgz", - "integrity": "sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.9.tgz", + "integrity": "sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==", "dev": true }, "@babel/plugin-syntax-async-generators": { @@ -449,9 +439,9 @@ } }, "@babel/runtime-corejs3": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.17.8.tgz", - "integrity": "sha512-ZbYSUvoSF6dXZmMl/CYTMOvzIFnbGfv4W3SEHYgMvNsFTeLaF2gkGAF4K2ddmtSK4Emej+0aYcnSC6N5dPCXUQ==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.17.9.tgz", + "integrity": "sha512-WxYHHUWF2uZ7Hp1K+D1xQgbgkGUfA+5UPOegEXGt2Y5SMog/rYCVaifLZDbw8UkNXozEqqrZTy6bglL7xTaCOw==", "requires": { "core-js-pure": "^3.20.2", "regenerator-runtime": "^0.13.4" @@ -476,18 +466,18 @@ } }, "@babel/traverse": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", - "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.9.tgz", + "integrity": "sha512-PQO8sDIJ8SIwipTPiR71kJQCKQYB5NGImbOviK8K+kg5xkNSYXLBupuX9QhatFowrsvo9Hj8WgArg3W7ijNAQw==", "dev": true, "requires": { "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.3", + "@babel/generator": "^7.17.9", "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", + "@babel/helper-function-name": "^7.17.9", "@babel/helper-hoist-variables": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.3", + "@babel/parser": "^7.17.9", "@babel/types": "^7.17.0", "debug": "^4.1.0", "globals": "^11.1.0" @@ -1240,9 +1230,9 @@ } }, "@types/node": { - "version": "17.0.23", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", - "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==" + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.24.tgz", + "integrity": "sha512-aveCYRQbgTH9Pssp1voEP7HiuWlD2jW2BO56w+bVrJn04i61yh6mRfoKO6hEYQD9vF+W8Chkwc6j1M36uPkx4g==" } } }, @@ -1319,9 +1309,9 @@ }, "dependencies": { "@types/node": { - "version": "17.0.23", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", - "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==" + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.24.tgz", + "integrity": "sha512-aveCYRQbgTH9Pssp1voEP7HiuWlD2jW2BO56w+bVrJn04i61yh6mRfoKO6hEYQD9vF+W8Chkwc6j1M36uPkx4g==" } } }, @@ -1435,9 +1425,9 @@ } }, "@types/babel__traverse": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz", - "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.17.0.tgz", + "integrity": "sha512-r8aveDbd+rzGP+ykSdF3oPuTVRWRfbBiHl0rVDM2yNEmSMXfkObQLV46b4RnCv3Lra51OlfnZhkkFaDl2MIRaA==", "dev": true, "requires": { "@babel/types": "^7.3.0" @@ -1453,9 +1443,9 @@ }, "dependencies": { "@types/node": { - "version": "17.0.23", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", - "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==" + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.24.tgz", + "integrity": "sha512-aveCYRQbgTH9Pssp1voEP7HiuWlD2jW2BO56w+bVrJn04i61yh6mRfoKO6hEYQD9vF+W8Chkwc6j1M36uPkx4g==" } } }, @@ -1471,9 +1461,9 @@ }, "dependencies": { "@types/node": { - "version": "17.0.23", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", - "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==" + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.24.tgz", + "integrity": "sha512-aveCYRQbgTH9Pssp1voEP7HiuWlD2jW2BO56w+bVrJn04i61yh6mRfoKO6hEYQD9vF+W8Chkwc6j1M36uPkx4g==" } } }, @@ -1491,9 +1481,9 @@ }, "dependencies": { "@types/node": { - "version": "17.0.23", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", - "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==" + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.24.tgz", + "integrity": "sha512-aveCYRQbgTH9Pssp1voEP7HiuWlD2jW2BO56w+bVrJn04i61yh6mRfoKO6hEYQD9vF+W8Chkwc6j1M36uPkx4g==" } } }, @@ -1511,9 +1501,9 @@ }, "dependencies": { "@types/node": { - "version": "17.0.23", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", - "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==" + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.24.tgz", + "integrity": "sha512-aveCYRQbgTH9Pssp1voEP7HiuWlD2jW2BO56w+bVrJn04i61yh6mRfoKO6hEYQD9vF+W8Chkwc6j1M36uPkx4g==" } } }, @@ -1549,9 +1539,9 @@ }, "dependencies": { "@types/node": { - "version": "17.0.23", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", - "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==" + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.24.tgz", + "integrity": "sha512-aveCYRQbgTH9Pssp1voEP7HiuWlD2jW2BO56w+bVrJn04i61yh6mRfoKO6hEYQD9vF+W8Chkwc6j1M36uPkx4g==" } } }, @@ -1633,9 +1623,9 @@ }, "dependencies": { "@types/node": { - "version": "17.0.23", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", - "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==" + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.24.tgz", + "integrity": "sha512-aveCYRQbgTH9Pssp1voEP7HiuWlD2jW2BO56w+bVrJn04i61yh6mRfoKO6hEYQD9vF+W8Chkwc6j1M36uPkx4g==" } } }, @@ -1653,9 +1643,9 @@ }, "dependencies": { "@types/node": { - "version": "17.0.23", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", - "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==" + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.24.tgz", + "integrity": "sha512-aveCYRQbgTH9Pssp1voEP7HiuWlD2jW2BO56w+bVrJn04i61yh6mRfoKO6hEYQD9vF+W8Chkwc6j1M36uPkx4g==" } } }, @@ -1676,16 +1666,16 @@ }, "dependencies": { "@types/node": { - "version": "17.0.23", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", - "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==" + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.24.tgz", + "integrity": "sha512-aveCYRQbgTH9Pssp1voEP7HiuWlD2jW2BO56w+bVrJn04i61yh6mRfoKO6hEYQD9vF+W8Chkwc6j1M36uPkx4g==" } } }, "@types/node": { - "version": "16.11.26", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.26.tgz", - "integrity": "sha512-GZ7bu5A6+4DtG7q9GsoHXy3ALcgeIHP4NnL0Vv2wu0uUB/yQex26v0tf6/na1mm0+bS9Uw+0DFex7aaKr2qawQ==", + "version": "16.11.27", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.27.tgz", + "integrity": "sha512-C1pD3kgLoZ56Uuy5lhfOxie4aZlA3UMGLX9rXteq4WitEZH6Rl80mwactt9QG0w0gLFlN/kLBTFnGXtDVWvWQw==", "dev": true }, "@types/normalize-package-data": { @@ -1705,16 +1695,16 @@ }, "dependencies": { "@types/node": { - "version": "17.0.23", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", - "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==" + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.24.tgz", + "integrity": "sha512-aveCYRQbgTH9Pssp1voEP7HiuWlD2jW2BO56w+bVrJn04i61yh6mRfoKO6hEYQD9vF+W8Chkwc6j1M36uPkx4g==" } } }, "@types/prettier": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.4.tgz", - "integrity": "sha512-ReVR2rLTV1kvtlWFyuot+d1pkpG2Fw/XKE3PDAdj57rbM97ttSp9JZ2UsP+2EHTylra9cUf6JA7tGwW1INzUrA==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.6.0.tgz", + "integrity": "sha512-G/AdOadiZhnJp0jXCaBQU449W2h716OW/EoXeYkCytxKL06X1WCXB4DZpp8TpZ8eyIJVS1cw4lrlkkSYU21cDw==", "dev": true }, "@types/qs": { @@ -1739,9 +1729,9 @@ }, "dependencies": { "@types/node": { - "version": "17.0.23", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", - "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==" + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.24.tgz", + "integrity": "sha512-aveCYRQbgTH9Pssp1voEP7HiuWlD2jW2BO56w+bVrJn04i61yh6mRfoKO6hEYQD9vF+W8Chkwc6j1M36uPkx4g==" } } }, @@ -1754,9 +1744,9 @@ }, "dependencies": { "@types/node": { - "version": "17.0.23", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", - "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==" + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.24.tgz", + "integrity": "sha512-aveCYRQbgTH9Pssp1voEP7HiuWlD2jW2BO56w+bVrJn04i61yh6mRfoKO6hEYQD9vF+W8Chkwc6j1M36uPkx4g==" } } }, @@ -1770,9 +1760,9 @@ }, "dependencies": { "@types/node": { - "version": "17.0.23", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", - "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==" + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.24.tgz", + "integrity": "sha512-aveCYRQbgTH9Pssp1voEP7HiuWlD2jW2BO56w+bVrJn04i61yh6mRfoKO6hEYQD9vF+W8Chkwc6j1M36uPkx4g==" } } }, @@ -1791,9 +1781,9 @@ }, "dependencies": { "@types/node": { - "version": "17.0.23", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", - "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==" + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.24.tgz", + "integrity": "sha512-aveCYRQbgTH9Pssp1voEP7HiuWlD2jW2BO56w+bVrJn04i61yh6mRfoKO6hEYQD9vF+W8Chkwc6j1M36uPkx4g==" } } }, @@ -1807,16 +1797,16 @@ }, "dependencies": { "@types/node": { - "version": "17.0.23", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", - "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==" + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.24.tgz", + "integrity": "sha512-aveCYRQbgTH9Pssp1voEP7HiuWlD2jW2BO56w+bVrJn04i61yh6mRfoKO6hEYQD9vF+W8Chkwc6j1M36uPkx4g==" } } }, "@types/tough-cookie": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.1.tgz", - "integrity": "sha512-Y0K95ThC3esLEYD6ZuqNek29lNX2EM1qxV8y2FTLUB0ff5wWrk7az+mLrnNFUnaXcgKye22+sFBRXOgpPILZNg==" + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz", + "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==" }, "@types/underscore": { "version": "1.11.4", @@ -1832,9 +1822,9 @@ }, "dependencies": { "@types/node": { - "version": "17.0.23", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", - "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==" + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.24.tgz", + "integrity": "sha512-aveCYRQbgTH9Pssp1voEP7HiuWlD2jW2BO56w+bVrJn04i61yh6mRfoKO6hEYQD9vF+W8Chkwc6j1M36uPkx4g==" } } }, @@ -2113,14 +2103,15 @@ "optional": true }, "array.prototype.flat": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", - "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", + "integrity": "sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" + "es-abstract": "^1.19.2", + "es-shim-unscopables": "^1.0.0" } }, "array.prototype.map": { @@ -2205,11 +2196,6 @@ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" - }, "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", @@ -2221,9 +2207,9 @@ "integrity": "sha1-0WkB0QzOxZUWwZe5zNiTBom4E7Q=" }, "aws-sdk": { - "version": "2.1107.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1107.0.tgz", - "integrity": "sha512-gZaCm+zSSwjUYSa/cVg63uXhq5w9coT9yA8aTDOYzFkyl19b9H2CCixPeyf7KHtZdGwe3QAG2Oe6Rw0xtoCs+Q==", + "version": "2.1114.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1114.0.tgz", + "integrity": "sha512-LB3q0aHK37GccvNZ4HKtA+0YF94GWYDbJMz3XYoNSEVFOFnLj2DfpkoWlBSnBEJlG9m8GRNssDWs65gQ3MVzDQ==", "requires": { "buffer": "4.9.2", "events": "1.1.1", @@ -3246,9 +3232,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001325", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001325.tgz", - "integrity": "sha512-sB1bZHjseSjDtijV1Hb7PB2Zd58Kyx+n/9EotvZ4Qcz2K3d0lWB8dB4nb8wN/TsOGFq3UuAm0zQZNQ4SoR7TrQ==", + "version": "1.0.30001332", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001332.tgz", + "integrity": "sha512-10T30NYOEQtN6C11YGg411yebhvpnC6Z102+B95eAsN0oB6KUs01ivE8u+G6FMIRtIrVlYXhL+LUwQ3/hXwDWw==", "dev": true }, "capture-exit": { @@ -4308,9 +4294,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { - "version": "1.4.103", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.103.tgz", - "integrity": "sha512-c/uKWR1Z/W30Wy/sx3dkZoj4BijbXX85QKWu9jJfjho3LBAXNEGAEW3oWiGb+dotA6C6BzCTxL2/aLes7jlUeg==", + "version": "1.4.107", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.107.tgz", + "integrity": "sha512-Huen6taaVrUrSy8o7mGStByba8PfOWWluHNxSHGBrCgEdFVLtvdQDBr9LBCF9Uci8SYxh28QNNMO0oC17wbGAg==", "dev": true }, "elliptic": { @@ -4461,9 +4447,9 @@ } }, "es-abstract": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.2.tgz", - "integrity": "sha512-gfSBJoZdlL2xRiOCy0g8gLMryhoe1TlimjzU99L/31Z8QEGIhVQI+EWwt5lT+AuU9SnorVupXFqqOGqGfsyO6w==", + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.5.tgz", + "integrity": "sha512-Aa2G2+Rd3b6kxEUKTF4TaW67czBLyAv3z7VOhYRU50YBx+bbsYZ9xQP4lMNazePuFlybXI0V4MruPos7qUo5fA==", "requires": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", @@ -4476,7 +4462,7 @@ "is-callable": "^1.2.4", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.1", + "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", "is-weakref": "^1.0.2", "object-inspect": "^1.12.0", @@ -4527,6 +4513,15 @@ } } }, + "es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, "es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", @@ -4538,9 +4533,9 @@ } }, "es5-ext": { - "version": "0.10.59", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.59.tgz", - "integrity": "sha512-cOgyhW0tIJyQY1Kfw6Kr0viu9ZlUctVchRMZ7R0HiH3dxTSp5zJDLecwxUqPUrGKMsgBI1wd1FL+d9Jxfi4cLw==", + "version": "0.10.60", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.60.tgz", + "integrity": "sha512-jpKNXIt60htYG59/9FGf2PYT3pwMpnEbNKysU+k/4FGwyGtMotOvcZOuW+EmXXYASRqYSXQfGL5cVIthOTgbkg==", "dev": true, "requires": { "es6-iterator": "^2.0.3", @@ -4900,9 +4895,9 @@ } }, "eslint-plugin-import": { - "version": "2.25.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.4.tgz", - "integrity": "sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA==", + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", + "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", "dev": true, "requires": { "array-includes": "^3.1.4", @@ -4910,14 +4905,14 @@ "debug": "^2.6.9", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.2", + "eslint-module-utils": "^2.7.3", "has": "^1.0.3", - "is-core-module": "^2.8.0", + "is-core-module": "^2.8.1", "is-glob": "^4.0.3", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "object.values": "^1.1.5", - "resolve": "^1.20.0", - "tsconfig-paths": "^3.12.0" + "resolve": "^1.22.0", + "tsconfig-paths": "^3.14.1" }, "dependencies": { "doctrine": { @@ -5731,11 +5726,10 @@ "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" }, "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz", + "integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==", "requires": { - "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" @@ -8095,9 +8089,9 @@ } }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -8471,17 +8465,17 @@ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" }, "json-merger": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/json-merger/-/json-merger-1.1.7.tgz", - "integrity": "sha512-B0k+roIIiZ/vkKkhQQlDf986fFJN5nYn+G6o+zAy7NtRtkFud2GlqsTHl88RA7v4eGKgVQ2sjowSCKbKlCWEKA==", + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/json-merger/-/json-merger-1.1.9.tgz", + "integrity": "sha512-kbt/SUtX3sMm11PjBG4CjgjIEaYKqWP7xYk8lwIlXUs1EXCZaIHKv9uqSxAs6EPdisQhsa2k64C3I/RVn+562w==", "requires": { - "commander": "^7.2.0", - "fs-extra": "^9.1.0", + "commander": "^9.1.0", + "fs-extra": "^10.0.1", "js-yaml": "^4.1.0", - "json-ptr": "^3.0.0", + "json-ptr": "^3.1.0", "jsonpath": "^1.1.1", "lodash.range": "^3.2.0", - "vm2": "^3.9.5" + "vm2": "^3.9.9" }, "dependencies": { "argparse": { @@ -8490,9 +8484,9 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.1.0.tgz", + "integrity": "sha512-i0/MaqBtdbnJ4XQs4Pmyb+oFQl+q0lsAmokVUH92SlSw4fkeAcG3bVon+Qt7hmtF+u3Het6o4VgrcY3qAoEB6w==" }, "js-yaml": { "version": "4.1.0", @@ -8656,9 +8650,9 @@ } }, "keyv": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.2.1.tgz", - "integrity": "sha512-cAJq5cTfxQdq1DHZEVNpnk4mEvhP+8UP8UQftLtTtJ98beKkRHf+62M0mIDM2u/IWXyP8bmGB375/6uGdSX2MA==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.2.2.tgz", + "integrity": "sha512-uYS0vKTlBIjNCAUqrjlxmruxOEiZxZIHXyp32sdcGmP+ukFrmWUnE//RcPXJH3Vxrni1H2gsQbjHE0bH7MtMQQ==", "requires": { "compress-brotli": "^1.3.6", "json-buffer": "3.0.1" @@ -8679,9 +8673,9 @@ "dev": true }, "knex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/knex/-/knex-1.0.5.tgz", - "integrity": "sha512-EPEQNA0Yn5H5yoqKuCpdGn1EmispA/wS7OMaCAmirHlvHpiZUqcTerD9OU71t3nVLSnuXa0nYcnkUtRSPchsnA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/knex/-/knex-1.0.7.tgz", + "integrity": "sha512-89jxuRATt4qJMb9ZyyaKBy0pQ4d5h7eOFRqiNFnUvsgU+9WZ2eIaZKrAPG1+F3mgu5UloPUnkVE5Yo2sKZUs6Q==", "requires": { "colorette": "2.0.16", "commander": "^9.1.0", @@ -9297,9 +9291,9 @@ } }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "optional": true, "requires": { @@ -9319,9 +9313,9 @@ } }, "node-releases": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", - "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.3.tgz", + "integrity": "sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw==", "dev": true }, "nodemon": { @@ -10430,14 +10424,14 @@ "dev": true }, "promise.any": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/promise.any/-/promise.any-2.0.3.tgz", - "integrity": "sha512-BTzZue0G5jWLe5YRxn5yEPm8WI+wI/Kp387Y0P70m4S3VPYRBFuQiQ5GEHgFbpWs0RsTk4pGhQKRaFqVoJfsDw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/promise.any/-/promise.any-2.0.4.tgz", + "integrity": "sha512-Yyl7jstFInFv/eIjm8Sj+pyyzHKZJPMr6yOdxxls1xdVatc3kVyVOvMPmqDaKC5kzxjwuMCkn41isweIUf8DPw==", "requires": { "array.prototype.map": "^1.0.4", "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", + "es-abstract": "^1.19.2", "es-aggregate-error": "^1.0.7", "get-intrinsic": "^1.1.1", "iterate-value": "^1.0.2" @@ -11966,9 +11960,9 @@ }, "dependencies": { "@types/node": { - "version": "17.0.23", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", - "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==" + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.24.tgz", + "integrity": "sha512-aveCYRQbgTH9Pssp1voEP7HiuWlD2jW2BO56w+bVrJn04i61yh6mRfoKO6hEYQD9vF+W8Chkwc6j1M36uPkx4g==" }, "debug": { "version": "4.3.4", @@ -13139,9 +13133,9 @@ } }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { "lru-cache": "^6.0.0" diff --git a/tests/api/event-services/work-request.test.js b/tests/api/event-services/work-request.test.js index 23ac8fd82..665592953 100644 --- a/tests/api/event-services/work-request.test.js +++ b/tests/api/event-services/work-request.test.js @@ -74,7 +74,7 @@ describe('handleWorkRequest', () => { await handleWorkRequest(workRequest); } catch (e) { expect(e.message).toMatch( - /^Error: distanceMetric is not set to an allowed value/, + /^Error: distanceMetric must be one of the following:/, ); } }); diff --git a/tests/api/routes/__snapshots__/experiment.test.js.snap b/tests/api/routes/__snapshots__/experiment.test.js.snap index 4a9fc0bef..4d13a8578 100644 --- a/tests/api/routes/__snapshots__/experiment.test.js.snap +++ b/tests/api/routes/__snapshots__/experiment.test.js.snap @@ -1,5 +1,29 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`tests for experiment route Find cell sets by experiment id works 1`] = ` +Object { + "experimentId": "someId", + "experimentName": "my mocky name", + "meta": Object { + "gem2s": Object { + "executionArn": "", + "paramsHash": "", + "stateMachineArn": "", + }, + "organism": null, + "pipeline": Object { + "executionArn": "", + "stateMachineArn": "", + }, + "type": "10x", + }, + "projectId": "projectUuid", + "sampleIds": Array [ + "sampleId1", + ], +} +`; + exports[`tests for experiment route Find experiment by id works 1`] = ` Object { "experimentId": "someId", From 205e9634ae082a44064c3151544023a9f4c84bec Mon Sep 17 00:00:00 2001 From: stefanbabukov Date: Thu, 14 Apr 2022 15:41:36 +0100 Subject: [PATCH 09/17] update snapshot --- .../__snapshots__/experiment.test.js.snap | 24 ------------------- 1 file changed, 24 deletions(-) diff --git a/tests/api/routes/__snapshots__/experiment.test.js.snap b/tests/api/routes/__snapshots__/experiment.test.js.snap index 4d13a8578..4a9fc0bef 100644 --- a/tests/api/routes/__snapshots__/experiment.test.js.snap +++ b/tests/api/routes/__snapshots__/experiment.test.js.snap @@ -1,29 +1,5 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`tests for experiment route Find cell sets by experiment id works 1`] = ` -Object { - "experimentId": "someId", - "experimentName": "my mocky name", - "meta": Object { - "gem2s": Object { - "executionArn": "", - "paramsHash": "", - "stateMachineArn": "", - }, - "organism": null, - "pipeline": Object { - "executionArn": "", - "stateMachineArn": "", - }, - "type": "10x", - }, - "projectId": "projectUuid", - "sampleIds": Array [ - "sampleId1", - ], -} -`; - exports[`tests for experiment route Find experiment by id works 1`] = ` Object { "experimentId": "someId", From 2e815b4af262d028b96541893df8420f6caa7bda Mon Sep 17 00:00:00 2001 From: stefanbabukov Date: Thu, 14 Apr 2022 16:30:02 +0100 Subject: [PATCH 10/17] remove this because github got confused --- src/api.v2/model/Experiment.js | 164 ----------------------------- src/api.v2/model/experiment.js | 182 --------------------------------- 2 files changed, 346 deletions(-) delete mode 100644 src/api.v2/model/Experiment.js delete mode 100644 src/api.v2/model/experiment.js diff --git a/src/api.v2/model/Experiment.js b/src/api.v2/model/Experiment.js deleted file mode 100644 index ce724b53f..000000000 --- a/src/api.v2/model/Experiment.js +++ /dev/null @@ -1,164 +0,0 @@ -const _ = require('lodash'); - -const BasicModel = require('./BasicModel'); -const sqlClient = require('../../sql/sqlClient'); -const { collapseKeyIntoArray } = require('../../sql/helpers'); - -const { NotFoundError } = require('../../utils/responses'); - -const tableNames = require('../helpers/tableNames'); - - -const getLogger = require('../../utils/getLogger'); - -const logger = getLogger('[ExperimentModel] - '); - - -const experimentFields = [ - 'id', - 'name', - 'description', - 'samples_order', - 'processing_config', - 'notify_by_email', - 'created_at', - 'updated_at', -]; - -class Experiment extends BasicModel { - constructor(sql = sqlClient.get()) { - super(sql, tableNames.EXPERIMENT, experimentFields); - } - - async getAllExperiments(userId) { - const fields = [ - 'id', - 'name', - 'description', - 'samples_order', - 'notify_by_email', - 'created_at', - 'updated_at', - ]; - - const aliasedExperimentFields = fields.map((field) => `e.${field}`); - function mainQuery() { - this.select([...aliasedExperimentFields, 'm.key']) - .from(tableNames.USER_ACCESS) - .where('user_id', userId) - .join(`${tableNames.EXPERIMENT} as e`, 'e.id', `${tableNames.USER_ACCESS}.experiment_id`) - .leftJoin(`${tableNames.METADATA_TRACK} as m`, 'e.id', 'm.experiment_id') - .as('mainQuery'); - } - - const result = await collapseKeyIntoArray(mainQuery, [...fields], 'key', 'metadataKeys', this.sql); - - return result; - } - - async getExperimentData(experimentId) { - function mainQuery() { - this.select('*') - .from(tableNames.EXPERIMENT) - .leftJoin(tableNames.EXPERIMENT_EXECUTION, `${tableNames.EXPERIMENT}.id`, `${tableNames.EXPERIMENT_EXECUTION}.experiment_id`) - .where('id', experimentId) - .as('mainQuery'); - } - - const experimentExecutionFields = [ - 'params_hash', 'state_machine_arn', 'execution_arn', - ]; - - const pipelineExecutionKeys = experimentExecutionFields.reduce((acum, current) => { - acum.push(`'${current}'`); - acum.push(current); - - return acum; - }, []); - - const replaceNullsWithObject = (object, nullableKey) => ( - `COALESCE( - ${object} - FILTER( - WHERE ${nullableKey} IS NOT NULL - ), - '{}'::jsonb - )` - ); - - const result = await this.sql - .select([ - ...experimentFields, - this.sql.raw( - `${replaceNullsWithObject( - `jsonb_object_agg(pipeline_type, jsonb_build_object(${pipelineExecutionKeys.join(', ')}))`, - 'pipeline_type', - )} as pipelines`, - ), - ]) - .from(mainQuery) - .groupBy(experimentFields) - .first(); - - if (_.isEmpty(result)) { - throw new NotFoundError('Experiment not found'); - } - - return result; - } - - // Sets samples_order as an array that has the sample in oldPosition moved to newPosition - async updateSamplePosition( - experimentId, oldPosition, newPosition, - ) { - const trx = await this.sql.transaction(); - - try { - const result = await trx(tableNames.EXPERIMENT) - .update({ - samples_order: trx.raw(`( - SELECT jsonb_insert(samples_order - ${oldPosition}, '{${newPosition}}', samples_order -> ${oldPosition}, false) - FROM ( - SELECT (samples_order) - FROM experiment e - WHERE e.id = '${experimentId}' - ) samples_order - )`), - }).where('id', experimentId) - .returning(['samples_order']); - - const { samplesOrder = null } = result[0] || {}; - - if (_.isNil(samplesOrder) - || !_.inRange(oldPosition, 0, samplesOrder.length) - || !_.inRange(newPosition, 0, samplesOrder.length) - ) { - logger.log('Invalid positions or samples_order was broken, rolling back transaction'); - throw new Error('Invalid update parameters'); - } - - trx.commit(); - } catch (e) { - trx.rollback(); - throw e; - } - } - - async addSample(experimentId, sampleId) { - await this.sql(tableNames.EXPERIMENT) - .update({ - samples_order: this.sql.raw(`samples_order || '["${sampleId}"]'::jsonb`), - }) - .where('id', experimentId); - } - - async deleteSample(experimentId, sampleId) { - await this.sql(tableNames.EXPERIMENT) - .update({ - samples_order: this.sql.raw(`samples_order - '${sampleId}'`), - }) - .where('id', experimentId); - } -} - -module.exports = Experiment; diff --git a/src/api.v2/model/experiment.js b/src/api.v2/model/experiment.js deleted file mode 100644 index 34fcdcae9..000000000 --- a/src/api.v2/model/experiment.js +++ /dev/null @@ -1,182 +0,0 @@ -const _ = require('lodash'); - -const BasicModel = require('./BasicModel'); -const sqlClient = require('../../sql/sqlClient'); -const { collapseKeyIntoArray } = require('../../sql/helpers'); - -const { NotFoundError } = require('../../utils/responses'); - -const tableNames = require('../helpers/tableNames'); - - -const getLogger = require('../../utils/getLogger'); - -const logger = getLogger('[ExperimentModel] - '); - - -const experimentFields = [ - 'id', - 'name', - 'description', - 'samples_order', - 'processing_config', - 'notify_by_email', - 'created_at', - 'updated_at', -]; - -class Experiment extends BasicModel { - constructor(sql = sqlClient.get()) { - super(sql, tableNames.EXPERIMENT, experimentFields); - } - - async getAllExperiments(userId) { - const fields = [ - 'id', - 'name', - 'description', - 'samples_order', - 'notify_by_email', - 'created_at', - 'updated_at', - ]; - - const aliasedExperimentFields = fields.map((field) => `e.${field}`); - function mainQuery() { - this.select([...aliasedExperimentFields, 'm.key']) - .from(tableNames.USER_ACCESS) - .where('user_id', userId) - .join(`${tableNames.EXPERIMENT} as e`, 'e.id', `${tableNames.USER_ACCESS}.experiment_id`) - .leftJoin(`${tableNames.METADATA_TRACK} as m`, 'e.id', 'm.experiment_id') - .as('mainQuery'); - } - - const result = await collapseKeyIntoArray(mainQuery, [...fields], 'key', 'metadataKeys', this.sql); - - return result; - } - - async getExperimentData(experimentId) { - function mainQuery() { - this.select('*') - .from(tableNames.EXPERIMENT) - .leftJoin(tableNames.EXPERIMENT_EXECUTION, `${tableNames.EXPERIMENT}.id`, `${tableNames.EXPERIMENT_EXECUTION}.experiment_id`) - .where('id', experimentId) - .as('mainQuery'); - } - - const experimentExecutionFields = [ - 'params_hash', 'state_machine_arn', 'execution_arn', - ]; - - const pipelineExecutionKeys = experimentExecutionFields.reduce((acum, current) => { - acum.push(`'${current}'`); - acum.push(current); - - return acum; - }, []); - - const replaceNullsWithObject = (object, nullableKey) => ( - `COALESCE( - ${object} - FILTER( - WHERE ${nullableKey} IS NOT NULL - ), - '{}'::jsonb - )` - ); - - const result = await this.sql - .select([ - ...experimentFields, - this.sql.raw( - `${replaceNullsWithObject( - `jsonb_object_agg(pipeline_type, jsonb_build_object(${pipelineExecutionKeys.join(', ')}))`, - 'pipeline_type', - )} as pipelines`, - ), - ]) - .from(mainQuery) - .groupBy(experimentFields) - .first(); - - if (_.isEmpty(result)) { - throw new NotFoundError('Experiment not found'); - } - - return result; - } - - // Sets samples_order as an array that has the sample in oldPosition moved to newPosition - async updateSamplePosition( - experimentId, oldPosition, newPosition, - ) { - const trx = await this.sql.transaction(); - - try { - const result = await trx(tableNames.EXPERIMENT) - .update({ - samples_order: trx.raw(`( - SELECT jsonb_insert(samples_order - ${oldPosition}, '{${newPosition}}', samples_order -> ${oldPosition}, false) - FROM ( - SELECT (samples_order) - FROM experiment e - WHERE e.id = '${experimentId}' - ) samples_order - )`), - }).where('id', experimentId) - .returning(['samples_order']); - - const { samplesOrder = null } = result[0] || {}; - - if (_.isNil(samplesOrder) - || !_.inRange(oldPosition, 0, samplesOrder.length) - || !_.inRange(newPosition, 0, samplesOrder.length) - ) { - logger.log('Invalid positions or samples_order was broken, rolling back transaction'); - throw new Error('Invalid update parameters'); - } - - trx.commit(); - } catch (e) { - trx.rollback(); - throw e; - } - } - - async getProcessingConfig(experimentId) { - const result = await this.find({ id: experimentId }); - if (_.isEmpty(result)) { - throw new NotFoundError('Experiment not found'); - } - - return result[0].processingConfig; - } - - async updateProcessingConfig(experimentId, body) { - const { name: stepName, body: change } = body[0]; - - const processingConfig = await this.getProcessingConfig(experimentId); - processingConfig[stepName] = change; - - await this.update(experimentId, { processing_config: processingConfig }); - } - - async addSample(experimentId, sampleId) { - await this.sql(tableNames.EXPERIMENT) - .update({ - samples_order: this.sql.raw(`samples_order || '["${sampleId}"]'::jsonb`), - }) - .where('id', experimentId); - } - - async deleteSample(experimentId, sampleId) { - await this.sql(tableNames.EXPERIMENT) - .update({ - samples_order: this.sql.raw(`samples_order - '${sampleId}'`), - }) - .where('id', experimentId); - } -} - -module.exports = Experiment; From f453852914f3895afd085003571e6f76ce3f22f2 Mon Sep 17 00:00:00 2001 From: stefanbabukov Date: Thu, 14 Apr 2022 16:30:53 +0100 Subject: [PATCH 11/17] added again --- src/api.v2/model/Experiment.js | 182 +++++++++++++++++++++++++++++++++ 1 file changed, 182 insertions(+) create mode 100644 src/api.v2/model/Experiment.js diff --git a/src/api.v2/model/Experiment.js b/src/api.v2/model/Experiment.js new file mode 100644 index 000000000..34fcdcae9 --- /dev/null +++ b/src/api.v2/model/Experiment.js @@ -0,0 +1,182 @@ +const _ = require('lodash'); + +const BasicModel = require('./BasicModel'); +const sqlClient = require('../../sql/sqlClient'); +const { collapseKeyIntoArray } = require('../../sql/helpers'); + +const { NotFoundError } = require('../../utils/responses'); + +const tableNames = require('../helpers/tableNames'); + + +const getLogger = require('../../utils/getLogger'); + +const logger = getLogger('[ExperimentModel] - '); + + +const experimentFields = [ + 'id', + 'name', + 'description', + 'samples_order', + 'processing_config', + 'notify_by_email', + 'created_at', + 'updated_at', +]; + +class Experiment extends BasicModel { + constructor(sql = sqlClient.get()) { + super(sql, tableNames.EXPERIMENT, experimentFields); + } + + async getAllExperiments(userId) { + const fields = [ + 'id', + 'name', + 'description', + 'samples_order', + 'notify_by_email', + 'created_at', + 'updated_at', + ]; + + const aliasedExperimentFields = fields.map((field) => `e.${field}`); + function mainQuery() { + this.select([...aliasedExperimentFields, 'm.key']) + .from(tableNames.USER_ACCESS) + .where('user_id', userId) + .join(`${tableNames.EXPERIMENT} as e`, 'e.id', `${tableNames.USER_ACCESS}.experiment_id`) + .leftJoin(`${tableNames.METADATA_TRACK} as m`, 'e.id', 'm.experiment_id') + .as('mainQuery'); + } + + const result = await collapseKeyIntoArray(mainQuery, [...fields], 'key', 'metadataKeys', this.sql); + + return result; + } + + async getExperimentData(experimentId) { + function mainQuery() { + this.select('*') + .from(tableNames.EXPERIMENT) + .leftJoin(tableNames.EXPERIMENT_EXECUTION, `${tableNames.EXPERIMENT}.id`, `${tableNames.EXPERIMENT_EXECUTION}.experiment_id`) + .where('id', experimentId) + .as('mainQuery'); + } + + const experimentExecutionFields = [ + 'params_hash', 'state_machine_arn', 'execution_arn', + ]; + + const pipelineExecutionKeys = experimentExecutionFields.reduce((acum, current) => { + acum.push(`'${current}'`); + acum.push(current); + + return acum; + }, []); + + const replaceNullsWithObject = (object, nullableKey) => ( + `COALESCE( + ${object} + FILTER( + WHERE ${nullableKey} IS NOT NULL + ), + '{}'::jsonb + )` + ); + + const result = await this.sql + .select([ + ...experimentFields, + this.sql.raw( + `${replaceNullsWithObject( + `jsonb_object_agg(pipeline_type, jsonb_build_object(${pipelineExecutionKeys.join(', ')}))`, + 'pipeline_type', + )} as pipelines`, + ), + ]) + .from(mainQuery) + .groupBy(experimentFields) + .first(); + + if (_.isEmpty(result)) { + throw new NotFoundError('Experiment not found'); + } + + return result; + } + + // Sets samples_order as an array that has the sample in oldPosition moved to newPosition + async updateSamplePosition( + experimentId, oldPosition, newPosition, + ) { + const trx = await this.sql.transaction(); + + try { + const result = await trx(tableNames.EXPERIMENT) + .update({ + samples_order: trx.raw(`( + SELECT jsonb_insert(samples_order - ${oldPosition}, '{${newPosition}}', samples_order -> ${oldPosition}, false) + FROM ( + SELECT (samples_order) + FROM experiment e + WHERE e.id = '${experimentId}' + ) samples_order + )`), + }).where('id', experimentId) + .returning(['samples_order']); + + const { samplesOrder = null } = result[0] || {}; + + if (_.isNil(samplesOrder) + || !_.inRange(oldPosition, 0, samplesOrder.length) + || !_.inRange(newPosition, 0, samplesOrder.length) + ) { + logger.log('Invalid positions or samples_order was broken, rolling back transaction'); + throw new Error('Invalid update parameters'); + } + + trx.commit(); + } catch (e) { + trx.rollback(); + throw e; + } + } + + async getProcessingConfig(experimentId) { + const result = await this.find({ id: experimentId }); + if (_.isEmpty(result)) { + throw new NotFoundError('Experiment not found'); + } + + return result[0].processingConfig; + } + + async updateProcessingConfig(experimentId, body) { + const { name: stepName, body: change } = body[0]; + + const processingConfig = await this.getProcessingConfig(experimentId); + processingConfig[stepName] = change; + + await this.update(experimentId, { processing_config: processingConfig }); + } + + async addSample(experimentId, sampleId) { + await this.sql(tableNames.EXPERIMENT) + .update({ + samples_order: this.sql.raw(`samples_order || '["${sampleId}"]'::jsonb`), + }) + .where('id', experimentId); + } + + async deleteSample(experimentId, sampleId) { + await this.sql(tableNames.EXPERIMENT) + .update({ + samples_order: this.sql.raw(`samples_order - '${sampleId}'`), + }) + .where('id', experimentId); + } +} + +module.exports = Experiment; From 1586f1a64b57201bc9c5d1a0e2af7665a1054413 Mon Sep 17 00:00:00 2001 From: stefanbabukov Date: Mon, 18 Apr 2022 10:46:19 +0100 Subject: [PATCH 12/17] schema revert --- .../api-body-schemas/ProcessingConfig.v1.yaml | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/src/specs/models/api-body-schemas/ProcessingConfig.v1.yaml b/src/specs/models/api-body-schemas/ProcessingConfig.v1.yaml index a0ccd6e2c..740d9bc16 100644 --- a/src/specs/models/api-body-schemas/ProcessingConfig.v1.yaml +++ b/src/specs/models/api-body-schemas/ProcessingConfig.v1.yaml @@ -2,28 +2,28 @@ title: Processing Config schema description: Processing Config schema type: object properties: - processingConfig: - type: object - properties: - cellSizeDistribution: - $ref: '../processing-config-bodies/ProcessingConfigCellSizeDistribution.v1.yaml' - mitochondrialContent: - $ref: '../processing-config-bodies/ProcessingConfigMitochondrialContent.v1.yaml' - readAlignment: - $ref: '../processing-config-bodies/ProcessingConfigReadAlignment.v1.yaml' - classifier: - $ref: '../processing-config-bodies/ProcessingConfigClassifier.v1.yaml' - numGenesVsNumUmis: - $ref: '../processing-config-bodies/ProcessingConfigNumGenesVsNumUMIs.v1.yaml' - doubletScores: - $ref: '../processing-config-bodies/ProcessingConfigDoubletScores.v1.yaml' - dataIntegration: - $ref: '../processing-config-bodies/ProcessingConfigDataIntegration.v1.yaml' - configureEmbedding: - $ref: '../processing-config-bodies/ProcessingConfigConfigureEmbedding.v1.yaml' - + cellSizeDistribution: + $ref: '../processing-config-bodies/ProcessingConfigCellSizeDistribution.v1.yaml' + mitochondrialContent: + $ref: '../processing-config-bodies/ProcessingConfigMitochondrialContent.v1.yaml' + readAlignment: + $ref: '../processing-config-bodies/ProcessingConfigReadAlignment.v1.yaml' + classifier: + $ref: '../processing-config-bodies/ProcessingConfigClassifier.v1.yaml' + numGenesVsNumUmis: + $ref: '../processing-config-bodies/ProcessingConfigNumGenesVsNumUMIs.v1.yaml' + doubletScores: + $ref: '../processing-config-bodies/ProcessingConfigDoubletScores.v1.yaml' + dataIntegration: + $ref: '../processing-config-bodies/ProcessingConfigDataIntegration.v1.yaml' + configureEmbedding: + $ref: '../processing-config-bodies/ProcessingConfigConfigureEmbedding.v1.yaml' required: - - processingConfig: [ - 'cellSizeDistribution', 'mitochondrialContent', 'readAlignment', - 'classifier', 'numGenesVsNumUmis', 'doubletScores', 'dataIntegration', 'configureEmbedding'] -additionalProperties: false \ No newline at end of file + - cellSizeDistribution + - mitochondrialContent + - readAlignment + - classifier + - numGenesVsNumUmis + - doubletScores + - dataIntegration + - configureEmbedding \ No newline at end of file From 9f6c9f2a7e4c82dc4539f8fcba402679d4c76a17 Mon Sep 17 00:00:00 2001 From: stefanbabukov Date: Mon, 18 Apr 2022 18:05:18 +0100 Subject: [PATCH 13/17] update parts of json instead of sending the whole thing --- src/api.v2/model/Experiment.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/api.v2/model/Experiment.js b/src/api.v2/model/Experiment.js index d3078e90f..55b53a4aa 100644 --- a/src/api.v2/model/Experiment.js +++ b/src/api.v2/model/Experiment.js @@ -154,11 +154,12 @@ class Experiment extends BasicModel { async updateProcessingConfig(experimentId, body) { const { name: stepName, body: change } = body[0]; + const updateString = JSON.stringify({ [stepName]: change }); - const processingConfig = await this.getProcessingConfig(experimentId); - processingConfig[stepName] = change; - - await this.update(experimentId, { processing_config: processingConfig }); + await this.sql(tableNames.EXPERIMENT) + .update({ + processing_config: this.sql.raw(`processing_config || '${updateString}'::jsonb`), + }).where('id', experimentId); } async addSample(experimentId, sampleId) { From 2eb1ed558aa4ed19ecae194f7342da77e8e1f414 Mon Sep 17 00:00:00 2001 From: stefanbabukov Date: Mon, 18 Apr 2022 18:59:53 +0100 Subject: [PATCH 14/17] tests ammend and enable auth --- src/api.v2/routes/experiment.js | 4 ++-- tests/api.v2/model/Experiment.test.js | 9 ++------- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/src/api.v2/routes/experiment.js b/src/api.v2/routes/experiment.js index 7028fb217..56bff2043 100644 --- a/src/api.v2/routes/experiment.js +++ b/src/api.v2/routes/experiment.js @@ -27,11 +27,11 @@ module.exports = { (req, res, next) => updateSamplePosition(req, res).catch(next), ], 'experiment#getProcessingConfig': [ - // expressAuthorizationMiddleware, + expressAuthorizationMiddleware, (req, res, next) => getProcessingConfig(req, res).catch(next), ], 'experiment#updateProcessingConfig': [ - // expressAuthorizationMiddleware, + expressAuthorizationMiddleware, (req, res, next) => updateProcessingConfig(req, res).catch(next), ], 'experiment#getBackendStatus': [ diff --git a/tests/api.v2/model/Experiment.test.js b/tests/api.v2/model/Experiment.test.js index 431902312..70a763223 100644 --- a/tests/api.v2/model/Experiment.test.js +++ b/tests/api.v2/model/Experiment.test.js @@ -202,14 +202,9 @@ describe('model/Experiment', () => { changedField: 'IamChanging so much', }, }]; - const mockFind = jest.spyOn(BasicModel.prototype, 'find') - .mockImplementationOnce(() => Promise.resolve(getProcessingConfigResponse)); - const mockUpdate = jest.spyOn(BasicModel.prototype, 'update') - .mockImplementationOnce(() => Promise.resolve()); + mockSqlClient.where.mockImplementationOnce(() => { Promise.resolve(); }); await new Experiment().updateProcessingConfig(mockExperimentId, mockBody); - expect(mockFind).toHaveBeenCalled(); - expect(mockUpdate).toHaveBeenCalledWith(mockExperimentId, - { processing_config: getProcessingConfigResponse[0].processingConfig }); + expect(mockSqlClient.where).toHaveBeenCalledWith('id', mockExperimentId); }); }); From 7c2433c7e818199bc3b6a797623378ac9e29b245 Mon Sep 17 00:00:00 2001 From: stefanbabukov Date: Wed, 20 Apr 2022 12:25:23 +0100 Subject: [PATCH 15/17] change snapshot --- .../data/getProcessingConfigResponse.json | 28 +++++++++---------- .../__snapshots__/Experiment.test.js.snap | 14 ---------- .../__snapshots__/experiment.test.js.snap | 24 ++++++++++++++++ 3 files changed, 38 insertions(+), 28 deletions(-) diff --git a/tests/api.v2/mocks/data/getProcessingConfigResponse.json b/tests/api.v2/mocks/data/getProcessingConfigResponse.json index 6099fb09e..92714b559 100644 --- a/tests/api.v2/mocks/data/getProcessingConfigResponse.json +++ b/tests/api.v2/mocks/data/getProcessingConfigResponse.json @@ -13,7 +13,7 @@ "330390E9Cdc94C7FB68A0C51Fd059Dda": { "auto": true, "apiUrl": "http://api.api-default.svc.cluster.local:3000", - "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", + "enabled": true, "filterSettings": { "binStep": 0.05, @@ -27,7 +27,7 @@ "46E6484545Dc4Aeb932DE1B43178Fe09": { "auto": true, "apiUrl": "http://api.api-default.svc.cluster.local:3000", - "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", + "enabled": true, "filterSettings": { "binStep": 0.05, @@ -41,7 +41,7 @@ "7Ff6388CCa204325A30C0C29135E1D05": { "auto": true, "apiUrl": "http://api.api-default.svc.cluster.local:3000", - "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", + "enabled": true, "filterSettings": { "binStep": 0.05, @@ -55,7 +55,7 @@ }, "dataIntegration": { "apiUrl": "http://api.api-default.svc.cluster.local:3000", - "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", + "dataIntegration": { "method": "harmony", "methodSettings": { @@ -96,7 +96,7 @@ "330390E9Cdc94C7FB68A0C51Fd059Dda": { "auto": true, "apiUrl": "http://api.api-default.svc.cluster.local:3000", - "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", + "enabled": true, "filterSettings": { "regressionType": "linear", @@ -124,7 +124,7 @@ "46E6484545Dc4Aeb932DE1B43178Fe09": { "auto": true, "apiUrl": "http://api.api-default.svc.cluster.local:3000", - "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", + "enabled": true, "filterSettings": { "regressionType": "linear", @@ -152,7 +152,7 @@ "7Ff6388CCa204325A30C0C29135E1D05": { "auto": true, "apiUrl": "http://api.api-default.svc.cluster.local:3000", - "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", + "enabled": true, "filterSettings": { "regressionType": "linear", @@ -180,7 +180,7 @@ }, "configureEmbedding": { "apiUrl": "http://api.api-default.svc.cluster.local:3000", - "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", + "embeddingSettings": { "method": "umap", "methodSettings": { @@ -213,7 +213,7 @@ "330390E9Cdc94C7FB68A0C51Fd059Dda": { "auto": true, "apiUrl": "http://api.api-default.svc.cluster.local:3000", - "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", + "enabled": false, "filterSettings": { "binStep": 200, @@ -227,7 +227,7 @@ "46E6484545Dc4Aeb932DE1B43178Fe09": { "auto": true, "apiUrl": "http://api.api-default.svc.cluster.local:3000", - "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", + "enabled": false, "filterSettings": { "binStep": 200, @@ -241,7 +241,7 @@ "7Ff6388CCa204325A30C0C29135E1D05": { "auto": true, "apiUrl": "http://api.api-default.svc.cluster.local:3000", - "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", + "enabled": false, "filterSettings": { "binStep": 200, @@ -268,7 +268,7 @@ "330390E9Cdc94C7FB68A0C51Fd059Dda": { "auto": true, "apiUrl": "http://api.api-default.svc.cluster.local:3000", - "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", + "enabled": true, "filterSettings": { "method": "absolute_threshold", @@ -292,7 +292,7 @@ "46E6484545Dc4Aeb932DE1B43178Fe09": { "auto": true, "apiUrl": "http://api.api-default.svc.cluster.local:3000", - "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", + "enabled": true, "filterSettings": { "method": "absolute_threshold", @@ -316,7 +316,7 @@ "7Ff6388CCa204325A30C0C29135E1D05": { "auto": true, "apiUrl": "http://api.api-default.svc.cluster.local:3000", - "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", + "enabled": true, "filterSettings": { "method": "absolute_threshold", diff --git a/tests/api.v2/model/__snapshots__/Experiment.test.js.snap b/tests/api.v2/model/__snapshots__/Experiment.test.js.snap index ce29a0808..27bb6818a 100644 --- a/tests/api.v2/model/__snapshots__/Experiment.test.js.snap +++ b/tests/api.v2/model/__snapshots__/Experiment.test.js.snap @@ -17,7 +17,6 @@ Object { "cellSizeDistribution": Object { "330390E9Cdc94C7FB68A0C51Fd059Dda": Object { "apiUrl": "http://api.api-default.svc.cluster.local:3000", - "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", "auto": true, "defaultFilterSettings": Object { "binStep": 200, @@ -31,7 +30,6 @@ Object { }, "46E6484545Dc4Aeb932DE1B43178Fe09": Object { "apiUrl": "http://api.api-default.svc.cluster.local:3000", - "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", "auto": true, "defaultFilterSettings": Object { "binStep": 200, @@ -45,7 +43,6 @@ Object { }, "7Ff6388CCa204325A30C0C29135E1D05": Object { "apiUrl": "http://api.api-default.svc.cluster.local:3000", - "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", "auto": true, "defaultFilterSettings": Object { "binStep": 200, @@ -69,7 +66,6 @@ Object { }, "configureEmbedding": Object { "apiUrl": "http://api.api-default.svc.cluster.local:3000", - "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", "clusteringSettings": Object { "method": "louvain", "methodSettings": Object { @@ -94,7 +90,6 @@ Object { }, "dataIntegration": Object { "apiUrl": "http://api.api-default.svc.cluster.local:3000", - "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", "dataIntegration": Object { "method": "harmony", "methodSettings": Object { @@ -125,7 +120,6 @@ Object { "doubletScores": Object { "330390E9Cdc94C7FB68A0C51Fd059Dda": Object { "apiUrl": "http://api.api-default.svc.cluster.local:3000", - "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", "auto": true, "defaultFilterSettings": Object { "binStep": 0.05, @@ -139,7 +133,6 @@ Object { }, "46E6484545Dc4Aeb932DE1B43178Fe09": Object { "apiUrl": "http://api.api-default.svc.cluster.local:3000", - "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", "auto": true, "defaultFilterSettings": Object { "binStep": 0.05, @@ -153,7 +146,6 @@ Object { }, "7Ff6388CCa204325A30C0C29135E1D05": Object { "apiUrl": "http://api.api-default.svc.cluster.local:3000", - "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", "auto": true, "defaultFilterSettings": Object { "binStep": 0.05, @@ -175,7 +167,6 @@ Object { "mitochondrialContent": Object { "330390E9Cdc94C7FB68A0C51Fd059Dda": Object { "apiUrl": "http://api.api-default.svc.cluster.local:3000", - "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", "auto": true, "defaultFilterSettings": Object { "method": "absolute_threshold", @@ -199,7 +190,6 @@ Object { }, "46E6484545Dc4Aeb932DE1B43178Fe09": Object { "apiUrl": "http://api.api-default.svc.cluster.local:3000", - "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", "auto": true, "defaultFilterSettings": Object { "method": "absolute_threshold", @@ -223,7 +213,6 @@ Object { }, "7Ff6388CCa204325A30C0C29135E1D05": Object { "apiUrl": "http://api.api-default.svc.cluster.local:3000", - "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", "auto": true, "defaultFilterSettings": Object { "method": "absolute_threshold", @@ -260,7 +249,6 @@ Object { "numGenesVsNumUmis": Object { "330390E9Cdc94C7FB68A0C51Fd059Dda": Object { "apiUrl": "http://api.api-default.svc.cluster.local:3000", - "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", "auto": true, "defaultFilterSettings": Object { "regressionType": "linear", @@ -288,7 +276,6 @@ Object { }, "46E6484545Dc4Aeb932DE1B43178Fe09": Object { "apiUrl": "http://api.api-default.svc.cluster.local:3000", - "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", "auto": true, "defaultFilterSettings": Object { "regressionType": "linear", @@ -316,7 +303,6 @@ Object { }, "7Ff6388CCa204325A30C0C29135E1D05": Object { "apiUrl": "http://api.api-default.svc.cluster.local:3000", - "authJwt": "Bearer eyJraWQiOiJJYUFRSyttQ1BpcGwwVmg4ZGVrNjJNR25uWE9CaTRnYmZXR2g1eWZQRlA4PSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoieTFzQkhUMWoyOTRFZnVmWFo3MXk0ZyIsInN1YiI6Ijc0OTY5NmZiLTM2NGMtNDIzYy05NjkxLWZlZjgzYmUyNmRlNiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb21cL2V1LXdlc3QtMV9abW1CWUk2ak8iLCJjb2duaXRvOnVzZXJuYW1lIjoiNzQ5Njk2ZmItMzY0Yy00MjNjLTk2OTEtZmVmODNiZTI2ZGU2IiwiYXVkIjoiNGJmM2F2aW45Y3VkY3NycGUyazluZms0dnAiLCJldmVudF9pZCI6IjFmNDMwNDNmLWEzZTQtNGEyNy1iMjk0LTI5YTEwNjk1NDBlMiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjMxNjM0OTA2LCJuYW1lIjoiSXZhIiwiZXhwIjoxNjMxNjkyNzU5LCJpYXQiOjE2MzE2ODkxNTksImVtYWlsIjoiaXZhQGJpb21hZ2UubmV0In0.Ow5kRCvDwId39_fTvuiTpvQz5PeL6T32-D2oBnyli6DdvRj75EzoOZM1lgqNiCkmqBWmn_cLzljzvYEfdXXc9TCMVYjbqD3J4xSaR-ndGsNuVd-YCJPNJ1IHos2d5rDW63bRCDvbBbYNF8p-Bu9YCsDnWXYWBB8ZYg7qp2g6vi9zokWviIV2wT9Vo_3pgxRrqmv2DhrXclpJ2-piirhZdUJEWi9ODpTZbslsdWNBfPcwGeX6iS7RRjerkrSJTjskeRarxkFbGfZTrMgXJ1TzsehPoUYsDDLZZjddcPnEe6XWbnANphu8Tmgh_zZ0IIKHFX_nxCE8Vfprx1f1eUGYkQ", "auto": true, "defaultFilterSettings": Object { "regressionType": "linear", diff --git a/tests/api/routes/__snapshots__/experiment.test.js.snap b/tests/api/routes/__snapshots__/experiment.test.js.snap index 4a9fc0bef..4d13a8578 100644 --- a/tests/api/routes/__snapshots__/experiment.test.js.snap +++ b/tests/api/routes/__snapshots__/experiment.test.js.snap @@ -1,5 +1,29 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`tests for experiment route Find cell sets by experiment id works 1`] = ` +Object { + "experimentId": "someId", + "experimentName": "my mocky name", + "meta": Object { + "gem2s": Object { + "executionArn": "", + "paramsHash": "", + "stateMachineArn": "", + }, + "organism": null, + "pipeline": Object { + "executionArn": "", + "stateMachineArn": "", + }, + "type": "10x", + }, + "projectId": "projectUuid", + "sampleIds": Array [ + "sampleId1", + ], +} +`; + exports[`tests for experiment route Find experiment by id works 1`] = ` Object { "experimentId": "someId", From e0303e62ad1e36ce65bccb938efdc306b7baa161 Mon Sep 17 00:00:00 2001 From: stefanbabukov Date: Wed, 20 Apr 2022 16:02:46 +0100 Subject: [PATCH 16/17] remove obsolete snapshot --- .../__snapshots__/experiment.test.js.snap | 24 ------------------- 1 file changed, 24 deletions(-) diff --git a/tests/api/routes/__snapshots__/experiment.test.js.snap b/tests/api/routes/__snapshots__/experiment.test.js.snap index 4d13a8578..4a9fc0bef 100644 --- a/tests/api/routes/__snapshots__/experiment.test.js.snap +++ b/tests/api/routes/__snapshots__/experiment.test.js.snap @@ -1,29 +1,5 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`tests for experiment route Find cell sets by experiment id works 1`] = ` -Object { - "experimentId": "someId", - "experimentName": "my mocky name", - "meta": Object { - "gem2s": Object { - "executionArn": "", - "paramsHash": "", - "stateMachineArn": "", - }, - "organism": null, - "pipeline": Object { - "executionArn": "", - "stateMachineArn": "", - }, - "type": "10x", - }, - "projectId": "projectUuid", - "sampleIds": Array [ - "sampleId1", - ], -} -`; - exports[`tests for experiment route Find experiment by id works 1`] = ` Object { "experimentId": "someId", From 743aa0cd8967f3e0327da7e2ffb2e37343335c08 Mon Sep 17 00:00:00 2001 From: stefanbabukov Date: Thu, 21 Apr 2022 11:34:40 +0100 Subject: [PATCH 17/17] address comments --- src/api.v2/model/Experiment.js | 4 ++-- src/specs/api.v2.yaml | 28 +++++++++++++++------------- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/api.v2/model/Experiment.js b/src/api.v2/model/Experiment.js index 55b53a4aa..5bff9470e 100644 --- a/src/api.v2/model/Experiment.js +++ b/src/api.v2/model/Experiment.js @@ -144,12 +144,12 @@ class Experiment extends BasicModel { } async getProcessingConfig(experimentId) { - const result = await this.find({ id: experimentId }); + const result = await this.findOne({ id: experimentId }); if (_.isEmpty(result)) { throw new NotFoundError('Experiment not found'); } - return result[0].processingConfig; + return result.processingConfig; } async updateProcessingConfig(experimentId, body) { diff --git a/src/specs/api.v2.yaml b/src/specs/api.v2.yaml index 61de22040..3205aed86 100644 --- a/src/specs/api.v2.yaml +++ b/src/specs/api.v2.yaml @@ -72,24 +72,25 @@ paths: application/json: schema: $ref: '#/components/schemas/ProcessingConfig' - '404': - description: Not found error. - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPError' '400': description: Bad Request content: application/json: schema: - $ref: '#/components/schemas/HTTPError' + $ref: '#/components/schemas/HTTPError' '401': description: The request lacks authentication credentials. + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '404': + description: Not found error. content: application/json: schema: $ref: '#/components/schemas/HTTPError' + put: summary: Update processing configuration for an experiment description: Update processing configuration for an experiment @@ -103,12 +104,6 @@ paths: application/json: schema: $ref: '#/components/schemas/HTTPSuccess' - '404': - description: Not found error. - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPError' '400': description: Bad Request content: @@ -121,6 +116,13 @@ paths: application/json: schema: $ref: '#/components/schemas/HTTPError' + '404': + description: Not found error. + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '/experiments': get: summary: Get all experiments