diff --git a/README.md b/README.md index 39071b8300c35a86ed4e0330e0d561319f72b652..23bca6e1c7ac2067ff09ad6e67b7b098c04dc83c 100644 --- a/README.md +++ b/README.md @@ -9,63 +9,30 @@ <p>DOCKER-COMPOSE</p> <p>ANGULAR CLI</p> -### Temporary users ids : +### Temporary user ids : | Username | Password | Privileges | |----------|----------|------------| -| shodai | shodai | shodai | -| sensei | sensei | sensei | -| monji | monji | monji | +| shodai | admin | shodai | -<b>Users privileges hierarchy</b> -<p>shodai>sensei>monji</p> -#### Client - ->./client/ -``` -npm install -ng serve --open -``` +<p>When connected to shodai account, you can generate tokens to create further sensei in "Sponsorship" (location : left nav bar)</p> -#### Gateway ->./gateway/ -``` -mvn package -mvn exec:java -``` - -#### Compilateur ->./compilation/ -``` -mvn package -mvn exec:java -``` - -##### Create java container - ->./compilation/docker/java -``` -docker build . -t java:1.0 -``` - -##### Create python container +<p>All created account without token will automatically be ranked as "monji"</p> +<b>Users privileges hierarchy</b> ->./compilation/docker/python -``` -docker build . -t python:1.0 -``` +<p>shodai>sensei>monji</p> -#### MongoDB +#### 1. Mongo Database -##### Create container +##### 1.2 Create container >./mongodb/ ``` docker-compose up -d ``` -##### Create user +##### 1.3 Create user >./mongodb/ ``` @@ -76,6 +43,8 @@ password : example insert the following command : ``` +use DojoHepia + db.createUser( { user: "shodai", @@ -87,13 +56,11 @@ db.createUser( ) ``` -##### Importing data -<p>If you want to popularize the database with programs and katas, you can insert the following files in the mongo db database</p> +##### (optional) Importing data +<p>If you want to popularize the database with programs and katas, you can insert the following file in the mongo db database</p> >./mongodb/data/programs ->./mongodb/data/programssubscriptions - <p>to import the datas, copy past them and to the following steps :</p> >./mongodb/ @@ -104,9 +71,43 @@ password : example ``` use DojoHepia db.Programs.insertMany(<programs-copied-data>); -db.ProgramsSubscription.insertMany(<programsSubscription-copied-data>); ``` +#### 2. Gateway +>./gateway/ +``` +mvn package +mvn exec:java +``` +#### 3. Client + +>./client/ +``` +npm install +ng serve --open +``` + +#### 4. Compilateur + +##### 4.1 Pull java container + +``` +docker pull freakency/java:1.0 +``` +##### 4.2 Pull python container + +``` +docker pull freakency/python:1.0 +``` +##### 4.3 Compile and run + +>./compilation/ +``` +mvn package +mvn exec:java +``` + + ## Vocabulaire | Art - Martial | Dojo Hepia | diff --git a/client/package-lock.json b/client/package-lock.json index 5c029f943acac6d35ffac0491300c7f57a3d5554..5a1dc920edd1efe9e049fa1df6b352709438ebeb 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -5525,6 +5525,11 @@ "dev": true, "optional": true }, + "js-sha1": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/js-sha1/-/js-sha1-0.6.0.tgz", + "integrity": "sha512-01gwBFreYydzmU9BmZxpVk6svJJHrVxEN3IOiGl6VO93bVKYETJ0sIth6DASI6mIFdt7NmfX9UiByRzsYHGU9w==" + }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", diff --git a/client/package.json b/client/package.json index eafca2b6b32d808f6bf804535eada417e1eaf981..2fad21703397ae3603faff239a6b1e241ce042c3 100644 --- a/client/package.json +++ b/client/package.json @@ -28,12 +28,12 @@ "font-awesome": "^4.7.0", "hammerjs": "^2.0.8", "jquery": "^3.4.0", + "js-sha1": "^0.6.0", "ng2-ace-editor": "^0.3.9", "ngx-alerts": "^3.4.3", "ngx-bootstrap": "^4.1.1", "ngx-ui-loader": "^7.2.2", "rxjs": "~6.3.3", - "tslib": "^1.9.0", "uuid": "^3.3.2", "zone.js": "~0.8.26" }, diff --git a/client/src/app/app-routing.module.ts b/client/src/app/app-routing.module.ts index 84db7391ef7c0ff6fc16415822822b5a00df71f2..4398032abb74b329e27b58a42784910390ef6f1a 100644 --- a/client/src/app/app-routing.module.ts +++ b/client/src/app/app-routing.module.ts @@ -11,12 +11,16 @@ import {SearchbyComponent} from './component/searchby/searchby.component'; import {Role} from './_helper/_models/roles'; import {SubscriptionComponent} from './component/subscription/subscription.component'; import {MineComponent} from './component/mine/mine.component'; +import {SigninComponent} from './component/signin/signin.component'; +import {TokenComponent} from './component/token/token.component'; const routes: Routes = [ - {path: '', component: ProgramDisplayerComponent, canActivate: [AuthGuard]}, + {path: '', component: ProgramDisplayerComponent, canActivate: [AuthGuard], data: {roles: [Role.shodai, Role.monji, Role.sensei]}}, {path: 'user/login', component: LoginComponent}, - {path: 'program', component: ProgramDisplayerComponent, canActivate: [AuthGuard], data: {roles: [Role.shodai, Role.monji, Role.sensei]}}, + {path: 'user/signin', component: SigninComponent}, + {path: 'program/all', component: ProgramDisplayerComponent, canActivate: [AuthGuard], data: {roles: [Role.shodai, Role.monji, Role.sensei]}}, + {path: 'token', component: TokenComponent, canActivate: [AuthGuard], data: {roles: [Role.shodai, Role.sensei]}}, {path: 'program/subscriptions', component: SubscriptionComponent, canActivate: [AuthGuard], data: {roles: [Role.shodai, Role.monji, Role.sensei]}}, {path: 'program/mine', component: MineComponent, canActivate: [AuthGuard], data: {roles: [Role.shodai, Role.sensei]}}, {path: 'program/search', component: SearchbyComponent, canActivate: [AuthGuard], data: {roles: [Role.shodai, Role.monji, Role.sensei]}}, diff --git a/client/src/app/app.module.ts b/client/src/app/app.module.ts index 7049df27d20f0612eb19adb8a57669e890ab7c55..2e362717de67331c44d604dd6ccc50e127c1b812 100644 --- a/client/src/app/app.module.ts +++ b/client/src/app/app.module.ts @@ -14,7 +14,14 @@ import { MatIconModule, MatListModule, MatCardModule, - MatInputModule, MatFormFieldModule, MatExpansionModule, MatGridListModule, MatSnackBarModule + MatInputModule, + MatFormFieldModule, + MatExpansionModule, + MatGridListModule, + MatSnackBarModule, + MatCheckboxModule, + MatBadgeModule, + MatProgressSpinnerModule } from '@angular/material'; import {AppRoutingModule} from './app-routing.module'; import {RouterModule} from '@angular/router'; @@ -38,6 +45,9 @@ import { SearchbyComponent } from './component/searchby/searchby.component'; import { SubscriptionComponent } from './component/subscription/subscription.component'; import { MineComponent } from './component/mine/mine.component'; import { CardNoneallDisplayerComponent } from './component/program-displayer/card-noneall-displayer/card-noneall-displayer.component'; +import { SigninComponent } from './component/signin/signin.component'; +import { TokenComponent } from './component/token/token.component'; + @NgModule({ declarations: [ @@ -57,7 +67,9 @@ import { CardNoneallDisplayerComponent } from './component/program-displayer/car SearchbyComponent, SubscriptionComponent, MineComponent, - CardNoneallDisplayerComponent + CardNoneallDisplayerComponent, + SigninComponent, + TokenComponent ], imports: [ @@ -71,6 +83,7 @@ import { CardNoneallDisplayerComponent } from './component/program-displayer/car MatInputModule, MatFormFieldModule, MatExpansionModule, + MatCheckboxModule, MatGridListModule, MatSnackBarModule, MatListModule, @@ -82,7 +95,9 @@ import { CardNoneallDisplayerComponent } from './component/program-displayer/car NgxUiLoaderModule, AlertModule.forRoot({maxMessages: 5, timeout: 5000, position: 'right'}), ReactiveFormsModule, - MatCardModule + MatCardModule, + MatBadgeModule, + MatProgressSpinnerModule ], providers: [{provide: HTTP_INTERCEPTORS, useClass: JwtInterceptor, multi: true}, { 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 2d9d8b227624d7f9a2a2d27e7df32f626d6ca607..0a29300392237157709a092c2a998ea2e8fbca24 100644 --- a/client/src/app/component/kata-displayer/kata-displayer.component.html +++ b/client/src/app/component/kata-displayer/kata-displayer.component.html @@ -5,12 +5,15 @@ <span class="subtitle">{{programSensei}} <span class="language"> {{programLanguage}}</span> </span> - <button mat-button style="margin:0 3rem 0 0;float:right" *ngIf="isOwner" + <button mat-button style="margin:0 3rem 0 0;float:right;" *ngIf="isOwner" routerLink="/kata_create/{{idProgram}}/{{programLanguage}}">Create a new kata </button> - <button mat-button style="margin:0 3rem 0 0;float:right" *ngIf="isOwner" (click)="delete(idProgram)">Delete this program + <button mat-button style="margin:0 3rem 0 0;float:right" *ngIf="isOwner" (click)="deleteProgram(idProgram)">Delete + this + program </button> - <button mat-button style="margin:0 3rem 0 0;float:right" *ngIf="!isOwner" (click)="subscribe()">{{subvalue}}</button> + <button mat-button style="margin:0 3rem 0 0;float:right" *ngIf="!isOwner" + (click)="subscribe()">{{subvalue}}</button> </h1> </div> @@ -25,11 +28,11 @@ <h5 class="card-title"><a class="title" routerLink="/kata/{{idProgram}}/{{kata.id}}">{{kata.title}}</a> <span style="float:right;" - [ngClass]="{'TODO':kata.status==='TODO','ON-GOING':kata.status==='ON-GOING','RESOLVED':kata.status==='RESOLVED','FAILED': kata.status==='FAILED'}">{{kata.status}}</span></h5> + [ngClass]="{'TODO':kata.status==='TODO','ON-GOING':kata.status==='ON-GOING','RESOLVED':kata.status==='RESOLVED','FAILED': kata.status==='FAILED'}">{{kata.status}}</span></h5> <br/> <h6 class="card-subtitle mb-2 text-muted">{{kata.difficulty}}</h6> - <br/> - <br/> + <!-- <button mat-button *ngIf="isOwner" (click)="deleteKata(kata.id)" class="card-link">Delete kata</button>--> + <!--<button mat-button *ngIf="isOwner" routerLink="#">Statistics</button>--> <!--<p class="card-text">{{kata.description}}</p>--> </div> </div> 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 9e23a1328b7bc1081bf4d98fe0b95b2b67825487..490baa36a62130ae7154762ffca9f3b4136eb334 100644 --- a/client/src/app/component/kata-displayer/kata-displayer.component.ts +++ b/client/src/app/component/kata-displayer/kata-displayer.component.ts @@ -53,6 +53,10 @@ export class KataDisplayerComponent implements OnInit { ) { } + deleteKata(kataid: string){ + + } + getIsOwner() { if (this.currentUser.id === this.programSenseiID) { this.isOwner = true; @@ -113,7 +117,7 @@ export class KataDisplayerComponent implements OnInit { }); } - delete(id: string) { + deleteProgram(id: string) { if (confirm('Are you sure you want to delete this program ? all katas and users datas regarding this katas will be deleted as well.')) { this.programService.deleteProgram(id).subscribe(() => { this.router.navigate(['program/mine']); diff --git a/client/src/app/component/login/login.component.html b/client/src/app/component/login/login.component.html index f50fb176e67ca1873835cc37b844c05b453fde5b..200a002a68852ad905469481cfdad64facbada5d 100644 --- a/client/src/app/component/login/login.component.html +++ b/client/src/app/component/login/login.component.html @@ -22,5 +22,6 @@ <br> <div *ngIf="error" class="alert alert-danger">{{error}}</div> </form> + <a routerLink="/user/signin">Create my account</a> </div> diff --git a/client/src/app/component/login/login.component.ts b/client/src/app/component/login/login.component.ts index de3f86b13178427b0901a340fd0a33f0c30bf634..f6a108a040ab56ffcccf5ee0cc74b187f10ebb2c 100644 --- a/client/src/app/component/login/login.component.ts +++ b/client/src/app/component/login/login.component.ts @@ -3,6 +3,7 @@ import {AuthenticationService} from '../../services/auth/authentication.service' import {first} from 'rxjs/operators'; import {ActivatedRoute, Router} from '@angular/router'; import {FormBuilder, FormGroup, Validators} from '@angular/forms'; +import * as sha1 from 'js-sha1'; @Component({ selector: 'app-login', @@ -13,7 +14,6 @@ export class LoginComponent implements OnInit { constructor(private route: ActivatedRoute, private router: Router, - private auth: AuthenticationService, private formBuilder: FormBuilder, private authenticationService: AuthenticationService) { if (this.authenticationService.currentUserValue) { @@ -38,7 +38,7 @@ export class LoginComponent implements OnInit { } this.loading = true; - this.auth.login(this.f.username.value, this.f.password.value) + this.authenticationService.login(this.f.username.value, sha1(this.f.password.value)) .pipe(first()) .subscribe( data => { 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 289b809565d3e812f015c9a1605fcdfbff3302f7..4784723815466635aa1ef08f25c7b8d359e792c7 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 @@ -3,15 +3,16 @@ [attr.role]="(isHandset$ | async) ? 'dialog' : 'navigation'" [mode]="(isHandset$ | async) ? 'over' : 'side'" [opened]="!(isHandset$ | async)"> - <mat-toolbar routerLink="/">DOJO HEPIA</mat-toolbar> + <mat-toolbar><a class="title" routerLink="/">DOJO HEPIA</a></mat-toolbar> <mat-nav-list *ngIf="currentUser"> - <a mat-list-item routerLink="/program">All programs</a> + <a mat-list-item routerLink="/program/all" routerLinkActive="active-list-item">All programs</a> <div *ngIf="currentUser.role != Role.monji"> - <a mat-list-item routerLink="/program/create">New program</a> - <a mat-list-item routerLink="/program/mine">My programs</a> + <a mat-list-item routerLink="/program/create" routerLinkActive="active-list-item">New program</a> + <a mat-list-item routerLink="/program/mine" routerLinkActive="active-list-item">My programs</a> + <a mat-list-item routerLink="/token" routerLinkActive="active-list-item">Sponsorship</a> </div> - <a mat-list-item routerLink="/program/subscriptions">Subscriptions</a> - <a mat-list-item routerLink="/program/search">Search</a> + <a mat-list-item routerLink="/program/subscriptions" routerLinkActive="active-list-item">Subscriptions</a> + <a mat-list-item routerLink="/program/search" routerLinkActive="active-list-item">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.scss b/client/src/app/component/main-left-side-nav/main-left-side-nav.component.scss index f483fdbadc6de2f6f154e246cf011ad304c98d44..d26a167c83dfd47a4434b8c4d32b09cca982d7c0 100644 --- a/client/src/app/component/main-left-side-nav/main-left-side-nav.component.scss +++ b/client/src/app/component/main-left-side-nav/main-left-side-nav.component.scss @@ -24,3 +24,15 @@ *{ color : var(--color-cloud); } + +.active-list-item { + background-color: var(--color-light-blue); +} +.title{ + color : var(--color-cloud); + text-decoration: none; +} +.title:hover{ + color: var(--color-dark-grey); + transition: .2s; +} diff --git a/client/src/app/component/mine/mine.component.ts b/client/src/app/component/mine/mine.component.ts index 884d28d83646aae2a9c0873a9009cd1765ff7596..ca2baaee0843481786a02e4c16f00836428fba5e 100644 --- a/client/src/app/component/mine/mine.component.ts +++ b/client/src/app/component/mine/mine.component.ts @@ -23,6 +23,9 @@ export class MineComponent implements OnInit { this.ngxLoader.start(); this.programSubscription.getMine(this.auth.currentUserValue.id).subscribe((data: Program[]) => { this.programs = data; + if (this.programs.length === 0) { + this.programReceivedFailed = true; + } this.ngxLoader.stop(); }, error1 => { if (error1.status === 404) { diff --git a/client/src/app/component/signin/signin.component.css b/client/src/app/component/signin/signin.component.css new file mode 100644 index 0000000000000000000000000000000000000000..cad61d57bb6c4a3325f97b494ac22f63779773ed --- /dev/null +++ b/client/src/app/component/signin/signin.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/signin/signin.component.html b/client/src/app/component/signin/signin.component.html new file mode 100644 index 0000000000000000000000000000000000000000..8b449413c70d56f762cd4ffd251b2436503554b9 --- /dev/null +++ b/client/src/app/component/signin/signin.component.html @@ -0,0 +1,53 @@ +<div class="container" style="margin-top:10%"> + <form [formGroup]="signinForm" (ngSubmit)="onSubmit()"> + + <!-- <div class="form-group"> + <label for="firstname">First name</label> + <input type="text" formControlName="firstname" class="form-control" [ngClass]="{ 'is-invalid': submitted && f.firstname.errors }"/> + <div *ngIf="submitted && f.firstname.errors" class="invalid-feedback"> + <div *ngIf="f.firstname.errors.required">First name is required</div> + </div> + </div> + + <div class="form-group"> + <label for="lastname">Last name</label> + <input type="text" formControlName="lastname" class="form-control" [ngClass]="{ 'is-invalid': submitted && f.lastname.errors }"/> + <div *ngIf="submitted && f.lastname.errors" class="invalid-feedback"> + <div *ngIf="f.lastname.errors.required">Last name is required</div> + </div> + </div>--> + + + <div class="form-group"> + <label for="username">Username</label> + <input type="text" formControlName="username" class="form-control" [ngClass]="{ 'is-invalid': submitted && f.username.errors }"/> + <div *ngIf="submitted && f.username.errors" class="invalid-feedback"> + <div *ngIf="f.username.errors.required">Username is required</div> + </div> + </div> + <div class="form-group"> + <label for="password">Password</label> + <input type="password" formControlName="password" class="form-control" [ngClass]="{ 'is-invalid': submitted && f.password.errors }"/> + <div *ngIf="submitted && f.password.errors" class="invalid-feedback"> + <div *ngIf="f.password.errors.required">Password is required</div> + </div> + </div> + <div class="form-group"> + <button [disabled]="loading" mat-button style="float:right">Sign in</button> + <img *ngIf="loading" src="data:image/gif;base64,R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQJCgAAACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkECQoAAAAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkECQoAAAAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkECQoAAAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQJCgAAACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQJCgAAACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAkKAAAALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA==" /> + </div> + + <mat-checkbox (change)="toggleChecked()">I have a token</mat-checkbox> + <div *ngIf="checked" class="form-group"> + <hr> + <input type="text" formControlName="token" placeholder="Past your given token" class="form-control" [ngClass]="{ 'is-invalid': submitted && f.token.errors }"/> + <div *ngIf="submitted && f.token.errors" class="invalid-feedback"> + <div *ngIf="f.token.errors.required">Token is required</div> + </div> + </div> + <br> + <br> + <div *ngIf="error" class="alert alert-danger">{{error}}</div> + </form> +</div> + diff --git a/client/src/app/component/signin/signin.component.spec.ts b/client/src/app/component/signin/signin.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..c64b0b29c1335ece163f3414d52dd8aee94f61ed --- /dev/null +++ b/client/src/app/component/signin/signin.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SigninComponent } from './signin.component'; + +describe('SigninComponent', () => { + let component: SigninComponent; + let fixture: ComponentFixture<SigninComponent>; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SigninComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SigninComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/client/src/app/component/signin/signin.component.ts b/client/src/app/component/signin/signin.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..0b0de48c2c12a56de6c0950142ab5feeabf41318 --- /dev/null +++ b/client/src/app/component/signin/signin.component.ts @@ -0,0 +1,81 @@ +import {Component, OnInit} from '@angular/core'; +import {AuthenticationService} from '../../services/auth/authentication.service'; +import {Router} from '@angular/router'; +import {FormBuilder, FormGroup, Validators} from '@angular/forms'; +import {SignInService} from '../../services/auth/signin/sign-in.service'; +import {v4 as uuid} from 'uuid'; +import * as sha1 from 'js-sha1'; + +@Component({ + selector: 'app-signin', + templateUrl: './signin.component.html', + styleUrls: ['./signin.component.css'] +}) +export class SigninComponent implements OnInit { + + constructor(private authenticationService: AuthenticationService, + private router: Router, + private formBuilder: FormBuilder, + private signinService: SignInService) { + if (this.authenticationService.currentUserValue) { + this.router.navigate(['/']); + } + } + + signinForm: FormGroup; + + loading = false; + submitted = false; + error = ''; + checked = false; + + + toggleChecked() { + const token = this.signinForm.get('token'); + this.checked = !this.checked; + if (!this.checked) { + token.setValidators([null]); + } else { + token.setValidators([Validators.required]); + } + } + + get f() { + return this.signinForm.controls; + } + + onSubmit() { + this.submitted = true; + + // stop here if form is invalid + if (this.signinForm.invalid) { + return; + } + + this.signinService.createUser(JSON.stringify({ + id: uuid(), + username: this.f.username.value, + password: sha1(this.f.password.value), + token: this.f.token.value + })).subscribe(data => { + this.router.navigate(['/login']); + }, + error => { + this.error = error.error; + }); + + } + + + ngOnInit() { + this.signinForm = this.formBuilder.group({ + // firstname: ['', Validators.required], + // lastname: ['', Validators.required], + username: ['', Validators.required], + token: ['', null], + password: ['', Validators.required] + }); + + } + +} diff --git a/client/src/app/component/subscription/subscription.component.ts b/client/src/app/component/subscription/subscription.component.ts index b611463b96c2f0ae42d3b62bc4526969c1b183c8..1fff01a6173ea7f598bfddfec463c532de80b19f 100644 --- a/client/src/app/component/subscription/subscription.component.ts +++ b/client/src/app/component/subscription/subscription.component.ts @@ -22,6 +22,10 @@ export class SubscriptionComponent implements OnInit { this.ngxLoader.start(); this.programSubscription.getSubscription(this.auth.currentUserValue.id).subscribe((data: Program[]) => { this.programs = data.filter((x) => x.sensei !== this.auth.currentUserValue.username); + + if (this.programs.length === 0) { + this.programReceivedFailed = true; + } this.ngxLoader.stop(); }, error1 => { if (error1.status === 404) { diff --git a/client/src/app/component/token/token.component.css b/client/src/app/component/token/token.component.css new file mode 100644 index 0000000000000000000000000000000000000000..e31f2863e72462cd0deb5d637db883dcdd155286 --- /dev/null +++ b/client/src/app/component/token/token.component.css @@ -0,0 +1,6 @@ +.container{ + text-align: center; + font-family: "Helvetica Neue"; + margin-top:5%; + color:var(--color-cloud); +} diff --git a/client/src/app/component/token/token.component.html b/client/src/app/component/token/token.component.html new file mode 100644 index 0000000000000000000000000000000000000000..b2dd8fc5fc17f52a1b8be65813ce3128e69875f4 --- /dev/null +++ b/client/src/app/component/token/token.component.html @@ -0,0 +1,9 @@ +<div class="container"> + <p>Hey ! If you're here, it's because you're trusted by Dojo Hepia.</p> + <p>If you want to let one of your friend become a Sensei by sponsoring him, you can generate a special token</p> + <p>(token will be up 10 minutes)</p> + <button mat-button (click)="generate()">Generate token</button> + <br/> + <br/> + <p style="color:rgba(231, 76, 60,1.0);">{{token}}</p> +</div> diff --git a/client/src/app/component/token/token.component.spec.ts b/client/src/app/component/token/token.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..9c319a5ad9b5dd06dcb3c53875a9689399b8283b --- /dev/null +++ b/client/src/app/component/token/token.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { TokenComponent } from './token.component'; + +describe('TokenComponent', () => { + let component: TokenComponent; + let fixture: ComponentFixture<TokenComponent>; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ TokenComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(TokenComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/client/src/app/component/token/token.component.ts b/client/src/app/component/token/token.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..d1d07d8b3f5b188b5a2ce27778d083ddf316cc4b --- /dev/null +++ b/client/src/app/component/token/token.component.ts @@ -0,0 +1,25 @@ +import {Component, OnInit} from '@angular/core'; +import {TokenService} from '../../services/auth/signin/token.service'; + +@Component({ + selector: 'app-token', + templateUrl: './token.component.html', + styleUrls: ['./token.component.css'] +}) +export class TokenComponent implements OnInit { + + constructor(private tokenService: TokenService) { + } + + token = ''; + + generate() { + this.tokenService.getToken().subscribe((data: string) => { + this.token = data; + }); + } + + ngOnInit() { + } + +} diff --git a/client/src/app/services/auth/signin/sign-in.service.spec.ts b/client/src/app/services/auth/signin/sign-in.service.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..544991d1b5e57035837f6dde87fdb9eb950e5dab --- /dev/null +++ b/client/src/app/services/auth/signin/sign-in.service.spec.ts @@ -0,0 +1,12 @@ +import { TestBed } from '@angular/core/testing'; + +import { SignInService } from './sign-in.service'; + +describe('SignInService', () => { + beforeEach(() => TestBed.configureTestingModule({})); + + it('should be created', () => { + const service: SignInService = TestBed.get(SignInService); + expect(service).toBeTruthy(); + }); +}); diff --git a/client/src/app/services/auth/signin/sign-in.service.ts b/client/src/app/services/auth/signin/sign-in.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..64ac600de45623ae77179076a3be01fadeda0e08 --- /dev/null +++ b/client/src/app/services/auth/signin/sign-in.service.ts @@ -0,0 +1,15 @@ +import {Injectable} from '@angular/core'; +import {HttpClient} from '@angular/common/http'; + +@Injectable({ + providedIn: 'root' +}) +export class SignInService { + + createUser(obj: string) { + return this.http.post('http://localhost:7000/user/signin', obj); + } + + constructor(private http: HttpClient) { + } +} diff --git a/client/src/app/services/auth/signin/token.service.spec.ts b/client/src/app/services/auth/signin/token.service.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..9375546dec7e3a1f3e7b451d2b8c61f546648fe6 --- /dev/null +++ b/client/src/app/services/auth/signin/token.service.spec.ts @@ -0,0 +1,12 @@ +import { TestBed } from '@angular/core/testing'; + +import { TokenService } from './token.service'; + +describe('TokenService', () => { + beforeEach(() => TestBed.configureTestingModule({})); + + it('should be created', () => { + const service: TokenService = TestBed.get(TokenService); + expect(service).toBeTruthy(); + }); +}); diff --git a/client/src/app/services/auth/signin/token.service.ts b/client/src/app/services/auth/signin/token.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..60d9461b777165da8f4096a6a3171658eb94b842 --- /dev/null +++ b/client/src/app/services/auth/signin/token.service.ts @@ -0,0 +1,15 @@ +import {Injectable} from '@angular/core'; +import {HttpClient} from '@angular/common/http'; + +@Injectable({ + providedIn: 'root' +}) +export class TokenService { + + getToken() { + return this.http.get('http://localhost:7000/token/generate'); + } + + constructor(private http: HttpClient) { + } +} diff --git a/client/src/styles.scss b/client/src/styles.scss index 7f7ca8724520992f877b4a0f79c93c589ba16bec..f28ad0c7c16fce2f85e4a6607286a6fe539906a6 100644 --- a/client/src/styles.scss +++ b/client/src/styles.scss @@ -62,3 +62,5 @@ button:focus{ hr{ border: 1px solid var(--color-dark-blue); } + + diff --git a/compilation/.idea/workspace.xml b/compilation/.idea/workspace.xml index 714e61bf531f18157adf03f92475899fb8cbf679..6c357ed1ba298443e6379c17a22b5519c0e828bd 100644 --- a/compilation/.idea/workspace.xml +++ b/compilation/.idea/workspace.xml @@ -2,26 +2,14 @@ <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/component/kata/kata.component.ts" beforeDir="false" afterPath="$PROJECT_DIR$/../client/src/app/component/kata/kata.component.ts" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/../client/src/app/component/mine/mine.component.html" beforeDir="false" afterPath="$PROJECT_DIR$/../client/src/app/component/mine/mine.component.html" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/../client/src/app/component/program-displayer/card-displayer/card-displayer.component.css" beforeDir="false" afterPath="$PROJECT_DIR$/../client/src/app/component/program-displayer/card-displayer/card-displayer.component.css" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/../client/src/app/component/program-displayer/card-noneall-displayer/card-noneall-displayer.component.css" beforeDir="false" /> - <change beforePath="$PROJECT_DIR$/../client/src/app/component/program-displayer/card-noneall-displayer/card-noneall-displayer.component.html" beforeDir="false" afterPath="$PROJECT_DIR$/../client/src/app/component/program-displayer/card-noneall-displayer/card-noneall-displayer.component.html" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/../client/src/app/component/program-displayer/card-noneall-displayer/card-noneall-displayer.component.ts" beforeDir="false" afterPath="$PROJECT_DIR$/../client/src/app/component/program-displayer/card-noneall-displayer/card-noneall-displayer.component.ts" 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/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/component/searchby/searchby.component.ts" beforeDir="false" afterPath="$PROJECT_DIR$/../client/src/app/component/searchby/searchby.component.ts" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/../client/src/app/component/subscription/subscription.component.html" beforeDir="false" afterPath="$PROJECT_DIR$/../client/src/app/component/subscription/subscription.component.html" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/../client/src/styles.scss" beforeDir="false" afterPath="$PROJECT_DIR$/../client/src/styles.scss" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/share_docker_file/Kata.class" beforeDir="false" afterPath="$PROJECT_DIR$/share_docker_file/Kata.class" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/share_docker_file/Main.class" beforeDir="false" afterPath="$PROJECT_DIR$/share_docker_file/Main.class" afterDir="false" /> + <change beforePath="$PROJECT_DIR$/../README.md" beforeDir="false" afterPath="$PROJECT_DIR$/../README.md" afterDir="false" /> + <change beforePath="$PROJECT_DIR$/../client/src/app/component/kata-displayer/kata-displayer.component.html" beforeDir="false" afterPath="$PROJECT_DIR$/../client/src/app/component/kata-displayer/kata-displayer.component.html" 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/ProgramShowCase.java" beforeDir="false" afterPath="$PROJECT_DIR$/../gateway/src/main/java/ProgramShowCase.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/MongoDB.class" beforeDir="false" afterPath="$PROJECT_DIR$/../gateway/target/classes/MongoDB.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/" /> @@ -39,8 +27,8 @@ <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="45"> - <caret line="6" column="67" lean-forward="true" selection-start-line="6" selection-start-column="67" selection-end-line="6" selection-end-column="67" /> + <state relative-caret-position="247"> + <caret line="20" column="114" selection-start-line="20" selection-start-column="114" selection-end-line="20" selection-end-column="114" /> </state> </provider> </entry> @@ -80,7 +68,7 @@ </MavenImportingSettings> </option> </component> - <component name="ProjectFrameBounds" fullScreen="true"> + <component name="ProjectFrameBounds" extendedState="6" fullScreen="true"> <option name="y" value="23" /> <option name="width" value="1920" /> <option name="height" value="1121" /> @@ -92,7 +80,6 @@ </navigator> <panes> <pane id="PackagesPane" /> - <pane id="Scope" /> <pane id="ProjectPane"> <subPane> <expand> @@ -109,6 +96,7 @@ <select /> </subPane> </pane> + <pane id="Scope" /> </panes> </component> <component name="PropertiesComponent"> @@ -208,11 +196,14 @@ <workItem from="1557833112052" duration="420000" /> <workItem from="1557842013256" duration="237000" /> <workItem from="1557902518593" duration="3056000" /> + <workItem from="1557931166779" duration="192000" /> + <workItem from="1557988860203" duration="849000" /> + <workItem from="1558017128365" duration="97000" /> </task> <servers /> </component> <component name="TimeTrackingManager"> - <option name="totallyTimeSpent" value="40913000" /> + <option name="totallyTimeSpent" value="42051000" /> </component> <component name="TodoView"> <todo-panel id="selected-file"> @@ -226,7 +217,7 @@ <component name="ToolWindowManager"> <frame x="0" y="0" width="1440" height="900" extended-state="6" /> <layout> - <window_info content_ui="combo" id="Project" order="0" visible="true" weight="0.33404863" /> + <window_info content_ui="combo" id="Project" order="0" visible="true" weight="0.3490701" /> <window_info id="Structure" order="1" side_tool="true" weight="0.25" /> <window_info id="Image Layers" order="2" /> <window_info id="Designer" order="3" /> @@ -235,7 +226,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 anchor="bottom" id="Run" order="2" weight="0.48795182" /> + <window_info anchor="bottom" id="Run" order="2" weight="0.21927711" /> <window_info anchor="bottom" id="Debug" order="3" weight="0.3987952" /> <window_info anchor="bottom" id="Cvs" order="4" weight="0.25" /> <window_info anchor="bottom" id="Inspection" order="5" weight="0.4" /> @@ -359,8 +350,8 @@ <entry file="file://$PROJECT_DIR$/share_docker_file/Main.java" /> <entry file="file://$PROJECT_DIR$/src/main/java/DockerCompilation.java"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="45"> - <caret line="6" column="67" lean-forward="true" selection-start-line="6" selection-start-column="67" selection-end-line="6" selection-end-column="67" /> + <state relative-caret-position="247"> + <caret line="20" column="114" selection-start-line="20" selection-start-column="114" selection-end-line="20" selection-end-column="114" /> </state> </provider> </entry> diff --git a/compilation/share_docker_file/Kata.class b/compilation/share_docker_file/Kata.class index b1fa1177342df418b220cff96d8caed53c68d8e0..117730112f0014d3a78257896966d9e5bfdd28e0 100644 Binary files a/compilation/share_docker_file/Kata.class and b/compilation/share_docker_file/Kata.class differ diff --git a/compilation/share_docker_file/__pycache__/sample.cpython-34.pyc b/compilation/share_docker_file/__pycache__/sample.cpython-34.pyc index eee4e3510d11e77a706e8677a667da70212b8436..761d5e6c7dbaefd90fde4b7528c6b7aa017d8f2e 100644 Binary files a/compilation/share_docker_file/__pycache__/sample.cpython-34.pyc and b/compilation/share_docker_file/__pycache__/sample.cpython-34.pyc differ diff --git a/compilation/src/main/java/DockerCompilation.java b/compilation/src/main/java/DockerCompilation.java index 2efd38f5f0ac32aa04260f3c60c965bc758f6b4c..9518b6c330ca0f46485026e0afc027934e76d337 100644 --- a/compilation/src/main/java/DockerCompilation.java +++ b/compilation/src/main/java/DockerCompilation.java @@ -13,12 +13,12 @@ public class DockerCompilation { case "python": filename = "share_docker_file/sample.py"; filename_test = "share_docker_file/assert.py"; - cmd = "docker run --rm --mount type=bind,source=" + dir + "/share_docker_file,dst=/env/ python:1.0 python3 assert.py"; + cmd = "docker run --rm --mount type=bind,source=" + dir + "/share_docker_file,dst=/env/ freakency/python:1.0 python3 assert.py"; break; case "java": filename = "share_docker_file/kata.java"; filename_test = "share_docker_file/Main.java"; - cmd = "docker run --rm --mount type=bind,source=" + dir + "/share_docker_file,dst=/env/ java:1.0 ./java_test.sh"; + cmd = "docker run --rm --mount type=bind,source=" + dir + "/share_docker_file,dst=/env/ freakency/java:1.0 ./java_test.sh"; break; } diff --git a/compilation/target/05-1.0-SNAPSHOT.jar b/compilation/target/05-1.0-SNAPSHOT.jar index fa2e926592bbfc6c72468ce3938fb933d01d8676..b508109229c066d7fc6c9596d60c715150eb7f78 100644 Binary files a/compilation/target/05-1.0-SNAPSHOT.jar and b/compilation/target/05-1.0-SNAPSHOT.jar differ diff --git a/compilation/target/classes/DockerCompilation.class b/compilation/target/classes/DockerCompilation.class index a0c134b4c750980a63932588459f4250ff42af6c..54b267b08d1c06483b7a2be98f949d3ad678dc1f 100644 Binary files a/compilation/target/classes/DockerCompilation.class and b/compilation/target/classes/DockerCompilation.class differ diff --git a/gateway/.idea/workspace.xml b/gateway/.idea/workspace.xml index c9f9a0aca62bfeefdfce8fc18609804a2da0ecd5..8776e03cd3f006ef5c3b2a1ef42a13175b6b61da 100644 --- a/gateway/.idea/workspace.xml +++ b/gateway/.idea/workspace.xml @@ -2,25 +2,12 @@ <project version="4"> <component name="ChangeListManager"> <list default="true" id="e6a1f2e5-4f60-4227-82bb-83eb10fa94a5" name="Default Changelist" comment=""> - <change beforePath="$PROJECT_DIR$/../client/src/app/component/kata/kata.component.ts" beforeDir="false" afterPath="$PROJECT_DIR$/../client/src/app/component/kata/kata.component.ts" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/../client/src/app/component/mine/mine.component.html" beforeDir="false" afterPath="$PROJECT_DIR$/../client/src/app/component/mine/mine.component.html" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/../client/src/app/component/program-displayer/card-displayer/card-displayer.component.css" beforeDir="false" afterPath="$PROJECT_DIR$/../client/src/app/component/program-displayer/card-displayer/card-displayer.component.css" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/../client/src/app/component/program-displayer/card-noneall-displayer/card-noneall-displayer.component.css" beforeDir="false" /> - <change beforePath="$PROJECT_DIR$/../client/src/app/component/program-displayer/card-noneall-displayer/card-noneall-displayer.component.html" beforeDir="false" afterPath="$PROJECT_DIR$/../client/src/app/component/program-displayer/card-noneall-displayer/card-noneall-displayer.component.html" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/../client/src/app/component/program-displayer/card-noneall-displayer/card-noneall-displayer.component.ts" beforeDir="false" afterPath="$PROJECT_DIR$/../client/src/app/component/program-displayer/card-noneall-displayer/card-noneall-displayer.component.ts" 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/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/component/searchby/searchby.component.ts" beforeDir="false" afterPath="$PROJECT_DIR$/../client/src/app/component/searchby/searchby.component.ts" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/../client/src/app/component/subscription/subscription.component.html" beforeDir="false" afterPath="$PROJECT_DIR$/../client/src/app/component/subscription/subscription.component.html" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/../client/src/styles.scss" beforeDir="false" afterPath="$PROJECT_DIR$/../client/src/styles.scss" afterDir="false" /> + <change beforePath="$PROJECT_DIR$/../README.md" beforeDir="false" afterPath="$PROJECT_DIR$/../README.md" afterDir="false" /> + <change beforePath="$PROJECT_DIR$/../client/src/app/component/kata-displayer/kata-displayer.component.html" beforeDir="false" afterPath="$PROJECT_DIR$/../client/src/app/component/kata-displayer/kata-displayer.component.html" 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/share_docker_file/Kata.class" beforeDir="false" afterPath="$PROJECT_DIR$/../compilation/share_docker_file/Kata.class" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/../compilation/share_docker_file/Main.class" beforeDir="false" afterPath="$PROJECT_DIR$/../compilation/share_docker_file/Main.class" 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$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" 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$/src/main/java/MongoDB.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/MongoDB.java" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/src/main/java/ProgramShowCase.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/ProgramShowCase.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/" /> @@ -50,11 +37,11 @@ </component> <component name="FileEditorManager"> <leaf SIDE_TABS_SIZE_LIMIT_KEY="300"> - <file pinned="false" current-in-tab="false"> + <file pinned="false" current-in-tab="true"> <entry file="file://$PROJECT_DIR$/src/main/java/app.java"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="3390"> - <caret line="226" lean-forward="true" selection-start-line="225" selection-start-column="28" selection-end-line="226" /> + <state relative-caret-position="210"> + <caret line="30" column="79" lean-forward="true" selection-start-line="30" selection-start-column="79" selection-end-line="30" selection-end-column="79" /> <folding> <element signature="imports" expanded="true" /> </folding> @@ -62,13 +49,15 @@ </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/MongoDB.java"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="315"> - <caret line="21" column="91" lean-forward="true" selection-start-line="21" selection-start-column="91" selection-end-line="21" selection-end-column="91" /> + <state relative-caret-position="678"> + <caret line="283" selection-start-line="283" selection-end-line="283" /> <folding> <element signature="imports" expanded="true" /> + <element signature="e#12452#12453#0" expanded="true" /> + <element signature="e#12528#12529#0" expanded="true" /> </folding> </state> </provider> @@ -77,17 +66,32 @@ <file pinned="false" current-in-tab="false"> <entry file="file://$PROJECT_DIR$/src/main/java/LiveDB.java"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="-636"> - <caret line="5" column="4" selection-start-line="5" selection-start-column="4" selection-end-line="5" selection-end-column="4" /> + <state relative-caret-position="660"> + <caret line="46" selection-start-line="46" selection-end-line="46" /> </state> </provider> </entry> </file> <file pinned="false" current-in-tab="false"> - <entry file="file://$PROJECT_DIR$/src/main/java/ProgramShowCase.java"> + <entry file="file://$PROJECT_DIR$/src/main/java/MockUser.java"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="270"> - <caret line="18" column="8" selection-start-line="18" selection-start-column="8" selection-end-line="18" selection-end-column="8" /> + <state relative-caret-position="150"> + <caret line="10" column="22" selection-start-line="10" selection-start-column="22" selection-end-line="10" selection-end-column="22" /> + </state> + </provider> + </entry> + </file> + <file pinned="false" current-in-tab="false"> + <entry file="file://$PROJECT_DIR$/src/main/java/Program.java"> + <provider selected="true" editor-type-id="text-editor"> + <state relative-caret-position="45"> + <caret line="3" column="47" selection-start-line="3" selection-start-column="42" selection-end-line="3" selection-end-column="47" /> + <folding> + <element signature="e#1540#1541#0" expanded="true" /> + <element signature="e#1571#1572#0" expanded="true" /> + <element signature="e#1619#1620#0" expanded="true" /> + <element signature="e#1659#1660#0" expanded="true" /> + </folding> </state> </provider> </entry> @@ -113,6 +117,7 @@ <find>idprogram</find> <find>programID</find> <find>sea</find> + <find>dou</find> </findStrings> </component> <component name="Git.Settings"> @@ -126,17 +131,17 @@ <option value="$PROJECT_DIR$/src/main/java/KataShowCase.java" /> <option value="$PROJECT_DIR$/src/main/java/JWT.java" /> <option value="$PROJECT_DIR$/src/main/java/JWToken.java" /> - <option value="$PROJECT_DIR$/src/main/java/MockUser.java" /> <option value="$PROJECT_DIR$/pom.xml" /> <option value="$PROJECT_DIR$/src/main/java/Program.java" /> <option value="$PROJECT_DIR$/src/main/java/Kata.java" /> <option value="$PROJECT_DIR$/src/main/java/KataSubscription.java" /> <option value="$PROJECT_DIR$/src/main/java/ProgramSubscription.java" /> + <option value="$PROJECT_DIR$/src/main/java/ProgramShowCase.java" /> <option value="$PROJECT_DIR$/src/main/java/ProgramsDataBase.java" /> - <option value="$PROJECT_DIR$/src/main/java/app.java" /> <option value="$PROJECT_DIR$/src/main/java/LiveDB.java" /> - <option value="$PROJECT_DIR$/src/main/java/ProgramShowCase.java" /> + <option value="$PROJECT_DIR$/src/main/java/MockUser.java" /> <option value="$PROJECT_DIR$/src/main/java/MongoDB.java" /> + <option value="$PROJECT_DIR$/src/main/java/app.java" /> </list> </option> </component> @@ -178,39 +183,7 @@ <navigator proportions="" version="1"> <foldersAlwaysOnTop value="true" /> </navigator> - <panes> - <pane id="ProjectPane"> - <subPane> - <expand> - <path> - <item name="gateway" type="b2602c69:ProjectViewProjectNode" /> - <item name="gateway" type="462c0819:PsiDirectoryNode" /> - </path> - <path> - <item name="gateway" type="b2602c69:ProjectViewProjectNode" /> - <item name="gateway" type="462c0819:PsiDirectoryNode" /> - <item name="src" type="462c0819:PsiDirectoryNode" /> - </path> - <path> - <item name="gateway" type="b2602c69:ProjectViewProjectNode" /> - <item name="gateway" type="462c0819:PsiDirectoryNode" /> - <item name="src" type="462c0819:PsiDirectoryNode" /> - <item name="main" type="462c0819:PsiDirectoryNode" /> - </path> - <path> - <item name="gateway" type="b2602c69:ProjectViewProjectNode" /> - <item name="gateway" type="462c0819:PsiDirectoryNode" /> - <item name="src" type="462c0819:PsiDirectoryNode" /> - <item name="main" type="462c0819:PsiDirectoryNode" /> - <item name="java" type="462c0819:PsiDirectoryNode" /> - </path> - </expand> - <select /> - </subPane> - </pane> - <pane id="PackagesPane" /> - <pane id="Scope" /> - </panes> + <panes /> </component> <component name="PropertiesComponent"> <property name="ASKED_SHARE_PROJECT_CONFIGURATION_FILES" value="true" /> @@ -294,11 +267,14 @@ <workItem from="1557833110452" duration="1791000" /> <workItem from="1557842011080" duration="239000" /> <workItem from="1557902516521" duration="5257000" /> + <workItem from="1557931164526" duration="197000" /> + <workItem from="1557988857639" duration="10612000" /> + <workItem from="1558017000960" duration="198000" /> </task> <servers /> </component> <component name="TimeTrackingManager"> - <option name="totallyTimeSpent" value="126009000" /> + <option name="totallyTimeSpent" value="137016000" /> </component> <component name="TodoView"> <todo-panel id="selected-file"> @@ -313,7 +289,7 @@ <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.17596567" /> + <window_info content_ui="combo" id="Project" order="0" sideWeight="0.49924126" weight="0.18025751" /> <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" /> @@ -352,84 +328,68 @@ <breakpoints> <line-breakpoint enabled="true" type="java-line"> <url>file://$PROJECT_DIR$/src/main/java/MongoDB.java</url> - <line>253</line> - <properties /> - <option name="timeStamp" value="1" /> - </line-breakpoint> - <line-breakpoint enabled="true" type="java-line"> - <url>file://$PROJECT_DIR$/src/main/java/MongoDB.java</url> - <line>105</line> + <line>213</line> <properties /> - <option name="timeStamp" value="2" /> + <option name="timeStamp" value="8" /> </line-breakpoint> <line-breakpoint enabled="true" type="java-line"> <url>file://$PROJECT_DIR$/src/main/java/MongoDB.java</url> - <line>98</line> + <line>201</line> <properties /> - <option name="timeStamp" value="3" /> + <option name="timeStamp" value="9" /> </line-breakpoint> </breakpoints> </breakpoint-manager> - <watches-manager> - <configuration name="Application"> - <watch expression=" database.getCollection("ProgramsSubscription", ProgramSubscription.class).find(combine(eq("iduser", userid), eq("idprogram", programid))).first()" language="JAVA" /> - <watch expression="database.getCollection("ProgramsSubscription", ProgramSubscription.class).find(combine(eq("iduser", userid), eq("idprogram", programid))).projection(include("katas")).first()" language="JAVA" /> - <watch expression="programs.updateOne(combine(eq("iduser", userid), eq("idprogram", programid)), inc("nbKataDone", 1))" /> - <watch expression="programs.find(combine(eq("iduser",userid),eq("idprogram",programid))).first().getNbKataDone()" language="JAVA" /> - <watch expression="programs.find(combine(eq("iduser", userid), eq("idprogram", programid))).first()" /> - <watch expression="x.getNbKataDone()" /> - </configuration> - </watches-manager> </component> <component name="debuggerHistoryManager"> <expressions id="watch"> <expression> - <expression-string>programs.find(combine(eq("iduser",userid),eq("idprogram",programid))).first().getNbKataDone()</expression-string> + <expression-string>p.getKatas().contains(kataid)</expression-string> <language-id>JAVA</language-id> <evaluation-mode>EXPRESSION</evaluation-mode> </expression> <expression> - <expression-string>programs.find(combine(eq("iduser",userid),eq("idprogram",programid)))</expression-string> + <expression-string>p.getKatas().get("id","0");</expression-string> <language-id>JAVA</language-id> <evaluation-mode>EXPRESSION</evaluation-mode> </expression> <expression> - <expression-string>database.getCollection("ProgramsSubscription", ProgramSubscription.class).find(combine(eq("iduser", userid), eq("idprogram", programid))).projection(include("katas")).first()</expression-string> + <expression-string>database.getCollection("ProgramsSubscription", ProgramSubscription.class).find(combine(eq("iduser", userid), eq("idprogram", programid), eq("status", true),elemMatch("katas",Do) ))).first()</expression-string> <language-id>JAVA</language-id> <evaluation-mode>EXPRESSION</evaluation-mode> </expression> <expression> - <expression-string>database.getCollection("ProgramsSubscription", ProgramSubscription.class).find(combine(eq("iduser", userid), eq("idprogram", programid))).first()</expression-string> + <expression-string>database.getCollection("ProgramsSubscription", ProgramSubscription.class).find(combine(eq("iduser", userid), eq("idprogram", programid), eq("status", true),elemMatch("katas",Document.parse(kataid) ))).first()</expression-string> <language-id>JAVA</language-id> <evaluation-mode>EXPRESSION</evaluation-mode> </expression> <expression> - <expression-string>database.getCollection("ProgramsSubscription", ProgramSubscription.class).find(combine(eq("iduser", userid), eq("idprogram", programid))).firs</expression-string> + <expression-string>database.getCollection("ProgramsSubscription", ProgramSubscription.class).find(combine(eq("iduser", userid), eq("idprogram", programid), eq("status", true),elemMatch("katas._id",kataid ))).first()</expression-string> <language-id>JAVA</language-id> <evaluation-mode>EXPRESSION</evaluation-mode> </expression> <expression> - <expression-string>database.getCollection("ProgramsSubscription", ProgramSubscription.class).find(combine(eq("iduser", userid), eq("idprogram", programid))).first().getKatas()</expression-string> + <expression-string>database.getCollection("ProgramsSubscription", ProgramSubscription.class).find(combine(eq("iduser", userid), eq("idprogram", programid), eq("status", true),eq("katas.1._id",kataid ))).first()</expression-string> <language-id>JAVA</language-id> <evaluation-mode>EXPRESSION</evaluation-mode> </expression> <expression> - <expression-string>database.getCollection("ProgramsSubscription", ProgramSubscription.class).find(combine(eq("iduser", userid), eq("idprogram", programid))).first().getKatas();</expression-string> + <expression-string>database.getCollection("ProgramsSubscription", ProgramSubscription.class).find(combine(eq("iduser", userid), eq("idprogram", programid), eq("status", true),eq("katas.0._id",kataid ))).first()</expression-string> <language-id>JAVA</language-id> <evaluation-mode>EXPRESSION</evaluation-mode> </expression> <expression> - <expression-string>database.getCollection("ProgramsSubscription", ProgramSubscription.class).find(combine(eq("iduser", userid), eq("idprogram", programid))).projection(include("katas")).first();</expression-string> + <expression-string>database.getCollection("ProgramsSubscription", ProgramSubscription.class).find(combine(eq("iduser", userid), eq("idprogram", programid), eq("status", true),eq("katas._id",kataid ))).first()</expression-string> <language-id>JAVA</language-id> <evaluation-mode>EXPRESSION</evaluation-mode> </expression> <expression> - <expression-string>database.getCollection("ProgramsSubscription", ProgramSubscription.class).find(combine(eq("iduser", userid), eq("idprogram", programid))).projection(include("idprogram")).first()</expression-string> + <expression-string>database.getCollection("ProgramsSubscription", ProgramSubscription.class).find(combine(eq("iduser", userid), eq("idprogram", programid), eq("status", true),eq("katas.id",kataid ))).first()</expression-string> <language-id>JAVA</language-id> <evaluation-mode>EXPRESSION</evaluation-mode> </expression> <expression> - <expression-string>database.getCollection("ProgramsSubscription", ProgramSubscription.class).find(combine(eq("iduser", userid), eq("status", true))).projection(include("idprogram")).first()</expression-string> + <expression-string>database.getCollection("ProgramsSubscription", ProgramSubscription.class).find(combine(eq("iduser", userid), eq("idprogram", programid))).first()</expression-string> <language-id>JAVA</language-id> <evaluation-mode>EXPRESSION</evaluation-mode> </expression> @@ -452,13 +412,6 @@ </provider> </entry> <entry file="file://$PROJECT_DIR$/src/main/java/JWToken.java" /> - <entry file="file://$PROJECT_DIR$/src/main/java/MockUser.java"> - <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="90"> - <caret line="6" column="16" selection-start-line="6" selection-start-column="16" selection-end-line="6" selection-end-column="16" /> - </state> - </provider> - </entry> <entry file="file://$PROJECT_DIR$/pom.xml"> <provider selected="true" editor-type-id="text-editor"> <state relative-caret-position="455"> @@ -491,33 +444,6 @@ </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/src/main/java/KataSubscription.java"> - <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="75"> - <caret line="5" column="26" selection-start-line="5" selection-start-column="24" selection-end-line="5" selection-end-column="26" /> - </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="45"> - <caret line="3" column="47" selection-start-line="3" selection-start-column="42" selection-end-line="3" selection-end-column="47" /> - <folding> - <element signature="e#1540#1541#0" expanded="true" /> - <element signature="e#1571#1572#0" expanded="true" /> - <element signature="e#1619#1620#0" expanded="true" /> - <element signature="e#1659#1660#0" expanded="true" /> - </folding> - </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="455"> - <caret line="37" column="20" selection-start-line="37" selection-start-column="20" selection-end-line="37" selection-end-column="20" /> - </state> - </provider> - </entry> <entry file="file://$PROJECT_DIR$/src/main/java/ProgramSubscription.java"> <provider selected="true" editor-type-id="text-editor"> <state relative-caret-position="165"> @@ -540,34 +466,92 @@ </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/src/main/java/app.java"> + <entry file="file://$PROJECT_DIR$/src/main/java/ProgramShowCase.java"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="3390"> - <caret line="226" lean-forward="true" selection-start-line="225" selection-start-column="28" selection-end-line="226" /> - <folding> - <element signature="imports" expanded="true" /> - </folding> + <state> + <caret column="27" lean-forward="true" selection-start-column="27" selection-end-column="27" /> + </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="425"> + <caret line="43" column="20" selection-start-line="43" selection-start-column="20" selection-end-line="43" selection-end-column="20" /> + </state> + </provider> + </entry> + <entry file="file://$PROJECT_DIR$/src/main/java/KataSubscription.java"> + <provider selected="true" editor-type-id="text-editor"> + <state relative-caret-position="75"> + <caret line="5" column="26" selection-start-line="5" selection-start-column="24" selection-end-line="5" selection-end-column="26" /> </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="-636"> - <caret line="5" column="4" selection-start-line="5" selection-start-column="4" selection-end-line="5" selection-end-column="4" /> + <state relative-caret-position="660"> + <caret line="46" selection-start-line="46" selection-end-line="46" /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/src/main/java/ProgramShowCase.java"> + <entry file="file://$PROJECT_DIR$/src/main/java/MockUser.java"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="270"> - <caret line="18" column="8" selection-start-line="18" selection-start-column="8" selection-end-line="18" selection-end-column="8" /> + <state relative-caret-position="150"> + <caret line="10" column="22" selection-start-line="10" selection-start-column="22" selection-end-line="10" selection-end-column="22" /> + <folding> + <element signature="e#98#99#0" expanded="true" /> + <element signature="e#123#124#0" expanded="true" /> + <element signature="e#159#160#0" expanded="true" /> + <element signature="e#187#188#0" expanded="true" /> + <element signature="e#217#218#0" expanded="true" /> + <element signature="e#243#244#0" expanded="true" /> + <element signature="e#281#282#0" expanded="true" /> + <element signature="e#311#312#0" expanded="true" /> + <element signature="e#476#477#0" expanded="true" /> + <element signature="e#507#508#0" expanded="true" /> + <element signature="e#555#556#0" expanded="true" /> + <element signature="e#595#596#0" expanded="true" /> + <element signature="e#627#628#0" expanded="true" /> + <element signature="e#655#656#0" expanded="true" /> + <element signature="e#697#698#0" expanded="true" /> + <element signature="e#731#732#0" expanded="true" /> + <element signature="e#646#647#0" expanded="true" /> + <element signature="e#677#678#0" expanded="true" /> + <element signature="e#725#726#0" expanded="true" /> + <element signature="e#765#766#0" expanded="true" /> + </folding> + </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="45"> + <caret line="3" column="47" selection-start-line="3" selection-start-column="42" selection-end-line="3" selection-end-column="47" /> + <folding> + <element signature="e#1540#1541#0" expanded="true" /> + <element signature="e#1571#1572#0" expanded="true" /> + <element signature="e#1619#1620#0" expanded="true" /> + <element signature="e#1659#1660#0" 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="315"> - <caret line="21" column="91" lean-forward="true" selection-start-line="21" selection-start-column="91" selection-end-line="21" selection-end-column="91" /> + <state relative-caret-position="678"> + <caret line="283" selection-start-line="283" selection-end-line="283" /> + <folding> + <element signature="imports" expanded="true" /> + <element signature="e#12452#12453#0" expanded="true" /> + <element signature="e#12528#12529#0" expanded="true" /> + </folding> + </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="210"> + <caret line="30" column="79" lean-forward="true" selection-start-line="30" selection-start-column="79" selection-end-line="30" selection-end-column="79" /> <folding> <element signature="imports" expanded="true" /> </folding> diff --git a/gateway/src/main/java/LiveDB.java b/gateway/src/main/java/LiveDB.java index 798101b6fd638727eed22ef5b84e0d8b0b83eff8..b9a7c4ef0d761f9b3b53332f147f829cbf9733f1 100644 --- a/gateway/src/main/java/LiveDB.java +++ b/gateway/src/main/java/LiveDB.java @@ -133,5 +133,20 @@ public class LiveDB extends ProgramsDataBase { } + @Override + public void createUser(MockUser u) { + + } + + @Override + public MockUser checkUser(String username, String password) { + return null; + } + + @Override + public boolean doUserExists(String username) { + return false; + } + } \ No newline at end of file diff --git a/gateway/src/main/java/MockUser.java b/gateway/src/main/java/MockUser.java index 2c8565fa582ba7bea9f2a2e310a3eb00607f0f6a..7812029403afb5c1376dd2e4852c410fbcdf96ba 100644 --- a/gateway/src/main/java/MockUser.java +++ b/gateway/src/main/java/MockUser.java @@ -1,13 +1,54 @@ public class MockUser { - int id; - String name; - String password; - String level; + private String id, _id, username, password, level; - MockUser(int id, String name, String level,String password) { + public MockUser(String id, String username, String level,String password) { this.id = id; - this.name = name; + this.username = username; this.level = level; this.password = password; } + + public MockUser(){} + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String get_id() { + return _id; + } + + public void set_id(String _id) { + this._id = _id; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getLevel() { + return level; + } + + public void setLevel(String level) { + this.level = level; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + } \ No newline at end of file diff --git a/gateway/src/main/java/MongoDB.java b/gateway/src/main/java/MongoDB.java index 8ee3a84a0542f4d1b00be3f5f33e042f6f57934e..da0e2ab312d3f2b3536ffacb4e267ce5a87685e0 100644 --- a/gateway/src/main/java/MongoDB.java +++ b/gateway/src/main/java/MongoDB.java @@ -28,6 +28,10 @@ public class MongoDB extends ProgramsDataBase { this.database = mongoClient.getDatabase("DojoHepia"); database.getCollection("Programs").createIndex(Indexes.ascending("title")); + if (!doUserExists("shodai")) { + createUser(new MockUser("0", "shodai", "shodai", "d033e22ae348aeb5660fc2140aec35850c4da997")); + } + } public void createProgram(Program prg) { @@ -46,12 +50,9 @@ public class MongoDB extends ProgramsDataBase { public ArrayList<ProgramShowCase> getProgramsDetails() { ArrayList<ProgramShowCase> p = new ArrayList<>(); MongoCollection<Program> programs = database.getCollection("Programs", Program.class); - MongoCollection<ProgramSubscription> programSubs = database.getCollection("ProgramsSubscription", ProgramSubscription.class); - - for (Program prg : programs.find()) { + for (Program prg : programs.find()) p.add(new ProgramShowCase(prg.getTitle(), prg.getSensei(), prg.getLanguage(), prg.getDescription(), prg.getNbKata(), prg.getTags(), prg.getId())); - } return p; } @@ -193,13 +194,16 @@ public class MongoDB extends ProgramsDataBase { } public KataSubscription getKataSubscriptionByID(String kataid, String programid, String userid) { - +/* + ProgramSubscription p = database.getCollection("ProgramsSubscription", ProgramSubscription.class).find(combine(eq("iduser", userid), eq("idprogram", programid), eq("status", true),eq("katas._id",kataid ))).filter((); + return p == null ? new KataSubscription() : p.getKatas().get(0); + */ ProgramSubscription s = database.getCollection("ProgramsSubscription", ProgramSubscription.class).find(combine(eq("iduser", userid), eq("idprogram", programid), eq("status", true))).projection(include("katas")).first(); - if (s == null) { return new KataSubscription(); } else for (KataSubscription k : s.getKatas()) { + if (k.getId().equals(kataid)) return k; } @@ -258,12 +262,23 @@ public class MongoDB extends ProgramsDataBase { database.getCollection("Programs", Program.class).deleteMany(eq("_id", programid)); database.getCollection("ProgramsSubscription", ProgramSubscription.class).deleteMany(eq("idprogram", programid)); } -/* - public void deletekatas(String kataid, String programid){ - database.getCollection("ProgramsSubscription",ProgramSubscription.class).deleteMany();// - database.getCollection("Programs",Program.class).deleteMany(eq("_id",programid)); + public void createUser(MockUser u) { + database.getCollection("Users", MockUser.class).insertOne(u); + } + + public MockUser checkUser(String username, String password) { + MockUser u = database.getCollection("Users", MockUser.class).find(combine(eq("username", username), eq("password", password))).first(); + if (u == null) + return null; + return u; + } + + public boolean doUserExists(String username) { + MockUser u = database.getCollection("Users", MockUser.class).find(eq("username", username)).first(); + if (u == null) + return false; + return true; } -*/ } diff --git a/gateway/src/main/java/ProgramsDataBase.java b/gateway/src/main/java/ProgramsDataBase.java index ed19c3071363a0d50df00fd481354553e8cff93b..79301b4f9d97c0b39e9bfdf7acab8ffaf8c45dfd 100644 --- a/gateway/src/main/java/ProgramsDataBase.java +++ b/gateway/src/main/java/ProgramsDataBase.java @@ -37,4 +37,10 @@ public abstract class ProgramsDataBase { public abstract void deleteProgram(String programid); + public abstract void createUser(MockUser u); + + public abstract MockUser checkUser(String username, String password); + + public abstract boolean doUserExists(String username); + } diff --git a/gateway/src/main/java/app.java b/gateway/src/main/java/app.java index 373455079a89017909cf27004b28b7377b67e56e..4fe36aab1b0475b2ef9f1f1548a325993d0e6612 100644 --- a/gateway/src/main/java/app.java +++ b/gateway/src/main/java/app.java @@ -2,6 +2,8 @@ import com.auth0.jwt.JWT; import com.auth0.jwt.JWTCreator; import com.auth0.jwt.JWTVerifier; import com.auth0.jwt.algorithms.Algorithm; +import com.auth0.jwt.exceptions.JWTVerificationException; +import com.auth0.jwt.interfaces.DecodedJWT; import com.fasterxml.jackson.databind.ObjectMapper; import io.javalin.Context; import io.javalin.Handler; @@ -18,6 +20,7 @@ import java.net.ConnectException; import java.net.HttpURLConnection; import java.net.URL; import java.util.ArrayList; +import java.util.Date; import java.util.HashMap; import java.util.Map; @@ -49,6 +52,7 @@ public class app { /** * Entry point of the gateway, no args needed + * * @param args - Not needed */ public static void main(String[] args) { @@ -60,19 +64,16 @@ public class app { // It generates a token based on user's name and his level JWTGenerator<MockUser> generator = (user, alg) -> { JWTCreator.Builder token = JWT.create() - .withClaim("username", user.name) - .withClaim("level", user.level); + .withClaim("username", user.getUsername()) + .withClaim("level", user.getLevel()) + .withClaim("exp", new Date()); return token.sign(alg); }; - JWTVerifier verifier = JWT.require(algorithm).build(); + // Make the token expire after six days + JWTVerifier verifier = JWT.require(algorithm).acceptExpiresAt(518400).build(); JWTProvider provider = new JWTProvider(algorithm, generator, verifier); - // Mock list of users - Temporary - users.add(new MockUser(0, "monji", "monji", "monji")); - users.add(new MockUser(1, "shodai", "shodai", "shodai")); - users.add(new MockUser(2, "sensei", "sensei", "sensei")); - // Decoder Handler Handler decodeHandler = JavalinJWT.createHeaderDecodeHandler(provider); @@ -176,10 +177,10 @@ public class app { ctx.status(200); }, roles(Roles.SHODAI, Roles.SENSEI)); - app.post("program/delete",ctx -> { + app.post("program/delete", ctx -> { db.deleteProgram(new JSONObject(ctx.body()).getString("programid")); ctx.status(200); - },roles(Roles.SHODAI, Roles.SENSEI)); + }, roles(Roles.SHODAI, Roles.SENSEI)); /******************/ @@ -187,7 +188,7 @@ public class app { /** KATAS **/ app.get("/program/getkatas/details/:id/:userid", ctx -> { - ArrayList<KataShowCase> ktsc = db.getProgramKatasDetails(ctx.pathParam("id"),ctx.pathParam("userid")); + ArrayList<KataShowCase> ktsc = db.getProgramKatasDetails(ctx.pathParam("id"), ctx.pathParam("userid")); ctx.json(ktsc); }, roles(Roles.SHODAI, Roles.SENSEI, Roles.MONJI)); @@ -205,16 +206,17 @@ public class app { /** USER **/ app.post("jwt/request/", ctx -> { - MockUser u = checkUser(ctx); + JSONObject ids = new JSONObject(ctx.body()); + MockUser u = db.checkUser(ids.getString("username"), ids.getString("password")); if (!(u == null)) { String token = provider.generateToken(u); HashMap<String, String> p = new HashMap<>(); - p.put("id", String.valueOf(u.id)); - p.put("username", u.name); + p.put("id", String.valueOf(u.getId())); + p.put("username", u.getUsername()); p.put("token", token); - p.put("role", u.level); + p.put("role", u.getLevel()); ctx.json(p); } else { @@ -318,20 +320,51 @@ public class app { app.post("kata/update/subscription", ctx -> { JSONObject obj = new JSONObject(ctx.body()); - db.updateKataSubscription(obj.getString("kataid"), obj.getString("programid"), obj.getString("userid"), obj.getString("sol"),obj.getString("status")); + db.updateKataSubscription(obj.getString("kataid"), obj.getString("programid"), obj.getString("userid"), obj.getString("sol"), obj.getString("status")); ctx.status(200); }, roles(Roles.SHODAI, Roles.SENSEI, Roles.MONJI)); /******************/ - } + /** SIGN IN **/ - public static MockUser checkUser(Context ctx) { - JSONObject ids = new JSONObject(ctx.body()); + app.get("token/generate", ctx -> { + Algorithm algotoken = Algorithm.HMAC256("tochange"); + String token = JWT.create() + .withClaim("exp", new Date()) + .sign(algotoken); + ctx.json(token); + }, roles(Roles.SHODAI, Roles.SENSEI)); - for (MockUser u : users) - if (u.name.equals(ids.get("username")) && u.password.equals(ids.get("password"))) - return u; - return null; + app.post("user/signin", ctx -> { + JSONObject input = new JSONObject(ctx.body()); + String username = input.getString("username"); + String password = input.getString("password"); + String id = input.getString("id"); + if (db.doUserExists(username)) { + ctx.status(400).json("Username '" + username + "' already exists"); + } else { + if (!input.get("token").equals("")) { + try { + Algorithm algotoken = Algorithm.HMAC256("tochange"); + JWTVerifier checker = JWT.require(algotoken) + .acceptExpiresAt(600) + .build(); //Reusable verifier instance + + checker.verify(input.getString("token")); + db.createUser(new MockUser(id, username, "sensei", password)); + ctx.status(200); + } catch (JWTVerificationException exception) { + ctx.status(400).json("Bad token"); + } + } else { + db.createUser(new MockUser(id, username, "monji", password)); + ctx.status(200); + } + + } + }, roles(Roles.ANYONE)); + /******************/ } + } diff --git a/gateway/target/09-1.0-SNAPSHOT.jar b/gateway/target/09-1.0-SNAPSHOT.jar index 2381c521d3c4ad868ed9777c4c7c1c8c4722fa86..9ed8e5c63cf7a440aa386fbacf7424762c6a33e6 100644 Binary files a/gateway/target/09-1.0-SNAPSHOT.jar and b/gateway/target/09-1.0-SNAPSHOT.jar differ diff --git a/gateway/target/classes/LiveDB.class b/gateway/target/classes/LiveDB.class index 41cad6a6f656cdda2c19b807d166106c265dbd21..13dceb1079bf4734755c0d11c47764b7e20d4f1e 100644 Binary files a/gateway/target/classes/LiveDB.class and b/gateway/target/classes/LiveDB.class differ diff --git a/gateway/target/classes/MockUser.class b/gateway/target/classes/MockUser.class index 8f9dff4d0fbf1e8dc569af3217c1cacd4419f244..5233ab9cfe462ae704441d3d485c0accd79cf37d 100644 Binary files a/gateway/target/classes/MockUser.class and b/gateway/target/classes/MockUser.class differ diff --git a/gateway/target/classes/MongoDB.class b/gateway/target/classes/MongoDB.class index c75c8ccfa3ebbe95ace5f6f6b368b7b320e1002c..1690a6899501e0268151c890ff7c34d612d72f28 100644 Binary files a/gateway/target/classes/MongoDB.class and b/gateway/target/classes/MongoDB.class differ diff --git a/gateway/target/classes/ProgramsDataBase.class b/gateway/target/classes/ProgramsDataBase.class index 73f4ea12c0f3cc9e2e19df185b957496eab9d782..c0c01999d9fd0e6dc77addece7c813460d8734a8 100644 Binary files a/gateway/target/classes/ProgramsDataBase.class and b/gateway/target/classes/ProgramsDataBase.class differ diff --git a/gateway/target/classes/app$Roles.class b/gateway/target/classes/app$Roles.class index 7fd0a8d175306585e897c571a1a78fb67665262c..4b64a05c7994775255726b2a5f9f6333e54f31cb 100644 Binary files a/gateway/target/classes/app$Roles.class and b/gateway/target/classes/app$Roles.class differ diff --git a/gateway/target/classes/app.class b/gateway/target/classes/app.class index 15cacf490efeb00aa9c56d5dbd249490e3bf7e1f..193a5635f2f7ac70e9b641ac1133076d2fe073d1 100644 Binary files a/gateway/target/classes/app.class and b/gateway/target/classes/app.class differ diff --git a/gateway/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/gateway/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst index e8545315b0608c56cb3421477889a560d1624f53..629da2976ca4cd6cc0c3261470fbab857b313dc5 100644 --- a/gateway/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ b/gateway/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -1,7 +1,11 @@ +/Users/freak/Desktop/dojo-hepia/gateway/src/main/java/MockUser.java +/Users/freak/Desktop/dojo-hepia/gateway/src/main/java/KataSubscription.java /Users/freak/Desktop/dojo-hepia/gateway/src/main/java/KataShowCase.java /Users/freak/Desktop/dojo-hepia/gateway/src/main/java/ProgramShowCase.java /Users/freak/Desktop/dojo-hepia/gateway/src/main/java/Program.java +/Users/freak/Desktop/dojo-hepia/gateway/src/main/java/ProgramSubscription.java /Users/freak/Desktop/dojo-hepia/gateway/src/main/java/app.java /Users/freak/Desktop/dojo-hepia/gateway/src/main/java/LiveDB.java /Users/freak/Desktop/dojo-hepia/gateway/src/main/java/Kata.java +/Users/freak/Desktop/dojo-hepia/gateway/src/main/java/MongoDB.java /Users/freak/Desktop/dojo-hepia/gateway/src/main/java/ProgramsDataBase.java diff --git a/mongodb/data/programssubscriptions b/mongodb/data/deprecated-programssubscriptions similarity index 100% rename from mongodb/data/programssubscriptions rename to mongodb/data/deprecated-programssubscriptions diff --git a/mongodb/data/programs b/mongodb/data/programs index 5645e090c719a09ac91c7424d24ad4d728d20d76..c5b23392504c91e38cecd18b4d21e0f38bc5e55c 100644 --- a/mongodb/data/programs +++ b/mongodb/data/programs @@ -1 +1 @@ -[{"_id":"baac03de-2816-470e-8789-3c10b438364f","description":"Let's play with arrays in python !","idsensei":"1","katas":[{"_id":"41ea64c1-0711-46a8-aece-fae593283ad1","canva":"def add(arr,m):","cassert":"from assertpy import assert_that\nimport sample as m\n\nassert_that(m.add([2,3,4],3)).is_equal_to([2,3,4,3])","difficulty":"Ceinture blanche","keepAssert":false,"language":"python","nbAttempt":3,"programID":"baac03de-2816-470e-8789-3c10b438364f","rules":"Add the given element to the given array\n\nexemple :\nafter you've added the number '3' to the array [2,3,4], it becomes [2,3,4,3]","solution":"def add(arr,m):\n arr.append(m)\n return arr","title":"Add element"},{"_id":"55501e10-12fe-446f-aea1-2d4db550f1f6","canva":"def mult(arr,n):\n # begin code here\n ","cassert":"from assertpy import assert_that\nimport sample as m\n\nassert_that(m.mult([2,3,4],2)).is_equal_to([4,6,8])\nassert_that(m.mult([2,3,4],5)).is_equal_to([10,15,20])","difficulty":"Ceinture blanche","keepAssert":true,"language":"python","nbAttempt":10,"programID":"baac03de-2816-470e-8789-3c10b438364f","rules":"You'll multiply each element of a given array by the given number.","solution":"def mult(arr,n):\n return [i * n for i in arr]","title":"Multiply elements"}],"language":"python","nbKata":2,"sensei":"shodai","tags":["arrays","hashmap","list"],"title":"Arrays"},{"_id":"26f8bb8a-e872-4b21-94a4-56308d500399","description":"Basics of the python language","idsensei":"2","katas":[{"_id":"4603ffd1-054f-4163-af51-d84a84c894e9","canva":"def ret(n):\n ","cassert":"from assertpy import assert_that\nimport sample as m\n\nassert_that(m.ret(5)).is_equal_to(5)\nassert_that(m.ret(4)).is_equal_to(4)","difficulty":"Ceinture blanche","keepAssert":false,"language":"python","nbAttempt":100,"programID":"26f8bb8a-e872-4b21-94a4-56308d500399","rules":"Just return the given value.","solution":"def ret(n):\n return n","title":"Return n"}],"language":"python","nbKata":1,"sensei":"sensei","tags":["basics","python"],"title":"Fundamentals"},{"_id":"86a3991a-a02e-4e0a-9323-7f4cedca2e3b","description":"Arrays in java are not that easy.","idsensei":"2","katas":[{"_id":"24ba470b-5678-482b-a888-95a02b6bf90e","canva":"import java.util.ArrayList;\n\npublic class Kata {\n public static int sum(ArrayList<Integer> list){\n \n }\n}\n","cassert":"import static org.junit.Assert.*;\nimport java.util.ArrayList;\n\npublic class Main {\n\n public static void main(String[] args) {\n\n ArrayList<Integer> mylist = new ArrayList<>();\n mylist.add(15);\n mylist.add(5);\n mylist.add(10);\n\n assertEquals(Kata.sum(mylist),30); \n\n }\n}","difficulty":"Ceinture blanche","keepAssert":true,"language":"java","nbAttempt":2,"programID":"86a3991a-a02e-4e0a-9323-7f4cedca2e3b","rules":"Return a sum of all element in an arraylist","solution":"import java.util.ArrayList;\n\npublic class Kata {\n public static int sum(ArrayList<Integer> list){\n int sum = 0;\n for(int n : list)\n sum += n;\n return sum;\n }\n}\n","title":"Sum up element"}],"language":"java","nbKata":1,"sensei":"sensei","tags":["arrays","arraylist","hashmap"],"title":"Arrays"}] +[{"_id":"baac03de-2816-470e-8789-3c10b438364f","description":"Let's play with arrays in python !","idsensei":"0","katas":[{"_id":"41ea64c1-0711-46a8-aece-fae593283ad1","canva":"def add(arr,m):","cassert":"from assertpy import assert_that\nimport sample as m\n\nassert_that(m.add([2,3,4],3)).is_equal_to([2,3,4,3])","difficulty":"Ceinture blanche","keepAssert":false,"language":"python","nbAttempt":3,"programID":"baac03de-2816-470e-8789-3c10b438364f","rules":"Add the given element to the given array\n\nexemple :\nafter you've added the number '3' to the array [2,3,4], it becomes [2,3,4,3]","solution":"def add(arr,m):\n arr.append(m)\n return arr","title":"Add element"},{"_id":"55501e10-12fe-446f-aea1-2d4db550f1f6","canva":"def mult(arr,n):\n # begin code here\n ","cassert":"from assertpy import assert_that\nimport sample as m\n\nassert_that(m.mult([2,3,4],2)).is_equal_to([4,6,8])\nassert_that(m.mult([2,3,4],5)).is_equal_to([10,15,20])","difficulty":"Ceinture blanche","keepAssert":true,"language":"python","nbAttempt":10,"programID":"baac03de-2816-470e-8789-3c10b438364f","rules":"You'll multiply each element of a given array by the given number.","solution":"def mult(arr,n):\n return [i * n for i in arr]","title":"Multiply elements"}],"language":"python","nbKata":2,"sensei":"shodai","tags":["arrays","hashmap","list"],"title":"Arrays"},{"_id":"26f8bb8a-e872-4b21-94a4-56308d500399","description":"Basics of the python language","idsensei":"0","katas":[{"_id":"4603ffd1-054f-4163-af51-d84a84c894e9","canva":"def ret(n):\n ","cassert":"from assertpy import assert_that\nimport sample as m\n\nassert_that(m.ret(5)).is_equal_to(5)\nassert_that(m.ret(4)).is_equal_to(4)","difficulty":"Ceinture blanche","keepAssert":false,"language":"python","nbAttempt":100,"programID":"26f8bb8a-e872-4b21-94a4-56308d500399","rules":"Just return the given value.","solution":"def ret(n):\n return n","title":"Return n"}],"language":"python","nbKata":1,"sensei":"shodai","tags":["basics","python"],"title":"Fundamentals"},{"_id":"86a3991a-a02e-4e0a-9323-7f4cedca2e3b","description":"Arrays in java are not that easy.","idsensei":"0","katas":[{"_id":"24ba470b-5678-482b-a888-95a02b6bf90e","canva":"import java.util.ArrayList;\n\npublic class Kata {\n public static int sum(ArrayList<Integer> list){\n \n }\n}\n","cassert":"import static org.junit.Assert.*;\nimport java.util.ArrayList;\n\npublic class Main {\n\n public static void main(String[] args) {\n\n ArrayList<Integer> mylist = new ArrayList<>();\n mylist.add(15);\n mylist.add(5);\n mylist.add(10);\n\n assertEquals(Kata.sum(mylist),30); \n\n }\n}","difficulty":"Ceinture blanche","keepAssert":true,"language":"java","nbAttempt":2,"programID":"86a3991a-a02e-4e0a-9323-7f4cedca2e3b","rules":"Return a sum of all element in an arraylist","solution":"import java.util.ArrayList;\n\npublic class Kata {\n public static int sum(ArrayList<Integer> list){\n int sum = 0;\n for(int n : list)\n sum += n;\n return sum;\n }\n}\n","title":"Sum up element"}],"language":"java","nbKata":1,"sensei":"shodai","tags":["arrays","arraylist","hashmap"],"title":"Arrays"}]