120 lines
3.4 KiB
TypeScript
120 lines
3.4 KiB
TypeScript
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";
|
|
import {OAuthAction} from "@model/oAuthAction";
|
|
|
|
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<TwoFactorAuthentication>(request);
|
|
}
|
|
|
|
public twoFactorAuth(data: TwoFactorAuthRequest) {
|
|
let request = this.createRequestBuilder()
|
|
.setEndpoint('2FA')
|
|
.setData(data)
|
|
.setWithCredentials()
|
|
.build;
|
|
|
|
return this.post<boolean>(request);
|
|
}
|
|
|
|
public reLogin() {
|
|
let request = this.createRequestBuilder()
|
|
.setEndpoint('ReLogin')
|
|
.setWithCredentials()
|
|
.build;
|
|
|
|
return this.get<AuthRoles>(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<AuthRoles>(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(callback: string): Observable<OAuthProviderData[]> {
|
|
let request = this.createRequestBuilder()
|
|
.setEndpoint('AvailableProviders')
|
|
.setQueryParams({callback: callback})
|
|
.setWithCredentials()
|
|
.build;
|
|
|
|
return this.get<Array<AvailableOAuthProvidersResponse>>(request).pipe(
|
|
map(data => {
|
|
return data.map((provider) => ({
|
|
...provider,
|
|
icon: this.getProviderIcon(provider.provider),
|
|
}) as OAuthProviderData);
|
|
}));
|
|
}
|
|
|
|
private handleTokenRequest(token: string, action: OAuthAction) {
|
|
return this.createRequestBuilder()
|
|
.setEndpoint('HandleToken')
|
|
.setQueryParams({token: token, action: action})
|
|
.setWithCredentials()
|
|
.build;
|
|
}
|
|
|
|
public loginOAuth(token: string) {
|
|
return this.get<TwoFactorAuthentication>(this.handleTokenRequest(token, OAuthAction.Login));
|
|
}
|
|
|
|
public linkAccount(token: string): Observable<null> {
|
|
const request = this.handleTokenRequest(token, OAuthAction.Bind);
|
|
return this.addAuth(request).get(request);
|
|
}
|
|
}
|