From b6536f736bd6c0cea77b54f39dad4ad8aa9bcab3 Mon Sep 17 00:00:00 2001 From: Dan Percic Date: Thu, 28 Jul 2022 00:46:19 +0300 Subject: [PATCH] rename auth module to users module & add initial avatar & user button --- src/index.ts | 2 +- src/lib/auth/auth.module.ts | 79 ---------------- src/lib/auth/index.ts | 12 --- src/lib/auth/types/auth-module-options.ts | 15 ---- .../initials-avatar.component.html | 13 +++ .../initials-avatar.component.scss | 17 ++++ .../initials-avatar.component.ts | 88 ++++++++++++++++++ .../user-button/user-button.component.html | 7 ++ .../user-button/user-button.component.scss | 24 +++++ .../user-button/user-button.component.ts | 11 +++ .../guards/iqser-auth-guard.service.ts} | 8 +- .../guards/iqser-role-guard.service.ts} | 8 +- src/lib/users/index.ts | 15 ++++ .../iqser-user.model.ts} | 0 src/lib/users/iqser-users.module.ts | 90 +++++++++++++++++++ src/lib/users/name.pipe.ts | 63 +++++++++++++ .../services}/default-user.service.ts | 6 +- .../services/iqser-user.service.ts} | 24 ++--- .../types/create-user.request.ts | 0 .../users/types/iqser-users-module-options.ts | 15 ++++ .../types/my-profile-update.request.ts | 0 src/lib/users/types/name-pipe-options.ts | 5 ++ .../types/profile-update.request.ts | 0 .../types/reset-password.request.ts | 0 .../{auth => users}/types/user.response.ts | 0 25 files changed, 372 insertions(+), 130 deletions(-) delete mode 100644 src/lib/auth/auth.module.ts delete mode 100644 src/lib/auth/index.ts delete mode 100644 src/lib/auth/types/auth-module-options.ts create mode 100644 src/lib/users/components/initials-avatar/initials-avatar.component.html create mode 100644 src/lib/users/components/initials-avatar/initials-avatar.component.scss create mode 100644 src/lib/users/components/initials-avatar/initials-avatar.component.ts create mode 100644 src/lib/users/components/user-button/user-button.component.html create mode 100644 src/lib/users/components/user-button/user-button.component.scss create mode 100644 src/lib/users/components/user-button/user-button.component.ts rename src/lib/{auth/auth.guard.ts => users/guards/iqser-auth-guard.service.ts} (79%) rename src/lib/{auth/role.guard.ts => users/guards/iqser-role-guard.service.ts} (78%) create mode 100644 src/lib/users/index.ts rename src/lib/{auth/user.model.ts => users/iqser-user.model.ts} (100%) create mode 100644 src/lib/users/iqser-users.module.ts create mode 100644 src/lib/users/name.pipe.ts rename src/lib/{auth => users/services}/default-user.service.ts (56%) rename src/lib/{auth/base-user.service.ts => users/services/iqser-user.service.ts} (86%) rename src/lib/{auth => users}/types/create-user.request.ts (100%) create mode 100644 src/lib/users/types/iqser-users-module-options.ts rename src/lib/{auth => users}/types/my-profile-update.request.ts (100%) create mode 100644 src/lib/users/types/name-pipe-options.ts rename src/lib/{auth => users}/types/profile-update.request.ts (100%) rename src/lib/{auth => users}/types/reset-password.request.ts (100%) rename src/lib/{auth => users}/types/user.response.ts (100%) diff --git a/src/index.ts b/src/index.ts index bab98dc..d853157 100644 --- a/src/index.ts +++ b/src/index.ts @@ -17,4 +17,4 @@ export * from './lib/search'; export * from './lib/empty-states'; export * from './lib/scrollbar'; export * from './lib/caching'; -export * from './lib/auth'; +export * from './lib/users'; diff --git a/src/lib/auth/auth.module.ts b/src/lib/auth/auth.module.ts deleted file mode 100644 index b2629f4..0000000 --- a/src/lib/auth/auth.module.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { APP_INITIALIZER, ModuleWithProviders, NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { HttpClientModule } from '@angular/common/http'; - -import { KeycloakAngularModule, KeycloakOptions, KeycloakService } from 'keycloak-angular'; -import { DefaultUserService } from './default-user.service'; -import { IIqserUser } from './types/user.response'; -import { BaseUserService } from './base-user.service'; -import { BASE_HREF, ModuleWithOptions } from '../utils'; -import { AuthModuleOptions } from './types/auth-module-options'; -import { IqserUser } from './user.model'; -import { RoleGuard } from './role.guard'; -import { AuthGuard } from './auth.guard'; -import { BaseConfigService } from '../services'; - -function getKeycloakOptions(baseUrl: string, configService: BaseConfigService): 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) { - keyCloakService.getKeycloakInstance().onAuthRefreshError = async () => { - await keyCloakService.logout(); - }; -} - -export function keycloakInitializer( - keycloakService: KeycloakService, - configService: BaseConfigService, - baseUrl: string, -): () => Promise { - const x = keycloakService.init(getKeycloakOptions(baseUrl, configService)); - return () => x.then(() => configureAutomaticRedirectToLoginScreen(keycloakService)); -} - -@NgModule({ - imports: [CommonModule, HttpClientModule, KeycloakAngularModule], - providers: [ - AuthGuard, - { - provide: APP_INITIALIZER, - useFactory: keycloakInitializer, - multi: true, - deps: [KeycloakService, BaseConfigService, BASE_HREF], - }, - ], -}) -export class AuthModule extends ModuleWithOptions { - static forRoot< - Interface extends IIqserUser, - Class extends IqserUser & Interface, - UserService extends BaseUserService, - RolesGuard extends RoleGuard = RoleGuard, - >(options: AuthModuleOptions): ModuleWithProviders { - const userService = this._getService(BaseUserService, DefaultUserService, options.existingUserService); - const roleGuard = this._getService(RoleGuard, RoleGuard, options.existingRoleGuard); - - return { - ngModule: AuthModule, - providers: [userService, roleGuard], - }; - } -} diff --git a/src/lib/auth/index.ts b/src/lib/auth/index.ts deleted file mode 100644 index 273ba7a..0000000 --- a/src/lib/auth/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -export * from './types/user.response'; -export * from './types/create-user.request'; -export * from './types/reset-password.request'; -export * from './types/my-profile-update.request'; -export * from './types/profile-update.request'; -export * from './types/auth-module-options'; -export * from './user.model'; -export * from './base-user.service'; -export * from './default-user.service'; -export * from './auth.module'; -export * from './auth.guard'; -export * from './role.guard'; diff --git a/src/lib/auth/types/auth-module-options.ts b/src/lib/auth/types/auth-module-options.ts deleted file mode 100644 index 05bdc0c..0000000 --- a/src/lib/auth/types/auth-module-options.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { BaseUserService } from '../base-user.service'; -import { IIqserUser } from './user.response'; -import { IqserUser } from '../user.model'; -import { Type } from '@angular/core'; -import { RoleGuard } from '../role.guard'; - -export interface AuthModuleOptions< - I extends IIqserUser = IIqserUser, - C extends IqserUser & I = IqserUser & I, - T extends BaseUserService = BaseUserService, - R extends RoleGuard = RoleGuard, -> { - existingUserService?: Type; - existingRoleGuard?: Type; -} diff --git a/src/lib/users/components/initials-avatar/initials-avatar.component.html b/src/lib/users/components/initials-avatar/initials-avatar.component.html new file mode 100644 index 0000000..5456552 --- /dev/null +++ b/src/lib/users/components/initials-avatar/initials-avatar.component.html @@ -0,0 +1,13 @@ +
+
+ {{ _user | name: { showInitials: true } }} +
+ +
+ {{ userName }} +
+
diff --git a/src/lib/users/components/initials-avatar/initials-avatar.component.scss b/src/lib/users/components/initials-avatar/initials-avatar.component.scss new file mode 100644 index 0000000..dad8a5d --- /dev/null +++ b/src/lib/users/components/initials-avatar/initials-avatar.component.scss @@ -0,0 +1,17 @@ +.wrapper { + display: flex; + align-items: center; + width: fit-content; + + .username { + margin-left: 6px; + + &.disabled { + opacity: 0.7; + } + } +} + +.border { + border: 1px solid var(--iqser-grey-7); +} diff --git a/src/lib/users/components/initials-avatar/initials-avatar.component.ts b/src/lib/users/components/initials-avatar/initials-avatar.component.ts new file mode 100644 index 0000000..c87e7be --- /dev/null +++ b/src/lib/users/components/initials-avatar/initials-avatar.component.ts @@ -0,0 +1,88 @@ +import { ChangeDetectionStrategy, Component, Input, OnChanges, OnInit } from '@angular/core'; +import { TranslateService } from '@ngx-translate/core'; +import { IqserUserService } from '../../services/iqser-user.service'; +import { NamePipeOptions } from '../../types/name-pipe-options'; +import { IqserUser } from '../../iqser-user.model'; +import { IIqserUser } from '../../types/user.response'; + +@Component({ + selector: 'iqser-initials-avatar', + templateUrl: './initials-avatar.component.html', + styleUrls: ['./initials-avatar.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class InitialsAvatarComponent + implements OnInit, OnChanges +{ + @Input() color = 'lightgray'; + @Input() size: 'small' | 'large' = 'small'; + @Input() withName = false; + @Input() showYou = false; + @Input() tooltipPosition: 'below' | 'above' = 'above'; + @Input() defaultValue: string = this._translateService.instant('initials-avatar.unassigned'); + colorClass?: string; + namePipeOptions?: NamePipeOptions; + + constructor(private readonly _userService: IqserUserService, private readonly _translateService: TranslateService) {} + + _user?: Class; + + @Input() + set user(user: Class | string) { + if (typeof user === 'string') { + this._user = this._userService.find(user); + } else { + this._user = user; + } + } + + get hasBorder(): boolean { + return !!this._user && !this.isCurrentUser && this.showBorderCondition(this._user); + } + + get disabled(): boolean { + return !!this._user && !this._isSystemUser && !this._user.hasAnyRole; + } + + get isCurrentUser(): boolean { + return this._userService.currentUser?.id === this._user?.id; + } + + private get _colorClass() { + if (this.isCurrentUser) { + return 'primary-white'; + } + + if (this.disabled) { + return 'inactive'; + } + + if (this.color.includes('-')) { + return this.color; + } + + return `${this.color}-dark`; + } + + private get _isSystemUser() { + return this._user?.id?.toLowerCase() === 'system'; + } + + @Input() showBorderCondition: (user: T) => boolean = () => false; + + ngOnChanges(): void { + if (this._isSystemUser) { + this.colorClass = 'primary-white primary'; + return; + } + + this.colorClass = this._colorClass; + } + + ngOnInit(): void { + this.namePipeOptions = { + showYou: this.showYou, + defaultValue: this.defaultValue, + }; + } +} diff --git a/src/lib/users/components/user-button/user-button.component.html b/src/lib/users/components/user-button/user-button.component.html new file mode 100644 index 0000000..fe868ac --- /dev/null +++ b/src/lib/users/components/user-button/user-button.component.html @@ -0,0 +1,7 @@ + + +
diff --git a/src/lib/users/components/user-button/user-button.component.scss b/src/lib/users/components/user-button/user-button.component.scss new file mode 100644 index 0000000..ea7a257 --- /dev/null +++ b/src/lib/users/components/user-button/user-button.component.scss @@ -0,0 +1,24 @@ +@use '../../../../assets/styles/common-buttons'; + +:host { + @extend .user-button; + min-width: fit-content; + + button { + padding: 0 10px 0 5px; + + mat-icon { + width: 14px; + } + } + + &[aria-expanded='true'] { + button { + background: rgba(var(--iqser-primary-rgb), 0.1); + } + } + + .dot { + left: -2px; + } +} diff --git a/src/lib/users/components/user-button/user-button.component.ts b/src/lib/users/components/user-button/user-button.component.ts new file mode 100644 index 0000000..b67fcea --- /dev/null +++ b/src/lib/users/components/user-button/user-button.component.ts @@ -0,0 +1,11 @@ +import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; + +@Component({ + selector: 'iqser-user-button', + templateUrl: './user-button.component.html', + styleUrls: ['./user-button.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class UserButtonComponent { + @Input() showDot = false; +} diff --git a/src/lib/auth/auth.guard.ts b/src/lib/users/guards/iqser-auth-guard.service.ts similarity index 79% rename from src/lib/auth/auth.guard.ts rename to src/lib/users/guards/iqser-auth-guard.service.ts index 17eb476..ffd7cfc 100644 --- a/src/lib/auth/auth.guard.ts +++ b/src/lib/users/guards/iqser-auth-guard.service.ts @@ -1,16 +1,16 @@ import { Injectable } from '@angular/core'; import { ActivatedRouteSnapshot, Router } from '@angular/router'; import { KeycloakAuthGuard, KeycloakService } from 'keycloak-angular'; -import { BaseConfigService } from '../services'; -import { BaseUserService } from './base-user.service'; +import { BaseConfigService } from '../../services'; +import { IqserUserService } from '../services/iqser-user.service'; @Injectable() -export class AuthGuard extends KeycloakAuthGuard { +export class IqserAuthGuard extends KeycloakAuthGuard { constructor( protected readonly _router: Router, protected readonly _keycloak: KeycloakService, private readonly _configService: BaseConfigService, - private readonly _userService: BaseUserService, + private readonly _userService: IqserUserService, ) { super(_router, _keycloak); } diff --git a/src/lib/auth/role.guard.ts b/src/lib/users/guards/iqser-role-guard.service.ts similarity index 78% rename from src/lib/auth/role.guard.ts rename to src/lib/users/guards/iqser-role-guard.service.ts index 86afd68..1bb193c 100644 --- a/src/lib/auth/role.guard.ts +++ b/src/lib/users/guards/iqser-role-guard.service.ts @@ -1,13 +1,13 @@ import { inject, Injectable } from '@angular/core'; import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router'; -import { LoadingService } from '../loading'; -import { BaseUserService } from './base-user.service'; +import { LoadingService } from '../../loading'; +import { IqserUserService } from '../services/iqser-user.service'; @Injectable() -export class RoleGuard implements CanActivate { +export class IqserRoleGuard implements CanActivate { protected readonly _router = inject(Router); protected readonly _loadingService = inject(LoadingService); - protected readonly _userService = inject(BaseUserService); + protected readonly _userService = inject(IqserUserService); async canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise { const currentUser = this._userService.currentUser; diff --git a/src/lib/users/index.ts b/src/lib/users/index.ts new file mode 100644 index 0000000..4ccf4a5 --- /dev/null +++ b/src/lib/users/index.ts @@ -0,0 +1,15 @@ +export * from './types/user.response'; +export * from './types/create-user.request'; +export * from './types/reset-password.request'; +export * from './types/my-profile-update.request'; +export * from './types/profile-update.request'; +export * from './types/iqser-users-module-options'; +export * from './types/name-pipe-options'; +export * from './iqser-user.model'; +export * from './services/iqser-user.service'; +export * from './services/default-user.service'; +export * from './iqser-users.module'; +export * from './guards/iqser-auth-guard.service'; +export * from './guards/iqser-role-guard.service'; +export * from './components/user-button/user-button.component'; +export * from './components/initials-avatar/initials-avatar.component'; diff --git a/src/lib/auth/user.model.ts b/src/lib/users/iqser-user.model.ts similarity index 100% rename from src/lib/auth/user.model.ts rename to src/lib/users/iqser-user.model.ts diff --git a/src/lib/users/iqser-users.module.ts b/src/lib/users/iqser-users.module.ts new file mode 100644 index 0000000..8af0043 --- /dev/null +++ b/src/lib/users/iqser-users.module.ts @@ -0,0 +1,90 @@ +import { APP_INITIALIZER, ModuleWithProviders, NgModule } from '@angular/core'; +import { HttpClientModule } from '@angular/common/http'; + +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 { BaseConfigService } from '../services'; +import { NamePipe } from './name.pipe'; +import { InitialsAvatarComponent } from './components/initials-avatar/initials-avatar.component'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { CommonModule } from '@angular/common'; +import { UserButtonComponent } from './components/user-button/user-button.component'; +import { MatIconModule } from '@angular/material/icon'; +import { MatButtonModule } from '@angular/material/button'; + +function getKeycloakOptions(baseUrl: string, configService: BaseConfigService): 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) { + keyCloakService.getKeycloakInstance().onAuthRefreshError = async () => { + await keyCloakService.logout(); + }; +} + +export function keycloakInitializer( + keycloakService: KeycloakService, + configService: BaseConfigService, + baseUrl: string, +): () => Promise { + const x = keycloakService.init(getKeycloakOptions(baseUrl, configService)); + return () => x.then(() => configureAutomaticRedirectToLoginScreen(keycloakService)); +} + +const components = [NamePipe, InitialsAvatarComponent, UserButtonComponent]; + +@NgModule({ + imports: [HttpClientModule, 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, BaseConfigService, BASE_HREF], + }, + ], + }; + } +} diff --git a/src/lib/users/name.pipe.ts b/src/lib/users/name.pipe.ts new file mode 100644 index 0000000..aa79268 --- /dev/null +++ b/src/lib/users/name.pipe.ts @@ -0,0 +1,63 @@ +import { Pipe, PipeTransform } from '@angular/core'; +import { TranslateService } from '@ngx-translate/core'; +import { IqserUserService } from './services/iqser-user.service'; +import { NamePipeOptions } from './types/name-pipe-options'; +import { IqserUser } from './iqser-user.model'; + +function getInitials(name: string) { + if (name.toLowerCase() === 'system') { + return 'SY'; + } + + const splittedName = name.split(' ').filter(value => value !== ' ' && value !== ''); + return splittedName + .filter((_value, index) => index < 2) + .map(str => str[0]) + .join(''); +} + +@Pipe({ + name: 'name', +}) +export class NamePipe implements PipeTransform { + protected readonly _defaultOptions: Required = { + defaultValue: this._translateService.instant('unknown') as string, + showYou: false, + showInitials: false, + }; + + constructor(private readonly _userService: IqserUserService, private readonly _translateService: TranslateService) {} + + transform(value: IqserUser | string, options: NamePipeOptions = this._defaultOptions): string { + let name: string | undefined; + + if (!value) { + return this._getDefaultName(options); + } + + name = value ? this._userService.getName(value) : options.defaultValue; + + if (!name) { + return this._getDefaultName(options); + } + + if (options.showYou && this._isCurrentUser(value)) { + name = `${name} (${this._translateService.instant('initials-avatar.you')})`; + } + + return options.showInitials ? getInitials(name) : name; + } + + protected _getDefaultName(options: NamePipeOptions) { + if (options.showInitials) { + return '?'; + } + + return options.defaultValue ?? this._defaultOptions.defaultValue; + } + + protected _isCurrentUser(user: IqserUser | string): boolean { + const userId = typeof user === 'string' ? user : user.id; + return this._userService.currentUser?.id === userId; + } +} diff --git a/src/lib/auth/default-user.service.ts b/src/lib/users/services/default-user.service.ts similarity index 56% rename from src/lib/auth/default-user.service.ts rename to src/lib/users/services/default-user.service.ts index 54dbf0d..fcce62f 100644 --- a/src/lib/auth/default-user.service.ts +++ b/src/lib/users/services/default-user.service.ts @@ -1,9 +1,9 @@ import { Injectable } from '@angular/core'; -import { IqserUser } from './user.model'; -import { BaseUserService } from './base-user.service'; +import { IqserUserService } from './iqser-user.service'; +import { IqserUser } from '../iqser-user.model'; @Injectable() -export class DefaultUserService extends BaseUserService { +export class DefaultUserService extends IqserUserService { protected readonly _defaultModelPath = 'user'; protected readonly _entityClass = IqserUser; protected readonly _rolesFilter = () => true; diff --git a/src/lib/auth/base-user.service.ts b/src/lib/users/services/iqser-user.service.ts similarity index 86% rename from src/lib/auth/base-user.service.ts rename to src/lib/users/services/iqser-user.service.ts index bff668a..d32e6c3 100644 --- a/src/lib/auth/base-user.service.ts +++ b/src/lib/users/services/iqser-user.service.ts @@ -3,20 +3,20 @@ import { KeycloakService } from 'keycloak-angular'; import { BehaviorSubject, firstValueFrom, Observable } from 'rxjs'; import { tap } from 'rxjs/operators'; import jwt_decode from 'jwt-decode'; -import { BASE_HREF, List, mapEach, RequiredParam, Validate } from '../utils'; -import { QueryParam } from '../services'; -import { CacheApiService } from '../caching'; -import { EntitiesService } from '../listing'; -import { IqserUser } from './user.model'; -import { IIqserUser } from './types/user.response'; -import { ICreateUserRequest } from './types/create-user.request'; -import { IResetPasswordRequest } from './types/reset-password.request'; -import { IMyProfileUpdateRequest } from './types/my-profile-update.request'; -import { IProfileUpdateRequest } from './types/profile-update.request'; +import { BASE_HREF, List, mapEach, RequiredParam, Validate } from '../../utils'; +import { QueryParam } from '../../services'; +import { CacheApiService } from '../../caching'; +import { EntitiesService } from '../../listing'; +import { IIqserUser } from '../types/user.response'; +import { ICreateUserRequest } from '../types/create-user.request'; +import { IResetPasswordRequest } from '../types/reset-password.request'; +import { IMyProfileUpdateRequest } from '../types/my-profile-update.request'; +import { IProfileUpdateRequest } from '../types/profile-update.request'; import { KeycloakProfile } from 'keycloak-js'; +import { IqserUser } from '../iqser-user.model'; @Injectable() -export abstract class BaseUserService< +export abstract class IqserUserService< Interface extends IIqserUser = IIqserUser, Class extends IqserUser & Interface = IqserUser & Interface, > extends EntitiesService { @@ -135,5 +135,5 @@ export abstract class BaseUserService< } export function getCurrentUser() { - return inject>(BaseUserService).currentUser; + return inject>(IqserUserService).currentUser; } diff --git a/src/lib/auth/types/create-user.request.ts b/src/lib/users/types/create-user.request.ts similarity index 100% rename from src/lib/auth/types/create-user.request.ts rename to src/lib/users/types/create-user.request.ts diff --git a/src/lib/users/types/iqser-users-module-options.ts b/src/lib/users/types/iqser-users-module-options.ts new file mode 100644 index 0000000..cfd9fe0 --- /dev/null +++ b/src/lib/users/types/iqser-users-module-options.ts @@ -0,0 +1,15 @@ +import { IqserUserService } from '../services/iqser-user.service'; +import { IIqserUser } from './user.response'; +import { Type } from '@angular/core'; +import { IqserRoleGuard } from '../guards/iqser-role-guard.service'; +import { IqserUser } from '../iqser-user.model'; + +export interface IqserUsersModuleOptions< + I extends IIqserUser = IIqserUser, + C extends IqserUser & I = IqserUser & I, + T extends IqserUserService = IqserUserService, + R extends IqserRoleGuard = IqserRoleGuard, +> { + existingUserService?: Type; + existingRoleGuard?: Type; +} diff --git a/src/lib/auth/types/my-profile-update.request.ts b/src/lib/users/types/my-profile-update.request.ts similarity index 100% rename from src/lib/auth/types/my-profile-update.request.ts rename to src/lib/users/types/my-profile-update.request.ts diff --git a/src/lib/users/types/name-pipe-options.ts b/src/lib/users/types/name-pipe-options.ts new file mode 100644 index 0000000..dace346 --- /dev/null +++ b/src/lib/users/types/name-pipe-options.ts @@ -0,0 +1,5 @@ +export interface NamePipeOptions { + showYou?: boolean; + showInitials?: boolean; + defaultValue?: string; +} diff --git a/src/lib/auth/types/profile-update.request.ts b/src/lib/users/types/profile-update.request.ts similarity index 100% rename from src/lib/auth/types/profile-update.request.ts rename to src/lib/users/types/profile-update.request.ts diff --git a/src/lib/auth/types/reset-password.request.ts b/src/lib/users/types/reset-password.request.ts similarity index 100% rename from src/lib/auth/types/reset-password.request.ts rename to src/lib/users/types/reset-password.request.ts diff --git a/src/lib/auth/types/user.response.ts b/src/lib/users/types/user.response.ts similarity index 100% rename from src/lib/auth/types/user.response.ts rename to src/lib/users/types/user.response.ts