Skip to content
Snippets Groups Projects
Commit 9f1485ec authored by Rafael László's avatar Rafael László :speech_balloon:
Browse files

Document all services and models

parent d2d86d4e
No related branches found
No related tags found
No related merge requests found
Showing
with 120 additions and 5 deletions
...@@ -3,6 +3,9 @@ import { Injectable } from '@angular/core'; ...@@ -3,6 +3,9 @@ import { Injectable } from '@angular/core';
import { AuthService } from '../services/auth.service'; import { AuthService } from '../services/auth.service';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
/**
* AuthGuard that prevents a site from loading if not Authorized and redirect to the forbidden page.
*/
@Injectable({ @Injectable({
providedIn: 'root' providedIn: 'root'
}) })
......
...@@ -4,6 +4,9 @@ import { Observable, throwError } from 'rxjs'; ...@@ -4,6 +4,9 @@ import { Observable, throwError } from 'rxjs';
import { catchError } from 'rxjs/operators'; import { catchError } from 'rxjs/operators';
import { AuthService } from '../services/auth.service'; import { AuthService } from '../services/auth.service';
/**
* HTTP Error interceptor that logs all the errors and logs out if a 401 request intercepted
*/
@Injectable() @Injectable()
export class ErrorInterceptor implements HttpInterceptor { export class ErrorInterceptor implements HttpInterceptor {
constructor(private authService: AuthService) {} constructor(private authService: AuthService) {}
......
...@@ -4,6 +4,9 @@ import { Observable } from 'rxjs'; ...@@ -4,6 +4,9 @@ import { Observable } from 'rxjs';
import { environment } from '../../environments/environment'; import { environment } from '../../environments/environment';
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
/**
* HTTP Interceptor that adds the jwt token to all requests if exist
*/
@Injectable() @Injectable()
export class JwtInterceptor implements HttpInterceptor { export class JwtInterceptor implements HttpInterceptor {
private currentJwt?: string; private currentJwt?: string;
......
/**
* Error that is stored in ErrorService
*/
export interface ErrorModel { export interface ErrorModel {
message: string; message: string;
navigate?: string[]; navigate?: string[];
......
/**
* History model
*/
export interface History { export interface History {
id: number; id: number;
description: string; description: string;
......
/**
* User details that can be get from JWT
*/
export interface JwtUserModel { export interface JwtUserModel {
fullName: string; fullName: string;
schacc: string; schacc: string;
......
/**
* Sent request on new History creation
*/
export interface CreateHistoryRequest { export interface CreateHistoryRequest {
createdAt?: string; // Default now createdAt?: string; // Default now
description: string; description: string;
......
/**
* Sent request on new Service creation
*/
export interface CreateServiceRequestModel { export interface CreateServiceRequestModel {
description: string; description: string;
isOkay?: string; // default is false isOkay?: string; // default is false
......
/**
* Sent request on new User creation
*/
export interface CreateUserRequestModel { export interface CreateUserRequestModel {
email: string; email: string;
fullName: string; fullName: string;
......
/**
* Sent request on service creation
*/
export interface UpdateHistoryRequest { export interface UpdateHistoryRequest {
createdAt?: string; createdAt?: string;
description?: string; description?: string;
......
/**
* Sent request on Service update
*/
export interface UpdateServiceRequestModel { export interface UpdateServiceRequestModel {
description?: string; description?: string;
isOkay?: string; isOkay?: string;
......
/**
* Response when something is successfully created
*/
export interface CreatedResponseModel { export interface CreatedResponseModel {
id: number; id: number;
} }
/**
* Response when a token is requested
*/
export interface TokenReponseModel { export interface TokenReponseModel {
code: number; code: number;
expire: string; expire: string;
......
import { History } from './history.model'; import { History } from './history.model';
/**
* A service model
*/
export interface Service { export interface Service {
id: number; id: number;
name: string; name: string;
......
/**
* User model
*/
export interface User { export interface User {
id: number; id: number;
fullName: string; fullName: string;
......
...@@ -8,12 +8,21 @@ import { map } from 'rxjs/operators'; ...@@ -8,12 +8,21 @@ import { map } from 'rxjs/operators';
import { TokenReponseModel } from '../models/response/token-reponse.model'; import { TokenReponseModel } from '../models/response/token-reponse.model';
import { Router } from '@angular/router'; import { Router } from '@angular/router';
/**
* Authentication service
*/
@Injectable({ @Injectable({
providedIn: 'root', providedIn: 'root',
}) })
export class AuthService { export class AuthService {
/**
* The is Authenticated
*/
isLoggedIn = false; isLoggedIn = false;
private userDataSource = new BehaviorSubject<JwtUserModel | void>(null); private userDataSource = new BehaviorSubject<JwtUserModel | void>(null);
/**
* User data
*/
userData$ = this.userDataSource.asObservable(); userData$ = this.userDataSource.asObservable();
private refreshTokenTimeout: number; private refreshTokenTimeout: number;
private expire: Date; private expire: Date;
...@@ -23,6 +32,11 @@ export class AuthService { ...@@ -23,6 +32,11 @@ export class AuthService {
this.startRefreshTokenTimer(); this.startRefreshTokenTimer();
} }
/**
* Log in the user and start auto refresh
* @param username User's username
* @param password User's password
*/
login(username: string, password: string): Observable<TokenReponseModel> { login(username: string, password: string): Observable<TokenReponseModel> {
return this.http.post(`${environment.apiUrl}/auth/login`, { username, password }).pipe( return this.http.post(`${environment.apiUrl}/auth/login`, { username, password }).pipe(
map((tokenRes: TokenReponseModel) => { map((tokenRes: TokenReponseModel) => {
...@@ -34,6 +48,9 @@ export class AuthService { ...@@ -34,6 +48,9 @@ export class AuthService {
); );
} }
/**
* Log out the user. Delete JWT and variables
*/
logout(): void { logout(): void {
this.stopRefreshTokenTimer(); this.stopRefreshTokenTimer();
this.userDataSource.next(null); this.userDataSource.next(null);
...@@ -41,6 +58,9 @@ export class AuthService { ...@@ -41,6 +58,9 @@ export class AuthService {
this.router.navigate(['/services']); this.router.navigate(['/services']);
} }
/**
* Refresh the token using the current one
*/
refreshToken(): Observable<TokenReponseModel> { refreshToken(): Observable<TokenReponseModel> {
return this.http.get(`${environment.apiUrl}/auth/refresh`).pipe( return this.http.get(`${environment.apiUrl}/auth/refresh`).pipe(
map((tokenRes: TokenReponseModel) => { map((tokenRes: TokenReponseModel) => {
...@@ -52,6 +72,9 @@ export class AuthService { ...@@ -52,6 +72,9 @@ export class AuthService {
); );
} }
/**
* Load the current user data from LocalStorage
*/
loadUserData(): void { loadUserData(): void {
const data = this.jwtService.getDecodedToken(); const data = this.jwtService.getDecodedToken();
if (!data || data.exp < new Date()) { if (!data || data.exp < new Date()) {
......
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { ErrorDialogComponent } from '../shared/error-dialog/error-dialog.component';
import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
import { BehaviorSubject } from 'rxjs'; import { BehaviorSubject } from 'rxjs';
import { JwtUserModel } from '../models/jwt-user.model';
import { ErrorModel } from '../models/error.model'; import { ErrorModel } from '../models/error.model';
/**
* Service that contains the current and past errors.
*/
@Injectable({ @Injectable({
providedIn: 'root', providedIn: 'root',
}) })
export class ErrorService { export class ErrorService {
private errorDataSource = new BehaviorSubject<ErrorModel | void>(null); private errorDataSource = new BehaviorSubject<ErrorModel | void>(null);
/**
* Error data
*/
errorData$ = this.errorDataSource.asObservable(); errorData$ = this.errorDataSource.asObservable();
constructor(private modalService: NgbModal) {} constructor(private modalService: NgbModal) {}
/**
* Update the current error
* @param message Message of error
* @param navigate where to navigate
*/
updateError(message: string, navigate?: string[]): void { updateError(message: string, navigate?: string[]): void {
this.errorDataSource.next({ this.errorDataSource.next({
message, message,
...@@ -21,6 +30,9 @@ export class ErrorService { ...@@ -21,6 +30,9 @@ export class ErrorService {
}); });
} }
/**
* Set to null the error
*/
resetError(): void { resetError(): void {
this.errorDataSource.next(null); this.errorDataSource.next(null);
} }
......
...@@ -6,6 +6,9 @@ import { CreatedResponseModel } from '../models/response/created-response.model' ...@@ -6,6 +6,9 @@ import { CreatedResponseModel } from '../models/response/created-response.model'
import { CreateHistoryRequest } from '../models/request/create-history-request'; import { CreateHistoryRequest } from '../models/request/create-history-request';
import { UpdateHistoryRequest } from '../models/request/update-history-request'; import { UpdateHistoryRequest } from '../models/request/update-history-request';
/**
* Service that handles the history endpoint
*/
@Injectable({ @Injectable({
providedIn: 'root', providedIn: 'root',
}) })
......
...@@ -3,6 +3,9 @@ import { LocalstorageService } from './localstorage.service'; ...@@ -3,6 +3,9 @@ import { LocalstorageService } from './localstorage.service';
import { JwtUserModel } from '../models/jwt-user.model'; import { JwtUserModel } from '../models/jwt-user.model';
import jwt_decode from 'jwt-decode'; import jwt_decode from 'jwt-decode';
/**
* Service that handles the JWT
*/
@Injectable({ @Injectable({
providedIn: 'root', providedIn: 'root',
}) })
...@@ -17,6 +20,9 @@ export class JwtService { ...@@ -17,6 +20,9 @@ export class JwtService {
this.localStorageService.setItem('token', token); this.localStorageService.setItem('token', token);
} }
/**
* Clear the token from localstorage
*/
clearToken(): void { clearToken(): void {
this.localStorageService.removeItem('token'); this.localStorageService.removeItem('token');
} }
......
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
/**
* Service that handles all localstorage methods. Type safe
*/
@Injectable({ @Injectable({
providedIn: 'root', providedIn: 'root'
}) })
export class LocalstorageService { export class LocalstorageService {
constructor() { } constructor() {
}
/**
* Set a record to the localstorage
* @param key The Record key
* @param value The Record value
*/
setItem(key: string, value: any): void { setItem(key: string, value: any): void {
localStorage.setItem(key, JSON.stringify({ value })); localStorage.setItem(key, JSON.stringify({ value }));
} }
/**
* Remove a record by key
* @param key Record key
*/
removeItem(key: string): void { removeItem(key: string): void {
localStorage.removeItem(key); localStorage.removeItem(key);
} }
/**
* Get a given record specifying it's type
* @param key Key of the record
*/
getItem<T>(key: string): T | null; getItem<T>(key: string): T | null;
/**
* Get a given record specifying it's type
* @param key Key of the record
* @param otherwise default return value
*/
getItem<T>(key: string, otherwise: T): T; getItem<T>(key: string, otherwise: T): T;
/**
* Get a given record specifying it's type
* @param key Key of the record
* @param otherwise default return value
*/
getItem<T>(key: string, otherwise?: T): T | null { getItem<T>(key: string, otherwise?: T): T | null {
const data: string | null = localStorage.getItem(key); const data: string | null = localStorage.getItem(key);
if (data !== null) { if (data !== null) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment