Skip to content

Commit a9c1a20

Browse files
committed
Fixed issue affecting angular-cli
Moved fake backend factory function into exported function to resolve issue with angular-cli build
1 parent 3c53ee7 commit a9c1a20

File tree

1 file changed

+131
-129
lines changed

1 file changed

+131
-129
lines changed

app/_helpers/fake-backend.ts

Lines changed: 131 additions & 129 deletions
Original file line numberDiff line numberDiff line change
@@ -1,154 +1,156 @@
11
import { Http, BaseRequestOptions, Response, ResponseOptions, RequestMethod, XHRBackend, RequestOptions } from '@angular/http';
22
import { MockBackend, MockConnection } from '@angular/http/testing';
33

4-
export let fakeBackendProvider = {
5-
// use fake backend in place of Http service for backend-less development
6-
provide: Http,
7-
useFactory: function (backend: MockBackend, options: BaseRequestOptions, realBackend: XHRBackend) {
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-
}
4+
export function fakeBackendFactory(backend: MockBackend, options: BaseRequestOptions, realBackend: XHRBackend) {
5+
// array in local storage for registered users
6+
let users: any[] = JSON.parse(localStorage.getItem('users')) || [];
7+
8+
// configure fake backend
9+
backend.connections.subscribe((connection: MockConnection) => {
10+
// wrap in timeout to simulate server api call
11+
setTimeout(() => {
12+
13+
// authenticate
14+
if (connection.request.url.endsWith('/api/authenticate') && connection.request.method === RequestMethod.Post) {
15+
// get parameters from post request
16+
let params = JSON.parse(connection.request.getBody());
17+
18+
// find if any user matches login credentials
19+
let filteredUsers = users.filter(user => {
20+
return user.username === params.username && user.password === params.password;
21+
});
4322

44-
return;
23+
if (filteredUsers.length) {
24+
// if login details are valid return 200 OK with user details and fake jwt token
25+
let user = filteredUsers[0];
26+
connection.mockRespond(new Response(new ResponseOptions({
27+
status: 200,
28+
body: {
29+
id: user.id,
30+
username: user.username,
31+
firstName: user.firstName,
32+
lastName: user.lastName,
33+
token: 'fake-jwt-token'
34+
}
35+
})));
36+
} else {
37+
// else return 400 bad request
38+
connection.mockError(new Error('Username or password is incorrect'));
4539
}
4640

47-
// get users
48-
if (connection.request.url.endsWith('/api/users') && connection.request.method === RequestMethod.Get) {
49-
// check for fake auth token in header and return users if valid, this security is implemented server side in a real application
50-
if (connection.request.headers.get('Authorization') === 'Bearer fake-jwt-token') {
51-
connection.mockRespond(new Response(new ResponseOptions({ status: 200, body: users })));
52-
} else {
53-
// return 401 not authorised if token is null or invalid
54-
connection.mockRespond(new Response(new ResponseOptions({ status: 401 })));
55-
}
56-
57-
return;
41+
return;
42+
}
43+
44+
// get users
45+
if (connection.request.url.endsWith('/api/users') && connection.request.method === RequestMethod.Get) {
46+
// check for fake auth token in header and return users if valid, this security is implemented server side in a real application
47+
if (connection.request.headers.get('Authorization') === 'Bearer fake-jwt-token') {
48+
connection.mockRespond(new Response(new ResponseOptions({ status: 200, body: users })));
49+
} else {
50+
// return 401 not authorised if token is null or invalid
51+
connection.mockRespond(new Response(new ResponseOptions({ status: 401 })));
5852
}
5953

60-
// get user by id
61-
if (connection.request.url.match(/\/api\/users\/\d+$/) && connection.request.method === RequestMethod.Get) {
62-
// check for fake auth token in header and return user if valid, this security is implemented server side in a real application
63-
if (connection.request.headers.get('Authorization') === 'Bearer fake-jwt-token') {
64-
// find user by id in users array
65-
let urlParts = connection.request.url.split('/');
66-
let id = parseInt(urlParts[urlParts.length - 1]);
67-
let matchedUsers = users.filter(user => { return user.id === id; });
68-
let user = matchedUsers.length ? matchedUsers[0] : null;
69-
70-
// respond 200 OK with user
71-
connection.mockRespond(new Response(new ResponseOptions({ status: 200, body: user })));
72-
} else {
73-
// return 401 not authorised if token is null or invalid
74-
connection.mockRespond(new Response(new ResponseOptions({ status: 401 })));
75-
}
76-
77-
return;
54+
return;
55+
}
56+
57+
// get user by id
58+
if (connection.request.url.match(/\/api\/users\/\d+$/) && connection.request.method === RequestMethod.Get) {
59+
// check for fake auth token in header and return user if valid, this security is implemented server side in a real application
60+
if (connection.request.headers.get('Authorization') === 'Bearer fake-jwt-token') {
61+
// find user by id in users array
62+
let urlParts = connection.request.url.split('/');
63+
let id = parseInt(urlParts[urlParts.length - 1]);
64+
let matchedUsers = users.filter(user => { return user.id === id; });
65+
let user = matchedUsers.length ? matchedUsers[0] : null;
66+
67+
// respond 200 OK with user
68+
connection.mockRespond(new Response(new ResponseOptions({ status: 200, body: user })));
69+
} else {
70+
// return 401 not authorised if token is null or invalid
71+
connection.mockRespond(new Response(new ResponseOptions({ status: 401 })));
7872
}
7973

80-
// create user
81-
if (connection.request.url.endsWith('/api/users') && connection.request.method === RequestMethod.Post) {
82-
// get new user object from post body
83-
let newUser = JSON.parse(connection.request.getBody());
84-
85-
// validation
86-
let duplicateUser = users.filter(user => { return user.username === newUser.username; }).length;
87-
if (duplicateUser) {
88-
return connection.mockError(new Error('Username "' + newUser.username + '" is already taken'));
89-
}
90-
91-
// save new user
92-
newUser.id = users.length + 1;
93-
users.push(newUser);
94-
localStorage.setItem('users', JSON.stringify(users));
74+
return;
75+
}
9576

96-
// respond 200 OK
97-
connection.mockRespond(new Response(new ResponseOptions({ status: 200 })));
77+
// create user
78+
if (connection.request.url.endsWith('/api/users') && connection.request.method === RequestMethod.Post) {
79+
// get new user object from post body
80+
let newUser = JSON.parse(connection.request.getBody());
9881

99-
return;
82+
// validation
83+
let duplicateUser = users.filter(user => { return user.username === newUser.username; }).length;
84+
if (duplicateUser) {
85+
return connection.mockError(new Error('Username "' + newUser.username + '" is already taken'));
10086
}
10187

102-
// delete user
103-
if (connection.request.url.match(/\/api\/users\/\d+$/) && connection.request.method === RequestMethod.Delete) {
104-
// check for fake auth token in header and return user if valid, this security is implemented server side in a real application
105-
if (connection.request.headers.get('Authorization') === 'Bearer fake-jwt-token') {
106-
// find user by id in users array
107-
let urlParts = connection.request.url.split('/');
108-
let id = parseInt(urlParts[urlParts.length - 1]);
109-
for (let i = 0; i < users.length; i++) {
110-
let user = users[i];
111-
if (user.id === id) {
112-
// delete user
113-
users.splice(i, 1);
114-
localStorage.setItem('users', JSON.stringify(users));
115-
break;
116-
}
88+
// save new user
89+
newUser.id = users.length + 1;
90+
users.push(newUser);
91+
localStorage.setItem('users', JSON.stringify(users));
92+
93+
// respond 200 OK
94+
connection.mockRespond(new Response(new ResponseOptions({ status: 200 })));
95+
96+
return;
97+
}
98+
99+
// delete user
100+
if (connection.request.url.match(/\/api\/users\/\d+$/) && connection.request.method === RequestMethod.Delete) {
101+
// check for fake auth token in header and return user if valid, this security is implemented server side in a real application
102+
if (connection.request.headers.get('Authorization') === 'Bearer fake-jwt-token') {
103+
// find user by id in users array
104+
let urlParts = connection.request.url.split('/');
105+
let id = parseInt(urlParts[urlParts.length - 1]);
106+
for (let i = 0; i < users.length; i++) {
107+
let user = users[i];
108+
if (user.id === id) {
109+
// delete user
110+
users.splice(i, 1);
111+
localStorage.setItem('users', JSON.stringify(users));
112+
break;
117113
}
118-
119-
// respond 200 OK
120-
connection.mockRespond(new Response(new ResponseOptions({ status: 200 })));
121-
} else {
122-
// return 401 not authorised if token is null or invalid
123-
connection.mockRespond(new Response(new ResponseOptions({ status: 401 })));
124114
}
125115

126-
return;
116+
// respond 200 OK
117+
connection.mockRespond(new Response(new ResponseOptions({ status: 200 })));
118+
} else {
119+
// return 401 not authorised if token is null or invalid
120+
connection.mockRespond(new Response(new ResponseOptions({ status: 401 })));
127121
}
128122

129-
// pass through any requests not handled above
130-
let realHttp = new Http(realBackend, options);
131-
let requestOptions = new RequestOptions({
132-
method: connection.request.method,
133-
headers: connection.request.headers,
134-
body: connection.request.getBody(),
135-
url: connection.request.url,
136-
withCredentials: connection.request.withCredentials,
137-
responseType: connection.request.responseType
123+
return;
124+
}
125+
126+
// pass through any requests not handled above
127+
let realHttp = new Http(realBackend, options);
128+
let requestOptions = new RequestOptions({
129+
method: connection.request.method,
130+
headers: connection.request.headers,
131+
body: connection.request.getBody(),
132+
url: connection.request.url,
133+
withCredentials: connection.request.withCredentials,
134+
responseType: connection.request.responseType
135+
});
136+
realHttp.request(connection.request.url, requestOptions)
137+
.subscribe((response: Response) => {
138+
connection.mockRespond(response);
139+
},
140+
(error: any) => {
141+
connection.mockError(error);
138142
});
139-
realHttp.request(connection.request.url, requestOptions)
140-
.subscribe((response: Response) => {
141-
connection.mockRespond(response);
142-
},
143-
(error: any) => {
144-
connection.mockError(error);
145-
});
146143

147-
}, 500);
144+
}, 500);
145+
146+
});
148147

149-
});
148+
return new Http(backend, options);
149+
};
150150

151-
return new Http(backend, options);
152-
},
151+
export let fakeBackendProvider = {
152+
// use fake backend in place of Http service for backend-less development
153+
provide: Http,
154+
useFactory: fakeBackendFactory,
153155
deps: [MockBackend, BaseRequestOptions, XHRBackend]
154156
};

0 commit comments

Comments
 (0)