From a829cb7e13540d5934c7ca8c623ed2aecc4de7bc Mon Sep 17 00:00:00 2001 From: Kyrylo Petrov Date: Mon, 3 Mar 2025 17:12:33 +0200 Subject: [PATCH 1/3] setup api and mapper --- src/app/app.config.ts | 2 ++ .../core/services/json-api/json-api.entity.ts | 8 +++++ .../services/json-api/json-api.service.ts | 30 +++++++++++++++++++ .../underscore-entites/user/user-us.entity.ts | 13 ++++++++ src/app/core/services/user/user.entity.ts | 4 +++ src/app/core/services/user/user.service.ts | 24 +++++++++++++++ 6 files changed, 81 insertions(+) create mode 100644 src/app/core/services/json-api/json-api.entity.ts create mode 100644 src/app/core/services/json-api/json-api.service.ts create mode 100644 src/app/core/services/json-api/underscore-entites/user/user-us.entity.ts create mode 100644 src/app/core/services/user/user.entity.ts create mode 100644 src/app/core/services/user/user.service.ts diff --git a/src/app/app.config.ts b/src/app/app.config.ts index e1db8f2b7..75242042d 100644 --- a/src/app/app.config.ts +++ b/src/app/app.config.ts @@ -5,6 +5,7 @@ import { provideStore } from '@ngxs/store'; import { withNgxsReduxDevtoolsPlugin } from '@ngxs/devtools-plugin'; import { providePrimeNG } from 'primeng/config'; import Aura from '@primeng/themes/aura'; +import { provideHttpClient } from '@angular/common/http'; export const appConfig: ApplicationConfig = { providers: [ @@ -16,5 +17,6 @@ export const appConfig: ApplicationConfig = { preset: Aura, }, }), + provideHttpClient(), ], }; diff --git a/src/app/core/services/json-api/json-api.entity.ts b/src/app/core/services/json-api/json-api.entity.ts new file mode 100644 index 000000000..ec4610998 --- /dev/null +++ b/src/app/core/services/json-api/json-api.entity.ts @@ -0,0 +1,8 @@ +export interface JsonApiResponse { + data: ApiData | ApiData[]; +} + +export interface ApiData { + id: string | number; + attributes: T; +} diff --git a/src/app/core/services/json-api/json-api.service.ts b/src/app/core/services/json-api/json-api.service.ts new file mode 100644 index 000000000..0a934ab88 --- /dev/null +++ b/src/app/core/services/json-api/json-api.service.ts @@ -0,0 +1,30 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { map, Observable } from 'rxjs'; +import { + ApiData, + JsonApiResponse, +} from '@core/services/json-api/json-api.entity'; + +@Injectable({ + providedIn: 'root', +}) +export class JsonApiService { + constructor(private http: HttpClient) {} + + get(url: string): Observable { + return this.http + .get>(url) + .pipe(map((response) => (response.data as ApiData).attributes)); + } + + getArray(url: string): Observable { + return this.http + .get>(url) + .pipe( + map((response) => + (response.data as ApiData[]).map((item) => item.attributes), + ), + ); + } +} diff --git a/src/app/core/services/json-api/underscore-entites/user/user-us.entity.ts b/src/app/core/services/json-api/underscore-entites/user/user-us.entity.ts new file mode 100644 index 000000000..14f398cac --- /dev/null +++ b/src/app/core/services/json-api/underscore-entites/user/user-us.entity.ts @@ -0,0 +1,13 @@ +import { User } from '@core/services/user/user.entity'; + +export class UserUS { + full_name = ''; + given_name = ''; + + toUser(): User { + return { + fullName: this.full_name, + givenName: this.given_name, + }; + } +} diff --git a/src/app/core/services/user/user.entity.ts b/src/app/core/services/user/user.entity.ts new file mode 100644 index 000000000..6ff2e9419 --- /dev/null +++ b/src/app/core/services/user/user.entity.ts @@ -0,0 +1,4 @@ +export interface User { + fullName: string; + givenName: string; +} diff --git a/src/app/core/services/user/user.service.ts b/src/app/core/services/user/user.service.ts new file mode 100644 index 000000000..9b2e06a3e --- /dev/null +++ b/src/app/core/services/user/user.service.ts @@ -0,0 +1,24 @@ +import { inject, Injectable } from '@angular/core'; +import { map, Observable } from 'rxjs'; +import { JsonApiService } from '@core/services/json-api/json-api.service'; +import { User } from '@core/services/user/user.entity'; +import { UserUS } from '@core/services/json-api/underscore-entites/user/user-us.entity'; + +@Injectable({ + providedIn: 'root', +}) +export class UserService { + jsonApiService = inject(JsonApiService); + + getMe(): Observable { + return this.jsonApiService + .get('https://api.test.osf.io/v2/users/me') + .pipe( + map((response) => { + const userUs = new UserUS(); + Object.assign(userUs, response); + return userUs.toUser(); + }), + ); + } +} From 939a13224b2d7e171359b2594cbc0e57211c3363 Mon Sep 17 00:00:00 2001 From: Kyrylo Petrov Date: Mon, 3 Mar 2025 20:24:49 +0200 Subject: [PATCH 2/3] use mapper function --- .../underscore-entites/user/user-us.entity.ts | 15 +++------------ .../core/services/mappers/users/users.mapper.ts | 15 +++++++++++++++ src/app/core/services/user/user.service.ts | 10 +++------- 3 files changed, 21 insertions(+), 19 deletions(-) create mode 100644 src/app/core/services/mappers/users/users.mapper.ts diff --git a/src/app/core/services/json-api/underscore-entites/user/user-us.entity.ts b/src/app/core/services/json-api/underscore-entites/user/user-us.entity.ts index 14f398cac..735b8238c 100644 --- a/src/app/core/services/json-api/underscore-entites/user/user-us.entity.ts +++ b/src/app/core/services/json-api/underscore-entites/user/user-us.entity.ts @@ -1,13 +1,4 @@ -import { User } from '@core/services/user/user.entity'; - -export class UserUS { - full_name = ''; - given_name = ''; - - toUser(): User { - return { - fullName: this.full_name, - givenName: this.given_name, - }; - } +export interface UserUS { + full_name: string; + given_name: string; } diff --git a/src/app/core/services/mappers/users/users.mapper.ts b/src/app/core/services/mappers/users/users.mapper.ts new file mode 100644 index 000000000..a1cc149a3 --- /dev/null +++ b/src/app/core/services/mappers/users/users.mapper.ts @@ -0,0 +1,15 @@ +import { Injectable } from '@angular/core'; +import { User } from '@core/services/user/user.entity'; +import { UserUS } from '@core/services/json-api/underscore-entites/user/user-us.entity'; + +@Injectable({ + providedIn: 'root', +}) +export class UsersMapper { + mapUserUStoUser(user: UserUS): User { + return { + fullName: user.full_name, + givenName: user.given_name, + }; + } +} diff --git a/src/app/core/services/user/user.service.ts b/src/app/core/services/user/user.service.ts index 9b2e06a3e..73bae3a69 100644 --- a/src/app/core/services/user/user.service.ts +++ b/src/app/core/services/user/user.service.ts @@ -3,22 +3,18 @@ import { map, Observable } from 'rxjs'; import { JsonApiService } from '@core/services/json-api/json-api.service'; import { User } from '@core/services/user/user.entity'; import { UserUS } from '@core/services/json-api/underscore-entites/user/user-us.entity'; +import { UsersMapper } from '@core/services/mappers/users/users.mapper'; @Injectable({ providedIn: 'root', }) export class UserService { jsonApiService = inject(JsonApiService); + usersMapper = inject(UsersMapper); getMe(): Observable { return this.jsonApiService .get('https://api.test.osf.io/v2/users/me') - .pipe( - map((response) => { - const userUs = new UserUS(); - Object.assign(userUs, response); - return userUs.toUser(); - }), - ); + .pipe(map((user) => this.usersMapper.mapUserUStoUser(user))); } } From 9c7b04d666b3799316c98b12307c4585ec9b02df Mon Sep 17 00:00:00 2001 From: Kyrylo Petrov Date: Tue, 4 Mar 2025 12:15:35 +0200 Subject: [PATCH 3/3] fix(mappers): export mapper as func --- .../core/services/mappers/users/users.mapper.ts | 16 +++++----------- src/app/core/services/user/user.service.ts | 5 ++--- 2 files changed, 7 insertions(+), 14 deletions(-) diff --git a/src/app/core/services/mappers/users/users.mapper.ts b/src/app/core/services/mappers/users/users.mapper.ts index a1cc149a3..b86c43c2d 100644 --- a/src/app/core/services/mappers/users/users.mapper.ts +++ b/src/app/core/services/mappers/users/users.mapper.ts @@ -1,15 +1,9 @@ -import { Injectable } from '@angular/core'; import { User } from '@core/services/user/user.entity'; import { UserUS } from '@core/services/json-api/underscore-entites/user/user-us.entity'; -@Injectable({ - providedIn: 'root', -}) -export class UsersMapper { - mapUserUStoUser(user: UserUS): User { - return { - fullName: user.full_name, - givenName: user.given_name, - }; - } +export function mapUserUStoUser(user: UserUS): User { + return { + fullName: user.full_name, + givenName: user.given_name, + }; } diff --git a/src/app/core/services/user/user.service.ts b/src/app/core/services/user/user.service.ts index 73bae3a69..a1b5c2614 100644 --- a/src/app/core/services/user/user.service.ts +++ b/src/app/core/services/user/user.service.ts @@ -3,18 +3,17 @@ import { map, Observable } from 'rxjs'; import { JsonApiService } from '@core/services/json-api/json-api.service'; import { User } from '@core/services/user/user.entity'; import { UserUS } from '@core/services/json-api/underscore-entites/user/user-us.entity'; -import { UsersMapper } from '@core/services/mappers/users/users.mapper'; +import { mapUserUStoUser } from '@core/services/mappers/users/users.mapper'; @Injectable({ providedIn: 'root', }) export class UserService { jsonApiService = inject(JsonApiService); - usersMapper = inject(UsersMapper); getMe(): Observable { return this.jsonApiService .get('https://api.test.osf.io/v2/users/me') - .pipe(map((user) => this.usersMapper.mapUserUStoUser(user))); + .pipe(map((user) => mapUserUStoUser(user))); } }