valtech-components 2.0.452 → 2.0.453
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/services/auth/auth-state.service.mjs +173 -0
- package/esm2022/lib/services/auth/auth.service.mjs +454 -0
- package/esm2022/lib/services/auth/config.mjs +76 -0
- package/esm2022/lib/services/auth/guards.mjs +194 -0
- package/esm2022/lib/services/auth/index.mjs +70 -0
- package/esm2022/lib/services/auth/interceptor.mjs +98 -0
- package/esm2022/lib/services/auth/storage.service.mjs +141 -0
- package/esm2022/lib/services/auth/sync.service.mjs +149 -0
- package/esm2022/lib/services/auth/token.service.mjs +113 -0
- package/esm2022/lib/services/auth/types.mjs +29 -0
- package/esm2022/lib/services/firebase/config.mjs +108 -0
- package/esm2022/lib/services/firebase/firebase.service.mjs +288 -0
- package/esm2022/lib/services/firebase/firestore-collection.mjs +254 -0
- package/esm2022/lib/services/firebase/firestore.service.mjs +509 -0
- package/esm2022/lib/services/firebase/index.mjs +49 -0
- package/esm2022/lib/services/firebase/messaging.service.mjs +512 -0
- package/esm2022/lib/services/firebase/shared-config.mjs +138 -0
- package/esm2022/lib/services/firebase/storage.service.mjs +422 -0
- package/esm2022/lib/services/firebase/types.mjs +8 -0
- package/esm2022/lib/services/firebase/utils/path-builder.mjs +195 -0
- package/esm2022/lib/services/firebase/utils/query-builder.mjs +302 -0
- package/esm2022/public-api.mjs +3 -5
- package/fesm2022/valtech-components.mjs +4195 -4
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/services/auth/auth-state.service.d.ts +85 -0
- package/lib/services/auth/auth.service.d.ts +146 -0
- package/lib/services/auth/config.d.ts +38 -0
- package/lib/services/auth/guards.d.ts +123 -0
- package/lib/services/auth/index.d.ts +63 -0
- package/lib/services/auth/interceptor.d.ts +22 -0
- package/lib/services/auth/storage.service.d.ts +48 -0
- package/lib/services/auth/sync.service.d.ts +49 -0
- package/lib/services/auth/token.service.d.ts +51 -0
- package/lib/services/auth/types.d.ts +315 -0
- package/lib/services/firebase/config.d.ts +49 -0
- package/lib/services/firebase/firebase.service.d.ts +140 -0
- package/lib/services/firebase/firestore-collection.d.ts +175 -0
- package/lib/services/firebase/firestore.service.d.ts +304 -0
- package/lib/services/firebase/index.d.ts +39 -0
- package/lib/services/firebase/messaging.service.d.ts +263 -0
- package/lib/services/firebase/shared-config.d.ts +126 -0
- package/lib/services/firebase/storage.service.d.ts +206 -0
- package/lib/services/firebase/types.d.ts +281 -0
- package/lib/services/firebase/utils/path-builder.d.ts +132 -0
- package/lib/services/firebase/utils/query-builder.d.ts +210 -0
- package/package.json +1 -1
- package/public-api.d.ts +2 -0
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Firebase Shared Configuration
|
|
3
|
+
*
|
|
4
|
+
* Configuración base de Firebase compartida entre todas las apps del monorepo.
|
|
5
|
+
* Los secrets (apiKey, appId) se inyectan en build time via environment.
|
|
6
|
+
*/
|
|
7
|
+
import { EmulatorConfig, FirebaseConfig, ValtechFirebaseConfig } from './types';
|
|
8
|
+
/**
|
|
9
|
+
* Identificadores de las apps del monorepo.
|
|
10
|
+
* Usados para namespacing de colecciones Firestore y paths de Storage.
|
|
11
|
+
*/
|
|
12
|
+
export type AppId = 'demo' | 'showcase' | 'admin-portal' | 'app';
|
|
13
|
+
export declare const APP_IDS: {
|
|
14
|
+
readonly DEMO: AppId;
|
|
15
|
+
readonly SHOWCASE: AppId;
|
|
16
|
+
readonly ADMIN_PORTAL: AppId;
|
|
17
|
+
readonly APP: AppId;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* IDs de los proyectos Firebase por ambiente.
|
|
21
|
+
* Deben coincidir con los proyectos creados en Firebase Console.
|
|
22
|
+
*/
|
|
23
|
+
export declare const FIREBASE_PROJECTS: {
|
|
24
|
+
readonly development: "myvaltech-dev";
|
|
25
|
+
readonly production: "myvaltech-prod";
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Configuración de emuladores compartida.
|
|
29
|
+
* Todos los puertos deben coincidir con frontend/firebase/firebase.json
|
|
30
|
+
*/
|
|
31
|
+
export declare const SHARED_EMULATOR_CONFIG: EmulatorConfig;
|
|
32
|
+
/**
|
|
33
|
+
* Genera paths de Storage con namespace por app.
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* // Path específico de la app
|
|
37
|
+
* storagePaths.forApp('showcase', 'uploads', 'image.jpg')
|
|
38
|
+
* // => 'showcase/uploads/image.jpg'
|
|
39
|
+
*
|
|
40
|
+
* // Path compartido
|
|
41
|
+
* storagePaths.shared.profilePhoto('user123', 'avatar.jpg')
|
|
42
|
+
* // => 'profile-photos/user123/avatar.jpg'
|
|
43
|
+
*/
|
|
44
|
+
export declare const storagePaths: {
|
|
45
|
+
/** Carpeta específica de la app: {appId}/{...paths} */
|
|
46
|
+
forApp: (appId: AppId, ...paths: string[]) => string;
|
|
47
|
+
/** Carpetas compartidas (sin namespace) */
|
|
48
|
+
shared: {
|
|
49
|
+
/** Foto de perfil de usuario */
|
|
50
|
+
profilePhoto: (userId: string, fileName: string) => string;
|
|
51
|
+
/** Archivos públicos accesibles sin autenticación */
|
|
52
|
+
public: (...paths: string[]) => string;
|
|
53
|
+
};
|
|
54
|
+
/** Carpetas de desarrollo (acceso libre en emuladores) */
|
|
55
|
+
demo: (...paths: string[]) => string;
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Genera paths de colecciones con namespace por app.
|
|
59
|
+
*
|
|
60
|
+
* IMPORTANTE: La estructura es /apps/{appId}/{collection}/{docId}
|
|
61
|
+
* Firestore requiere número impar de segmentos para paths de colección.
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* // Colección específica de la app
|
|
65
|
+
* collections.forApp('showcase', 'items')
|
|
66
|
+
* // => 'apps/showcase/items'
|
|
67
|
+
*
|
|
68
|
+
* // Colección de desarrollo
|
|
69
|
+
* collections.forApp('demo', 'items')
|
|
70
|
+
* // => 'apps/demo/items'
|
|
71
|
+
*
|
|
72
|
+
* // Colección compartida
|
|
73
|
+
* collections.shared.users
|
|
74
|
+
* // => 'users'
|
|
75
|
+
*/
|
|
76
|
+
export declare const collections: {
|
|
77
|
+
/** Colección específica de la app: apps/{appId}/{collection} */
|
|
78
|
+
forApp: (appId: AppId, collectionName: string) => string;
|
|
79
|
+
/** Colecciones compartidas (sin namespace, nivel raíz) */
|
|
80
|
+
shared: {
|
|
81
|
+
/** Usuarios del sistema */
|
|
82
|
+
users: string;
|
|
83
|
+
/** Perfiles públicos */
|
|
84
|
+
profiles: string;
|
|
85
|
+
/** Notificaciones de usuarios */
|
|
86
|
+
notifications: string;
|
|
87
|
+
};
|
|
88
|
+
};
|
|
89
|
+
/**
|
|
90
|
+
* Opciones para crear la configuración de Firebase
|
|
91
|
+
*/
|
|
92
|
+
export interface CreateFirebaseConfigOptions {
|
|
93
|
+
/** Usar emuladores locales (para desarrollo) */
|
|
94
|
+
useEmulators?: boolean;
|
|
95
|
+
/** Habilitar persistencia offline de Firestore */
|
|
96
|
+
persistence?: boolean;
|
|
97
|
+
/** Habilitar Firebase Cloud Messaging */
|
|
98
|
+
enableMessaging?: boolean;
|
|
99
|
+
/** VAPID key para FCM (requerido si enableMessaging es true) */
|
|
100
|
+
messagingVapidKey?: string;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Crea la configuración completa de Firebase desde variables de entorno.
|
|
104
|
+
* Usa esto en el environment.ts de cada app.
|
|
105
|
+
*
|
|
106
|
+
* @example
|
|
107
|
+
* // environment.ts
|
|
108
|
+
* export const environment = {
|
|
109
|
+
* firebase: createFirebaseConfig(
|
|
110
|
+
* {
|
|
111
|
+
* apiKey: 'AIza...',
|
|
112
|
+
* authDomain: 'myvaltech-dev.firebaseapp.com',
|
|
113
|
+
* projectId: 'myvaltech-dev',
|
|
114
|
+
* storageBucket: 'myvaltech-dev.appspot.com',
|
|
115
|
+
* messagingSenderId: '123456789',
|
|
116
|
+
* appId: '1:123456789:web:abc123',
|
|
117
|
+
* },
|
|
118
|
+
* { useEmulators: true, persistence: true }
|
|
119
|
+
* ),
|
|
120
|
+
* };
|
|
121
|
+
*/
|
|
122
|
+
export declare function createFirebaseConfig(envConfig: FirebaseConfig, options?: CreateFirebaseConfigOptions): ValtechFirebaseConfig;
|
|
123
|
+
/**
|
|
124
|
+
* Verifica si la configuración tiene emuladores habilitados
|
|
125
|
+
*/
|
|
126
|
+
export declare function isEmulatorMode(config: ValtechFirebaseConfig): boolean;
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import { Storage } from '@angular/fire/storage';
|
|
2
|
+
import { Observable } from 'rxjs';
|
|
3
|
+
import { StorageListResult, StorageMetadata, UploadProgress, UploadResult } from './types';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
/**
|
|
6
|
+
* Servicio para Firebase Storage.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* @Component({...})
|
|
11
|
+
* export class FileUploadComponent {
|
|
12
|
+
* private storage = inject(StorageService);
|
|
13
|
+
*
|
|
14
|
+
* uploadProgress = signal<number>(0);
|
|
15
|
+
* downloadUrl = signal<string | null>(null);
|
|
16
|
+
*
|
|
17
|
+
* async onFileSelected(event: Event) {
|
|
18
|
+
* const file = (event.target as HTMLInputElement).files?.[0];
|
|
19
|
+
* if (!file) return;
|
|
20
|
+
*
|
|
21
|
+
* // Upload con progreso
|
|
22
|
+
* this.storage.upload(`uploads/${file.name}`, file).subscribe({
|
|
23
|
+
* next: (progress) => this.uploadProgress.set(progress.percentage),
|
|
24
|
+
* complete: async () => {
|
|
25
|
+
* const url = await this.storage.getDownloadUrl(`uploads/${file.name}`);
|
|
26
|
+
* this.downloadUrl.set(url);
|
|
27
|
+
* }
|
|
28
|
+
* });
|
|
29
|
+
* }
|
|
30
|
+
* }
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export declare class StorageService {
|
|
34
|
+
private storage;
|
|
35
|
+
constructor(storage: Storage);
|
|
36
|
+
/**
|
|
37
|
+
* Sube un archivo con tracking de progreso.
|
|
38
|
+
*
|
|
39
|
+
* @param path - Ruta en Storage donde guardar el archivo
|
|
40
|
+
* @param file - Archivo a subir (File o Blob)
|
|
41
|
+
* @param metadata - Metadata opcional (contentType, customMetadata)
|
|
42
|
+
* @returns Observable que emite el progreso y completa cuando termina
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* ```typescript
|
|
46
|
+
* // Upload básico
|
|
47
|
+
* storage.upload('images/photo.jpg', file).subscribe({
|
|
48
|
+
* next: (progress) => console.log(`${progress.percentage}%`),
|
|
49
|
+
* complete: () => console.log('Upload completado')
|
|
50
|
+
* });
|
|
51
|
+
*
|
|
52
|
+
* // Con metadata
|
|
53
|
+
* storage.upload('docs/report.pdf', file, {
|
|
54
|
+
* contentType: 'application/pdf',
|
|
55
|
+
* customMetadata: { uploadedBy: 'user123' }
|
|
56
|
+
* }).subscribe(...);
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
upload(path: string, file: File | Blob, metadata?: StorageMetadata): Observable<UploadProgress>;
|
|
60
|
+
/**
|
|
61
|
+
* Sube un archivo y retorna la URL de descarga al completar.
|
|
62
|
+
*
|
|
63
|
+
* @param path - Ruta en Storage
|
|
64
|
+
* @param file - Archivo a subir
|
|
65
|
+
* @param metadata - Metadata opcional
|
|
66
|
+
* @returns Resultado del upload con URL de descarga
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* ```typescript
|
|
70
|
+
* const result = await storage.uploadAndGetUrl('avatars/user123.jpg', file);
|
|
71
|
+
* console.log('URL:', result.downloadUrl);
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
uploadAndGetUrl(path: string, file: File | Blob, metadata?: StorageMetadata): Promise<UploadResult>;
|
|
75
|
+
/**
|
|
76
|
+
* Sube un archivo desde una Data URL (base64).
|
|
77
|
+
*
|
|
78
|
+
* @param path - Ruta en Storage
|
|
79
|
+
* @param dataUrl - Data URL (ej: 'data:image/png;base64,...')
|
|
80
|
+
* @param metadata - Metadata opcional
|
|
81
|
+
* @returns Resultado del upload
|
|
82
|
+
*
|
|
83
|
+
* @example
|
|
84
|
+
* ```typescript
|
|
85
|
+
* // Desde canvas
|
|
86
|
+
* const dataUrl = canvas.toDataURL('image/png');
|
|
87
|
+
* const result = await storage.uploadFromDataUrl('images/drawing.png', dataUrl);
|
|
88
|
+
* ```
|
|
89
|
+
*/
|
|
90
|
+
uploadFromDataUrl(path: string, dataUrl: string, metadata?: StorageMetadata): Promise<UploadResult>;
|
|
91
|
+
/**
|
|
92
|
+
* Obtiene la URL de descarga de un archivo.
|
|
93
|
+
*
|
|
94
|
+
* @param path - Ruta del archivo en Storage
|
|
95
|
+
* @returns URL de descarga
|
|
96
|
+
*
|
|
97
|
+
* @example
|
|
98
|
+
* ```typescript
|
|
99
|
+
* const url = await storage.getDownloadUrl('images/photo.jpg');
|
|
100
|
+
* // Usar en <img [src]="url">
|
|
101
|
+
* ```
|
|
102
|
+
*/
|
|
103
|
+
getDownloadUrl(path: string): Promise<string>;
|
|
104
|
+
/**
|
|
105
|
+
* Obtiene la metadata de un archivo.
|
|
106
|
+
*
|
|
107
|
+
* @param path - Ruta del archivo
|
|
108
|
+
* @returns Metadata del archivo
|
|
109
|
+
*/
|
|
110
|
+
getMetadata(path: string): Promise<StorageMetadata & {
|
|
111
|
+
size: number;
|
|
112
|
+
name: string;
|
|
113
|
+
}>;
|
|
114
|
+
/**
|
|
115
|
+
* Elimina un archivo.
|
|
116
|
+
*
|
|
117
|
+
* @param path - Ruta del archivo a eliminar
|
|
118
|
+
*
|
|
119
|
+
* @example
|
|
120
|
+
* ```typescript
|
|
121
|
+
* await storage.delete('images/old-photo.jpg');
|
|
122
|
+
* ```
|
|
123
|
+
*/
|
|
124
|
+
delete(path: string): Promise<void>;
|
|
125
|
+
/**
|
|
126
|
+
* Elimina múltiples archivos.
|
|
127
|
+
*
|
|
128
|
+
* @param paths - Array de rutas a eliminar
|
|
129
|
+
*
|
|
130
|
+
* @example
|
|
131
|
+
* ```typescript
|
|
132
|
+
* await storage.deleteMultiple([
|
|
133
|
+
* 'images/photo1.jpg',
|
|
134
|
+
* 'images/photo2.jpg'
|
|
135
|
+
* ]);
|
|
136
|
+
* ```
|
|
137
|
+
*/
|
|
138
|
+
deleteMultiple(paths: string[]): Promise<void>;
|
|
139
|
+
/**
|
|
140
|
+
* Lista archivos en un directorio.
|
|
141
|
+
*
|
|
142
|
+
* @param path - Ruta del directorio
|
|
143
|
+
* @returns Lista de rutas de archivos
|
|
144
|
+
*
|
|
145
|
+
* @example
|
|
146
|
+
* ```typescript
|
|
147
|
+
* const result = await storage.list('images/');
|
|
148
|
+
* console.log(result.items); // ['images/photo1.jpg', 'images/photo2.jpg']
|
|
149
|
+
* ```
|
|
150
|
+
*/
|
|
151
|
+
list(path: string): Promise<StorageListResult>;
|
|
152
|
+
/**
|
|
153
|
+
* Genera un nombre de archivo único con timestamp.
|
|
154
|
+
*
|
|
155
|
+
* @param originalName - Nombre original del archivo
|
|
156
|
+
* @param prefix - Prefijo opcional
|
|
157
|
+
* @returns Nombre único
|
|
158
|
+
*
|
|
159
|
+
* @example
|
|
160
|
+
* ```typescript
|
|
161
|
+
* const uniqueName = storage.generateFileName('photo.jpg', 'user123');
|
|
162
|
+
* // => 'user123_1703091234567_photo.jpg'
|
|
163
|
+
* ```
|
|
164
|
+
*/
|
|
165
|
+
generateFileName(originalName: string, prefix?: string): string;
|
|
166
|
+
/**
|
|
167
|
+
* Genera una ruta única para un archivo.
|
|
168
|
+
*
|
|
169
|
+
* @param directory - Directorio base
|
|
170
|
+
* @param originalName - Nombre original
|
|
171
|
+
* @param prefix - Prefijo opcional
|
|
172
|
+
* @returns Ruta completa única
|
|
173
|
+
*
|
|
174
|
+
* @example
|
|
175
|
+
* ```typescript
|
|
176
|
+
* const path = storage.generatePath('uploads', 'photo.jpg', 'user123');
|
|
177
|
+
* // => 'uploads/user123_1703091234567_photo.jpg'
|
|
178
|
+
* ```
|
|
179
|
+
*/
|
|
180
|
+
generatePath(directory: string, originalName: string, prefix?: string): string;
|
|
181
|
+
/**
|
|
182
|
+
* Obtiene la extensión de un archivo.
|
|
183
|
+
*
|
|
184
|
+
* @param filename - Nombre del archivo
|
|
185
|
+
* @returns Extensión (sin el punto)
|
|
186
|
+
*/
|
|
187
|
+
getExtension(filename: string): string;
|
|
188
|
+
/**
|
|
189
|
+
* Verifica si un archivo es una imagen basándose en su extensión.
|
|
190
|
+
*/
|
|
191
|
+
isImage(filename: string): boolean;
|
|
192
|
+
/**
|
|
193
|
+
* Verifica si un archivo es un documento.
|
|
194
|
+
*/
|
|
195
|
+
isDocument(filename: string): boolean;
|
|
196
|
+
/**
|
|
197
|
+
* Mapea el estado de la tarea de upload
|
|
198
|
+
*/
|
|
199
|
+
private mapTaskState;
|
|
200
|
+
/**
|
|
201
|
+
* Convierte errores de Storage a mensajes en español
|
|
202
|
+
*/
|
|
203
|
+
private getErrorMessage;
|
|
204
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<StorageService, never>;
|
|
205
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<StorageService>;
|
|
206
|
+
}
|
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Firebase Types
|
|
3
|
+
*
|
|
4
|
+
* Tipos e interfaces para la integración de Firebase en valtech-components.
|
|
5
|
+
* Todos los modelos de Firestore deben extender FirestoreDocument.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Configuración de Firebase (valores de firebaseConfig)
|
|
9
|
+
*/
|
|
10
|
+
export interface FirebaseConfig {
|
|
11
|
+
apiKey: string;
|
|
12
|
+
authDomain: string;
|
|
13
|
+
projectId: string;
|
|
14
|
+
storageBucket: string;
|
|
15
|
+
messagingSenderId: string;
|
|
16
|
+
appId: string;
|
|
17
|
+
measurementId?: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Configuración de emuladores para desarrollo local
|
|
21
|
+
*/
|
|
22
|
+
export interface EmulatorConfig {
|
|
23
|
+
firestore?: {
|
|
24
|
+
host: string;
|
|
25
|
+
port: number;
|
|
26
|
+
};
|
|
27
|
+
auth?: {
|
|
28
|
+
host: string;
|
|
29
|
+
port: number;
|
|
30
|
+
};
|
|
31
|
+
storage?: {
|
|
32
|
+
host: string;
|
|
33
|
+
port: number;
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Configuración completa de Valtech Firebase
|
|
38
|
+
*/
|
|
39
|
+
export interface ValtechFirebaseConfig {
|
|
40
|
+
/** Configuración de Firebase */
|
|
41
|
+
firebase: FirebaseConfig;
|
|
42
|
+
/** Configuración de emuladores (opcional, para desarrollo) */
|
|
43
|
+
emulator?: EmulatorConfig;
|
|
44
|
+
/** Habilitar persistencia offline de Firestore (default: false) */
|
|
45
|
+
persistence?: boolean;
|
|
46
|
+
/** Habilitar Firebase Cloud Messaging (default: false) - requiere Service Worker */
|
|
47
|
+
enableMessaging?: boolean;
|
|
48
|
+
/** VAPID key para Firebase Cloud Messaging */
|
|
49
|
+
messagingVapidKey?: string;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Interface base para todos los documentos de Firestore.
|
|
53
|
+
* Todos los modelos deben extender esta interface.
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* interface User extends FirestoreDocument {
|
|
57
|
+
* name: string;
|
|
58
|
+
* email: string;
|
|
59
|
+
* }
|
|
60
|
+
*/
|
|
61
|
+
export interface FirestoreDocument {
|
|
62
|
+
/** ID del documento (asignado por Firestore) */
|
|
63
|
+
id?: string;
|
|
64
|
+
/** Fecha de creación (manejada automáticamente) */
|
|
65
|
+
createdAt?: Date;
|
|
66
|
+
/** Fecha de última actualización (manejada automáticamente) */
|
|
67
|
+
updatedAt?: Date;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Operadores disponibles para cláusulas where
|
|
71
|
+
*/
|
|
72
|
+
export type WhereOperator = '==' | '!=' | '<' | '<=' | '>' | '>=' | 'array-contains' | 'array-contains-any' | 'in' | 'not-in';
|
|
73
|
+
/**
|
|
74
|
+
* Cláusula where para filtrar documentos
|
|
75
|
+
*/
|
|
76
|
+
export interface WhereClause {
|
|
77
|
+
/** Campo a filtrar */
|
|
78
|
+
field: string;
|
|
79
|
+
/** Operador de comparación */
|
|
80
|
+
operator: WhereOperator;
|
|
81
|
+
/** Valor a comparar */
|
|
82
|
+
value: unknown;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Dirección de ordenamiento
|
|
86
|
+
*/
|
|
87
|
+
export type OrderDirection = 'asc' | 'desc';
|
|
88
|
+
/**
|
|
89
|
+
* Cláusula orderBy para ordenar resultados
|
|
90
|
+
*/
|
|
91
|
+
export interface OrderByClause {
|
|
92
|
+
/** Campo por el cual ordenar */
|
|
93
|
+
field: string;
|
|
94
|
+
/** Dirección del ordenamiento */
|
|
95
|
+
direction: OrderDirection;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Opciones para queries de Firestore
|
|
99
|
+
*/
|
|
100
|
+
export interface QueryOptions {
|
|
101
|
+
/** Filtros where (AND entre todos) */
|
|
102
|
+
where?: WhereClause[];
|
|
103
|
+
/** Ordenamiento de resultados */
|
|
104
|
+
orderBy?: OrderByClause[];
|
|
105
|
+
/** Límite de documentos a retornar */
|
|
106
|
+
limit?: number;
|
|
107
|
+
/** Cursor para paginación: empezar después de este documento */
|
|
108
|
+
startAfter?: unknown;
|
|
109
|
+
/** Cursor para paginación: empezar en este documento */
|
|
110
|
+
startAt?: unknown;
|
|
111
|
+
/** Cursor para paginación: terminar antes de este documento */
|
|
112
|
+
endBefore?: unknown;
|
|
113
|
+
/** Cursor para paginación: terminar en este documento */
|
|
114
|
+
endAt?: unknown;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Opciones adicionales para subscripciones real-time
|
|
118
|
+
*/
|
|
119
|
+
export interface SubscriptionOptions extends QueryOptions {
|
|
120
|
+
/** Incluir cambios de metadata (ej: pendingWrites) */
|
|
121
|
+
includeMetadataChanges?: boolean;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Resultado de una query paginada
|
|
125
|
+
*/
|
|
126
|
+
export interface PaginatedResult<T> {
|
|
127
|
+
/** Documentos de la página actual */
|
|
128
|
+
data: T[];
|
|
129
|
+
/** Indica si hay más páginas disponibles */
|
|
130
|
+
hasMore: boolean;
|
|
131
|
+
/** Cursor para la siguiente página (pasar a startAfter) */
|
|
132
|
+
lastDoc: unknown;
|
|
133
|
+
/** Total de documentos (opcional, requiere query adicional) */
|
|
134
|
+
total?: number;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Estado de una operación de upload
|
|
138
|
+
*/
|
|
139
|
+
export type UploadState = 'running' | 'paused' | 'success' | 'canceled' | 'error';
|
|
140
|
+
/**
|
|
141
|
+
* Progreso de upload de archivo
|
|
142
|
+
*/
|
|
143
|
+
export interface UploadProgress {
|
|
144
|
+
/** Bytes transferidos hasta ahora */
|
|
145
|
+
bytesTransferred: number;
|
|
146
|
+
/** Total de bytes a transferir */
|
|
147
|
+
totalBytes: number;
|
|
148
|
+
/** Porcentaje completado (0-100) */
|
|
149
|
+
percentage: number;
|
|
150
|
+
/** Estado actual del upload */
|
|
151
|
+
state: UploadState;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Resultado de un upload completado
|
|
155
|
+
*/
|
|
156
|
+
export interface UploadResult {
|
|
157
|
+
/** URL de descarga del archivo */
|
|
158
|
+
downloadUrl: string;
|
|
159
|
+
/** Ruta completa en Storage */
|
|
160
|
+
fullPath: string;
|
|
161
|
+
/** Nombre del archivo */
|
|
162
|
+
name: string;
|
|
163
|
+
/** Tamaño en bytes */
|
|
164
|
+
size: number;
|
|
165
|
+
/** Tipo MIME del archivo */
|
|
166
|
+
contentType: string;
|
|
167
|
+
/** Metadata personalizada */
|
|
168
|
+
metadata: Record<string, string>;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Metadata para archivos en Storage
|
|
172
|
+
*/
|
|
173
|
+
export interface StorageMetadata {
|
|
174
|
+
/** Tipo MIME del archivo */
|
|
175
|
+
contentType?: string;
|
|
176
|
+
/** Metadata personalizada (key-value) */
|
|
177
|
+
customMetadata?: Record<string, string>;
|
|
178
|
+
/** Control de caché HTTP */
|
|
179
|
+
cacheControl?: string;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Resultado de listar archivos en Storage
|
|
183
|
+
*/
|
|
184
|
+
export interface StorageListResult {
|
|
185
|
+
/** Rutas de los archivos encontrados */
|
|
186
|
+
items: string[];
|
|
187
|
+
/** Token para la siguiente página (si hay más) */
|
|
188
|
+
nextPageToken?: string;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Información del usuario de Firebase (simplificada)
|
|
192
|
+
*/
|
|
193
|
+
export interface FirebaseUser {
|
|
194
|
+
/** UID único del usuario */
|
|
195
|
+
uid: string;
|
|
196
|
+
/** Email del usuario */
|
|
197
|
+
email: string | null;
|
|
198
|
+
/** Nombre para mostrar */
|
|
199
|
+
displayName: string | null;
|
|
200
|
+
/** URL de foto de perfil */
|
|
201
|
+
photoURL: string | null;
|
|
202
|
+
/** Email verificado */
|
|
203
|
+
emailVerified: boolean;
|
|
204
|
+
/** Usuario anónimo */
|
|
205
|
+
isAnonymous: boolean;
|
|
206
|
+
/** Proveedor de autenticación */
|
|
207
|
+
providerId: string;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Estado de la sesión de Firebase
|
|
211
|
+
*/
|
|
212
|
+
export interface SessionState {
|
|
213
|
+
/** Usuario actual (null si no autenticado) */
|
|
214
|
+
user: FirebaseUser | null;
|
|
215
|
+
/** Indica si el usuario está autenticado */
|
|
216
|
+
isAuthenticated: boolean;
|
|
217
|
+
/** Indica si se está cargando el estado de auth */
|
|
218
|
+
isLoading: boolean;
|
|
219
|
+
/** Error de autenticación (si lo hay) */
|
|
220
|
+
error: Error | null;
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Estado del permiso de notificaciones
|
|
224
|
+
*/
|
|
225
|
+
export type NotificationPermission = 'granted' | 'denied' | 'default';
|
|
226
|
+
/**
|
|
227
|
+
* Payload de una notificación push
|
|
228
|
+
*/
|
|
229
|
+
export interface NotificationPayload {
|
|
230
|
+
/** Título de la notificación */
|
|
231
|
+
title?: string;
|
|
232
|
+
/** Cuerpo del mensaje */
|
|
233
|
+
body?: string;
|
|
234
|
+
/** URL de imagen */
|
|
235
|
+
image?: string;
|
|
236
|
+
/** Datos personalizados */
|
|
237
|
+
data?: Record<string, string>;
|
|
238
|
+
/** ID del mensaje de FCM */
|
|
239
|
+
messageId?: string;
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Acción de navegación desde una notificación
|
|
243
|
+
*/
|
|
244
|
+
export interface NotificationAction {
|
|
245
|
+
/** Ruta interna de la app (ej: '/orders/123') */
|
|
246
|
+
route?: string;
|
|
247
|
+
/** URL externa (ej: 'https://example.com') */
|
|
248
|
+
url?: string;
|
|
249
|
+
/** Parámetros de query string */
|
|
250
|
+
queryParams?: Record<string, string>;
|
|
251
|
+
/** Tipo de acción personalizada */
|
|
252
|
+
actionType?: string;
|
|
253
|
+
/** Datos adicionales para la acción */
|
|
254
|
+
actionData?: Record<string, unknown>;
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Evento de click en una notificación
|
|
258
|
+
*/
|
|
259
|
+
export interface NotificationClickEvent {
|
|
260
|
+
/** Payload original de la notificación */
|
|
261
|
+
notification: NotificationPayload;
|
|
262
|
+
/** Acción de navegación extraída */
|
|
263
|
+
action: NotificationAction;
|
|
264
|
+
/** Timestamp del click */
|
|
265
|
+
timestamp: Date;
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Códigos de error de Firebase
|
|
269
|
+
*/
|
|
270
|
+
export type FirebaseErrorCode = 'permission-denied' | 'not-found' | 'already-exists' | 'resource-exhausted' | 'cancelled' | 'unknown' | 'invalid-argument' | 'deadline-exceeded' | 'unauthenticated';
|
|
271
|
+
/**
|
|
272
|
+
* Error de Firebase tipado
|
|
273
|
+
*/
|
|
274
|
+
export interface FirebaseError {
|
|
275
|
+
/** Código del error */
|
|
276
|
+
code: FirebaseErrorCode;
|
|
277
|
+
/** Mensaje de error (en español) */
|
|
278
|
+
message: string;
|
|
279
|
+
/** Error original de Firebase */
|
|
280
|
+
originalError?: unknown;
|
|
281
|
+
}
|