dcb-backoffice/src/app/core/models/dcb-bo-hub-user.model.ts

243 lines
6.3 KiB
TypeScript

// === ENUMS COHÉRENTS ===
export enum UserType {
HUB = 'HUB',
MERCHANT_PARTNER = 'MERCHANT'
}
export enum UserRole {
// Rôles Hub (sans merchantPartnerId)
DCB_ADMIN = 'dcb-admin',
DCB_SUPPORT = 'dcb-support',
DCB_PARTNER = 'dcb-partner', // Propriétaire de merchants
// Rôles Merchant Partner (avec merchantPartnerId obligatoire = ID du DCB_PARTNER)
DCB_PARTNER_ADMIN = 'dcb-partner-admin',
DCB_PARTNER_MANAGER = 'dcb-partner-manager',
DCB_PARTNER_SUPPORT = 'dcb-partner-support',
MERCHANT_CONFIG_ADMIN = 'ADMIN',
MERCHANT_CONFIG_MANAGER = 'MANAGER',
MERCHANT_CONFIG_TECHNICAL = 'TECHNICAL',
MERCHANT_CONFIG_VIEWER = 'VIEWER',
//ADMIN, MANAGER, TECHNICAL, VIEWER
}
// Enum pour le contexte Angular (identique à l'ancien)
export enum UserContext {
HUB = 'HUB',
MERCHANT = 'MERCHANT'
}
// Ajoutez cette interface dans vos modèles
export interface GlobalUsersOverview {
hubUsers: User[];
merchantUsers: User[];
statistics: {
totalHubUsers: number;
totalMerchantUsers: number;
totalUsers: number;
};
}
export interface UsersStatistics {
totalHubUsers: number;
totalMerchantUsers: number;
totalUsers: number;
}
// dcb-bo-hub-user.model.ts - MIS À JOUR
export interface User {
id: string; // UUID Keycloak
username: string;
email: string;
firstName: string;
lastName: string;
enabled: boolean;
emailVerified: boolean;
userType: UserType; // HUB ou MERCHANT_PARTNER
// C'est l'ID du "merchant" (DCB_PARTNER) qui est propriétaire
merchantPartnerId?: string; // Référence à l'ID Keycloak du DCB_PARTNER
role: UserRole;
// Merchant Config - Stocker l'ID du merchant dans l'autre système
merchantConfigId?: string; // ID INT dans Merchant Config pour CE merchant
createdBy?: string;
createdByUsername?: string;
createdTimestamp: number;
lastLogin?: number;
profileImage?: string | null
}
export interface SyncResult {
success: boolean;
user?: User;
errors?: string[];
warnings?: string[];
}
// === DTOs CRUD ===
export interface CreateUserDto {
username: string;
email: string;
firstName: string;
lastName: string;
password: string;
userType: UserType;
role: UserRole;
enabled?: boolean;
emailVerified?: boolean;
merchantPartnerId?: string;
merchantConfigId?: string;
}
export interface UpdateUserDto {
firstName?: string;
lastName?: string;
email?: string;
enabled?: boolean;
role?: UserRole;
}
export interface ResetPasswordDto {
userId?: string;
newPassword: string;
temporary?: boolean;
}
// === PAGINATION / STATS ===
export interface PaginatedUserResponse {
users: User[];
total: number;
page: number;
limit: number;
totalPages: number;
}
export interface MerchantPartnerStatsResponse {
totalAdmins: number;
totalManagers: number;
totalSupport: number;
totalUsers: number;
activeUsers: number;
inactiveUsers: number;
}
// === ROLES ===
export interface AvailableRole {
value: UserRole;
label: string;
description: string;
allowedForCreation: boolean;
userType: UserType;
}
export interface AvailableRolesResponse {
roles: AvailableRole[];
}
export interface RoleOperationResponse {
message: string;
success: boolean;
}
// === SEARCH ===
export interface SearchUsersParams {
query?: string;
role?: UserRole;
enabled?: boolean;
userType?: UserType;
merchantPartnerId?: string;
merchantConfigId?: string;
page?: number;
limit?: number;
}
// === UTILITAIRES ===
export class UserUtils {
static isHubUser(user: User): boolean {
return user.userType === UserType.HUB;
}
static isMerchantPartnerUser(user: User): boolean {
return user.userType === UserType.MERCHANT_PARTNER;
}
static hasRole(user: User, role: UserRole): boolean {
if (!user.role) return false;
return user.role.includes(role);
}
static getRoleDisplayName(role: UserRole): string {
const roleNames = {
[UserRole.DCB_ADMIN]: 'DCB Admin',
[UserRole.DCB_SUPPORT]: 'DCB Support',
[UserRole.DCB_PARTNER]: 'DCB Partner',
[UserRole.DCB_PARTNER_ADMIN]: 'Partner Admin',
[UserRole.DCB_PARTNER_MANAGER]: 'Partner Manager',
[UserRole.DCB_PARTNER_SUPPORT]: 'Partner Support',
[UserRole.MERCHANT_CONFIG_ADMIN]: 'ADMIN',
[UserRole.MERCHANT_CONFIG_MANAGER]: 'MANAGER',
[UserRole.MERCHANT_CONFIG_TECHNICAL]: 'TECHNICAL',
[UserRole.MERCHANT_CONFIG_VIEWER]: 'VIEWER',
};
return roleNames[role] || role;
}
static getUserTypeDisplayName(userType: UserType): string {
const typeNames = {
[UserType.HUB]: 'Hub',
[UserType.MERCHANT_PARTNER]: 'Merchant Partner'
};
return typeNames[userType] || userType;
}
// Méthode pour convertir UserContext (Angular) en UserType (API)
static contextToUserType(context: UserContext): UserType {
return context === UserContext.HUB ? UserType.HUB : UserType.MERCHANT_PARTNER;
}
// Méthode pour convertir UserType (API) en UserContext (Angular)
static userTypeToContext(userType: UserType): UserContext {
return userType === UserType.HUB ? UserContext.HUB : UserContext.MERCHANT;
}
static validateUserCreation(user: CreateUserDto): string[] {
const errors: string[] = [];
// Validation merchantPartnerId
if (user.userType === UserType.MERCHANT_PARTNER && !user.merchantPartnerId) {
errors.push('merchantPartnerId est obligatoire pour les utilisateurs Merchant Partner');
}
if (user.userType === UserType.HUB && user.merchantPartnerId) {
errors.push('merchantPartnerId ne doit pas être défini pour les utilisateurs Hub');
}
if (!user.role) {
errors.push('Un rôle doit être assigné');
}
// Validation cohérence rôle/type
const hubRoles = [UserRole.DCB_ADMIN, UserRole.DCB_SUPPORT, UserRole.DCB_PARTNER];
const merchantRoles = [UserRole.DCB_PARTNER_ADMIN, UserRole.DCB_PARTNER_MANAGER, UserRole.DCB_PARTNER_SUPPORT];
if (user.userType === UserType.HUB && user.role) {
if (!hubRoles.includes(user.role)) {
errors.push(`Rôle invalide pour un utilisateur Hub: ${user.role}`);
}
}
if (user.userType === UserType.MERCHANT_PARTNER && user.role) {
if (!merchantRoles.includes(user.role)) {
errors.push(`Rôle invalide pour un utilisateur Merchant Partner: ${user.role}`);
}
}
return errors;
}
}