import { APP_INITIALIZER, ModuleWithProviders, NgModule } from '@angular/core'; import { KeycloakAngularModule, KeycloakOptions, KeycloakService } from 'keycloak-angular'; import { DefaultUserService } from './services/default-user.service'; import { IIqserUser } from './types/user.response'; import { IqserUserService } from './services/iqser-user.service'; import { BASE_HREF, ModuleWithOptions } from '../utils'; import { IqserUsersModuleOptions } from './types/iqser-users-module-options'; import { IqserUser } from './iqser-user.model'; import { IqserRoleGuard } from './guards/iqser-role-guard.service'; import { IqserAuthGuard } from './guards/iqser-auth-guard.service'; import { IqserConfigService } from '../services'; import { NamePipe } from './name.pipe'; import { InitialsAvatarComponent } from './components/initials-avatar/initials-avatar.component'; import { MatLegacyTooltipModule as MatTooltipModule } from '@angular/material/legacy-tooltip'; import { CommonModule } from '@angular/common'; import { UserButtonComponent } from './components/user-button/user-button.component'; import { MatIconModule } from '@angular/material/icon'; import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button'; function getKeycloakOptions(baseUrl: string, configService: IqserConfigService): KeycloakOptions { let url: string = configService.values.OAUTH_URL; url = url.replace(/\/$/, ''); // remove trailing slash const realm = url.substring(url.lastIndexOf('/') + 1, url.length); url = url.substring(0, url.lastIndexOf('/realms')); return { config: { url: url, realm: realm, clientId: configService.values.OAUTH_CLIENT_ID, }, initOptions: { checkLoginIframe: false, onLoad: 'check-sso', silentCheckSsoRedirectUri: window.location.origin + baseUrl + '/assets/oauth/silent-refresh.html', flow: 'standard', }, enableBearerInterceptor: true, }; } function configureAutomaticRedirectToLoginScreen(keyCloakService: KeycloakService, configService: IqserConfigService) { keyCloakService.getKeycloakInstance().onAuthRefreshError = () => { window.location.href = keyCloakService.getKeycloakInstance().createLoginUrl({ redirectUri: window.location.href, idpHint: configService.values.OAUTH_IDP_HINT, }); }; } export function keycloakInitializer( keycloakService: KeycloakService, configService: IqserConfigService, baseUrl: string, ): () => Promise { const x = keycloakService.init(getKeycloakOptions(baseUrl, configService)); return () => x.then(() => configureAutomaticRedirectToLoginScreen(keycloakService, configService)); } const components = [NamePipe, InitialsAvatarComponent, UserButtonComponent]; @NgModule({ imports: [KeycloakAngularModule, MatTooltipModule, CommonModule, MatIconModule, MatButtonModule], declarations: [...components], exports: [...components], }) export class IqserUsersModule extends ModuleWithOptions { static forRoot< Interface extends IIqserUser, Class extends IqserUser & Interface, UserService extends IqserUserService, RolesGuard extends IqserRoleGuard = IqserRoleGuard, >(options: IqserUsersModuleOptions): ModuleWithProviders { const userService = this._getService(IqserUserService, DefaultUserService, options.existingUserService); const roleGuard = this._getService(IqserRoleGuard, IqserRoleGuard, options.existingRoleGuard); return { ngModule: IqserUsersModule, providers: [ userService, roleGuard, IqserAuthGuard, { provide: APP_INITIALIZER, useFactory: keycloakInitializer, multi: true, deps: [KeycloakService, IqserConfigService, BASE_HREF], }, ], }; } }