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