Ir ao contido principal

Esquema Supabase

Supabase actúa como o backend principal da aplicación. A base de datos subxacente é PostgreSQL. Cada táboa, as súas columnas e as relacións entre elas descríbense a continuación.

Táboa: usuarios​

Almacena os datos dos usuarios rexistrados na aplicación.

ColumnaTipoRestriciónsDescrición
idintegerPK, incremento automáticoIdentificador único de usuario
nombrevarchar(100)NON NULONome completo do usuario
dnivarchar(20)ÚNICADocumento Nacional de Identidade. Utilízase como identificador de inicio de sesión
contraseniaHashvarchar(255)Contrasinal almacenado (texto simple na versión actual)
emailvarchar(100)ÚNICACorreo electrónico. Usado para a recuperación de contrasinal
telefonovarchar(20)Teléfono de contacto
adminintegerPREDETERMINADO 0Indica se o usuario ten un rol de administrador (0 = usuario, 1 = administrador)
premiumbooleanPREDETERMINADO falsoIndica se o usuario ten unha subscrición Premium activa
fecha_ini_premdateData de inicio da subscrición Premium
fecha_fin_premdateData de finalización da subscrición Premium
fototextImaxe de perfil codificada en Base64

A clase de datos correspondente é models/Usuario.kt.

Táboa: máquinas​

Almacena o catálogo de maquinaria do ximnasio.

ColumnaTipoRestriciónsDescrición
idintegerPK, incremento automáticoIdentificador único da máquina
nombrevarchar(100)NON NULONome amigable da máquina
tipovarchar(50)Categoría de exercicio (Cardio, Lombo, Perna, Peito, etc.)
estadointegerPREDETERMINADO 0Campo de estado xenérico
descripciontextDescrición detallada da máquina
operativabooleanPREDETERMINADO verdadeiroIndica se a máquina está dispoñible para reservas
mantenimiento_desdevarcharData e hora de inicio do período de mantemento (yyyy-MM-dd HH:mm)
mantenimiento_hastavarcharData e hora de finalización do período de mantemento (yyyy-MM-dd HH:mm)

A clase de datos correspondente é models/Maquina.kt.

Táboa: reservas​

Almacena as reservas de maquinaria realizadas polos usuarios.

ColumnaTipoRestriciónsDescrición
idintegerPK, incremento automáticoIdentificador único de reserva
id_usuariointegerFK → usuarios.idUsuario que fixo a reserva
id_maquinaintegerFK → máquinas.idMáquina reservada
fechadateData de reserva (yyyy-MM-dd)
hora_iniciotimeHora de inicio do slot reservado
hora_fintimeHora de finalización do espazo reservado
estadobooleanPREDETERMINADO verdadeirotrue = activo, false = cancelado

As clases de datos correspondentes son models/Reserva.kt e models/ReservaConDetalles.kt. O segundo inclúe os obxectos Usuario e Maquina incrustados, obtidos mediante a sintaxe de relación PostgREST (*, usuarios(*), maquinas(*)).

Mesa: pratos​

Garda pratos nutricionais do catálogo.

ColumnaTipoRestriciónsDescrición
idintegerPK, incremento automáticoIdentificador único do prato
id_usuariointegerFK → usuarios.idUsuario que suxeriu a antena (anulable para as antenas do sistema)
nombrevarchar(100)NON NULONome do prato
descripciontextDescrición ou receita do prato
caloriasdouble precisionContido calórico por porción
imagen_urlvarchar(255)URL da imaxe ou cadea Base64 da imaxe da placa
fecha_subidatimestampData e hora de creación do rexistro
visibilidadbooleanPREDETERMINADO verdadeiroIndica se o prato está visible no catálogo
tiempovarcharTempo estimado de preparación (por exemplo, "30 minutos")
aceptadobooleanPREDETERMINADO falsoIndica se o prato foi aprobado por un administrador

A clase de datos correspondente é models/Plato.kt.

Táboa: peso_usuario​

Almacena o historial dos rexistros de peso de cada usuario.

ColumnaTipoRestriciónsDescrición
idintegerPK, incremento automáticoIdentificador único de rexistro
id_usuariointegerFK → usuarios.idUsuario ao que pertence o rexistro
pesodouble precisionNON NULOPeso en quilogramos
fechadateData de rexistro (yyyy-MM-dd)

A aplicación impón a restrición dun só rexistro por día a nivel de IU. A pantalla comproba se xa existe un rexistro para a data actual antes de permitir que se engada un novo.

A clase de datos correspondente é models/PesoUsuario.kt.

Táboa: pagamentos​

Almacena o historial de transaccións da subscrición Premium.

ColumnaTipoRestriciónsDescrición
idintegerPK, incremento automáticoIdentificador único de pago
id_usuariointegerFK → usuarios.idUsuario que realizou o pago
montodouble precisionNON NULOImporte da operación en euros
fecha_pagodateData de pago
tipovarchar(50)Modo de subscrición (Mensual, Semestral, Anual)
metodo_pagovarchar(25)Método de pago utilizado (Tarxeta, Bizum)

A clase de datos correspondente é models/Pago.kt.

Diagrama de relacións​

usuarios (id)
|
|--< reservas (id_usuario) >-- maquinas (id)
|
|--< peso_usuario (id_usuario)
|
|--< platos (id_usuario)
|
|--< pagos (id_usuario)

As relacións son todas un a moitos. Non se definen chaves estranxeiras explícitas a nivel de Supabase Dashboard; A integridade referencial xestionase a nivel de aplicación.

Seguridade a nivel de fila​

As políticas de seguranza a nivel de fila de Supabase (RLS) non están configuradas nesta versión. O acceso aos datos realízase co anon key, polo que calquera cliente coa chave pode ler e escribir en todas as táboas. Nun ambiente de produción sería esencial definir políticas RLS adecuadas ou usar service_role key exclusivamente desde un backend de confianza.

Constantes da base de datos​

Os nomes das táboas e columnas están centralizados en DbConstants.kt a través dos obxectos DbTables e DbColumns, evitando o uso de cadeas literais espalladas polo código:

object DbTables {
const val USUARIOS = "usuarios"
const val MAQUINAS = "maquinas"
const val PLATOS = "platos"
const val PAGOS = "pagos"
const val RESERVAS = "reservas"
const val PESO_USUARIO = "peso_usuario"
}

object DbColumns {
const val ID = "id"
const val DNI = "dni"
const val NOMBRE = "nombre"
// ...
}