common-ui/src/lib/users/iqser-users.module.ts
Adina Țeudan d7b80af5bb Lint
2023-01-18 07:15:47 +02:00

93 lines
4.0 KiB
TypeScript

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<void> {
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<Interface, Class>,
RolesGuard extends IqserRoleGuard = IqserRoleGuard,
>(options: IqserUsersModuleOptions<Interface, Class, UserService, RolesGuard>): ModuleWithProviders<IqserUsersModule> {
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],
},
],
};
}
}