Skip to content

Commit 4dbeae2

Browse files
committed
a bit of refactoring
1 parent b2c9fbb commit 4dbeae2

File tree

17 files changed

+101
-109
lines changed

17 files changed

+101
-109
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,4 @@
3737
"webpack-cli": "^3.1.2",
3838
"webpack-dev-server": "^3.7.0"
3939
}
40-
}
40+
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
<div *ngIf="message" [ngClass]="{ 'alert': message, 'alert-success': message.type === 'success', 'alert-danger': message.type === 'error' }">{{message.text}}</div>
1+
<div *ngIf="message" [ngClass]="message.cssClass">{{message.text}}</div>

src/app/_components/alert.component.ts

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,27 @@ import { Subscription } from 'rxjs';
33

44
import { AlertService } from '@/_services';
55

6-
@Component({
7-
selector: 'alert',
8-
templateUrl: 'alert.component.html'
9-
})
10-
6+
@Component({ selector: 'alert', templateUrl: 'alert.component.html' })
117
export class AlertComponent implements OnInit, OnDestroy {
128
private subscription: Subscription;
139
message: any;
1410

1511
constructor(private alertService: AlertService) { }
1612

1713
ngOnInit() {
18-
this.subscription = this.alertService.getMessage().subscribe(message => {
19-
this.message = message;
20-
});
14+
this.subscription = this.alertService.getAlert()
15+
.subscribe(message => {
16+
switch (message && message.type) {
17+
case 'success':
18+
message.cssClass = 'alert alert-success';
19+
break;
20+
case 'error':
21+
message.cssClass = 'alert alert-danger';
22+
break;
23+
}
24+
25+
this.message = message;
26+
});
2127
}
2228

2329
ngOnDestroy() {

src/app/_guards/index.ts

Lines changed: 0 additions & 1 deletion
This file was deleted.
File renamed without changes.

src/app/_helpers/fake-backend.ts

Lines changed: 20 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,12 @@ export class FakeBackendInterceptor implements HttpInterceptor {
2020

2121
function handleRoute() {
2222
switch (true) {
23-
case url.endsWith('/users/register') && method === 'POST':
24-
return register();
2523
case url.endsWith('/users/authenticate') && method === 'POST':
2624
return authenticate();
25+
case url.endsWith('/users/register') && method === 'POST':
26+
return register();
2727
case url.endsWith('/users') && method === 'GET':
2828
return getUsers();
29-
case url.match(/\/users\/\d+$/) && method === 'GET':
30-
return getUserById();
3129
case url.match(/\/users\/\d+$/) && method === 'DELETE':
3230
return deleteUser();
3331
default:
@@ -38,6 +36,19 @@ export class FakeBackendInterceptor implements HttpInterceptor {
3836

3937
// route functions
4038

39+
function authenticate() {
40+
const { username, password } = body;
41+
const user = users.find(x => x.username === username && x.password === password);
42+
if (!user) return error('Username or password is incorrect');
43+
return ok({
44+
id: user.id,
45+
username: user.username,
46+
firstName: user.firstName,
47+
lastName: user.lastName,
48+
token: 'fake-jwt-token'
49+
})
50+
}
51+
4152
function register() {
4253
const user = body
4354

@@ -52,31 +63,11 @@ export class FakeBackendInterceptor implements HttpInterceptor {
5263
return ok();
5364
}
5465

55-
function authenticate() {
56-
const { username, password } = body;
57-
const user = users.find(x => x.username === username && x.password === password);
58-
if (!user) return error('Username or password is incorrect');
59-
return ok({
60-
id: user.id,
61-
username: user.username,
62-
firstName: user.firstName,
63-
lastName: user.lastName,
64-
token: 'fake-jwt-token'
65-
})
66-
}
67-
6866
function getUsers() {
6967
if (!isLoggedIn()) return unauthorized();
7068
return ok(users);
7169
}
7270

73-
function getUserById() {
74-
if (!isLoggedIn()) return unauthorized();
75-
76-
const user = users.find(x => x.id == idFromUrl());
77-
return ok(user);
78-
}
79-
8071
function deleteUser() {
8172
if (!isLoggedIn()) return unauthorized();
8273

@@ -91,14 +82,14 @@ export class FakeBackendInterceptor implements HttpInterceptor {
9182
return of(new HttpResponse({ status: 200, body }))
9283
}
9384

94-
function unauthorized() {
95-
return throwError({ status: 401, error: { message: 'Unauthorised' } });
96-
}
97-
9885
function error(message) {
9986
return throwError({ error: { message } });
10087
}
10188

89+
function unauthorized() {
90+
return throwError({ status: 401, error: { message: 'Unauthorised' } });
91+
}
92+
10293
function isLoggedIn() {
10394
return headers.get('Authorization') === 'Bearer fake-jwt-token';
10495
}
@@ -115,4 +106,4 @@ export const fakeBackendProvider = {
115106
provide: HTTP_INTERCEPTORS,
116107
useClass: FakeBackendInterceptor,
117108
multi: true
118-
};
109+
};

src/app/_helpers/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1-
export * from './error.interceptor';
1+
export * from './auth.guard';
2+
export * from './error.interceptor';
23
export * from './jwt.interceptor';
34
export * from './fake-backend';

src/app/_services/alert.service.ts

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,34 +5,39 @@ import { Observable, Subject } from 'rxjs';
55
@Injectable({ providedIn: 'root' })
66
export class AlertService {
77
private subject = new Subject<any>();
8-
private keepAfterNavigationChange = false;
8+
private keepAfterRouteChange = false;
99

1010
constructor(private router: Router) {
11-
// clear alert message on route change
12-
router.events.subscribe(event => {
11+
// clear alert messages on route change unless 'keepAfterRouteChange' flag is true
12+
this.router.events.subscribe(event => {
1313
if (event instanceof NavigationStart) {
14-
if (this.keepAfterNavigationChange) {
15-
// only keep for a single location change
16-
this.keepAfterNavigationChange = false;
14+
if (this.keepAfterRouteChange) {
15+
// only keep for a single route change
16+
this.keepAfterRouteChange = false;
1717
} else {
18-
// clear alert
19-
this.subject.next();
18+
// clear alert message
19+
this.clear();
2020
}
2121
}
2222
});
2323
}
2424

25-
success(message: string, keepAfterNavigationChange = false) {
26-
this.keepAfterNavigationChange = keepAfterNavigationChange;
25+
getAlert(): Observable<any> {
26+
return this.subject.asObservable();
27+
}
28+
29+
success(message: string, keepAfterRouteChange = false) {
30+
this.keepAfterRouteChange = keepAfterRouteChange;
2731
this.subject.next({ type: 'success', text: message });
2832
}
2933

30-
error(message: string, keepAfterNavigationChange = false) {
31-
this.keepAfterNavigationChange = keepAfterNavigationChange;
34+
error(message: string, keepAfterRouteChange = false) {
35+
this.keepAfterRouteChange = keepAfterRouteChange;
3236
this.subject.next({ type: 'error', text: message });
3337
}
3438

35-
getMessage(): Observable<any> {
36-
return this.subject.asObservable();
39+
clear() {
40+
// clear by calling subject.next() without parameters
41+
this.subject.next();
3742
}
3843
}

src/app/_services/authentication.service.ts

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,22 +19,18 @@ export class AuthenticationService {
1919
return this.currentUserSubject.value;
2020
}
2121

22-
login(username: string, password: string) {
22+
login(username, password) {
2323
return this.http.post<any>(`${config.apiUrl}/users/authenticate`, { username, password })
2424
.pipe(map(user => {
25-
// login successful if there's a jwt token in the response
26-
if (user && user.token) {
27-
// store user details and jwt token in local storage to keep user logged in between page refreshes
28-
localStorage.setItem('currentUser', JSON.stringify(user));
29-
this.currentUserSubject.next(user);
30-
}
31-
25+
// store user details and jwt token in local storage to keep user logged in between page refreshes
26+
localStorage.setItem('currentUser', JSON.stringify(user));
27+
this.currentUserSubject.next(user);
3228
return user;
3329
}));
3430
}
3531

3632
logout() {
37-
// remove user from local storage to log user out
33+
// remove user from local storage and set current user to null
3834
localStorage.removeItem('currentUser');
3935
this.currentUserSubject.next(null);
4036
}

src/app/_services/user.service.ts

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,10 @@ export class UserService {
1111
return this.http.get<User[]>(`${config.apiUrl}/users`);
1212
}
1313

14-
getById(id: number) {
15-
return this.http.get(`${config.apiUrl}/users/${id}`);
16-
}
17-
1814
register(user: User) {
1915
return this.http.post(`${config.apiUrl}/users/register`, user);
2016
}
2117

22-
update(user: User) {
23-
return this.http.put(`${config.apiUrl}/users/${user.id}`, user);
24-
}
25-
2618
delete(id: number) {
2719
return this.http.delete(`${config.apiUrl}/users/${id}`);
2820
}

0 commit comments

Comments
 (0)