Shared Models
Ecosistema completo para organización y gestión de contenido con interfaces espaciales
Librería Shared Models (Core) - Descripción
Propósito: Proporcionar modelos, interfaces y tipos compartidos para todo el workspace de GoGrab, garantizando consistencia y reutilización entre todas las librerías y aplicaciones.
Estado Actual
- Tipo: Librería Nx de TypeScript (sin Angular)
- Ruta de importación:
@libs-core/shared-models - Prioridad:
Crítica- base para todas las demás librerías - Entorno: Agnóstico - cliente y servidor
- Dependencias: Ninguna (librería base)
Arquitectura de Modelos Compartidos
La librería implementa un sistema de modelos centralizados que sirve como fuente única de verdad para todos los tipos de datos utilizados en el sistema multitenancy.
Principios Arquitectónicos
- Independencia: Sin dependencias externas, solo TypeScript puro
- Tipado Estricto: 100% tipado, sin uso de
any - Tree Shaking: Exportaciones granulares para optimización de bundle
- Versionado Semántico: Cambios controlados con backward compatibility
- Documentación JSDoc: Todos los interfaces documentados
Organización por Dominios
Tenant Domain
- Context: Información del contexto actual del tenant
- Config: Configuración específica por tenant
- Permissions: Estructura de permisos multitenancy
- Features: Características habilitadas por tenant
Authentication Domain
- UserProfile: Perfil completo del usuario
- AuthState: Estados de autenticación
- LoginFlow: Interfaces de login y selección de tenant
- SessionData: Información de sesión
RBAC Domain (Role-Based Access Control)
- Role: Definición de roles
- Permission: Permisos granulares
- PermissionScope: Alcances de permisos (own, team, all)
- PermissionCondition: Condiciones dinámicas
UI Domain
- BrandingConfig: Configuración de marca por tenant
- ModuleConfig: Configuración de módulos
- UserPreferences: Preferencias del usuario
- ThemeConfig: Configuración de temas
API Domain
- ApiResponse: Respuestas HTTP estandarizadas
- Pagination: Paginación de resultados
- ErrorResponse: Manejo de errores consistente
- RequestMetadata: Metadatos de requests
API Pública
Tenant Models
export interface Context {
tenantId: string;
tenantName: string;
apiBaseUrl: string;
locale: string;
timezone: string;
permissions: Permissions;
configuration: Config;
features: Features;
}
export interface Config {
modules: Record<string, ModuleConfig>;
ui: UiConfig;
limits: ResourceLimits;
}
export interface Permissions {
permissions: string[];
modules: Record<string, ModulePermissions>;
resources: Record<string, ResourcePermissions>;
}
Authentication Models
export interface UserProfile {
id: string;
tenantId: string;
email: string;
username: string;
firstName: string;
lastName: string;
avatar?: string;
roles: Role[];
permissions: Permission[];
preferences: UserPreferences;
isActive: boolean;
lastLogin?: Date;
emailVerified: boolean;
twoFactorEnabled: boolean;
createdAt: Date;
updatedAt: Date;
}
export interface LoginCredentials {
email: string;
password: string;
}
export interface LoginResult {
accessToken: string;
refreshToken: string;
user: UserProfile;
availableTenants: ContextInfo[];
}
RBAC Models
export interface Role {
id: string;
tenantId: string;
name: string;
description: string;
permissions: Permission[];
isSystemRole: boolean;
isActive: boolean;
createdAt: Date;
updatedAt: Date;
}
export interface Permission {
id: string;
tenantId: string;
name: string;
resource: string;
action: string;
scope: PermissionScope;
conditions?: PermissionCondition[];
}
export type PermissionScope = 'own' | 'team' | 'department' | 'all';
Estructura del Paquete
src/lib/
├── tenant/
│ ├── context.ts # Context interface
│ ├── config.ts # Config, UiConfig, ResourceLimits
│ ├── permissions.ts # Permissions, ModulePermissions
│ ├── features.ts # Features interface
│ ├── context-info.ts # ContextInfo para login
│ └── index.ts # Exportaciones tenant
├── auth/
│ ├── user-profile.ts # UserProfile interface
│ ├── auth-state.ts # AuthState union types
│ ├── login-credentials.ts # LoginCredentials interface
│ ├── login-result.ts # LoginResult interface
│ ├── selection-result.ts # SelectionResult interface
│ ├── auth-errors.ts # AuthError types
│ └── index.ts # Exportaciones auth
├── rbac/
│ ├── role.ts # Role interface
│ ├── permission.ts # Permission interface
│ ├── permission-scope.ts # PermissionScope types
│ ├── permission-condition.ts # PermissionCondition interface
│ ├── resource-permissions.ts # ResourcePermissions interface
│ └── index.ts # Exportaciones rbac
├── ui/
│ ├── branding-config.ts # BrandingConfig interface
│ ├── module-config.ts # ModuleConfig interface
│ ├── user-preferences.ts # UserPreferences interface
│ ├── theme-config.ts # ThemeConfig interface
│ ├── ui-config.ts # UiConfig interface
│ └── index.ts # Exportaciones ui
├── api/
│ ├── api-response.ts # ApiResponse<T> generic
│ ├── pagination.ts # PaginationRequest, PaginationResponse
│ ├── error-response.ts # ErrorResponse interface
│ ├── request-metadata.ts # RequestMetadata interface
│ ├── filter-criteria.ts # FilterCriteria interface
│ └── index.ts # Exportaciones api
├── common/
│ ├── base-entity.ts # BaseEntity interface
│ ├── audit-fields.ts # AuditFields interface
│ ├── date-range.ts # DateRange interface
│ ├── key-value.ts # KeyValue<T> interface
│ └── index.ts # Exportaciones common
└── index.ts # Exportación principal
Casos de Uso
1. Librería Security
import { Context, UserProfile, LoginCredentials, AuthState } from '@libs-core/shared-models';
@Injectable()
export class AuthService {
currentUser = signal<UserProfile | null>(null);
currentContext = signal<Context | null>(null);
async login(credentials: LoginCredentials): Promise<void> {
// ...
}
}
2. Librería Data Access
import { UserProfile, ApiResponse, PaginationRequest } from '@libs-core/shared-models';
@Injectable()
export class UserService {
getUsers(pagination: PaginationRequest): Observable<ApiResponse<UserProfile[]>> {
return this.http.get<ApiResponse<UserProfile[]>>('/api/users', { params: pagination });
}
}
3. Librería Module Base
import { Context, Permission, ModuleConfig } from '@libs-core/shared-models';
export class BaseModule {
constructor(private context: Context) {}
hasPermission(permission: Permission): boolean {
// ...
}
}
Ventajas Arquitectónicas
Consistencia
- Tipado Unificado: Mismas interfaces en todo el workspace
- Documentación Centralizada: JSDoc en una sola ubicación
- Validación Única: Un solo lugar para cambios de modelo
Performance
- Tree Shaking Optimizado: Solo se importan los tipos necesarios
- Bundle Size Reducido: Sin código ejecutable, solo tipos
- Compilación Rápida: TypeScript puro sin dependencias
Mantenibilidad
- Refactoring Seguro: Cambios se propagan automáticamente
- Testing Simplificado: Modelos aislados y testeable
- Versionado Controlado: Evolución gradual de interfaces
Métricas de Calidad
Tipado
- Type Safety: 100% tipado, sin
any - Strict Mode: Configuración TypeScript estricta
- Export Granular: Importaciones específicas
Documentación
- JSDoc Coverage: ≥ 95% interfaces documentadas
- README Completo: Ejemplos de uso para cada dominio
- Migration Guides: Documentación de cambios breaking
Testing
- Type Testing: Validación de tipos con
tsd - JSON Schema: Generación automática para validación
- Example Validation: Ejemplos compilables
Comandos de Desarrollo
# Crear la librería
nx generate @nx/js:library shared-models \
--directory=libs/core \
--importPath=@libs-core/shared-models \
--strict
# Validar tipos
nx run shared-models:type-check
# Generar documentación
nx run shared-models:docs
# Publicar (interno)
nx run shared-models:build
Roadmap
Fase 1: Modelos Base (Semana 1)
- Tenant domain models
- Auth domain models
- RBAC domain models
Fase 2: Modelos UI y API (Semana 2)
- UI domain models
- API domain models
- Common utilities
Fase 3: Validación y Testing (Semana 3)
- JSON Schema generation
- Type testing setup
- Documentation generation
Fase 4: Integración (Semana 4)
- Migración de librerías existentes
- Actualización de importaciones
- Testing de integración
Esta librería se convierte en la base fundamental de todo el sistema GoGrab, garantizando consistencia, reutilización y mantenibilidad en todo el workspace.