Saltar al contenido principal

Base de datos

La aplicación usa Supabase como backend, que provee una base de datos PostgreSQL gestionada, autenticación y almacenamiento de archivos.

Diagrama de tablas

auth.users (Supabase Auth)

├──► perfiles (1:1)
├──► obras (1:N)
├──► obras_favoritas (N:M con obras)
└──► usuario_logros (N:M con logros)

logros (catálogo estático)
└──► usuario_logros

Tablas

perfiles

Registros reales de la tabla perfiles en Supabase

Extiende el usuario de Supabase Auth con datos del perfil escolar.

ColumnaTipoDescripción
iduuid PKIgual al id de auth.users
nombrevarcharNombre completo del usuario
colegiovarcharNombre del colegio
gradovarcharGrado escolar (ej. "3ro")
avatarvarcharURL de imagen de avatar
created_attimestamptzFecha de creación

obras

Registros reales de la tabla obras en Supabase

Almacena las obras creadas por los usuarios.

ColumnaTipoDescripción
iduuid PKIdentificador único
user_iduuid FKReferencia a auth.users
nombrevarcharNombre dado a la obra
descripciontextDescripción opcional
estilovarcharEstilo artístico aplicado
imagen_urltextURL pública en Supabase Storage
created_attimestamptzFecha de publicación

Estilos válidos: impresionismo, vangogh, acuarela, cubismo, puntillismo, fantasia


obras_favoritas

Registros reales de la tabla obras_favoritas en Supabase

Relación muchos-a-muchos entre usuarios y obras que marcaron como favoritas.

ColumnaTipoDescripción
user_iduuid PK, FKReferencia a auth.users
obra_iduuid PK, FKReferencia a obras

logros

Registros reales de la tabla logros en Supabase

Catálogo estático de logros disponibles en la aplicación.

ColumnaTipoDescripción
iduuid PKIdentificador único
nombrevarcharNombre del logro
condiciontextDescripción de la condición en lenguaje natural
icon_namevarcharNombre del ícono (Bootstrap Icons)
requisitoint2Número de veces que se debe cumplir la acción
created_attimestamptzFecha de creación

Logros del sistema:

NombreCondiciónRequisitoÍcono
Primer publicaciónPublica su primera obra1sparkles
Artista constantePublica 5 obras5palette
Colección en crecimientoPublica 10 obras10gallery-horizontal
Favoritos inicialesGuarda su primera obra en favoritos1heart
ColeccionistaGuarda 10 obras en favoritos10bookmark
Explorador de estilosAplica 3 estilos distintos3compass
Cubismo visionarioPublica 3 obras con estilo Cubismo3box
Remolinos creativosPublica 3 obras con estilo Remolinos3wind
Maestro del ImpresionismoPublica 5 obras con estilo Impresionismo5brush
Acuarela soñadoraPublica 3 obras con estilo Acuarela3droplets

usuario_logros

Registros reales de la tabla usuario_logros en Supabase

Registra el progreso de cada usuario hacia cada logro.

ColumnaTipoDescripción
user_iduuid PK, FKReferencia a auth.users
logro_iduuid PK, FKReferencia a logros
conteointegerNúmero de veces que se ejecutó la acción
cumple_requisitobooleantrue cuando conteo >= requisito
updated_attimestamptzÚltima actualización
nota

cumple_requisito es permanente: una vez que pasa a true, no vuelve a false aunque el conteo baje (ej. al quitar favoritos).


Storage

Las imágenes de las obras se almacenan en el bucket obras_bucket de Supabase Storage:

obras_bucket/
{user_id}/
{timestamp}.jpg

Las URLs son públicas y se obtienen con:

const { data: { publicUrl } } = supabaseClient.storage
.from('obras_bucket')
.getPublicUrl(fileName);

Políticas RLS (Row Level Security)

Todas las tablas tienen RLS activado. Las políticas configuradas son:

-- perfiles: el usuario solo ve y edita su propio perfil
CREATE POLICY "perfil_propio" ON perfiles
FOR ALL USING (auth.uid() = id);

-- obras: lectura pública, escritura propia
CREATE POLICY "obras_lectura" ON obras FOR SELECT USING (true);
CREATE POLICY "obras_insertar" ON obras FOR INSERT WITH CHECK (auth.uid() = user_id);

-- logros: lectura pública
CREATE POLICY "logros_lectura_publica" ON logros FOR SELECT USING (true);

-- usuario_logros: el usuario gestiona sus propios logros
CREATE POLICY "usuario_logros_select" ON usuario_logros FOR SELECT USING (auth.uid() = user_id);
CREATE POLICY "usuario_logros_insert" ON usuario_logros FOR INSERT WITH CHECK (auth.uid() = user_id);
CREATE POLICY "usuario_logros_update" ON usuario_logros FOR UPDATE
USING (auth.uid() = user_id) WITH CHECK (auth.uid() = user_id);