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..735b8238c --- /dev/null +++ b/src/app/core/services/json-api/underscore-entites/user/user-us.entity.ts @@ -0,0 +1,4 @@ +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..b86c43c2d --- /dev/null +++ b/src/app/core/services/mappers/users/users.mapper.ts @@ -0,0 +1,9 @@ +import { User } from '@core/services/user/user.entity'; +import { UserUS } from '@core/services/json-api/underscore-entites/user/user-us.entity'; + +export function mapUserUStoUser(user: UserUS): User { + return { + fullName: user.full_name, + givenName: user.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..a1b5c2614 --- /dev/null +++ b/src/app/core/services/user/user.service.ts @@ -0,0 +1,19 @@ +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'; +import { mapUserUStoUser } from '@core/services/mappers/users/users.mapper'; + +@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((user) => mapUserUStoUser(user))); + } +}