Advertisement
Guest User

Untitled

a guest
Feb 1st, 2019
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.78 KB | None | 0 0
  1. import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest, HttpResponse } from '@angular/common/http';
  2. import { Injectable } from '@angular/core';
  3. import { Observable, of, throwError } from 'rxjs';
  4. import { delay, dematerialize, materialize, mergeMap } from 'rxjs/operators';
  5. import { environment } from '../../../environments/environment';
  6.  
  7.  
  8. // Based on http://jasonwatmore.com/post/2018/06/22/angular-6-mock-backend-example-for-backendless-development
  9.  
  10.  
  11. @Injectable({
  12. providedIn: 'root'
  13. })
  14. export class FakeBackendApiInterceptor implements HttpInterceptor {
  15.  
  16. constructor() { }
  17.  
  18. intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
  19.  
  20. // array in local storage for registered users
  21. let users: any[] = JSON.parse(localStorage.getItem('users')) || [];
  22.  
  23. // array in local storage for registered events
  24. let allEvents: any[] = JSON.parse(localStorage.getItem('events')) || {};
  25. let events: any[] = [];
  26.  
  27.  
  28.  
  29. // add a dummy user with some dummy events
  30. users[0] = {
  31. id: 1,
  32. username: 'dummy',
  33. password: 'dummy'
  34. };
  35. localStorage.setItem('users', JSON.stringify(users));
  36.  
  37. allEvents['dummy'] = (allEvents && allEvents['dummy'] ? allEvents['dummy'] : []);
  38. if (!allEvents['dummy'].length) {
  39. allEvents['dummy'][0] = {
  40. id: 1,
  41. description: 'Some event in the future',
  42. date: '2100-12-31',
  43. };
  44. allEvents['dummy'][1] = {
  45. id: 2,
  46. description: 'Some event in the past',
  47. date: '1900-12-31',
  48. };
  49. }
  50. localStorage.setItem('events', JSON.stringify(allEvents));
  51.  
  52.  
  53. // get authenticated user from token (if available)
  54. let username: string = ('' + request.headers.get('Authorization')).replace('Bearer ', '');
  55. let user: any = null;
  56. let filteredUsers = users.filter(user => { return user.username === username; });
  57. if (filteredUsers && filteredUsers.length) {
  58. user = filteredUsers[0];
  59. events = (allEvents && allEvents[username] ? allEvents[username] : []);
  60. }
  61.  
  62.  
  63.  
  64. // wrap in delayed observable to simulate server api call
  65. return of(null).pipe(mergeMap(() => {
  66.  
  67.  
  68.  
  69.  
  70.  
  71. // get current user
  72. if (request.url.includes(`${environment.API_BASE_URL}${environment.API_GetAuthenticatedUser}`) && request.method === 'GET') {
  73. // if there is a logged in user return 200 OK with user details and fake jwt token
  74. if (user) {
  75. let body = {
  76. ...user // Copy user details
  77. };
  78. return of(new HttpResponse({ status: 200, body: body }));
  79. } else {
  80. // return 401 not authorised if token is null or invalid
  81. return throwError({ error: { message: 'Unauthorised' } });
  82. }
  83. }
  84.  
  85.  
  86.  
  87. // register user
  88. if (request.url.includes(`${environment.API_BASE_URL}${environment.API_Register}`) && request.method === 'PUT') {
  89. // get new user object from post body
  90. let newUser = request.body;
  91.  
  92. // validation
  93. if (!newUser.username) {
  94. return throwError({ error: { message: 'Username cannot be empty' } });
  95. }
  96. let duplicateUser = users.filter(user => { return user.username === newUser.username; }).length;
  97. if (duplicateUser) {
  98. return throwError({ error: { message: 'Username "' + newUser.username + '" is already taken' } });
  99. }
  100.  
  101. // save new user
  102. newUser.id = Object.keys(users).length + 1;
  103. users.push(newUser);
  104. localStorage.setItem('users', JSON.stringify(users));
  105.  
  106. // respond 200 OK
  107. return of(new HttpResponse({ status: 200 }));
  108. }
  109.  
  110.  
  111.  
  112. // login
  113. if (request.url.includes(`${environment.API_BASE_URL}${environment.API_Login}`) && request.method === 'POST') {
  114. // find if any user matches login credentials
  115. let filteredUsers = users.filter(user => {
  116. return user.username === request.body.username && user.password === request.body.password;
  117. });
  118.  
  119. if (filteredUsers.length) {
  120. // if login details are valid return 200 OK with user details and fake jwt token
  121. let user = filteredUsers[0];
  122. let body = {
  123. id: user.id,
  124. username: user.username,
  125. token: user.username // We use the username as token to diferentiate which user is authenticated
  126. };
  127.  
  128. return of(new HttpResponse({ status: 200, body: body }));
  129. } else {
  130. // else return 400 bad request
  131. return throwError({ error: { message: 'Username or password is incorrect' } });
  132. }
  133. }
  134.  
  135.  
  136.  
  137. // logout
  138. if (request.url.includes(`${environment.API_BASE_URL}${environment.API_Logout}`) && request.method === 'POST') {
  139. // Always return success in this mock
  140. let body = {};
  141. return of(new HttpResponse({ status: 200, body: body }));
  142. }
  143.  
  144.  
  145.  
  146.  
  147.  
  148.  
  149. // get events
  150. if (request.url.includes(`${environment.API_BASE_URL}${environment.API_GetAllEvents}`) && request.method === 'GET') {
  151. if (user) {
  152. return of(new HttpResponse({ status: 200, body: events }));
  153. } else {
  154. // return 401 not authorised if token is null or invalid
  155. return throwError({ error: { message: 'Unauthorised' } });
  156. }
  157. }
  158.  
  159.  
  160.  
  161. // create event
  162. if (request.url.includes(`${environment.API_BASE_URL}${environment.API_CreateEvent}`) && request.method === 'POST') {
  163. if (user) {
  164.  
  165. // get new event object from post body
  166. let newEvent = request.body;
  167.  
  168. // validation
  169. if (!newEvent.description) {
  170. return throwError({ error: { message: 'Description cannot be empty' } });
  171. }
  172.  
  173. // save new event
  174. allEvents[username] = allEvents[username] || [];
  175. newEvent.id = allEvents[username].length + 1;
  176. events.push(newEvent);
  177. allEvents[username] = events;
  178. localStorage.setItem('events', JSON.stringify(allEvents));
  179.  
  180. let body = newEvent;
  181. // respond 200 OK
  182. return of(new HttpResponse({ status: 200, body: body }));
  183.  
  184. } else {
  185. // return 401 not authorised if token is null or invalid
  186. return throwError({ error: { message: 'Unauthorised' } });
  187. }
  188. }
  189.  
  190.  
  191.  
  192.  
  193.  
  194.  
  195.  
  196. // update event
  197. if (request.url.includes(`${environment.API_BASE_URL}${environment.API_UpdateEvent}`) && request.method === 'PUT') {
  198. if (user) {
  199.  
  200. // get new event object from post body
  201. let changedEvent = request.body;
  202.  
  203. // validation
  204. if (!changedEvent.id) {
  205. return throwError({ error: { message: 'Id cannot be empty' } });
  206. }
  207. if (!changedEvent.description) {
  208. return throwError({ error: { message: 'Description cannot be empty' } });
  209. }
  210.  
  211. // find event by id in events array
  212. for (let i = 0; i < events.length; i++) {
  213. if (events[i].id === changedEvent.id) {
  214. // update event
  215.  
  216. allEvents[username][i] = changedEvent;
  217. localStorage.setItem('events', JSON.stringify(allEvents));
  218. break;
  219. }
  220. }
  221.  
  222. // respond 200 OK
  223. return of(new HttpResponse({ status: 200 }));
  224.  
  225. } else {
  226. // return 401 not authorised if token is null or invalid
  227. return throwError({ error: { message: 'Unauthorised' } });
  228. }
  229. }
  230.  
  231.  
  232.  
  233. // remove event
  234. if (request.url.includes(`${environment.API_BASE_URL}${environment.API_RemoveEvent}`) && request.method === 'DELETE') {
  235. if (user) {
  236. // find event by id in events array
  237. let urlParts = request.url.split('/');
  238. let id = parseInt(urlParts[urlParts.length - 1]);
  239. for (let i = 0; i < events.length; i++) {
  240. let event = events[i];
  241. if (event.id === id) {
  242. // delete event
  243. events.splice(i, 1);
  244. allEvents[username] = events;
  245. localStorage.setItem('events', JSON.stringify(allEvents));
  246. break;
  247. }
  248. }
  249.  
  250. // respond 200 OK
  251. return of(new HttpResponse({ status: 200 }));
  252. } else {
  253. // return 401 not authorised if token is null or invalid
  254. return throwError({ error: { message: 'Unauthorised' } });
  255. }
  256. }
  257.  
  258.  
  259.  
  260.  
  261.  
  262. // pass through any requests not handled above
  263. return next.handle(request);
  264.  
  265. }))
  266.  
  267. // call materialize and dematerialize to ensure delay even if an error is thrown (https://github.com/Reactive-Extensions/RxJS/issues/648)
  268. .pipe(materialize())
  269. .pipe(delay(200))
  270. .pipe(dematerialize());
  271. }
  272. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement