Suite 101 · arquitectura
draw101 y nest101 se abren entrando con la cuenta de la suite: correo y contraseña, o Google. La clave tecleada se queda como segunda forma, pero deja de ser la principal. Y en master101 hay un visor que dice qué correos tienen licencia vigente, de qué tipo, en cuántos equipos y hasta cuándo. El tipo —de dónde salió la licencia— y la vigencia —si vence o no— son dos columnas distintas, a propósito.
Hasta hoy sólo había una: la persona tecleaba una clave T101-XXXX-XXXX-XXXX y la app la cambiaba por un token firmado, amarrado a esa máquina. Sigue existiendo, pero ya no es por donde se entra normalmente.
La pantalla vive en el mismo origen que la API, así que la galleta de sesión es de primera parte y el regreso de Google es una ruta de ahí mismo. Cuando la licencia queda activada, la pantalla deja el resultado en window.__t101_licencia y cambia el fragmento de la dirección a #listo. La app escucha ese cambio y lee el objeto.
Una dirección se copia, se pega, se manda por chat y se queda en los registros de quien sea que la vea pasar. El fragmento sólo dice «listo»; el token se queda en la memoria de la ventana.
Un «lugar» de la licencia es una máquina, y para contar máquinas hace falta poder distinguirlas. La huella es un azar de 32 bytes que la app se inventa la primera vez que arranca y guarda en su carpeta de datos; lo que viaja es el resumen, no el azar.
El tipo dice de dónde salió la licencia; la vigencia dice si vence. Meterlos en una sola lista se ve más simple y cuesta caro: una perpetua comprada en la App Store dejaría de contar como de App Store, y no habría forma de saber cuántas se vendieron ahí.
| Tipo | Qué quiere decir | Quién lo pone |
|---|---|---|
cortesia | Regalada; no la pagó nadie. | Mike, al dar de alta a mano. Es lo que se pone por omisión: nadie cobra desde ahí. |
suite101 | Va incluida en lo que la empresa ya paga por la suite. | Mike. |
stripe | La cobró la pasarela. | Se pone solo: un pago marcado con origen: 'stripe' cambia el tipo. Un pago marcado a mano no lo toca. |
appstore | La cobró la tienda de Apple. | Mike, mientras no haya versión de Mac. |
Y aparte, perpetua: la columna que antes se llamaba cortesia y que siempre quiso decir «sin fecha de corte», no «regalada». Una perpetua puede estar pagada. La cortesía de las empresas (orgs.cortesia) es otra cosa y no cambió.
El token trae su propio hasta firmado. Mientras ese día no pase, la app abre sin preguntarle a nadie y manda el latido sin detener el arranque: un taller no tiene por qué esperar a un servidor para abrir un plano. Cuando el token vence y no hay forma de llegar a la suite, la app no abre y lo dice con esas palabras.
«La suite dice que no» y «no se pudo llegar a la suite» no son lo mismo. Un 503 o una falta de señal no borran la licencia guardada de nadie. Confundirlas dejaría a un taller sin su programa por un mal rato del servidor, y es de las cosas que no se notan probando a mano con buen internet: por eso está medido, y por eso el núcleo de la puerta vive en un archivo que no importa Electron y se puede correr con node a secas.
En master101 → Licencias: una fila por licencia que abre con el correo —que es por donde se buscan— y trae el tipo, los equipos (activos de los permitidos) y cuándo vence, o «No vence». Arriba, filtros por tipo (con cuántas hay de cada uno), por programa, por correo, y una casilla para ver sólo las que hoy dejan entrar.
Los filtros los resuelve la API, no el navegador: «vigente» se decide con la fecha del servidor y no con la del teléfono de quien mira, y el día que haya cientos de licencias no tiene caso traerlas todas para esconder la mayoría. Los conteos por tipo vienen sin el filtro de tipo puesto, para que escoger uno no deje a los demás en cero y el filtro no se vuelva un callejón sin salida.