Skip to content

Commit 9024a4f

Browse files
committed
feat: add mappings
1 parent 966f4f1 commit 9024a4f

8 files changed

Lines changed: 145 additions & 81 deletions

File tree

angular-ngrx-scss/src/app/state/auth/auth.effects.ts

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import {
2626
userTokenExists,
2727
} from './auth.actions';
2828
import { selectAuthUserName } from './auth.selectors';
29-
import { AuthUserData } from './auth.state';
29+
import { userApiToAuthUserData } from './auth.mappings';
3030

3131
@Injectable()
3232
export class AuthEffects {
@@ -81,13 +81,9 @@ export class AuthEffects {
8181
distinctUntilChanged(),
8282
exhaustMap(() =>
8383
this.userService.getAuthenticatedUserInfo().pipe(
84-
map((userData) => {
85-
const user: AuthUserData = {
86-
avatar: userData.avatar_url,
87-
email: userData.email,
88-
username: userData.login,
89-
};
90-
return fetchAuthenticatedUserDataSuccess({ userData: user });
84+
map((apiResponse) => {
85+
const userData = userApiToAuthUserData(apiResponse);
86+
return fetchAuthenticatedUserDataSuccess({ userData });
9187
}),
9288
catchError((error) =>
9389
of(fetchAuthenticatedUserDataFailure({ error })),
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { UserApiResponse } from '../user';
2+
import { AuthUserData } from './auth.state';
3+
4+
export function userApiToAuthUserData(
5+
apiResponse: UserApiResponse,
6+
): AuthUserData {
7+
return {
8+
avatar: apiResponse.avatar_url,
9+
email: apiResponse.email,
10+
username: apiResponse.login,
11+
};
12+
}

angular-ngrx-scss/src/app/state/profile/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ export * from './profile.effects';
33
export * from './profile.reducer';
44
export * from './profile.selectors';
55
export * from './profile.state';
6+
export * from './profile.mappings';

angular-ngrx-scss/src/app/state/profile/profile.effects.ts

Lines changed: 7 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,12 @@ import { Injectable } from '@angular/core';
22
import { Actions, createEffect, ofType } from '@ngrx/effects';
33
import { catchError, combineLatest, map, of, switchMap } from 'rxjs';
44
import { UserService } from 'src/app/user/services/user.service';
5-
import { UserState } from '../user';
65
import {
76
fetchProfile,
87
fetchProfileFailure,
98
fetchProfileSuccess,
109
} from './profile.actions';
11-
import { UserOrgsState, UserReposState } from './profile.state';
10+
import { profileApiToUserStateMapping } from './profile.mappings';
1211

1312
@Injectable()
1413
export class ProfileEffects {
@@ -22,49 +21,12 @@ export class ProfileEffects {
2221
this.userService.getUserRepos(username),
2322
]).pipe(
2423
map(([userData, orgsData, reposData]) => {
25-
const user: UserState = {
26-
avatar: userData.avatar_url,
27-
bio: userData.bio,
28-
blog: userData.blog,
29-
company: userData.company,
30-
email: userData.email,
31-
followers: userData.followers,
32-
following: userData.following,
33-
location: userData.location,
34-
name: userData.name,
35-
twitterUsername: userData.twitter_username,
36-
username: userData.login,
37-
type: userData.type,
38-
};
39-
const orgs: UserOrgsState[] = orgsData.map((org) => ({
40-
id: org.id,
41-
login: org.login,
42-
avatar_url: org.avatar_url,
43-
}));
44-
const repos: UserReposState[] = reposData.map((repo) => ({
45-
name: repo.name,
46-
description: repo.description,
47-
language: repo.language,
48-
stargazers_count: repo.stargazers_count,
49-
forks_count: repo.forks_count,
50-
private: repo.private,
51-
updated_at: repo.updated_at,
52-
fork: repo.fork,
53-
archived: repo.archived,
54-
license: repo.license
55-
? {
56-
key: repo.license.key,
57-
name: repo.license.name,
58-
spdx_id: repo.license.spdx_id,
59-
url: repo.license.url,
60-
node_id: repo.license.node_id,
61-
}
62-
: null,
63-
owner: {
64-
login: repo.owner.login,
65-
},
66-
}));
67-
return fetchProfileSuccess({ data: { user, orgs, repos } });
24+
const data = profileApiToUserStateMapping(
25+
userData,
26+
orgsData,
27+
reposData,
28+
);
29+
return fetchProfileSuccess({ data });
6830
}),
6931
catchError((error) => {
7032
console.error(error);
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import { UserApiResponse, UserState } from '../user';
2+
import {
3+
ProfileState,
4+
UserOrgsApiResponse,
5+
UserOrgsState,
6+
UserReposApiResponse,
7+
UserReposState,
8+
} from './profile.state';
9+
10+
export function profileApiToUserStateMapping(
11+
userData: UserApiResponse,
12+
orgsData: UserOrgsApiResponse,
13+
reposData: UserReposApiResponse,
14+
): ProfileState {
15+
const user: UserState = {
16+
avatar: userData.avatar_url,
17+
bio: userData.bio,
18+
blog: userData.blog,
19+
company: userData.company,
20+
email: userData.email,
21+
followers: userData.followers,
22+
following: userData.following,
23+
location: userData.location,
24+
name: userData.name,
25+
twitterUsername: userData.twitter_username,
26+
username: userData.login,
27+
type: userData.type,
28+
};
29+
const orgs: UserOrgsState[] = orgsData.map((org) => ({
30+
id: org.id,
31+
login: org.login,
32+
avatar_url: org.avatar_url,
33+
}));
34+
const repos: UserReposState[] = reposData.map((repo) => ({
35+
name: repo.name,
36+
description: repo.description,
37+
language: repo.language,
38+
stargazers_count: repo.stargazers_count,
39+
forks_count: repo.forks_count,
40+
private: repo.private,
41+
updated_at: repo.updated_at,
42+
fork: repo.fork,
43+
archived: repo.archived,
44+
license: repo.license
45+
? {
46+
key: repo.license.key,
47+
name: repo.license.name,
48+
spdx_id: repo.license.spdx_id,
49+
url: repo.license.url,
50+
node_id: repo.license.node_id,
51+
}
52+
: null,
53+
owner: {
54+
login: repo.owner.login,
55+
},
56+
}));
57+
58+
return { user, orgs, repos };
59+
}

angular-ngrx-scss/src/app/state/repository/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ export * from './repository.effects';
33
export * from './repository.reducer';
44
export * from './repository.selectors';
55
export * from './repository.state';
6+
export * from './repository.mappings';

angular-ngrx-scss/src/app/state/repository/repository.effects.ts

Lines changed: 14 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ import {
1818
fetchRepositoryFailure,
1919
fetchRepositorySuccess,
2020
} from './repository.actions';
21-
import { FileContents, RepositoryState } from './repository.state';
21+
import { FileContents } from './repository.state';
22+
import { reposApiToRepoStateMapping } from './repository.mappings';
2223

2324
@Injectable()
2425
export class RepositoryEffects {
@@ -64,33 +65,18 @@ export class RepositoryEffects {
6465
repoLabels$,
6566
).pipe(
6667
map(([info, prCount, contents, readme, milestones, labels]) => {
67-
const allData: RepositoryState = {
68-
path: path ?? '',
69-
description: info.description,
70-
forkCount: info.forks_count,
71-
issueCount: info.open_issues_count,
72-
ownerName: owner,
73-
prCount: prCount,
74-
repoName: info.name,
75-
starCount: info.stargazers_count,
76-
tags: info.topics,
77-
tree: contents,
78-
activeBranch: branch ?? info.default_branch,
79-
selectedFile: null,
80-
openPullRequests: null,
81-
closedPullRequests: null,
82-
openIssues: null,
83-
closedIssues: null,
84-
visibility: info.visibility,
85-
watchCount: info.watchers_count,
86-
website: info.homepage,
87-
readme: readme?.content || '',
88-
milestones: milestones || [],
89-
labels: labels || [],
90-
pullsFilterParams: null,
91-
issuesFilterParams: null,
92-
};
93-
return fetchRepositorySuccess({ repoData: allData });
68+
const repoData = reposApiToRepoStateMapping(
69+
info,
70+
prCount,
71+
contents,
72+
readme,
73+
milestones,
74+
labels,
75+
owner,
76+
path,
77+
branch,
78+
);
79+
return fetchRepositorySuccess({ repoData });
9480
}),
9581
catchError((error) => of(fetchRepositoryFailure({ error }))),
9682
);
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import {
2+
IssueLabel,
3+
Milestone,
4+
ReadmeApiResponse,
5+
RepoApiResponse,
6+
RepoContentsApiResponse,
7+
RepositoryState,
8+
} from './repository.state';
9+
10+
export function reposApiToRepoStateMapping(
11+
info: RepoApiResponse,
12+
prCount: number,
13+
contents: RepoContentsApiResponse[],
14+
readme: ReadmeApiResponse | null,
15+
milestones: Milestone[],
16+
labels: IssueLabel[],
17+
owner: string,
18+
path?: string,
19+
branch?: string,
20+
): RepositoryState {
21+
return {
22+
path: path ?? '',
23+
description: info.description,
24+
forkCount: info.forks_count,
25+
issueCount: info.open_issues_count,
26+
ownerName: owner,
27+
prCount: prCount,
28+
repoName: info.name,
29+
starCount: info.stargazers_count,
30+
tags: info.topics,
31+
tree: contents,
32+
activeBranch: branch ?? info.default_branch,
33+
selectedFile: null,
34+
openPullRequests: null,
35+
closedPullRequests: null,
36+
openIssues: null,
37+
closedIssues: null,
38+
visibility: info.visibility,
39+
watchCount: info.watchers_count,
40+
website: info.homepage,
41+
readme: readme?.content || '',
42+
milestones: milestones || [],
43+
labels: labels || [],
44+
pullsFilterParams: null,
45+
issuesFilterParams: null,
46+
};
47+
}

0 commit comments

Comments
 (0)