From 08356a32addf987bf05aa78960749304df510d18 Mon Sep 17 00:00:00 2001
From: Steve Reis <stevereis93@gmail.com>
Date: Sun, 26 Sep 2021 19:40:53 +0200
Subject: [PATCH] WIP: mutation for transient

---
 .../connectors/datashield/main.connector.ts   |  6 ++++++
 .../connectors/exareme/main.connector.ts      |  9 +++++++++
 api/src/engine/engine.interfaces.ts           |  4 ++++
 api/src/engine/engine.resolver.ts             | 11 ++++++++++-
 .../transient/transient-create.input.ts       |  7 +++++++
 .../models/transient/transient.model.ts       |  5 +++++
 api/src/schema.gql                            | 19 ++++++++++++++++---
 7 files changed, 57 insertions(+), 4 deletions(-)
 create mode 100644 api/src/engine/models/transient/transient-create.input.ts
 create mode 100644 api/src/engine/models/transient/transient.model.ts

diff --git a/api/src/engine/connectors/datashield/main.connector.ts b/api/src/engine/connectors/datashield/main.connector.ts
index c81cc65..cfa03be 100644
--- a/api/src/engine/connectors/datashield/main.connector.ts
+++ b/api/src/engine/connectors/datashield/main.connector.ts
@@ -1,8 +1,14 @@
 import { Observable } from 'rxjs';
 import { IEngineService } from 'src/engine/engine.interfaces';
 import { Domain } from 'src/engine/models/domain.model';
+import { TransientCreateInput } from 'src/engine/models/transient/transient-create.input';
+import { Transient } from 'src/engine/models/transient/transient.model';
 
 export default class DataShieldService implements IEngineService {
+  createTransient(data: TransientCreateInput): Promise<Transient> | Transient {
+    throw new Error('Method not implemented.');
+  }
+
   getDomains(): Domain[] {
     throw new Error('Method not implemented.');
   }
diff --git a/api/src/engine/connectors/exareme/main.connector.ts b/api/src/engine/connectors/exareme/main.connector.ts
index aa8fd7d..30a7a6e 100644
--- a/api/src/engine/connectors/exareme/main.connector.ts
+++ b/api/src/engine/connectors/exareme/main.connector.ts
@@ -5,6 +5,8 @@ import { firstValueFrom, map, Observable } from 'rxjs';
 import { IEngineOptions, IEngineService } from 'src/engine/engine.interfaces';
 import { Domain } from 'src/engine/models/domain.model';
 import { Group } from 'src/engine/models/group.model';
+import { TransientCreateInput } from 'src/engine/models/transient/transient-create.input';
+import { Transient } from 'src/engine/models/transient/transient.model';
 import { Variable } from 'src/engine/models/variable.model';
 import { dataToCategory, dataToGroup, dataToVariable } from './converters';
 import { Hierarchy } from './interfaces/hierarchy.interface';
@@ -16,6 +18,13 @@ export default class ExaremeService implements IEngineService {
     private readonly httpService: HttpService,
   ) {}
 
+  createTransient(data: TransientCreateInput): Transient | Promise<Transient> {
+    return {
+      id: 'test',
+      label: 'test',
+    };
+  }
+
   async getDomains(ids: string[]): Promise<Domain[]> {
     const path = this.options.baseurl + 'pathologies';
 
diff --git a/api/src/engine/engine.interfaces.ts b/api/src/engine/engine.interfaces.ts
index 09b86b7..ec9bcd7 100644
--- a/api/src/engine/engine.interfaces.ts
+++ b/api/src/engine/engine.interfaces.ts
@@ -1,6 +1,8 @@
 import { Request } from 'express';
 import { Observable } from 'rxjs';
 import { Domain } from './models/domain.model';
+import { TransientCreateInput } from './models/transient/transient-create.input';
+import { Transient } from './models/transient/transient.model';
 
 export interface IEngineOptions {
   type: string;
@@ -24,6 +26,8 @@ export interface IEngineService {
 
   startExperimentTransient(request: Request): Observable<string>;
 
+  createTransient(data: TransientCreateInput): Promise<Transient> | Transient;
+
   startExperiment(request: Request): Observable<string>;
 
   getActiveUser(request: Request): Observable<string>;
diff --git a/api/src/engine/engine.resolver.ts b/api/src/engine/engine.resolver.ts
index beeb589..750a2d6 100644
--- a/api/src/engine/engine.resolver.ts
+++ b/api/src/engine/engine.resolver.ts
@@ -1,8 +1,10 @@
 import { Inject } from '@nestjs/common';
-import { Args, Query, Resolver } from '@nestjs/graphql';
+import { Args, Mutation, Query, Resolver } from '@nestjs/graphql';
 import { ENGINE_SERVICE } from './engine.constants';
 import { IEngineService } from './engine.interfaces';
 import { Domain } from './models/domain.model';
+import { TransientCreateInput } from './models/transient/transient-create.input';
+import { Transient } from './models/transient/transient.model';
 
 @Resolver()
 export class EngineResolver {
@@ -17,4 +19,11 @@ export class EngineResolver {
   ) {
     return this.engineService.getDomains(ids);
   }
+
+  @Mutation(() => Transient)
+  async createTransient(
+    @Args('data') transientCreateInput: TransientCreateInput,
+  ) {
+    return this.engineService.createTransient(transientCreateInput);
+  }
 }
diff --git a/api/src/engine/models/transient/transient-create.input.ts b/api/src/engine/models/transient/transient-create.input.ts
new file mode 100644
index 0000000..d4b012c
--- /dev/null
+++ b/api/src/engine/models/transient/transient-create.input.ts
@@ -0,0 +1,7 @@
+import { Field, InputType } from '@nestjs/graphql';
+
+@InputType()
+export class TransientCreateInput {
+  @Field()
+  name: string;
+}
diff --git a/api/src/engine/models/transient/transient.model.ts b/api/src/engine/models/transient/transient.model.ts
new file mode 100644
index 0000000..4831c0f
--- /dev/null
+++ b/api/src/engine/models/transient/transient.model.ts
@@ -0,0 +1,5 @@
+import { ObjectType } from '@nestjs/graphql';
+import { Entity } from '../entity.model';
+
+@ObjectType()
+export class Transient extends Entity {}
diff --git a/api/src/schema.gql b/api/src/schema.gql
index 023cdbe..5657a0d 100644
--- a/api/src/schema.gql
+++ b/api/src/schema.gql
@@ -4,7 +4,7 @@
 
 type Category {
   id: String!
-  label: String!
+  label: String
 }
 
 type Variable {
@@ -18,7 +18,7 @@ type Variable {
 
 type Group {
   id: String!
-  label: String!
+  label: String
   description: String
   groups: [Group!]!
   variables: [Variable!]!
@@ -26,7 +26,7 @@ type Group {
 
 type Domain {
   id: String!
-  label: String!
+  label: String
   description: String
   groups: [Group!]!
   variables: [Variable!]!
@@ -34,6 +34,19 @@ type Domain {
   rootGroup: Group!
 }
 
+type Transient {
+  id: String!
+  label: String
+}
+
 type Query {
   domains(ids: [String!] = []): [Domain!]!
 }
+
+type Mutation {
+  createTransient(data: TransientCreateInput!): Transient!
+}
+
+input TransientCreateInput {
+  name: String!
+}
-- 
GitLab