# Prompt 8 — Fotos en el Google Drive de cada quien

Requiere el prompt 4 (lugares) y, para verlas en el mapa, el prompt 7. La
hoja del grupo no aguanta imágenes y un servidor propio no escala; en cambio
cada quien pone su espacio: la foto va al Drive de quien la tomó y la
bitácora solo guarda su identificador.

Antes de pegarlo necesitas un **ID de cliente de OAuth**. Es gratis, toma 10
minutos y lo haces tú UNA vez: registra la página, no a las personas. Tu
grupo no configura nada; cada quien solo toca "Conectar mi Drive".

1. **Proyecto.** https://console.cloud.google.com/projectcreate — nombre
   `Viaje`, Crear. Revisa que arriba diga ese proyecto.
2. **Drive.** https://console.cloud.google.com/apis/library/drive.googleapis.com
   — Habilitar.
3. **La pantalla de permiso.** https://console.cloud.google.com/auth/overview
   — Comenzar: nombre de la app, tu correo, Público **Externo**, Crear.
   Luego https://console.cloud.google.com/auth/scopes — Agregar o quitar
   permisos, marca solo `.../auth/drive.file`, Actualizar y Guardar. Y
   https://console.cloud.google.com/auth/audience — **Publicar app** (en
   "Prueba" solo entran los correos que apuntes a mano). `drive.file` es un
   permiso no sensible: no pide revisión de Google.
4. **El ID.** https://console.cloud.google.com/auth/clients/create — tipo
   Aplicación web; en "Orígenes de JavaScript autorizados" la dirección de
   tu página, exacta y sin ruta (`https://tu-sitio`); Crear. Copia el ID de
   cliente (termina en `.apps.googleusercontent.com`) y ponlo en
   `config.js`. No es un secreto. El "secreto del cliente" no se usa: no lo
   pongas en ningún lado.

Google renombra estos menús seguido; las direcciones llevan a la pantalla
correcta aunque el texto cambie.

---

Agrega fotos a los lugares de mi tablero de viaje, cada una en el Google
Drive de QUIEN la sube, en un módulo `fotos.js` aparte y un `config.js` con
`googleClientId` (vacío = el botón de fotos no aparece y todo lo demás
funciona igual).

- **Sesión**: Google Identity Services (`accounts.google.com/gsi/client`,
  cargado solo cuando hace falta) con `initTokenClient` y el alcance
  `https://www.googleapis.com/auth/drive.file` — la página solo ve los
  archivos que ella misma crea; el resto del Drive de nadie. La ventana de
  Google necesita un toque del usuario: pídela desde un botón.
- **Drive**: una carpeta "Viaje · <nombre>" por viaje en el Drive de cada
  quien (búscala por nombre la primera vez —con `drive.file` solo ve las que
  creó la página— y recuerda su id). Sube con `uploadType=multipart` y
  comparte cada foto como `{ role: 'reader', type: 'anyone' }`: así el grupo
  y el mapa la ven. Un 401 de Drive = sesión vencida: pídela otra vez.
- **Antes de subir**: redúcela en el teléfono a 1600 px de lado mayor, JPEG
  0.82, redibujándola en un canvas (eso además borra los metadatos EXIF,
  ubicación GPS incluida).
- **Sin señal**: la foto reducida espera en IndexedDB (localStorage no
  aguanta blobs) con su lugar; se ve en la tira del lugar marcada "por
  subir". Sube sola al volver la red si la sesión sigue viva; si no, un
  aviso "N fotos esperan para subir a tu Google Drive · Conectar mi Drive".
  SOLO cuando Drive confirmó, entra a la bitácora
  `{ tipo: 'foto', id, lugar, drive, ancho, alto }` y sale de la cola.
- **En el motor**: las fotos se cuelgan de su lugar al final del reductor
  (pueden llegar antes que él); una vez por id y una vez por archivo de
  Drive (la cola reintenta); el id de Drive se valida con
  `/^[A-Za-z0-9_-]{10,200}$/`; `{ tipo: 'anulacion_foto', foto }` la quita
  del viaje (sigue en el Drive de su dueño). Botón "Foto" en cada lugar
  probado; miniaturas de `https://drive.google.com/thumbnail?id=ID&sz=w240`
  que abren `https://drive.google.com/file/d/ID/view`; solo quien subió una
  foto ve la ✕ para quitarla.
- **Al mapa**: `paraElMapa` manda hasta 6 ids de Drive por lugar. El mapa
  acepta SOLO ids con forma válida y arma él mismo la URL de la miniatura
  (nunca confíes en una URL que venga en el paquete) y la cuelga de la
  ciudad sin repetirla.

Para probar sin cuenta de Google, deja un punto de sustitución
(`ViajeFotos.backend.subir`, `conectado`, `conectar`) que el banco del
navegador reemplace por uno falso.

Qué decirle a tu grupo: las fotos quedan en su propio Drive, compartidas
"con cualquiera que tenga el enlace"; el enlace solo vive en la hoja del
grupo y en tu mapa. Quien no quiera, simplemente no sube fotos.
