REST API tab finished on testapp

pull/20/head
pabloFuente 2017-09-27 16:24:39 +02:00
parent 64a68bb42e
commit 3a12428be8
9 changed files with 251 additions and 127 deletions

View File

@ -24,6 +24,7 @@
"@angular/platform-browser": "^4.2.4", "@angular/platform-browser": "^4.2.4",
"@angular/platform-browser-dynamic": "^4.2.4", "@angular/platform-browser-dynamic": "^4.2.4",
"@angular/router": "^4.2.4", "@angular/router": "^4.2.4",
"colormap": "^2.2.0",
"core-js": "^2.4.1", "core-js": "^2.4.1",
"hammerjs": "^2.0.8", "hammerjs": "^2.0.8",
"openvidu-browser": "1.1.0", "openvidu-browser": "1.1.0",

View File

@ -11,6 +11,10 @@ import {
MdDialogModule, MdDialogModule,
MdToolbarModule, MdToolbarModule,
MdTabsModule, MdTabsModule,
MdTableModule,
MdListModule,
MdRadioModule,
MdSelectModule,
MdSlideToggleModule MdSlideToggleModule
} from '@angular/material'; } from '@angular/material';
@ -27,6 +31,10 @@ import {
MdDialogModule, MdDialogModule,
MdToolbarModule, MdToolbarModule,
MdTabsModule, MdTabsModule,
MdTableModule,
MdListModule,
MdRadioModule,
MdSelectModule,
MdSlideToggleModule MdSlideToggleModule
], ],
}) })

View File

@ -26,7 +26,9 @@ import { OpenviduRestService } from './services/openvidu-rest.service';
FlexLayoutModule, FlexLayoutModule,
routing routing
], ],
providers: [OpenviduRestService], providers: [
OpenviduRestService
],
bootstrap: [AppComponent] bootstrap: [AppComponent]
}) })
export class AppModule { } export class AppModule { }

View File

@ -1,93 +1,125 @@
#join-dialog h1 { .demo-tab-content {
color: #4d4d4d; margin-top: 50px;
}
table {
width: 100%;
}
table tr {
text-align: left;
}
#table-row {
margin-top: 40px;
}
.first-col {
padding-right: 20px;
}
th {
padding-bottom: 20px;
}
#server-data-field {
padding-top: 16px;
}
md-card {
font-weight: bold; font-weight: bold;
text-align: center; }
#join-dialog h1 {
color: #4d4d4d;
font-weight: bold;
text-align: center;
} }
#img-div { #img-div {
text-align: center; text-align: center;
position: absolute; position: absolute;
top: 19%; top: 19%;
left: 50%; left: 50%;
transform: translate(-50%, -50%); transform: translate(-50%, -50%);
} }
#img-div img { #img-div img {
height: 15%; height: 15%;
} }
#join-dialog label { #join-dialog label {
color: #0088aa; color: #0088aa;
} }
#join-dialog input.btn { #join-dialog input.btn {
margin-top: 15px; margin-top: 15px;
} }
#session-header { #session-header {
margin-bottom: 20px; margin-bottom: 20px;
} }
#session-title { #session-title {
display: inline-block; display: inline-block;
} }
#buttonLeaveSession { #buttonLeaveSession {
float: right; float: right;
margin-top: 20px; margin-top: 20px;
} }
#video-container video { #video-container video {
position: relative; position: relative;
float: left; float: left;
cursor: pointer; cursor: pointer;
} }
#video-container p { #video-container p {
display: inline-block; display: inline-block;
background: #f8f8f8; background: #f8f8f8;
padding-right: 5px; padding-right: 5px;
padding-left: 5px; padding-left: 5px;
color: #777777; color: #777777;
font-weight: bold; font-weight: bold;
border-bottom-right-radius: 4px; border-bottom-right-radius: 4px;
} }
video { video {
width: 100%; width: 100%;
height: auto; height: auto;
} }
#main-video p { #main-video p {
position: absolute; position: absolute;
display: inline-block; display: inline-block;
background: #f8f8f8; background: #f8f8f8;
padding-right: 5px; padding-right: 5px;
padding-left: 5px; padding-left: 5px;
left: 0; left: 0;
font-size: 22px; font-size: 22px;
color: #777777; color: #777777;
font-weight: bold; font-weight: bold;
border-bottom-right-radius: 4px; border-bottom-right-radius: 4px;
} }
#main-video video { #main-video video {
cursor: initial; cursor: initial;
} }
#session img { #session img {
width: 100%; width: 100%;
height: auto; height: auto;
display: inline-block; display: inline-block;
object-fit: contain; object-fit: contain;
vertical-align: baseline; vertical-align: baseline;
} }
#session #video-container img { #session #video-container img {
position: relative; position: relative;
float: left; float: left;
width: 50%; width: 50%;
cursor: pointer; cursor: pointer;
object-fit: cover; object-fit: cover;
height: 180px; height: 180px;
} }

View File

@ -1,4 +1,8 @@
<md-tab-group class="demo-tab-group" dynamicHeight="true"> <md-form-field class="example-full-width">
<input mdInput placeholder="OpenVidu Server URL" [(ngModel)]="openviduURL">
</md-form-field>
<md-tab-group class="demo-tab-group" dynamicHeight="true" selectedIndex="5">
<md-tab id="audio-video" label="Audio + Video"> <md-tab id="audio-video" label="Audio + Video">
<div class="demo-tab-content"> <div class="demo-tab-content">
@ -18,11 +22,72 @@
</div> </div>
</md-tab> </md-tab>
<md-tab id="screen-only" label="Screen only"> <md-tab id="screen-only" label="Screen only">
<div class="demo-tab-content">
</div>
</md-tab> </md-tab>
<md-tab id="api-rest" label="API REST"> <md-tab id="api-rest" label="API REST">
<button md-raised-button color="primary" (click)="getSessionId()">Get sessionId</button> <div class="demo-tab-content">
<button md-raised-button color="primary" (click)="getToken()">Get token</button> <md-form-field>
<input mdInput placeholder="OpenVidu Server Secret" [(ngModel)]="openviduSecret">
</md-form-field>
<button md-raised-button color="primary" (click)="cleanAllSessions()" style="float: right">Clean sessions</button>
<div fxLayout="row" fxLayoutGap="20px" fxLayoutAlign="start space-around">
<div fxLayout="column" fxFlex="50" fxFlexAlign="center" fxFill>
<button md-raised-button color="primary" (click)="getSessionId()">Get sessionId</button>
</div>
<div fxLayout="column" fxFlex="50" fxFlexAlign="center" fxFill>
<button md-raised-button color="primary" (click)="getToken()" [disabled]="getTokenDisabled()">Get token</button>
</div>
</div>
<div id="table-row" fxLayout="row" fxLayoutGap="20px" fxLayoutAlign="start">
<div fxLayout="column" fxFlex="65" fxFlexAlign="start" fxFill>
<table>
<tr>
<th class="first-col">sessionIds</th>
<th>tokens</th>
<th>Session</th>
</tr>
<tr *ngFor="let sid of this.data; let ind = index">
<td class="first-col">
<md-card [style.background]="getBackgroundColor(ind)">{{sid[0]}}</md-card>
</td>
<td>
<md-card *ngIf="sid[1].length > 0" [style.background]="getBackgroundColor(ind)">
<p *ngFor="let token of sid[1]">{{token}}</p>
</md-card>
</td>
<td style="text-align: center">
<md-radio-button [checked]="selectedRadioIndex === ind" (click)="selectedRadioIndex = ind" name="sidOption"></md-radio-button>
</td>
</tr>
</table>
</div>
<div fxLayout="column" fxFlex="35" fxFlexAlign="start" fxFill>
<table>
<tr>
<th>OpenVidu Role</th>
<th>Server data</th>
</tr>
<tr id="tr-token-options" *ngIf="data.length > 0">
<td>
<md-select placeholder="OpenVidu Role" [(ngModel)]="selectedRole">
<md-option *ngFor="let role of openViduRoles" [value]="role">
{{ role }}
</md-option>
</md-select>
</td>
<td>
<md-form-field id="server-data-field">
<input mdInput placeholder="Server Data" [(ngModel)]="serverData">
</md-form-field>
</td>
</tr>
</table>
</div>
</div>
</div>
</md-tab> </md-tab>
</md-tab-group> </md-tab-group>

View File

@ -1,19 +1,49 @@
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { OpenviduRestService } from '../../services/openvidu-rest.service'; import { OpenviduRestService } from '../../services/openvidu-rest.service';
import { DataSource } from '@angular/cdk/table';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/of';
import { OpenVidu } from 'openvidu-browser';
import * as colormap from 'colormap';
const numColors = 64;
declare var $: any;
@Component({ @Component({
selector: 'app-dashboard', selector: 'app-dashboard',
templateUrl: './dashboard.component.html', templateUrl: './dashboard.component.html',
styleUrls: ['./dashboard.component.css'] styleUrls: ['./dashboard.component.css'],
}) })
export class DashboardComponent implements OnInit { export class DashboardComponent implements OnInit {
openviduURL = 'https://localhost:8443';
openviduSecret = 'MY_SECRET';
serverData = 'data_test';
selectedRole = 'PUBLISHER';
selectedRadioIndex = 0;
openViduRoles = ['SUBSCRIBER', 'PUBLISHER', 'MODERATOR'];
// Join form // Join form
sessionName: string; sessionName: string;
clientData: string; clientData: string;
// API REST data collected
data = [];
cg;
constructor(private openviduRestService: OpenviduRestService) { constructor(private openviduRestService: OpenviduRestService) {
this.generateSessionInfo(); this.generateSessionInfo();
const options = {
colormap: [
{ 'index': 0, 'rgb': [135, 196, 213] },
{ 'index': 1, 'rgb': [255, 230, 151] }],
nshades: numColors,
format: 'hex'
};
this.cg = colormap(options);
} }
ngOnInit() { } ngOnInit() { }
@ -24,9 +54,9 @@ export class DashboardComponent implements OnInit {
} }
private getSessionId() { private getSessionId() {
this.openviduRestService.getSessionId() this.openviduRestService.getSessionId(this.openviduURL, this.openviduSecret)
.then((sessionId) => { .then((sessionId) => {
alert(sessionId); this.updateData();
}) })
.catch((error) => { .catch((error) => {
console.error('Error getting a sessionId', error); console.error('Error getting a sessionId', error);
@ -34,12 +64,32 @@ export class DashboardComponent implements OnInit {
} }
private getToken() { private getToken() {
this.openviduRestService.getToken() const sessionId = this.data[this.selectedRadioIndex][0];
this.openviduRestService.getToken(this.openviduURL, this.openviduSecret, sessionId, this.selectedRole, this.serverData)
.then((token) => { .then((token) => {
alert(token); this.updateData();
}) })
.catch((error) => { .catch((error) => {
console.error('Error getting a token', error); console.error('Error getting a token', error);
}); });
} }
private updateData() {
this.data = Array.from(this.openviduRestService.getAvailableParams());
}
private getTokenDisabled(): boolean {
return ((this.data.length === 0) || this.selectedRadioIndex === undefined);
}
private getBackgroundColor(index: number) {
return this.cg[((index + 1) * 15) % numColors];
}
private cleanAllSessions() {
this.data = [];
this.openviduRestService.sessionIdSession.clear();
this.openviduRestService.sessionIdTokenOpenViduRole.clear();
}
} }

View File

@ -10,29 +10,49 @@ import { environment } from '../../environments/environment';
@Injectable() @Injectable()
export class OpenviduRestService { export class OpenviduRestService {
sessionIdSession: Map<string, SessionAPI> = new Map();
sessionIdTokenOpenViduRole: Map<string, Map<string, OpenViduRoleAPI>> = new Map();
constructor() { } constructor() { }
getSessionId(): Promise<String> { getSessionId(openviduURL: string, openviduSecret: string): Promise<string> {
const OV = new OpenViduAPI(environment.OPENVIDU_URL, environment.OPENVIDU_SECRET); const OV = new OpenViduAPI(openviduURL, openviduSecret);
const session = OV.createSession(); const session = OV.createSession();
return new Promise(resolve => { return new Promise(resolve => {
session.getSessionId((sessionId) => { session.getSessionId((sessionId) => {
this.sessionIdSession.set(sessionId, session);
this.sessionIdTokenOpenViduRole.set(sessionId, new Map());
resolve(sessionId); resolve(sessionId);
}); });
}); });
} }
getToken(): Promise<String> { getToken(openviduURL: string, openviduSecret: string, sessionId: string, role: string, serverData: string): Promise<string> {
const OV = new OpenViduAPI(environment.OPENVIDU_URL, environment.OPENVIDU_SECRET); console.warn(sessionId);
const session = OV.createSession();
const OV = new OpenViduAPI(openviduURL, openviduSecret);
const session: SessionAPI = this.sessionIdSession.get(sessionId);
const OVRole: OpenViduRoleAPI = OpenViduRoleAPI[role];
return new Promise(resolve => { return new Promise(resolve => {
let tokenOptions: TokenOptionsAPI; const tokenOptions: TokenOptionsAPI = new TokenOptionsAPI.Builder()
session.generateToken((token) => { .role(OVRole)
.data(serverData)
.build();
session.generateToken(tokenOptions, (token) => {
this.sessionIdTokenOpenViduRole.get(sessionId).set(token, OVRole);
resolve(token); resolve(token);
}); });
}); });
} }
getAvailableParams(): Map<string, string[]> {
const params = new Map<string, string[]>();
this.sessionIdSession.forEach((sessionApi, sessionId, map) => {
params.set(sessionId, Array.from(this.sessionIdTokenOpenViduRole.get(sessionId).keys()));
});
return params;
}
} }

View File

@ -9,7 +9,10 @@
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/x-icon" href="favicon.ico"> <link rel="icon" type="image/x-icon" href="favicon.ico">
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet"> <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha256-k2WSCIexGzOj3Euiig+TlR8gA0EmPjuc79OEeY5L45g="
crossorigin="anonymous"></script>
</head> </head>

View File

@ -16,64 +16,7 @@ a {
text-decoration: inherit; text-decoration: inherit;
} }
ul {
/* Elevation */ list-style: none;
padding-left: 0;
.z-depth-1 {
box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -2px rgba(0, 0, 0, 0.2);
}
.z-depth-1-half {
box-shadow: 0 3px 3px 0 rgba(0, 0, 0, 0.14), 0 1px 7px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -1px rgba(0, 0, 0, 0.2);
}
.z-depth-2 {
box-shadow: 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12), 0 2px 4px -1px rgba(0, 0, 0, 0.3);
}
.z-depth-3 {
box-shadow: 0 6px 10px 0 rgba(0, 0, 0, 0.14), 0 1px 18px 0 rgba(0, 0, 0, 0.12), 0 3px 5px -1px rgba(0, 0, 0, 0.3);
}
.z-depth-4 {
box-shadow: 0 8px 10px 1px rgba(0, 0, 0, 0.14), 0 3px 14px 2px rgba(0, 0, 0, 0.12), 0 5px 5px -3px rgba(0, 0, 0, 0.3);
}
.z-depth-5 {
box-shadow: 0 16px 24px 2px rgba(0, 0, 0, 0.14), 0 6px 30px 5px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 0, 0, 0.3);
}
/* Colors of Deep Purple Material Theme */
.back-primary {
background: #673ab7 !important;
}
.back-accent {
background: #ffd740;
}
.back-warn {
background: #f44336;
}
.back-secondary {
background: #D1C4E9;
}
.color-primary {
color: #673ab7 !important;
}
.color-accent {
color: #ffd740;
}
.color-warn {
color: #f44336;
}
.color-secondary {
color: #D1C4E9;
} }