Page MenuHomec4science

fake-backend.ts
No OneTemporary

File Metadata

Created
Sat, May 4, 09:52

fake-backend.ts

import {Injectable} from '@angular/core';
import { HttpRequest, HttpResponse, HttpHandler, HttpEvent, HttpInterceptor, HTTP_INTERCEPTORS } from '@angular/common/http';
import { Observable, of, throwError } from 'rxjs';
import { mergeMap, materialize, dematerialize } from 'rxjs/operators';
let users = [
{ id: 0, name: 'Judge 1', username: 'judge1', password: 'judge1' , role: 'judge1'},
{ id: 1, name: 'Judge 2', username: 'judge2', password: 'judge2' , role: 'judge2'},
{ id: 2, name: 'Judge 3', username: 'judge3', password: 'judge3' , role: 'judge3'},
{ id: 3, name: 'Judge 4', username: 'judge4', password: 'judge4' , role: 'judge4'},
{ id: 8, name: 'Jury', username: 'jury', password: 'test' , role: 'jury'},
{ id: 9, name: 'Admin', username: 'admin', password: 'admin' , role: 'admin'}
];
// Simulates a fake back end to manage users
export class UserBackEnd {
updateUsers(newUsers) {
users = newUsers;
}
getUsers() {
return users;
}
}
@Injectable()
export class FakeBackendInterceptor implements HttpInterceptor {
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const { url, method, headers, body } = request;
// wrap in delayed observable to simulate server api call
return of(null)
.pipe(mergeMap(handleRoute))
.pipe(materialize()) // call materialize and dematerialize to ensure delay even if an erro
.pipe(dematerialize());
function handleRoute() {
switch (true) {
case url.endsWith('/users/authenticate') && method === 'POST':
return authenticate();
default:
// pass through any requests not handled above
return next.handle(request);
}
}
// route functions
function authenticate() {
const { username, password } = body;
const user = users.find(x => x.username === username && x.password === password);
if (!user) { return error('Username or password is incorrect'); }
return ok({
id: user.id,
username: user.username,
role: user.role,
name: user.name,
token: 'fake-jwt-token'
});
}
// helper functions
function ok(body?) {
return of(new HttpResponse({ status: 200, body }));
}
function error(message) {
return throwError({ error: { message } });
}
}
}
export const fakeBackendProvider = {
// use fake backend in place of Http service for backend-less development
provide: HTTP_INTERCEPTORS,
useClass: FakeBackendInterceptor,
multi: true
};

Event Timeline