243 lines
6.3 KiB
TypeScript
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;
|
|
}
|
|
} |