Blog
Build in Public
30 de abril de 202610 min

3 niveles de acceso para compartir sin darlo todo: la renovación de permisos en TAMSIV

Marie invitó a Camille a la carpeta "Boda Léa & Thomas" el martes por la noche. Solo quería mostrarle la lista de proveedores y la organización de los invitados. El miércoles al mediodía, Camille había modificado el presupuesto, eliminado dos tareas "por error" y renombrado la carpeta. No por malicia. Simplemente porque el compartir era binario: o estás dentro o no estás, y cuando estás dentro, puedes hacer de todo.

Este escenario se repite sin cesar cada vez que una aplicación colaborativa crece. La granularidad de acceso no es un detalle técnico, es lo que diferencia una herramienta que puedes prestar a toda la familia de una herramienta que dudas en compartir. La versión 1.29 de TAMSIV introduce tres niveles de acceso distintos (lectura, escritura, total) que se aplican a cada miembro de un compartido, en cada tarea, nota, evento y carpeta. 1258 líneas añadidas, 824 eliminadas, seis idiomas actualizados, un proyecto que internamente llamamos "Fase A + B de rediseño de permisos".

Puntos clave
  • Tres niveles de acceso claros reemplazan el compartido binario: Lectura (ver sin modificar), Escritura (ver y modificar el contenido), Total (modificar, eliminar, gestionar asignaciones).
  • Cada miembro de una carpeta compartida recibe una insignia visible (ojo gris, lápiz azul, escudo verde) que hace que el acceso sea legible de un vistazo para todos, no solo para el propietario.
  • Las secciones "Árbol" y "Miembros" se vuelven colapsables, el árbol de acceso se rediseña con conectores continuos, tarjetas indentadas por profundidad y una línea horizontal extendida por nivel.
  • El componente PermissionLevelPicker centraliza la selección: 186 líneas, modal accesible, descripciones explícitas en seis idiomas, estado deshabilitado para roles no editables.
  • El rol de un asignado se resuelve en el contexto de la carpeta (asignado directo vs. externo), con claves roles.assigned y roles.external que evitan confusiones visuales.
Visualización cinemática de capas concéntricas de llaves doradas y ámbar, que representan los niveles de acceso graduales de un compartido colaborativo

¿Por qué el compartido binario ya no funciona cuando una familia se involucra?

En la mayoría de las aplicaciones colaborativas de consumo, el acceso se reduce a dos estados: eres miembro o no lo eres. Cuando invitas a alguien, por defecto le das derecho a hacer de todo. Modificar, eliminar, añadir participantes, cambiar fechas, renombrar. Este es el modelo de Trello para tableros básicos, de la mayoría de las notas compartidas de Apple, y de muchas listas de compras compartidas.

Este modelo funciona mientras compartas con una sola persona de confianza, y mientras todos tengan el mismo interés en respetar el contenido. Tan pronto como añades un tercer actor, o la dinámica cambia, la fricción comienza. Tu cónyuge necesita modificar la lista de compras, pero tu suegra que pasa el fin de semana solo necesita verla. Tu equipo puede editar el resumen del cliente, pero el cliente mismo solo debería leer. Tu hermana que prepara su boda contigo necesita control total, pero su cuñada que ayuda ocasionalmente no necesita poder eliminar toda la carpeta.

La ausencia de niveles de acceso fuerza una elección binaria dolorosa: o sobreinviertes a los invitados (y corres el riesgo de que un ser querido modifique sin querer), o subinviertes (y la persona no puede hacer nada útil, por lo que abandona). Esta es exactamente la fricción que empuja a la gente a volver a las capturas de pantalla de WhatsApp y a la carga mental dispersa en diez herramientas diferentes.

¿Cuáles son los tres niveles de acceso en TAMSIV?

El rediseño introduce tres niveles distintos, cada uno con su icono, color y descripción, accesibles a través de un selector unificado en toda la aplicación.

Lectura (ojo gris)

El miembro ve todo el contenido, pero no puede modificar nada. Puede comentar, reaccionar con emojis, recibir notificaciones de la carpeta, pero no crear nuevas tareas, no modificar fechas, no cambiar asignaciones. Es el nivel perfecto para un ser querido al que se mantiene informado, un cliente al que se consulta, un padre que quiere seguir la organización sin riesgo de tocar nada.

Escritura (lápiz azul)

El miembro puede ver y modificar el contenido existente. Puede crear nuevas tareas, modificar notas, añadir fotos, mover un evento. Pero no puede eliminar lo que no ha creado él mismo, ni gestionar las asignaciones de otros. Es el modo de colaboración habitual, el que se utiliza cuando se trabaja juntos en el mismo proyecto.

Total (escudo verde)

El miembro tiene los mismos derechos que el propietario con una excepción: no puede disolver todo el compartido. Puede modificar, eliminar, gestionar asignaciones, invitar a nuevos miembros, cambiar los niveles de acceso de otros. Es el modo "coorganizador", perfecto para un cónyuge, un socio, un padre al que se quiere delegar todo sin transferir la propiedad de la carpeta.

Los tres niveles están representados por un selector visual coherente: icono + color + etiqueta, con una burbuja de explicación al tocar. El selector se llama PermissionLevelPicker, reside en frontend/src/components/common/ y se utiliza en todos los lugares donde se debe mostrar o modificar un nivel de acceso. Esta unicidad del componente garantiza que un miembro de Lectura en la carpeta "Boda" se reconozca visualmente como Lectura en la tarea "Reservar sala", sin reinterpretación.

¿Cómo ver quién tiene qué acceso en una carpeta compartida?

La segunda gran parte del rediseño se refiere a la pantalla que lista a los miembros. Antes, se veía una lista plana de avatares con nombres. Ahora, cada miembro va acompañado de una insignia de acceso de color, y la lista está ordenada por nivel (los Total arriba, luego los Escritura, luego los Lectura). De un vistazo, el propietario ve quién puede hacer qué.

Las secciones "Árbol" y "Miembros" del detalle de una tarea, una nota o un evento ahora se pueden colapsar. Tú tocas el encabezado, el chevron gira, la sección se pliega o se despliega. En pantallas con muchos miembros o jerarquías profundas, esto cambia todo para la legibilidad.

El propio árbol de acceso ha sido rediseñado. Antes, era una lista plana con dos o tres indentaciones aproximadas. Ahora, cada nivel de profundidad tiene su propia celda, su propia línea horizontal que se extiende, sus propios conectores de árbol continuos que dibujan la jerarquía como un verdadero árbol. Cuando una carpeta está anidada dentro de otra, y una tarea está anidada dentro de la carpeta hija, el árbol hace que la cadena de herencia sea visual, no verbal.

¿Cómo funciona la herencia de permisos a través de la jerarquía?

TAMSIV permite anidar carpetas en seis niveles. Si le das acceso de Escritura a alguien en una carpeta padre, automáticamente hereda el acceso de Escritura en todas las subcarpetas y su contenido. Este es el comportamiento predeterminado, y es lo que se espera en el 80% de los casos.

Pero la nueva arquitectura también permite sobrescribir un nivel de acceso localmente. Un miembro con acceso de Escritura en la carpeta padre puede ser limitado a Lectura en una subcarpeta específica, porque esa subcarpeta contiene información sensible. La sobrescritura es explícita (aparece una insignia específica en el árbol), y se muestra en el contexto de la carpeta padre para que sea rastreable.

Esta herencia con sobrescritura es técnicamente compleja. Se basa en las políticas de seguridad a nivel de fila de PostgreSQL, extendidas por 31 políticas RLS que calculan el nivel efectivo de un usuario en un elemento dado al subir por el árbol. El resultado se calcula en el lado de la base de datos, no en el lado del cliente, lo que evita la deriva de permisos y los exploits en el frontend.

¿Por qué este rediseño afectó a 15 archivos y 6 idiomas?

Los permisos son un concepto transversal. Viven en el detalle de una tarea (¿quién puede modificar?), en la lista de miembros de una carpeta (¿quién ve qué?), en el selector de compartir (¿a quién doy acceso?), en la pantalla de asignación (¿quién puede ser asignado?), en el árbol de acceso (¿cómo se calcula la herencia?). Tocar los permisos es tocar la columna vertebral de la colaboración.

El rediseño implicó 15 archivos modificados en el frontend, entre los principales: AssigneesModal.tsx (130 líneas añadidas, gestión del rol de un asignado en su carpeta), GroupMembersModal.tsx (62 líneas añadidas, insignias de acceso), GroupHierarchySection.tsx (346 líneas refactorizadas, árbol rediseñado), TaskAccessTree.tsx (24 líneas ajustadas, integración de la insignia en la rama del grupo), y el nuevo componente PermissionLevelPicker.tsx (186 líneas, modal reutilizable).

En cuanto a i18n, las nuevas claves access.read/write/readWrite/full, access.readDescription/writeDescription/fullDescription, access.permissionLevel, roles.assigned/external se han añadido en los seis archivos de idioma (FR, EN, DE, ES, IT, PT). La traducción se realizó a través de nuestro script automático OpenRouter con revisión humana para los matices. Una etiqueta incorrecta para "Total" en alemán o "Escritura" en italiano puede ser suficiente para perder toda la legibilidad de la función.

¿Qué usos familiares y profesionales desbloquea la granularidad?

Lo que cambia en la vida real no es el código. Son los escenarios de uso que se hacen posibles sin rodeos.

Una familia con adolescentes. Tú le das Total a tu cónyuge en la carpeta "Casa", Escritura a tu hijo adolescente de 15 años para que pueda marcar sus propias tareas sin riesgo de eliminar las de toda la familia, Lectura a los abuelos que pasan el fin de semana y solo quieren saber si necesitan traer pan.

Un freelance con un cliente. Tú compartes la carpeta "Sitio cliente X" con tu cliente en Lectura (él ve el progreso, comenta), con tu subcontratista en Escritura (él modifica el contenido sin poder desasignarte), con tu socio en Total (él puede gestionar todo si te vas de vacaciones).

Una asociación o un APE. Tú le das Total a la junta (3 personas), Escritura a los voluntarios activos (15 personas), Lectura a los padres que quieren seguir la organización de la kermesse sin riesgo de modificar el horario por accidente.

Una boda entre varios. Tú le das Total a tu cónyuge y al testigo principal, Escritura a las cuatro damas de honor que ayudan en aspectos específicos, Lectura a los padres y suegros que quieren seguir a los invitados y el horario del día D sin riesgo de estropear todo.

Preguntas frecuentes

¿Puede el propietario de la carpeta cambiar el nivel de acceso de los miembros después de la invitación?

Sí. Desde la pantalla "Miembros" de la carpeta, el propietario (y cualquier miembro Total) puede modificar el nivel de acceso de cada uno en cualquier momento, sin necesidad de volver a invitar. El cambio se aplica en tiempo real en todos los dispositivos a través de Supabase Realtime, el miembro afectado ve su nivel cambiar en la aplicación sin tener que volver a iniciar sesión.

¿Qué sucede si le doy acceso de Lectura a alguien que antes tenía acceso Total?

Las contribuciones anteriores (tareas creadas, fotos subidas, comentarios) permanecen en la carpeta. La persona solo pierde la capacidad de modificarlas o eliminarlas. Continúa viendo todo el contenido, pero los botones de edición desaparecen en la interfaz, y las solicitudes del lado del servidor son rechazadas por las políticas RLS si alguien intenta eludir a través de una solicitud directa.

¿Puedo darle acceso Total a alguien en una subcarpeta sin darle acceso Total en la carpeta padre?

No, la herencia desciende pero no asciende. Si quieres que alguien tenga acceso Total en una subcarpeta, debe tener al menos acceso de Lectura en la carpeta padre (de lo contrario, no podrá navegar hasta la subcarpeta). Sin embargo, puedes hacer lo contrario: dar acceso Total en la carpeta padre y reducirlo a Escritura o Lectura en una subcarpeta específica para proteger una parte sensible.

¿Los niveles de acceso también se aplican a los archivos adjuntos y a los comentarios?

Sí. Un miembro con acceso de Lectura puede ver los archivos adjuntos pero no subirlos. Puede leer los comentarios pero aún puede escribirlos y reaccionar con emojis (el comentario es una forma de contribución no destructiva, abierta a todos los niveles). Las políticas RLS se aplican de manera coherente en las seis tablas involucradas: tareas, notas, eventos, archivos adjuntos, comentarios, reacciones.

¿Cómo se realiza la migración para las carpetas creadas antes de la versión 1.29?

Todos los miembros existentes han sido migrados al nivel Total (lo que corresponde al comportamiento anterior al rediseño). No se requiere ninguna acción por parte del usuario. Si quieres aprovechar la granularidad en una carpeta existente, simplemente abre la pantalla de Miembros y ajusta el nivel de cada persona. La modificación es instantánea, sin rechazo de invitación ni pérdida de datos.

Y tú, ¿alguna vez le has dado un acceso demasiado amplio a alguien en una aplicación compartida?

Si estás leyendo este artículo, es probable que ya hayas vivido la escena al menos una vez. Has añadido a un ser querido a una carpeta o un proyecto, y unos días después descubriste que la persona había modificado, eliminado o reorganizado algo que te importaba. No por malicia. Simplemente porque la aplicación no te permitía decir "puedes mirar, pero no tocar".

La versión 1.29 de TAMSIV resuelve este dilema en dos toques. Tú invitas, eliges el nivel, puedes modificarlo en cualquier momento. El compartir se convierte en un cursor, no en un interruptor. Y esto es quizás lo que te dará el valor de abrir tus carpetas a un círculo más amplio que las dos personas que invitabas antes.

Descarga TAMSIV gratis en el Play Store y prueba los nuevos niveles de acceso a partir de la versión 1.29.