import {Injectable} from "@angular/core"; import ApiService, {AvailableVersion} from "@api/api.service"; import {LoginRequest} from "@api/v1/loginRequest"; import {catchError, map, Observable, of} from "rxjs"; import {AuthRoles} from "@model/authRoles"; import {AvailableOAuthProvidersResponse} from "@api/v1/availableProvidersResponse"; import {OAuthProvider} from "@model/oAuthProvider"; import {TwoFactorAuthentication} from "@model/twoFactorAuthentication"; import {TwoFactorAuthRequest} from "@api/v1/twoFactorAuthRequest"; export interface OAuthProviderData extends AvailableOAuthProvidersResponse { icon: string; } @Injectable() export default class AuthApiService extends ApiService { public readonly basePath = 'Auth/'; public readonly version = AvailableVersion.v1; public login(login: LoginRequest) { let request = this.createRequestBuilder() .setEndpoint('Login') .setData(login) .setWithCredentials() .build; return this.post(request); } public twoFactorAuth(data: TwoFactorAuthRequest) { let request = this.createRequestBuilder() .setEndpoint('2FA') .setData(data) .setWithCredentials() .build; return this.post(request); } public reLogin() { let request = this.createRequestBuilder() .setEndpoint('ReLogin') .setWithCredentials() .build; return this.get(request); } public logout() { let request = this.createRequestBuilder() .setWithCredentials() .setEndpoint('Logout') .build; return this.addAuth(request).get(request); } public getRole(isSilence: boolean = true) { let request = this.createRequestBuilder() .setSilenceMode(isSilence) .setEndpoint('GetRole') .build; return this.addAuth(request) .get(request) .pipe( catchError(_ => { return of(null); }) ); } private getProviderIcon(provider: OAuthProvider): string { switch (provider) { case OAuthProvider.Google: return 'assets/icons/google.svg'; case OAuthProvider.Yandex: return 'assets/icons/yandex.svg'; case OAuthProvider.MailRu: return 'assets/icons/mailru.svg'; default: return ''; } } public availableProviders(): Observable { let request = this.createRequestBuilder() .setEndpoint('AvailableProviders') .setWithCredentials() .build; return this.get>(request).pipe( map(data => { return data.map((provider) => ({ ...provider, icon: this.getProviderIcon(provider.provider), }) as OAuthProviderData); })); } }