import { NotificationsService } from 'angular2-notifications';
-import { AccountService } from './account.service';
-import { FormReactive, USER_PASSWORD } from '../shared';
+import { FormReactive, UserService, USER_PASSWORD } from '../shared';
@Component({
selector: 'my-account',
private formBuilder: FormBuilder,
private router: Router,
private notificationsService: NotificationsService,
- private accountService: AccountService
+ private userService: UserService
) {
super();
}
return;
}
- this.accountService.changePassword(newPassword).subscribe(
+ this.userService.changePassword(newPassword).subscribe(
() => this.notificationsService.success('Success', 'Password updated.'),
err => this.error = err
AccountComponent
],
- providers: [
- AccountService
- ]
+ providers: []
})
export class AccountModule { }
+++ /dev/null
-import { Injectable } from '@angular/core';
-import 'rxjs/add/operator/catch';
-import 'rxjs/add/operator/map';
-
-import { AuthService } from '../core';
-import { AuthHttp, RestExtractor } from '../shared';
-
-@Injectable()
-export class AccountService {
- private static BASE_USERS_URL = '/api/v1/users/';
-
- constructor(
- private authHttp: AuthHttp,
- private authService: AuthService,
- private restExtractor: RestExtractor
- ) {}
-
- changePassword(newPassword: string) {
- const url = AccountService.BASE_USERS_URL + this.authService.getUser().id;
- const body = {
- password: newPassword
- };
-
- return this.authHttp.put(url, body)
- .map(this.restExtractor.extractDataBool)
- .catch((res) => this.restExtractor.handleError(res));
- }
-}
export * from './account-routing.module';
export * from './account.component';
export * from './account.module';
-export * from './account.service';
-import { Component, ViewContainerRef } from '@angular/core';
+import { Component, OnInit, ViewContainerRef } from '@angular/core';
import { Router } from '@angular/router';
import { MetaService } from 'ng2-meta';
+
+import { AuthService } from './core';
+import { UserService } from './shared';
+
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: [ './app.component.scss' ]
})
-
-export class AppComponent {
+export class AppComponent implements OnInit {
notificationOptions = {
timeOut: 3000,
lastOnBottom: true,
constructor(
private router: Router,
private metaService: MetaService,
+ private authService: AuthService,
+ private userService: UserService,
viewContainerRef: ViewContainerRef
) {}
+ ngOnInit() {
+ if (this.authService.isLoggedIn()) {
+ // The service will automatically redirect to the login page if the token is not valid anymore
+ this.userService.checkTokenValidity();
+ }
+ }
+
isInAdmin() {
return this.router.url.indexOf('/admin/') !== -1;
}
--- /dev/null
+export enum AuthStatus {
+ LoggedIn,
+ LoggedOut
+}
--- /dev/null
+// Do not use the barrel (dependency loop)
+import { User } from '../../shared/users/user.model';
+
+export class AuthUser extends User {
+ private static KEYS = {
+ ID: 'id',
+ ROLE: 'role',
+ USERNAME: 'username'
+ };
+
+ tokens: Tokens;
+
+ static load() {
+ const usernameLocalStorage = localStorage.getItem(this.KEYS.USERNAME);
+ if (usernameLocalStorage) {
+ return new AuthUser(
+ {
+ id: parseInt(localStorage.getItem(this.KEYS.ID)),
+ username: localStorage.getItem(this.KEYS.USERNAME),
+ role: localStorage.getItem(this.KEYS.ROLE)
+ },
+ Tokens.load()
+ );
+ }
+
+ return null;
+ }
+
+ static flush() {
+ localStorage.removeItem(this.KEYS.USERNAME);
+ localStorage.removeItem(this.KEYS.ID);
+ localStorage.removeItem(this.KEYS.ROLE);
+ Tokens.flush();
+ }
+
+ constructor(userHash: { id: number, username: string, role: string }, hashTokens: any) {
+ super(userHash);
+ this.tokens = new Tokens(hashTokens);
+ }
+
+ getAccessToken() {
+ return this.tokens.access_token;
+ }
+
+ getRefreshToken() {
+ return this.tokens.refresh_token;
+ }
+
+ getTokenType() {
+ return this.tokens.token_type;
+ }
+
+ refreshTokens(access_token: string, refresh_token: string) {
+ this.tokens.access_token = access_token;
+ this.tokens.refresh_token = refresh_token;
+ }
+
+ save() {
+ localStorage.setItem(AuthUser.KEYS.ID, this.id.toString());
+ localStorage.setItem(AuthUser.KEYS.USERNAME, this.username);
+ localStorage.setItem(AuthUser.KEYS.ROLE, this.role);
+ this.tokens.save();
+ }
+}
+
+// Private class only used by User
+class Tokens {
+ private static KEYS = {
+ ACCESS_TOKEN: 'access_token',
+ REFRESH_TOKEN: 'refresh_token',
+ TOKEN_TYPE: 'token_type',
+ };
+
+ access_token: string;
+ refresh_token: string;
+ token_type: string;
+
+ static load() {
+ const accessTokenLocalStorage = localStorage.getItem(this.KEYS.ACCESS_TOKEN);
+ const refreshTokenLocalStorage = localStorage.getItem(this.KEYS.REFRESH_TOKEN);
+ const tokenTypeLocalStorage = localStorage.getItem(this.KEYS.TOKEN_TYPE);
+
+ if (accessTokenLocalStorage && refreshTokenLocalStorage && tokenTypeLocalStorage) {
+ return new Tokens({
+ access_token: accessTokenLocalStorage,
+ refresh_token: refreshTokenLocalStorage,
+ token_type: tokenTypeLocalStorage
+ });
+ }
+
+ return null;
+ }
+
+ static flush() {
+ localStorage.removeItem(this.KEYS.ACCESS_TOKEN);
+ localStorage.removeItem(this.KEYS.REFRESH_TOKEN);
+ localStorage.removeItem(this.KEYS.TOKEN_TYPE);
+ }
+
+ constructor(hash?: any) {
+ if (hash) {
+ this.access_token = hash.access_token;
+ this.refresh_token = hash.refresh_token;
+
+ if (hash.token_type === 'bearer') {
+ this.token_type = 'Bearer';
+ } else {
+ this.token_type = hash.token_type;
+ }
+ }
+ }
+
+ save() {
+ localStorage.setItem('access_token', this.access_token);
+ localStorage.setItem('refresh_token', this.refresh_token);
+ localStorage.setItem('token_type', this.token_type);
+ }
+}
import { NotificationsService } from 'angular2-notifications';
+import { AuthStatus } from './auth-status.model';
+import { AuthUser } from './auth-user.model';
// Do not use the barrel (dependency loop)
-import { AuthStatus } from '../../shared/auth/auth-status.model';
-import { AuthUser } from '../../shared/auth/auth-user.model';
import { RestExtractor } from '../../shared/rest';
@Injectable()
+export * from './auth-status.model';
+export * from './auth-user.model';
export * from './auth.service'
import { Component, OnInit } from '@angular/core';
import { Router } from '@angular/router';
-import { AuthService } from '../auth';
-import { AuthStatus } from '../../shared';
+import { AuthService, AuthStatus } from '../auth';
@Component({
selector: 'my-menu',
+++ /dev/null
-export enum AuthStatus {
- LoggedIn,
- LoggedOut
-}
+++ /dev/null
-import { User } from '../users';
-
-export class AuthUser extends User {
- private static KEYS = {
- ID: 'id',
- ROLE: 'role',
- USERNAME: 'username'
- };
-
- tokens: Tokens;
-
- static load() {
- const usernameLocalStorage = localStorage.getItem(this.KEYS.USERNAME);
- if (usernameLocalStorage) {
- return new AuthUser(
- {
- id: parseInt(localStorage.getItem(this.KEYS.ID)),
- username: localStorage.getItem(this.KEYS.USERNAME),
- role: localStorage.getItem(this.KEYS.ROLE)
- },
- Tokens.load()
- );
- }
-
- return null;
- }
-
- static flush() {
- localStorage.removeItem(this.KEYS.USERNAME);
- localStorage.removeItem(this.KEYS.ID);
- localStorage.removeItem(this.KEYS.ROLE);
- Tokens.flush();
- }
-
- constructor(userHash: { id: number, username: string, role: string }, hashTokens: any) {
- super(userHash);
- this.tokens = new Tokens(hashTokens);
- }
-
- getAccessToken() {
- return this.tokens.access_token;
- }
-
- getRefreshToken() {
- return this.tokens.refresh_token;
- }
-
- getTokenType() {
- return this.tokens.token_type;
- }
-
- refreshTokens(access_token: string, refresh_token: string) {
- this.tokens.access_token = access_token;
- this.tokens.refresh_token = refresh_token;
- }
-
- save() {
- localStorage.setItem(AuthUser.KEYS.ID, this.id.toString());
- localStorage.setItem(AuthUser.KEYS.USERNAME, this.username);
- localStorage.setItem(AuthUser.KEYS.ROLE, this.role);
- this.tokens.save();
- }
-}
-
-// Private class only used by User
-class Tokens {
- private static KEYS = {
- ACCESS_TOKEN: 'access_token',
- REFRESH_TOKEN: 'refresh_token',
- TOKEN_TYPE: 'token_type',
- };
-
- access_token: string;
- refresh_token: string;
- token_type: string;
-
- static load() {
- const accessTokenLocalStorage = localStorage.getItem(this.KEYS.ACCESS_TOKEN);
- const refreshTokenLocalStorage = localStorage.getItem(this.KEYS.REFRESH_TOKEN);
- const tokenTypeLocalStorage = localStorage.getItem(this.KEYS.TOKEN_TYPE);
-
- if (accessTokenLocalStorage && refreshTokenLocalStorage && tokenTypeLocalStorage) {
- return new Tokens({
- access_token: accessTokenLocalStorage,
- refresh_token: refreshTokenLocalStorage,
- token_type: tokenTypeLocalStorage
- });
- }
-
- return null;
- }
-
- static flush() {
- localStorage.removeItem(this.KEYS.ACCESS_TOKEN);
- localStorage.removeItem(this.KEYS.REFRESH_TOKEN);
- localStorage.removeItem(this.KEYS.TOKEN_TYPE);
- }
-
- constructor(hash?: any) {
- if (hash) {
- this.access_token = hash.access_token;
- this.refresh_token = hash.refresh_token;
-
- if (hash.token_type === 'bearer') {
- this.token_type = 'Bearer';
- } else {
- this.token_type = hash.token_type;
- }
- }
- }
-
- save() {
- localStorage.setItem('access_token', this.access_token);
- localStorage.setItem('refresh_token', this.refresh_token);
- localStorage.setItem('token_type', this.token_type);
- }
-}
export * from './auth-http.service';
-export * from './auth-status.model';
-export * from './auth-user.model';
import { AUTH_HTTP_PROVIDERS } from './auth';
import { RestExtractor, RestService } from './rest';
import { SearchComponent, SearchService } from './search';
+import { UserService } from './users';
import { VideoAbuseService } from './video-abuse';
@NgModule({
RestExtractor,
RestService,
SearchService,
- VideoAbuseService
+ VideoAbuseService,
+ UserService
]
})
export class SharedModule { }
export * from './user.model';
+export * from './user.service';
--- /dev/null
+import { Injectable } from '@angular/core';
+import 'rxjs/add/operator/catch';
+import 'rxjs/add/operator/map';
+
+import { AuthService } from '../../core';
+import { AuthHttp } from '../auth';
+import { RestExtractor } from '../rest';
+
+@Injectable()
+export class UserService {
+ private static BASE_USERS_URL = '/api/v1/users/';
+
+ constructor(
+ private authHttp: AuthHttp,
+ private authService: AuthService,
+ private restExtractor: RestExtractor
+ ) {}
+
+ checkTokenValidity() {
+ const url = UserService.BASE_USERS_URL + 'me';
+
+ // AuthHttp will redirect us to the login page if the oken is not valid anymore
+ this.authHttp.get(url).subscribe(() => { ; });
+ }
+
+ changePassword(newPassword: string) {
+ const url = UserService.BASE_USERS_URL + this.authService.getUser().id;
+ const body = {
+ password: newPassword
+ };
+
+ return this.authHttp.put(url, body)
+ .map(this.restExtractor.extractDataBool)
+ .catch((res) => this.restExtractor.handleError(res));
+ }
+}
Video,
VideoService
} from '../shared';
-import { AuthService } from '../../core';
-import { AuthUser, RestPagination, Search, SearchField } from '../../shared';
+import { AuthService, AuthUser } from '../../core';
+import { RestPagination, Search, SearchField } from '../../shared';
import { SearchService } from '../../shared';
@Component({