From d8f77d4cfeccbe8e0f68f45f87c0550382b9caaa Mon Sep 17 00:00:00 2001
From: Steve Reis <stevereis93@gmail.com>
Date: Tue, 12 Apr 2022 14:33:03 +0200
Subject: [PATCH] feat(datashield): Add logout

---
 api/src/auth/auth.resolver.ts                 | 30 +++++++++++++++----
 .../connectors/datashield/main.connector.ts   | 15 ++++++++++
 2 files changed, 39 insertions(+), 6 deletions(-)

diff --git a/api/src/auth/auth.resolver.ts b/api/src/auth/auth.resolver.ts
index 228943e..ba028fe 100644
--- a/api/src/auth/auth.resolver.ts
+++ b/api/src/auth/auth.resolver.ts
@@ -6,11 +6,15 @@ import {
 } from '@nestjs/common';
 import { ConfigService } from '@nestjs/config';
 import { Args, Mutation, Resolver } from '@nestjs/graphql';
-import { Response } from 'express';
+import { Response, Request } from 'express';
+import { GQLRequest } from 'src/common/decorators/gql-request.decoractor';
 import { GQLResponse } from '../common/decorators/gql-response.decoractor';
 import { parseToBoolean } from '../common/utilities';
-import { ENGINE_SERVICE } from '../engine/engine.constants';
-import { IEngineService } from '../engine/engine.interfaces';
+import {
+  ENGINE_MODULE_OPTIONS,
+  ENGINE_SERVICE,
+} from '../engine/engine.constants';
+import { IEngineOptions, IEngineService } from '../engine/engine.interfaces';
 import { User } from '../users/models/user.model';
 import { authConstants } from './auth-constants';
 import { AuthService } from './auth.service';
@@ -29,6 +33,8 @@ export class AuthResolver {
 
   constructor(
     @Inject(ENGINE_SERVICE) private readonly engineService: IEngineService,
+    @Inject(ENGINE_MODULE_OPTIONS)
+    private readonly engineOptions: IEngineOptions,
     private readonly authService: AuthService,
     private readonly configService: ConfigService,
   ) {}
@@ -68,11 +74,23 @@ export class AuthResolver {
 
   @Mutation(() => Boolean)
   @UseGuards(JwtAuthGuard)
-  logout(@GQLResponse() res: Response, @CurrentUser() user: User): boolean {
-    if (user) this.logger.verbose(`${user.username} logged out`);
+  logout(
+    @GQLRequest() req: Request,
+    @GQLResponse() res: Response,
+    @CurrentUser() user: User,
+  ): boolean {
+    if (user) {
+      this.logger.verbose(`${user.username} logged out`);
+      try {
+        this.engineService.logout?.(req);
+      } catch (e) {
+        this.logger.debug(
+          `Service ${this.engineOptions.type} produce an error when logging out ${user.username}`,
+        );
+      }
+    }
 
     res.clearCookie(authConstants.cookie.name);
-    this.engineService.logout?.();
 
     return true;
   }
diff --git a/api/src/engine/connectors/datashield/main.connector.ts b/api/src/engine/connectors/datashield/main.connector.ts
index 2079001..ad0e132 100644
--- a/api/src/engine/connectors/datashield/main.connector.ts
+++ b/api/src/engine/connectors/datashield/main.connector.ts
@@ -205,6 +205,21 @@ export default class DataShieldService implements IEngineService {
     throw new NotImplementedException();
   }
 
+  async logout(request: Request): Promise<void> {
+    const user = request.user as User;
+    const cookie = [`sid=${user.extraFields['sid']}`, `user=${user.id}`].join(
+      ';',
+    );
+
+    const path = new URL('/logout', this.options.baseurl).href;
+
+    this.httpService.get(path, {
+      headers: {
+        cookie,
+      },
+    });
+  }
+
   async editExperient(
     id: string,
     expriment: ExperimentEditInput,
-- 
GitLab