valtech-components 4.0.977 → 4.0.979

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.
@@ -17,7 +17,7 @@ import * as i0 from "@angular/core";
17
17
  * token: invite.orgId,
18
18
  * orgName: invite.orgName,
19
19
  * inviterName: invite.inviterName,
20
- * role: invite.roleId,
20
+ * role: invite.roleLabel,
21
21
  * accepting: accepting() === invite.orgId
22
22
  * }"
23
23
  * (onAccept)="accept(invite)"
@@ -76,6 +76,8 @@ export interface PendingInvitation {
76
76
  orgId: string;
77
77
  orgName: string;
78
78
  roleId: string;
79
+ /** Nombre legible del rol (ej. "Taquilla"), resuelto server-side. */
80
+ roleLabel: string;
79
81
  inviterId: string;
80
82
  inviterName: string;
81
83
  expiresAt: string;
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Contrato de subida directa a S3 vía POST presignado (ADR-087). El consumer
3
+ * nunca arma este objeto a mano — lo recibe tal cual del backend
4
+ * (`RequestVideoUploadResponse`) y se lo pasa a `VideoUploadService.upload()`.
5
+ */
6
+ export interface S3PostUploadIntent {
7
+ uploadUrl: string;
8
+ uploadFields: Record<string, string>;
9
+ }
10
+ /**
11
+ * Los dos pasos que SÍ dependen del dominio (receta, contenido, animal en
12
+ * adopción...) y que la lib no puede conocer: cómo pedir el intent de subida
13
+ * y cómo avisar que terminó. Todo lo demás (armar el FormData, el POST a S3,
14
+ * el orden intent→S3→finalize) lo resuelve `VideoUploadService`.
15
+ */
16
+ export interface VideoUploadHandlers {
17
+ requestIntent: (file: File) => Promise<S3PostUploadIntent>;
18
+ finalize: () => Promise<void>;
19
+ }
20
+ export type VideoUploadStatus = 'uploading' | 'processing';
21
+ export interface VideoUploadProgress {
22
+ status: VideoUploadStatus;
23
+ }
@@ -0,0 +1,59 @@
1
+ import { Observable } from 'rxjs';
2
+ import { VideoUploadHandlers, VideoUploadProgress } from './types';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * Subida directa a S3 vía POST presignado (ADR-087, "el video no puede pasar
6
+ * por la API" — API Gateway tiene un tope duro de ~10MB de payload y un
7
+ * timeout de integración de 29s, ninguno de los dos configurable). El
8
+ * archivo nunca toca nuestro backend.
9
+ *
10
+ * Antes de este servicio, `uploadVideoToS3` vivía copiado literal en cada app
11
+ * consumidora (Eklesee, Okhelia) — mismo texto, mismo comentario, mismo
12
+ * riesgo de que un fix quede aplicado en una sola copia. Este servicio es al
13
+ * video lo que `StorageService` es a Firebase Storage: la app nunca ve el
14
+ * bucket, nunca arma un `FormData`, nunca sabe que el proveedor es S3.
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * private videoUpload = inject(VideoUploadService);
19
+ *
20
+ * onFileSelected(file: File) {
21
+ * this.videoUpload.upload(file, {
22
+ * requestIntent: (f) => firstValueFrom(this.recipeSvc.requestVideoUpload(recipeId, {
23
+ * filename: f.name, contentType: f.type || 'video/mp4', sizeBytes: f.size,
24
+ * })),
25
+ * finalize: () => firstValueFrom(this.recipeSvc.finalizeVideoUpload(recipeId)),
26
+ * }).subscribe({
27
+ * next: (progress) => this.state.set(progress.status),
28
+ * error: (err) => this.errors.handle(err, { context: 'my-page.uploadVideo', ... }),
29
+ * complete: () => this.state.set('done'),
30
+ * });
31
+ * }
32
+ * ```
33
+ */
34
+ export declare class VideoUploadService {
35
+ /**
36
+ * Orquesta el flujo completo: pide el intent al backend del dominio, sube
37
+ * el archivo a S3, y avisa que terminó. Emite el progreso en dos pasos
38
+ * (`uploading` mientras sube a S3, `processing` mientras el backend hace
39
+ * `finalize`) y completa cuando el backend confirma — el estado real del
40
+ * video (`ready`/`failed`) sigue siendo async del lado del backend
41
+ * (EventBridge → worker), esto solo cubre la subida.
42
+ */
43
+ upload(file: File, handlers: VideoUploadHandlers): Observable<VideoUploadProgress>;
44
+ /**
45
+ * Arma el `FormData` de la subida POST de S3 y lo envía. **Orden del
46
+ * FormData**: los campos de la policy PRIMERO, el archivo AL FINAL — es un
47
+ * requisito del form-based upload de S3 (RFC de multipart/form-data + cómo
48
+ * S3 procesa la policy), no un detalle de estilo.
49
+ *
50
+ * Usa `fetch()` nativo A PROPÓSITO, nunca `HttpClient`: el interceptor de
51
+ * `provideValtechAuth` agrega `Authorization: Bearer <token>` a cualquier
52
+ * request que pase por él, y no corresponde que ese token viaje a un
53
+ * dominio de S3 que no es nuestro backend.
54
+ * @internal
55
+ */
56
+ private postToS3;
57
+ static ɵfac: i0.ɵɵFactoryDeclaration<VideoUploadService, never>;
58
+ static ɵprov: i0.ɵɵInjectableDeclaration<VideoUploadService>;
59
+ }
package/lib/version.d.ts CHANGED
@@ -2,4 +2,4 @@
2
2
  * Current version of valtech-components.
3
3
  * This is automatically updated during the publish process.
4
4
  */
5
- export declare const VERSION = "4.0.977";
5
+ export declare const VERSION = "4.0.979";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "valtech-components",
3
- "version": "4.0.977",
3
+ "version": "4.0.979",
4
4
  "private": false,
5
5
  "bin": {
6
6
  "valtech-firebase-config": "./src/lib/services/firebase/scripts/generate-sw-config.js"
package/public-api.d.ts CHANGED
@@ -430,6 +430,8 @@ export * from './lib/services/icons.service';
430
430
  export * from './lib/services/in-app-browser.service';
431
431
  export * from './lib/services/link-processor.service';
432
432
  export * from './lib/services/local-storage.service';
433
+ export * from './lib/services/video-upload/types';
434
+ export * from './lib/services/video-upload/video-upload.service';
433
435
  export * from './lib/services/locale.service';
434
436
  export * from './lib/services/navigation';
435
437
  export * from './lib/services/theme.service';