diff --git a/api/src/engine/connectors/datashield/datashield.connector.ts b/api/src/engine/connectors/datashield/datashield.connector.ts index d91cfa45cb57ab0b89dfd263be4d43775bb522fa..244c56621dd6d018f73655df9fec142416934e21 100644 --- a/api/src/engine/connectors/datashield/datashield.connector.ts +++ b/api/src/engine/connectors/datashield/datashield.connector.ts @@ -324,7 +324,7 @@ export default class DataShieldConnector implements Connector { }); } - async getDomains(_ids: string[], request: Request): Promise<Domain[]> { + async getDomains(request: Request): Promise<Domain[]> { const user = request.user as User; const sid = user && user.extraFields && user.extraFields['sid']; diff --git a/api/src/engine/connectors/exareme/exareme.connector.ts b/api/src/engine/connectors/exareme/exareme.connector.ts index 60acbd5f9042b11f1c3c562d0b95ea18b57ebcc6..c628a369f867ecb4b1da333269c284071b15166f 100644 --- a/api/src/engine/connectors/exareme/exareme.connector.ts +++ b/api/src/engine/connectors/exareme/exareme.connector.ts @@ -161,29 +161,27 @@ export default class ExaremeConnector implements Connector { } } - async getDomains(ids: string[], request: Request): Promise<Domain[]> { + async getDomains(request: Request): Promise<Domain[]> { const path = this.options.baseurl + 'pathologies'; try { const data = await firstValueFrom(this.get<Pathology[]>(request, path)); return ( - data?.data - .filter((d) => !ids || ids.length == 0 || ids.includes(d.code)) - .map((d): Domain => { - const groups = this.flattenGroups(d.metadataHierarchy); - - return { - id: d.code, - label: d.label, - groups: groups, - rootGroup: dataToGroup(d.metadataHierarchy), - datasets: d.datasets ? d.datasets.map(dataToDataset) : [], - variables: d.metadataHierarchy - ? this.flattenVariables(d.metadataHierarchy, groups) - : [], - }; - }) ?? [] + data?.data.map((d): Domain => { + const groups = this.flattenGroups(d.metadataHierarchy); + + return { + id: d.code, + label: d.label, + groups: groups, + rootGroup: dataToGroup(d.metadataHierarchy), + datasets: d.datasets ? d.datasets.map(dataToDataset) : [], + variables: d.metadataHierarchy + ? this.flattenVariables(d.metadataHierarchy, groups) + : [], + }; + }) ?? [] ); } catch (error) { throw new HttpException( diff --git a/api/src/engine/engine.resolver.ts b/api/src/engine/engine.resolver.ts index f6ecef04897d77c9bef9488eabc74bfc484e83e1..69718a7c0b32763ccef141f96ea53774fcf015ae 100644 --- a/api/src/engine/engine.resolver.ts +++ b/api/src/engine/engine.resolver.ts @@ -63,12 +63,8 @@ export class EngineResolver { } @Query(() => [Domain]) - async domains( - @GQLRequest() req: Request, - @Args('ids', { nullable: true, type: () => [String], defaultValue: [] }) - ids: string[], - ) { - return this.engineService.getDomains(ids, req); + async domains(@GQLRequest() req: Request) { + return this.engineService.getDomains(req); } @Query(() => [Algorithm]) diff --git a/api/src/engine/engine.service.ts b/api/src/engine/engine.service.ts index 7008ebe8daefe54091c5aee824b5eadd30da3fed..97ff0b4687613a9e8eb7863ab0e4814aa19d1ce6 100644 --- a/api/src/engine/engine.service.ts +++ b/api/src/engine/engine.service.ts @@ -31,6 +31,10 @@ import { FilterConfiguration } from './models/filter/filter-configuration'; import { FormulaOperation } from './models/formula/formula-operation.model'; import { Variable } from './models/variable.model'; +const DOMAINS_CACHE_KEY = 'domains'; +const ALGORITHMS_CACHE_KEY = 'experiments'; +const CACHE_KEYS = [DOMAINS_CACHE_KEY, ALGORITHMS_CACHE_KEY]; + /** * Engine service. * This class is used as a Proxy to the real Connector. @@ -102,17 +106,18 @@ export default class EngineService implements Connector { return result; } - async getDomains(ids: string[], req: Request): Promise<Domain[]> { + async getDomains(req: Request): Promise<Domain[]> { const user = req?.user as User; - const key = user.id ? `domains-${ids.join('-')}-${user.id}` : undefined; + const key = user.id ? `${DOMAINS_CACHE_KEY}-${user.id}` : undefined; return this.getFromCacheOrCall<Domain[]>(key, () => - this.connector.getDomains(ids, req), + this.connector.getDomains(req), ); } async getAlgorithms(req: Request): Promise<Algorithm[]> { - const key = 'algorithms'; + const user = req?.user as User; + const key = user.id ? `${ALGORITHMS_CACHE_KEY}-${user.id}` : undefined; return this.getFromCacheOrCall<Algorithm[]>(key, () => this.connector.getAlgorithms(req), @@ -133,7 +138,7 @@ export default class EngineService implements Connector { ): Promise<Variable[]> { if (!domainId || varIds.length === 0) return []; - const domains = await this.getDomains([], request); + const domains = await this.getDomains(request); return ( domains @@ -217,6 +222,13 @@ export default class EngineService implements Connector { } async logout?(req?: Request): Promise<void> { + const user = req?.user as User; + + if (user && user.id) + CACHE_KEYS.map((key) => `${key}-${user.id}`).forEach((key) => + this.cacheManager.del(key), + ); + if (!this.connector.logout) throw new NotImplementedException(); return this.connector.logout(req); } diff --git a/api/src/engine/interfaces/connector.interface.ts b/api/src/engine/interfaces/connector.interface.ts index dc92dc71333914ca62d12a2b38da560848eb99a2..66224d6b9ec898e9b1a050cfacae17a2aff493f7 100644 --- a/api/src/engine/interfaces/connector.interface.ts +++ b/api/src/engine/interfaces/connector.interface.ts @@ -24,10 +24,9 @@ export default interface Connector { /** * Get the list of domains along with a list of variables - * @param ids - Ids to filter the domain needed * @param req - Request - this is the request object from the HTTP request. */ - getDomains(ids: string[], req?: Request): Promise<Domain[]>; + getDomains(req?: Request): Promise<Domain[]>; /** * Create and return a full detailed experiment diff --git a/api/src/schema.gql b/api/src/schema.gql index 8a6d3ba0d14b20e3c5575c86a64c0e297c84a7c0..9caebad8a51a50abc7f9e8a0bb6be9058cd2d526 100644 --- a/api/src/schema.gql +++ b/api/src/schema.gql @@ -374,7 +374,7 @@ type ListExperiments { type Query { configuration: Configuration! - domains(ids: [String!] = []): [Domain!]! + domains: [Domain!]! algorithms: [Algorithm!]! formula: [FormulaOperation!]! filter: FilterConfiguration!