From 2af2d3d0e4400abf10ec1af83752bbee200ec2f9 Mon Sep 17 00:00:00 2001
From: Alexandre Vanini <vanini.alexandre@gmail.com>
Date: Fri, 10 May 2019 22:34:16 +0200
Subject: [PATCH] [WIP]

---
 client/src/app/_guard/auth.guard.ts           |  16 ++-
 client/src/app/_helper/_models/roles.ts       |   7 ++
 client/src/app/_helper/_models/user.ts        |   2 +
 client/src/app/_helper/error.interceptor.ts   |   5 +-
 client/src/app/_helper/jwt.interceptor.ts     |   8 +-
 client/src/app/app-routing.module.ts          |  13 ++-
 client/src/app/app.component.ts               |  10 ++
 .../kata-create/kata-create.component.ts      |   6 +-
 .../kata-displayer.component.html             |  16 ++-
 .../kata-displayer.component.scss             |   6 +
 .../kata-displayer.component.ts               |  16 +++
 .../app/component/login/login.component.ts    |   6 +-
 .../main-left-side-nav.component.html         |  13 ++-
 .../main-left-side-nav.component.ts           |   6 +
 .../program-create.component.ts               |   8 +-
 .../component/searchby/searchby.component.css |  14 +++
 .../searchby/searchby.component.html          |  23 +++-
 .../services/auth/authentication.service.ts   |  11 ++
 compilation/.idea/workspace.xml               |  78 +++----------
 gateway/.idea/workspace.xml                   | 110 +++++++++++-------
 gateway/src/main/java/MongoDB.java            |   6 +
 gateway/src/main/java/app.java                |   3 +-
 gateway/target/classes/app.class              | Bin 10884 -> 10818 bytes
 mongodb/newnuser                              |  12 ++
 24 files changed, 253 insertions(+), 142 deletions(-)
 create mode 100644 client/src/app/_helper/_models/roles.ts
 create mode 100644 mongodb/newnuser

diff --git a/client/src/app/_guard/auth.guard.ts b/client/src/app/_guard/auth.guard.ts
index c310635..b4146e9 100644
--- a/client/src/app/_guard/auth.guard.ts
+++ b/client/src/app/_guard/auth.guard.ts
@@ -1,17 +1,29 @@
 import {Injectable} from '@angular/core';
 import {Router, CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot} from '@angular/router';
+import {AuthenticationService} from '../services/auth/authentication.service';
 
 @Injectable({providedIn: 'root'})
 export class AuthGuard implements CanActivate {
 
-  constructor(private router: Router) {
+  constructor(private router: Router, private authenticationService: AuthenticationService) {
   }
 
   canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
-    if (localStorage.getItem('currentUser')) {
+
+    const currentUser = this.authenticationService.currentUserValue;
+    if (currentUser) {
+      // check if route is restricted by role
+      if (route.data.roles && route.data.roles.indexOf(currentUser.role) === -1) {
+        // role not authorised so redirect to home page
+        this.router.navigate(['/']);
+        return false;
+      }
+
+      // authorised so return true
       return true;
     }
 
+    // not logged in so redirect to login page with the return url
     this.router.navigate(['/login'], {queryParams: {returnUrl: state.url}});
     return false;
   }
diff --git a/client/src/app/_helper/_models/roles.ts b/client/src/app/_helper/_models/roles.ts
new file mode 100644
index 0000000..85b6bea
--- /dev/null
+++ b/client/src/app/_helper/_models/roles.ts
@@ -0,0 +1,7 @@
+export enum Role {
+
+  shodai = 'shodai',
+  sensei = 'sensei',
+  monji = 'monji',
+
+}
diff --git a/client/src/app/_helper/_models/user.ts b/client/src/app/_helper/_models/user.ts
index 9f507ef..dc82e2e 100644
--- a/client/src/app/_helper/_models/user.ts
+++ b/client/src/app/_helper/_models/user.ts
@@ -1,4 +1,6 @@
 export class User {
   id: number;
   username: string;
+  role: string;
+  token?: string;
 }
diff --git a/client/src/app/_helper/error.interceptor.ts b/client/src/app/_helper/error.interceptor.ts
index d9ecfdb..4f5ae05 100644
--- a/client/src/app/_helper/error.interceptor.ts
+++ b/client/src/app/_helper/error.interceptor.ts
@@ -12,11 +12,12 @@ export class ErrorInterceptor implements HttpInterceptor {
 
   intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
     return next.handle(request).pipe(catchError(err => {
-      if (err.status === 401) {
-        // auto logout if 401 response returned from api
+      if ([401, 403].indexOf(err.status) !== -1) {
+        // auto logout if 401 Unauthorized or 403 Forbidden response returned from api
         this.authenticationService.logout();
         location.reload();
       }
+
       const error = err;
       return throwError(error);
     }));
diff --git a/client/src/app/_helper/jwt.interceptor.ts b/client/src/app/_helper/jwt.interceptor.ts
index 6378ff7..a0d236c 100644
--- a/client/src/app/_helper/jwt.interceptor.ts
+++ b/client/src/app/_helper/jwt.interceptor.ts
@@ -1,13 +1,18 @@
 import {Injectable} from '@angular/core';
 import {HttpRequest, HttpHandler, HttpEvent, HttpInterceptor} from '@angular/common/http';
 import {Observable} from 'rxjs';
+import {AuthenticationService} from '../services/auth/authentication.service';
 
 @Injectable()
 export class JwtInterceptor implements HttpInterceptor {
+
+  constructor(private authenticationService: AuthenticationService) {
+  }
+
   intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
     // add authorization header with jwt token if available
-    const currentUser = JSON.parse(localStorage.getItem('currentUser'));
 
+    const currentUser = this.authenticationService.currentUserValue;
     if (currentUser && currentUser.token) {
       request = request.clone({
         setHeaders: {
@@ -15,7 +20,6 @@ export class JwtInterceptor implements HttpInterceptor {
         }
       });
     }
-
     return next.handle(request);
   }
 }
diff --git a/client/src/app/app-routing.module.ts b/client/src/app/app-routing.module.ts
index 91c38de..872d793 100644
--- a/client/src/app/app-routing.module.ts
+++ b/client/src/app/app-routing.module.ts
@@ -7,16 +7,19 @@ import {ProgramCreateComponent} from './component/program-create/program-create.
 import {KataCreateComponent} from './component/kata-create/kata-create.component';
 import {LoginComponent} from './component/login/login.component';
 import {AuthGuard} from './_guard/auth.guard';
+import {SearchbyComponent} from './component/searchby/searchby.component';
+import {Role} from './_helper/_models/roles';
 
 const routes: Routes = [
   {path: '', component: ProgramDisplayerComponent, canActivate: [AuthGuard]},
 
   {path: 'login', component: LoginComponent},
-  {path: 'programs', component: ProgramDisplayerComponent, canActivate: [AuthGuard]},
-  {path: 'kata-displayer/:id', component: KataDisplayerComponent, canActivate: [AuthGuard]},
-  {path: 'kata/:prid/:id', component: KataComponent, canActivate: [AuthGuard]},
-  {path: 'program_create', component: ProgramCreateComponent, canActivate: [AuthGuard]},
-  {path: 'kata_create/:id/:language', component: KataCreateComponent, canActivate: [AuthGuard]},
+  {path: 'programs', component: ProgramDisplayerComponent, canActivate: [AuthGuard], data: {roles: [Role.shodai, Role.monji, Role.sensei]}},
+  {path: 'search', component: SearchbyComponent, canActivate: [AuthGuard], data: {roles: [Role.shodai, Role.monji, Role.sensei]}},
+  {path: 'kata-displayer/:id', component: KataDisplayerComponent, canActivate: [AuthGuard], data: {roles: [Role.shodai, Role.monji, Role.sensei]}},
+  {path: 'kata/:prid/:id', component: KataComponent, canActivate: [AuthGuard], data: {roles: [Role.shodai, Role.monji, Role.sensei]}},
+  {path: 'program_create', component: ProgramCreateComponent, canActivate: [AuthGuard], data: {roles: [Role.shodai, Role.sensei]}},
+  {path: 'kata_create/:id/:language', component: KataCreateComponent, canActivate: [AuthGuard], data: {roles: [Role.shodai, Role.sensei]}},
   {path: '**', redirectTo: ''}
 ];
 
diff --git a/client/src/app/app.component.ts b/client/src/app/app.component.ts
index 6390d57..de2adaf 100644
--- a/client/src/app/app.component.ts
+++ b/client/src/app/app.component.ts
@@ -1,4 +1,7 @@
 import {Component} from '@angular/core';
+import {User} from './_helper/_models/user';
+import {AuthenticationService} from './services/auth/authentication.service';
+import {Router} from '@angular/router';
 
 @Component({
   selector: 'app-root',
@@ -7,5 +10,12 @@ import {Component} from '@angular/core';
 })
 export class AppComponent {
   title = 'Dojo Hepia';
+  currentUser: User;
 
+  constructor(
+    private router: Router,
+    private authenticationService: AuthenticationService
+  ) {
+    this.authenticationService.currentUser.subscribe(x => this.currentUser = x);
+  }
 }
diff --git a/client/src/app/component/kata-create/kata-create.component.ts b/client/src/app/component/kata-create/kata-create.component.ts
index 494f0bd..b1b4fcd 100644
--- a/client/src/app/component/kata-create/kata-create.component.ts
+++ b/client/src/app/component/kata-create/kata-create.component.ts
@@ -45,7 +45,7 @@ export class KataCreateComponent implements OnInit {
 
 
   toggleOptions() {
-    this.options = ! this.options;
+    this.options = !this.options;
     console.log(this.options);
   }
 
@@ -90,9 +90,7 @@ export class KataCreateComponent implements OnInit {
       nbAttempt: this.numberOfAttempt,
       programID: this.programId,
       difficulty: 'Ceinture blanche'
-    })).subscribe();
-
-    this.router.navigate(['/kata-displayer/' + this.programId + '']);
+    })).subscribe(data => this.router.navigate(['/kata-displayer/' + this.programId + '']));
   }
 
   try(): void {
diff --git a/client/src/app/component/kata-displayer/kata-displayer.component.html b/client/src/app/component/kata-displayer/kata-displayer.component.html
index e8fa9b9..015312b 100644
--- a/client/src/app/component/kata-displayer/kata-displayer.component.html
+++ b/client/src/app/component/kata-displayer/kata-displayer.component.html
@@ -1,23 +1,27 @@
 <div style="margin:5rem 10rem 0 10rem" *ngIf="!error">
   <div *ngIf="inforreceived">
     <h1 class="title" style="margin:2rem 0 0 2rem;">{{programTitle}}
-    <br/>
-    <span class="subtitle">{{programSensei}} <span class="language"> {{programLanguage}}</span>
+      <br/>
+      <span class="subtitle">{{programSensei}} <span class="language"> {{programLanguage}}</span>
     </span>
-      <button mat-button style="margin:0 3rem 0 0;float:right" routerLink="/kata_create/{{idProgram}}/{{programLanguage}}">Create a new kata</button>
-  </h1>
+      <button mat-button style="margin:0 3rem 0 0;float:right"
+              routerLink="/kata_create/{{idProgram}}/{{programLanguage}}">Create a new kata
+      </button>
+      <button mat-button style="margin:0 3rem 0 0;float:right" (click)="subscribe()">{{subvalue}}</button>
+    </h1>
 
   </div>
   <br/>
 
-  <div *ngIf="katas">
+  <div *ngIf="katas" [ngClass]="isSubscribed ? '' : 'notsub'">
 
     <div class="d-flex flex-wrap justify-content-start">
     <span *ngFor="let kata of katas">
         <div class="card" style="width: 18rem;margin: 2rem" routerLink="/kata/{{idProgram}}/{{kata.id}}">
           <div class="card-body">
             <h5 class="card-title"><a class="title"
-                                      routerLink="/kata/{{idProgram}}/{{kata.id}}">{{kata.title}}</a><span class="difficulty">{{kata.status}}</span></h5>
+                                      routerLink="/kata/{{idProgram}}/{{kata.id}}">{{kata.title}}</a><span
+              class="difficulty">{{kata.status}}</span></h5>
             <br/>
             <h6 class="card-subtitle mb-2 text-muted">{{kata.difficulty}}</h6>
             <br/>
diff --git a/client/src/app/component/kata-displayer/kata-displayer.component.scss b/client/src/app/component/kata-displayer/kata-displayer.component.scss
index 6c91ebe..c764ffc 100644
--- a/client/src/app/component/kata-displayer/kata-displayer.component.scss
+++ b/client/src/app/component/kata-displayer/kata-displayer.component.scss
@@ -12,7 +12,13 @@
   font-size:15px;
   color:var(--color-dark-grey) !important;
 }
+.notsub{
+  pointer-events: none;
 
+  /* for "disabled" effect */
+  opacity: 0.5;
+  background: var(--color-dark-blue);
+}
 * {
   font-family: "Helvetica Neue";
 
diff --git a/client/src/app/component/kata-displayer/kata-displayer.component.ts b/client/src/app/component/kata-displayer/kata-displayer.component.ts
index e882788..0de3e1c 100644
--- a/client/src/app/component/kata-displayer/kata-displayer.component.ts
+++ b/client/src/app/component/kata-displayer/kata-displayer.component.ts
@@ -19,6 +19,8 @@ export class KataDisplayerComponent implements OnInit {
   programLanguage: string;
   programSensei: string;
   error = false;
+  subvalue: string;
+  isSubscribed = false;
 
   inforreceived = false;
 
@@ -31,6 +33,15 @@ export class KataDisplayerComponent implements OnInit {
   ) {
   }
 
+  subscribe() {
+    this.isSubscribed = !this.isSubscribed;
+    if (!this.isSubscribed) {
+      this.subvalue = 'Subscribe';
+    } else {
+      this.subvalue = 'Unsubscribe';
+    }
+  }
+
   getKatas(): void {
     this.idProgram = this.route.snapshot.paramMap.get('id');
     this.ngxLoader.start();
@@ -52,6 +63,11 @@ export class KataDisplayerComponent implements OnInit {
   }
 
   ngOnInit() {
+    if (!this.isSubscribed) {
+      this.subvalue = 'Subscribe';
+    } else {
+      this.subvalue = 'Unsubscribe';
+    }
     this.getKatas();
   }
 
diff --git a/client/src/app/component/login/login.component.ts b/client/src/app/component/login/login.component.ts
index bc3f277..8770775 100644
--- a/client/src/app/component/login/login.component.ts
+++ b/client/src/app/component/login/login.component.ts
@@ -14,7 +14,11 @@ export class LoginComponent implements OnInit {
   constructor(private route: ActivatedRoute,
               private router: Router,
               private auth: AuthenticationService,
-              private formBuilder: FormBuilder) {
+              private formBuilder: FormBuilder,
+              private authenticationService: AuthenticationService) {
+    if (this.authenticationService.currentUserValue) {
+      this.router.navigate(['/']);
+    }
   }
 
   loginForm: FormGroup;
diff --git a/client/src/app/component/main-left-side-nav/main-left-side-nav.component.html b/client/src/app/component/main-left-side-nav/main-left-side-nav.component.html
index 4ea638d..09498ef 100644
--- a/client/src/app/component/main-left-side-nav/main-left-side-nav.component.html
+++ b/client/src/app/component/main-left-side-nav/main-left-side-nav.component.html
@@ -1,12 +1,15 @@
 <mat-sidenav-container class="sidenav-container">
   <mat-sidenav #drawer class="sidenav" fixedInViewport="true"
-      [attr.role]="(isHandset$ | async) ? 'dialog' : 'navigation'"
-      [mode]="(isHandset$ | async) ? 'over' : 'side'"
-      [opened]="!(isHandset$ | async)">
+               [attr.role]="(isHandset$ | async) ? 'dialog' : 'navigation'"
+               [mode]="(isHandset$ | async) ? 'over' : 'side'"
+               [opened]="!(isHandset$ | async)">
     <mat-toolbar>DOJO HEPIA</mat-toolbar>
-    <mat-nav-list *ngIf="true">
+    <mat-nav-list *ngIf="currentUser">
       <a mat-list-item href="/programs">All programs</a>
-      <a mat-list-item href="/program_create">New program</a>
+      <div *ngIf="currentUser.role != Role.monji">
+        <a mat-list-item href="/program_create">New program</a>
+      </div>
+      <a mat-list-item href="/search">Search</a>
       <a mat-list-item (click)="logout()">Log out</a>
     </mat-nav-list>
   </mat-sidenav>
diff --git a/client/src/app/component/main-left-side-nav/main-left-side-nav.component.ts b/client/src/app/component/main-left-side-nav/main-left-side-nav.component.ts
index 0f81b45..3d5d058 100644
--- a/client/src/app/component/main-left-side-nav/main-left-side-nav.component.ts
+++ b/client/src/app/component/main-left-side-nav/main-left-side-nav.component.ts
@@ -3,6 +3,8 @@ import {BreakpointObserver, Breakpoints} from '@angular/cdk/layout';
 import {Observable} from 'rxjs';
 import {map} from 'rxjs/operators';
 import {AuthenticationService} from '../../services/auth/authentication.service';
+import {User} from '../../_helper/_models/user';
+import {Role} from '../../_helper/_models/roles';
 
 
 @Component({
@@ -12,6 +14,8 @@ import {AuthenticationService} from '../../services/auth/authentication.service'
 })
 export class MainLeftSideNavComponent {
 
+  currentUser: User;
+  Role = Role;
   isHandset$: Observable<boolean> = this.breakpointObserver.observe(Breakpoints.Handset)
     .pipe(
       map(result => result.matches)
@@ -24,6 +28,8 @@ export class MainLeftSideNavComponent {
   }
 
   constructor(private breakpointObserver: BreakpointObserver, private auth: AuthenticationService) {
+    this.currentUser = this.auth.currentUserValue;
+
   }
 
 }
diff --git a/client/src/app/component/program-create/program-create.component.ts b/client/src/app/component/program-create/program-create.component.ts
index b7b454b..cff6d7f 100644
--- a/client/src/app/component/program-create/program-create.component.ts
+++ b/client/src/app/component/program-create/program-create.component.ts
@@ -1,6 +1,8 @@
 import {Component, OnInit} from '@angular/core';
 import {CreateProgramService} from '../../services/program/create-program.service';
 import {Router} from '@angular/router';
+import {AuthenticationService} from '../../services/auth/authentication.service';
+import {User} from '../../_helper/_models/user';
 
 @Component({
   selector: 'app-program-create',
@@ -8,9 +10,11 @@ import {Router} from '@angular/router';
   styleUrls: ['./program-create.component.scss']
 })
 export class ProgramCreateComponent implements OnInit {
+  currentUser: User;
 
   constructor(private createProgramService: CreateProgramService,
-              public router: Router) {
+              public router: Router, private auth: AuthenticationService) {
+    this.currentUser = this.auth.currentUserValue;
   }
 
   programTitle = '';
@@ -26,7 +30,7 @@ export class ProgramCreateComponent implements OnInit {
   createProgram(newkata: boolean): void {
     this.createProgramService.createProgram(JSON.stringify({
       id: this.programToKata,
-      sensei: 'Shodai',
+      sensei: this.currentUser.username,
       language: this.programLanguage,
       nbKata: 0,
       title: this.programTitle,
diff --git a/client/src/app/component/searchby/searchby.component.css b/client/src/app/component/searchby/searchby.component.css
index e69de29..cad61d5 100644
--- a/client/src/app/component/searchby/searchby.component.css
+++ b/client/src/app/component/searchby/searchby.component.css
@@ -0,0 +1,14 @@
+input{
+
+  background-color: rgba(43, 47, 57, 1);
+  border: 1px solid rgba(63, 67, 77, 1);
+  border-radius: 7px;
+  color: rgba(236, 240, 241, 1.0);
+  padding: .6em 1.4em .5em .8em;
+}
+
+input:focus{
+  background-color: rgba(43, 47, 57, 1);
+  color: var(--color-cloud);
+  outline:none;
+}
diff --git a/client/src/app/component/searchby/searchby.component.html b/client/src/app/component/searchby/searchby.component.html
index f99bdc4..ea19413 100644
--- a/client/src/app/component/searchby/searchby.component.html
+++ b/client/src/app/component/searchby/searchby.component.html
@@ -1,3 +1,20 @@
-<p>
-  searchby works!
-</p>
+<div class="container" style="margin-top:10%">
+  <form [formGroup]="loginForm" (ngSubmit)="onSubmit()">
+    <div class="form-group">
+      <div class="input-group mb-3">
+        <div class="input-group-prepend">
+          <button class="btn btn-outline-secondary dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Tag</button>
+          <div class="dropdown-menu">
+            <a class="dropdown-item" href="#">Action</a>
+            <a class="dropdown-item" href="#">Another action</a>
+            <a class="dropdown-item" href="#">Something else here</a>
+            <div role="separator" class="dropdown-divider"></div>
+            <a class="dropdown-item" href="#">Separated link</a>
+          </div>
+        </div>
+        <input type="text" class="form-control" aria-label="Text input with dropdown button">
+      </div>
+    </div>
+  </form>
+
+</div>
diff --git a/client/src/app/services/auth/authentication.service.ts b/client/src/app/services/auth/authentication.service.ts
index 43f3bc3..f327743 100644
--- a/client/src/app/services/auth/authentication.service.ts
+++ b/client/src/app/services/auth/authentication.service.ts
@@ -1,10 +1,21 @@
 import {Injectable} from '@angular/core';
 import {HttpClient} from '@angular/common/http';
 import {map} from 'rxjs/operators';
+import {User} from '../../_helper/_models/user';
+import {BehaviorSubject, Observable} from 'rxjs';
 
 @Injectable({providedIn: 'root'})
 export class AuthenticationService {
+  private currentUserSubject: BehaviorSubject<User>;
+  public currentUser: Observable<User>;
+
   constructor(private http: HttpClient) {
+    this.currentUserSubject = new BehaviorSubject<User>(JSON.parse(localStorage.getItem('currentUser')));
+    this.currentUser = this.currentUserSubject.asObservable();
+  }
+
+  public get currentUserValue(): User {
+    return this.currentUserSubject.value;
   }
 
   login(username: string, password: string) {
diff --git a/compilation/.idea/workspace.xml b/compilation/.idea/workspace.xml
index 93e8f0f..dd502b1 100644
--- a/compilation/.idea/workspace.xml
+++ b/compilation/.idea/workspace.xml
@@ -2,22 +2,8 @@
 <project version="4">
   <component name="ChangeListManager">
     <list default="true" id="8d8fb2c1-8426-4933-8193-ee68625cf8de" name="Default Changelist" comment="">
-      <change beforePath="$PROJECT_DIR$/../client/src/app/app.module.ts" beforeDir="false" afterPath="$PROJECT_DIR$/../client/src/app/app.module.ts" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/../client/src/app/component/main-left-side-nav/main-left-side-nav.component.html" beforeDir="false" afterPath="$PROJECT_DIR$/../client/src/app/component/main-left-side-nav/main-left-side-nav.component.html" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/../client/src/app/component/program-displayer/program-displayer.component.html" beforeDir="false" afterPath="$PROJECT_DIR$/../client/src/app/component/program-displayer/program-displayer.component.html" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/../client/src/app/component/program-displayer/program-displayer.component.scss" beforeDir="false" afterPath="$PROJECT_DIR$/../client/src/app/component/program-displayer/program-displayer.component.scss" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/../client/src/app/component/program-displayer/program-displayer.component.ts" beforeDir="false" afterPath="$PROJECT_DIR$/../client/src/app/component/program-displayer/program-displayer.component.ts" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/main/java/DockerCompilation.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/DockerCompilation.java" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/../gateway/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/../gateway/.idea/workspace.xml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/../gateway/src/main/java/LiveDB.java" beforeDir="false" afterPath="$PROJECT_DIR$/../gateway/src/main/java/LiveDB.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/../gateway/src/main/java/MongoDB.java" beforeDir="false" afterPath="$PROJECT_DIR$/../gateway/src/main/java/MongoDB.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/../gateway/src/main/java/ProgramsDataBase.java" beforeDir="false" afterPath="$PROJECT_DIR$/../gateway/src/main/java/ProgramsDataBase.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/../gateway/src/main/java/app.java" beforeDir="false" afterPath="$PROJECT_DIR$/../gateway/src/main/java/app.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/../gateway/target/classes/LiveDB.class" beforeDir="false" afterPath="$PROJECT_DIR$/../gateway/target/classes/LiveDB.class" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/../gateway/target/classes/MongoDB.class" beforeDir="false" afterPath="$PROJECT_DIR$/../gateway/target/classes/MongoDB.class" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/../gateway/target/classes/ProgramsDataBase.class" beforeDir="false" afterPath="$PROJECT_DIR$/../gateway/target/classes/ProgramsDataBase.class" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/../gateway/target/classes/app.class" beforeDir="false" afterPath="$PROJECT_DIR$/../gateway/target/classes/app.class" afterDir="false" />
     </list>
     <ignored path="$PROJECT_DIR$/out/" />
     <ignored path="$PROJECT_DIR$/target/" />
@@ -31,44 +17,7 @@
     <option name="isMigrated" value="true" />
   </component>
   <component name="FileEditorManager">
-    <leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
-      <file pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/pom.xml">
-          <provider selected="true" editor-type-id="text-editor">
-            <state>
-              <caret column="22" selection-start-column="22" selection-end-column="22" />
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/src/main/java/app.java">
-          <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="135">
-              <caret line="10" selection-start-line="10" selection-end-line="10" />
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file pinned="false" current-in-tab="true">
-        <entry file="file://$PROJECT_DIR$/src/main/java/DockerCompilation.java">
-          <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="120">
-              <caret line="11" column="51" lean-forward="true" selection-start-line="11" selection-start-column="51" selection-end-line="11" selection-end-column="51" />
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/docker/python/dockerfile">
-          <provider selected="true" editor-type-id="text-editor">
-            <state>
-              <caret column="17" selection-start-column="17" selection-end-column="17" />
-            </state>
-          </provider>
-        </entry>
-      </file>
-    </leaf>
+    <leaf SIDE_TABS_SIZE_LIMIT_KEY="300" />
   </component>
   <component name="FileTemplateManagerImpl">
     <option name="RECENT_TEMPLATES">
@@ -242,7 +191,7 @@
     <servers />
   </component>
   <component name="TimeTrackingManager">
-    <option name="totallyTimeSpent" value="30823000" />
+    <option name="totallyTimeSpent" value="30876000" />
   </component>
   <component name="TodoView">
     <todo-panel id="selected-file">
@@ -255,7 +204,6 @@
   </component>
   <component name="ToolWindowManager">
     <frame x="0" y="0" width="1920" height="1200" extended-state="6" />
-    <editor active="true" />
     <layout>
       <window_info content_ui="combo" id="Project" order="0" visible="true" weight="0.30830672" />
       <window_info id="Structure" order="1" side_tool="true" weight="0.25" />
@@ -266,7 +214,7 @@
       <window_info id="Favorites" order="6" side_tool="true" />
       <window_info anchor="bottom" id="Message" order="0" />
       <window_info anchor="bottom" id="Find" order="1" weight="0.32891566" />
-      <window_info active="true" anchor="bottom" id="Run" order="2" visible="true" weight="0.4884956" />
+      <window_info anchor="bottom" id="Run" order="2" weight="0.4884956" />
       <window_info anchor="bottom" id="Debug" order="3" weight="0.39941692" />
       <window_info anchor="bottom" id="Cvs" order="4" weight="0.25" />
       <window_info anchor="bottom" id="Inspection" order="5" weight="0.4" />
@@ -359,31 +307,31 @@
     </entry>
     <entry file="file://$PROJECT_DIR$/share_docker_file/sample.py" />
     <entry file="file://$PROJECT_DIR$/share_docker_file/assert.py" />
-    <entry file="file://$PROJECT_DIR$/pom.xml">
+    <entry file="file://$PROJECT_DIR$/src/main/java/DockerCompilation.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state>
-          <caret column="22" selection-start-column="22" selection-end-column="22" />
+        <state relative-caret-position="450">
+          <caret line="33" column="12" selection-start-line="33" selection-start-column="12" selection-end-line="33" selection-end-column="12" />
         </state>
       </provider>
     </entry>
     <entry file="file://$PROJECT_DIR$/src/main/java/app.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="135">
-          <caret line="10" selection-start-line="10" selection-end-line="10" />
+        <state relative-caret-position="195">
+          <caret line="14" lean-forward="true" selection-start-line="14" selection-end-line="14" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/docker/python/dockerfile">
+    <entry file="file://$PROJECT_DIR$/pom.xml">
       <provider selected="true" editor-type-id="text-editor">
         <state>
-          <caret column="17" selection-start-column="17" selection-end-column="17" />
+          <caret column="22" selection-start-column="22" selection-end-column="22" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/java/DockerCompilation.java">
+    <entry file="file://$PROJECT_DIR$/docker/python/dockerfile">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="120">
-          <caret line="11" column="51" lean-forward="true" selection-start-line="11" selection-start-column="51" selection-end-line="11" selection-end-column="51" />
+        <state>
+          <caret column="17" selection-start-column="17" selection-end-column="17" />
         </state>
       </provider>
     </entry>
diff --git a/gateway/.idea/workspace.xml b/gateway/.idea/workspace.xml
index f96cecc..5b4af59 100644
--- a/gateway/.idea/workspace.xml
+++ b/gateway/.idea/workspace.xml
@@ -2,12 +2,21 @@
 <project version="4">
   <component name="ChangeListManager">
     <list default="true" id="e6a1f2e5-4f60-4227-82bb-83eb10fa94a5" name="Default Changelist" comment="">
+      <change afterPath="$PROJECT_DIR$/../client/src/app/_helper/_models/roles.ts" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/../client/src/app/_guard/auth.guard.ts" beforeDir="false" afterPath="$PROJECT_DIR$/../client/src/app/_guard/auth.guard.ts" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/../client/src/app/_helper/_models/user.ts" beforeDir="false" afterPath="$PROJECT_DIR$/../client/src/app/_helper/_models/user.ts" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/../client/src/app/_helper/error.interceptor.ts" beforeDir="false" afterPath="$PROJECT_DIR$/../client/src/app/_helper/error.interceptor.ts" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/../client/src/app/_helper/jwt.interceptor.ts" beforeDir="false" afterPath="$PROJECT_DIR$/../client/src/app/_helper/jwt.interceptor.ts" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/../client/src/app/app-routing.module.ts" beforeDir="false" afterPath="$PROJECT_DIR$/../client/src/app/app-routing.module.ts" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/../client/src/app/app.component.ts" beforeDir="false" afterPath="$PROJECT_DIR$/../client/src/app/app.component.ts" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/../client/src/app/component/login/login.component.ts" beforeDir="false" afterPath="$PROJECT_DIR$/../client/src/app/component/login/login.component.ts" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/../client/src/app/component/main-left-side-nav/main-left-side-nav.component.html" beforeDir="false" afterPath="$PROJECT_DIR$/../client/src/app/component/main-left-side-nav/main-left-side-nav.component.html" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/../client/src/app/component/searchby/searchby.component.css" beforeDir="false" afterPath="$PROJECT_DIR$/../client/src/app/component/searchby/searchby.component.css" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/../client/src/app/component/searchby/searchby.component.html" beforeDir="false" afterPath="$PROJECT_DIR$/../client/src/app/component/searchby/searchby.component.html" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/../client/src/app/services/auth/authentication.service.ts" beforeDir="false" afterPath="$PROJECT_DIR$/../client/src/app/services/auth/authentication.service.ts" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/../compilation/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/../compilation/.idea/workspace.xml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/../compilation/src/main/java/DockerCompilation.java" beforeDir="false" afterPath="$PROJECT_DIR$/../compilation/src/main/java/DockerCompilation.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/../compilation/target/classes/DockerCompilation.class" beforeDir="false" afterPath="$PROJECT_DIR$/../compilation/target/classes/DockerCompilation.class" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/main/java/LiveDB.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/LiveDB.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/src/main/java/MongoDB.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/MongoDB.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/main/java/ProgramsDataBase.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/ProgramsDataBase.java" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/src/main/java/app.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/app.java" afterDir="false" />
     </list>
     <ignored path="$PROJECT_DIR$/out/" />
@@ -40,20 +49,31 @@
       <file pinned="false" current-in-tab="false">
         <entry file="file://$PROJECT_DIR$/pom.xml">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="945">
+            <state relative-caret-position="1245">
               <caret line="83" column="4" selection-start-line="83" selection-start-column="4" selection-end-line="83" selection-end-column="4" />
             </state>
           </provider>
         </entry>
       </file>
-      <file pinned="false" current-in-tab="true">
+      <file pinned="false" current-in-tab="false">
         <entry file="file://$PROJECT_DIR$/src/main/java/app.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="488">
-              <caret line="108" column="10" selection-start-line="108" selection-start-column="10" selection-end-line="108" selection-end-column="10" />
+            <state relative-caret-position="195">
+              <caret line="158" column="12" selection-start-line="158" selection-start-column="12" selection-end-line="158" selection-end-column="12" />
+              <folding>
+                <element signature="imports" expanded="true" />
+              </folding>
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file pinned="false" current-in-tab="true">
+        <entry file="file://$PROJECT_DIR$/src/main/java/MongoDB.java">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="427">
+              <caret line="118" column="69" selection-start-line="118" selection-start-column="69" selection-end-line="118" selection-end-column="69" />
               <folding>
                 <element signature="imports" expanded="true" />
-                <element signature="e#1996#2010#0" expanded="true" />
               </folding>
             </state>
           </provider>
@@ -62,8 +82,8 @@
       <file pinned="false" current-in-tab="false">
         <entry file="file://$PROJECT_DIR$/src/main/java/ProgramsDataBase.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="135">
-              <caret line="9" column="74" selection-start-line="9" selection-start-column="74" selection-end-line="9" selection-end-column="74" />
+            <state relative-caret-position="165">
+              <caret line="11" selection-start-line="11" selection-end-line="11" />
             </state>
           </provider>
         </entry>
@@ -81,6 +101,7 @@
     <findStrings>
       <find>handler</find>
       <find>get_id</find>
+      <find>slee</find>
     </findStrings>
   </component>
   <component name="Git.Settings">
@@ -101,8 +122,8 @@
         <option value="$PROJECT_DIR$/pom.xml" />
         <option value="$PROJECT_DIR$/src/main/java/ProgramsDataBase.java" />
         <option value="$PROJECT_DIR$/src/main/java/LiveDB.java" />
-        <option value="$PROJECT_DIR$/src/main/java/MongoDB.java" />
         <option value="$PROJECT_DIR$/src/main/java/app.java" />
+        <option value="$PROJECT_DIR$/src/main/java/MongoDB.java" />
       </list>
     </option>
   </component>
@@ -133,8 +154,8 @@
     </option>
   </component>
   <component name="ProjectFrameBounds" fullScreen="true">
-    <option name="width" value="1920" />
-    <option name="height" value="1200" />
+    <option name="width" value="1440" />
+    <option name="height" value="900" />
   </component>
   <component name="ProjectLevelVcsManager" settingsEditedManually="true">
     <ConfirmationsSetting value="1" id="Add" />
@@ -145,6 +166,7 @@
     </navigator>
     <panes>
       <pane id="PackagesPane" />
+      <pane id="Scope" />
       <pane id="ProjectPane">
         <subPane>
           <expand>
@@ -174,7 +196,6 @@
           <select />
         </subPane>
       </pane>
-      <pane id="Scope" />
     </panes>
   </component>
   <component name="PropertiesComponent">
@@ -250,11 +271,12 @@
       <workItem from="1557469406279" duration="5073000" />
       <workItem from="1557487918416" duration="1045000" />
       <workItem from="1557490543401" duration="4129000" />
+      <workItem from="1557515924719" duration="2305000" />
     </task>
     <servers />
   </component>
   <component name="TimeTrackingManager">
-    <option name="totallyTimeSpent" value="82244000" />
+    <option name="totallyTimeSpent" value="84831000" />
   </component>
   <component name="TodoView">
     <todo-panel id="selected-file">
@@ -266,10 +288,10 @@
     </todo-panel>
   </component>
   <component name="ToolWindowManager">
-    <frame x="0" y="0" width="1920" height="1200" extended-state="0" />
+    <frame x="0" y="0" width="1440" height="900" extended-state="0" />
     <editor active="true" />
     <layout>
-      <window_info content_ui="combo" id="Project" order="0" sideWeight="0.49924126" visible="true" weight="0.157082" />
+      <window_info active="true" content_ui="combo" id="Project" order="0" sideWeight="0.49924126" visible="true" weight="0.15879828" />
       <window_info id="Structure" order="1" sideWeight="0.5007587" side_tool="true" weight="0.20127796" />
       <window_info id="Image Layers" order="2" />
       <window_info id="Designer" order="3" />
@@ -278,7 +300,7 @@
       <window_info id="Favorites" order="6" side_tool="true" />
       <window_info anchor="bottom" id="Message" order="0" />
       <window_info anchor="bottom" id="Find" order="1" weight="0.32920355" />
-      <window_info active="true" anchor="bottom" id="Run" order="2" visible="true" weight="0.35929203" />
+      <window_info anchor="bottom" id="Run" order="2" visible="true" weight="0.35903615" />
       <window_info anchor="bottom" id="Debug" order="3" weight="0.39911506" />
       <window_info anchor="bottom" id="Cvs" order="4" weight="0.25" />
       <window_info anchor="bottom" id="Inspection" order="5" weight="0.4" />
@@ -433,20 +455,6 @@
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/pom.xml">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="945">
-          <caret line="83" column="4" selection-start-line="83" selection-start-column="4" selection-end-line="83" selection-end-column="4" />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/java/ProgramsDataBase.java">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="135">
-          <caret line="9" column="74" selection-start-line="9" selection-start-column="74" selection-end-line="9" selection-end-column="74" />
-        </state>
-      </provider>
-    </entry>
     <entry file="file://$PROJECT_DIR$/src/main/java/LiveDB.java">
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="542">
@@ -458,13 +466,6 @@
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/java/MongoDB.java">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="75">
-          <caret line="5" lean-forward="true" selection-start-line="5" selection-end-line="5" />
-        </state>
-      </provider>
-    </entry>
     <entry file="file://$PROJECT_DIR$/src/main/java/Program.java">
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="540">
@@ -509,13 +510,36 @@
         </state>
       </provider>
     </entry>
+    <entry file="file://$PROJECT_DIR$/pom.xml">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="1245">
+          <caret line="83" column="4" selection-start-line="83" selection-start-column="4" selection-end-line="83" selection-end-column="4" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/ProgramsDataBase.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="165">
+          <caret line="11" selection-start-line="11" selection-end-line="11" />
+        </state>
+      </provider>
+    </entry>
     <entry file="file://$PROJECT_DIR$/src/main/java/app.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="488">
-          <caret line="108" column="10" selection-start-line="108" selection-start-column="10" selection-end-line="108" selection-end-column="10" />
+        <state relative-caret-position="195">
+          <caret line="158" column="12" selection-start-line="158" selection-start-column="12" selection-end-line="158" selection-end-column="12" />
+          <folding>
+            <element signature="imports" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/MongoDB.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="427">
+          <caret line="118" column="69" selection-start-line="118" selection-start-column="69" selection-end-line="118" selection-end-column="69" />
           <folding>
             <element signature="imports" expanded="true" />
-            <element signature="e#1996#2010#0" expanded="true" />
           </folding>
         </state>
       </provider>
diff --git a/gateway/src/main/java/MongoDB.java b/gateway/src/main/java/MongoDB.java
index d9769c3..7b49dbd 100644
--- a/gateway/src/main/java/MongoDB.java
+++ b/gateway/src/main/java/MongoDB.java
@@ -111,4 +111,10 @@ public class MongoDB extends ProgramsDataBase {
 
         return p;
     }
+
+    public toggleSubscription
+
+    // [iduser, idprogram : 234, status : 1 , katas [{id:1,status:"resolved",mysol:".."}],done : 1]
+    // ou
+    // separer en deux tables ,plus simple surement pour les requetes
 }
diff --git a/gateway/src/main/java/app.java b/gateway/src/main/java/app.java
index c378b8f..4c95f99 100644
--- a/gateway/src/main/java/app.java
+++ b/gateway/src/main/java/app.java
@@ -106,7 +106,7 @@ public class app {
                 e.printStackTrace();
             }
 
-        },roles(Roles.SHODAI, Roles.SENSEI, Roles.MONJI));
+        }, roles(Roles.SHODAI, Roles.SENSEI, Roles.MONJI));
 
         app.post("/program/create", ctx -> {
             Program prg = objectMapper.readValue(ctx.body(), Program.class);
@@ -155,7 +155,6 @@ public class app {
 
         app.post("jwt/request/", ctx -> {
             MockUser u = checkUser(ctx);
-            Thread.sleep(2000);
 
             if (!(u == null)) {
                 String token = provider.generateToken(u);
diff --git a/gateway/target/classes/app.class b/gateway/target/classes/app.class
index fb7a92deda977c4a2a4e32f135cdc907d1e86295..697229182d9509dbd8797e06e91138e4b9218c1d 100644
GIT binary patch
delta 4106
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
LXPLlR=8W<H_;+Fv

delta 4089
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
C>Rz@0

diff --git a/mongodb/newnuser b/mongodb/newnuser
new file mode 100644
index 0000000..24edbe0
--- /dev/null
+++ b/mongodb/newnuser
@@ -0,0 +1,12 @@
+docker-compose exec mongo mongo admin -u root -> example
+
+use DojoHepia
+db.createUser(
+  {
+    user: "shodai",
+    pwd: "shodai",
+    roles: [
+       { role: "readWrite", db: "DojoHepia" }
+    ]
+  }
+)
\ No newline at end of file
-- 
GitLab