Advertisement
Guest User

Untitled

a guest
Mar 24th, 2017
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import { Http, BaseRequestOptions, Response, ResponseOptions, RequestMethod } from '@angular/http';
  2. import { MockBackend, MockConnection } from '@angular/http/testing';
  3.  
  4. export let fakeBackendProvider = {
  5.   // use fake backend in place of Http service for backend-less development
  6.   provide: Http,
  7.   useFactory: (backend: MockBackend, options: BaseRequestOptions) => {
  8.     // array in local storage for registered users
  9.     let users: any[] = JSON.parse(localStorage.getItem('users')) || [];
  10.  
  11.     // configure fake backend
  12.     backend.connections.subscribe((connection: MockConnection) => {
  13.       // wrap in timeout to simulate server api call
  14.       setTimeout(() => {
  15.  
  16.         // authenticate
  17.         if (connection.request.url.endsWith('/api/authenticate') && connection.request.method === RequestMethod.Post) {
  18.           // get parameters from post request
  19.           let params = JSON.parse(connection.request.getBody());
  20.  
  21.           // find if any user matches login credentials
  22.           let filteredUsers = users.filter(user => {
  23.             return user.username === params.username && user.password === params.password;
  24.           });
  25.  
  26.           if (filteredUsers.length) {
  27.             // if login details are valid return 200 OK with user details and fake jwt token
  28.             let user = filteredUsers[0];
  29.             connection.mockRespond(new Response(new ResponseOptions({
  30.               status: 200,
  31.               body: {
  32.                 id: user.id,
  33.                 username: user.username,
  34.                 firstName: user.firstName,
  35.                 lastName: user.lastName,
  36.                 token: 'fake-jwt-token'
  37.               }
  38.             })));
  39.           } else {
  40.             // else return 400 bad request
  41.             connection.mockError(new Error('Username or password is incorrect'));
  42.           }
  43.         }
  44.  
  45.         // get users
  46.         if (connection.request.url.endsWith('/api/users') && connection.request.method === RequestMethod.Get) {
  47.           // check for fake auth token in header and return users if valid, this security is implemented server side in a real application
  48.           if (connection.request.headers.get('Authorization') === 'Bearer fake-jwt-token') {
  49.             connection.mockRespond(new Response(new ResponseOptions({ status: 200, body: users })));
  50.           } else {
  51.             // return 401 not authorised if token is null or invalid
  52.             connection.mockRespond(new Response(new ResponseOptions({ status: 401 })));
  53.           }
  54.         }
  55.  
  56.         // get user by id
  57.         if (connection.request.url.match(/\/api\/users\/\d+$/) && connection.request.method === RequestMethod.Get) {
  58.           // check for fake auth token in header and return user if valid, this security is implemented server side in a real application
  59.           if (connection.request.headers.get('Authorization') === 'Bearer fake-jwt-token') {
  60.             // find user by id in users array
  61.             let urlParts = connection.request.url.split('/');
  62.             let id = parseInt(urlParts[urlParts.length - 1]);
  63.             let matchedUsers = users.filter(user => { return user.id === id; });
  64.             let user = matchedUsers.length ? matchedUsers[0] : null;
  65.  
  66.             // respond 200 OK with user
  67.             connection.mockRespond(new Response(new ResponseOptions({ status: 200, body: user })));
  68.           } else {
  69.             // return 401 not authorised if token is null or invalid
  70.             connection.mockRespond(new Response(new ResponseOptions({ status: 401 })));
  71.           }
  72.         }
  73.  
  74.         // create user
  75.         if (connection.request.url.endsWith('/api/users') && connection.request.method === RequestMethod.Post) {
  76.           // get new user object from post body
  77.           let newUser = JSON.parse(connection.request.getBody());
  78.  
  79.           // validation
  80.           let duplicateUser = users.filter(user => { return user.username === newUser.username; }).length;
  81.           if (duplicateUser) {
  82.             return connection.mockError(new Error('Username "' + newUser.username + '" is already taken'));
  83.           }
  84.  
  85.           // save new user
  86.           newUser.id = users.length + 1;
  87.           users.push(newUser);
  88.           localStorage.setItem('users', JSON.stringify(users));
  89.  
  90.           // respond 200 OK
  91.           connection.mockRespond(new Response(new ResponseOptions({ status: 200 })));
  92.         }
  93.  
  94.         // delete user
  95.         if (connection.request.url.match(/\/api\/users\/\d+$/) && connection.request.method === RequestMethod.Delete) {
  96.           // check for fake auth token in header and return user if valid, this security is implemented server side in a real application
  97.           if (connection.request.headers.get('Authorization') === 'Bearer fake-jwt-token') {
  98.             // find user by id in users array
  99.             let urlParts = connection.request.url.split('/');
  100.             let id = parseInt(urlParts[urlParts.length - 1]);
  101.             for (let i = 0; i < users.length; i++) {
  102.               let user = users[i];
  103.               if (user.id === id) {
  104.                 // delete user
  105.                 users.splice(i, 1);
  106.                 localStorage.setItem('users', JSON.stringify(users));
  107.                 break;
  108.               }
  109.             }
  110.  
  111.             // respond 200 OK
  112.             connection.mockRespond(new Response(new ResponseOptions({ status: 200 })));
  113.           } else {
  114.             // return 401 not authorised if token is null or invalid
  115.             connection.mockRespond(new Response(new ResponseOptions({ status: 401 })));
  116.           }
  117.         }
  118.  
  119.       }, 500);
  120.  
  121.     });
  122.  
  123.     return new Http(backend, options);
  124.   },
  125.   deps: [MockBackend, BaseRequestOptions]
  126. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement