Saltar al contingut principal

Esquema Supabase

Supabase actua com a backend principal de l'aplicació. La base de dades subjacent és PostgreSQL. A continuació es descriu cada taula, les columnes i les relacions entre elles.

Taula: usuaris​

Emmagatzema les dades dels usuaris registrats a l'aplicació.

ColumnaTipusRestriccionsDescripció
idintegerPK, autoincrementIdentificador únic
nombrevarchar(100)NOT NULLNom complet de l'usuari
dnivarchar(20)UNIQUEDocument nacional d'identitat. S'usa com a identificador de login
contraseniaHashvarchar(255)Contrasenya emmagatzemada (text pla a la versió actual)
emailvarchar(100)UNIQUECorreu electrònic. Es fa servir per a la recuperació de contrasenya
telefonovarchar(20)Número de telèfon de contacte
adminintegerDEFAULT 0Indiqueu si l'usuari té rol d'administrador (0 = usuari, 1 = admin)
premiumbooleanDEFAULT falseIndiqueu si l'usuari té subscripció Premium activa
fecha_ini_premdateData d'inici de subscripció Premium
fecha_fin_premdateData de finalització de la subscripció Premium
fototextimatge de perfil codificada a Base64

La data class corresponent és models/Usuario.kt.

Taula: màquines​

Emmagatzema el catàleg de maquinària del gimnàs.

ColumnaTipusRestriccionsDescripció
idintegerPK, autoincrementIdentificador únic de la màquina
nombrevarchar(100)NOT NULLNom descriptiu de la màquina
tipovarchar(50)Categoria d'exercici (Cardio, Esquena, Cama, Pit, etc.)
estadointegerDEFAULT 0Camp d´estat genèric
descripciontextDescripció detallada de la màquina
operativabooleanDEFAULT trueIndica si la màquina està disponible per a reserves
mantenimiento_desdevarcharData i hora d'inici del període de manteniment (yyyy-MM-dd HH:mm)
mantenimiento_hastavarcharData i hora de finalització del període de manteniment (yyyy-MM-dd HH:mm)

La data class corresponent és models/Maquina.kt.

Taula: reserves​

Emmagatzema les reserves de maquinària realitzades pels usuaris.

ColumnaTipusRestriccionsDescripció
idintegerPK, autoincrementIdentificador únic de la reserva
id_usuariointegerFK → usuaris.idUsuari que va fer la reserva
id_maquinaintegerFK → maquines.idMàquina reservada
fechadateData de la reserva (yyyy-MM-dd)
hora_iniciotimeHora d'inici de la franja reservada
hora_fintimeHora de fi de la franja reservada
estadobooleanDEFAULT truetrue = activa, false = cancel·lada

Les data classes corresponents són models/Reserva.kt i models/ReservaConDetalles.kt. La segona inclou els objectes Usuario i Maquina embeguts, obtinguts mitjançant la sintaxi de relacions de PostgREST (*, usuarios(*), maquinas(*)).

Taula: plats​

Emmagatzema els plats nutricionals del catàleg.

ColumnaTipusRestriccionsDescripció
idintegerPK, autoincrementIdentificador únic del plat
id_usuariointegerFK → usuaris.idUsuari que va suggerir el plat (nullable per a plats del sistema)
nombrevarchar(100)NOT NULLNom del plat
descripciontextDescripció o recepta del plat
caloriasdouble precisionContingut calòric per ració
imagen_urlvarchar(255)URL d'imatge o cadena Base64 de la imatge del plat
fecha_subidatimestampData i hora de creació del registre
visibilidadbooleanDEFAULT trueIndica si el plat és visible al catàleg
tiempovarcharTemps de preparació estimat (per exemple, 30 minuts)
aceptadobooleanDEFAULT falseIndica si el plat ha estat aprovat per un administrador

La data class corresponent és models/Plato.kt.

Taula: pes_usuari​

Emmagatzemeu l'historial de registres de pes de cada usuari.

ColumnaTipusRestriccionsDescripció
idintegerPK, autoincrementIdentificador únic del registre
id_usuariointegerFK → usuaris.idUsuari a què pertany el registre
pesodouble precisionNOT NULLPes en quilograms
fechadateData del registre (yyyy-MM-dd)

Laplicació imposa la restricció dun únic registre per dia a nivell dUI. La pantalla comprova si ja hi ha un registre per a la data actual abans de permetre afegir-ne un de nou.

La data class corresponent és models/PesoUsuario.kt.

Taula: pagaments​

Emmagatzema l'historial de transaccions de subscripció Premium.

ColumnaTipusRestriccionsDescripció
idintegerPK, autoincrementIdentificador únic del pagament
id_usuariointegerFK → usuaris.idUsuari que va fer el pagament
montodouble precisionNOT NULLImport de la transacció en euros
fecha_pagodateData en què es va fer el pagament
tipovarchar(50)Modalitat de subscripció (Mensual, Semestral, Anual)
metodo_pagovarchar(25)Mètode de pagament utilitzat (Targeta, Bizum)

La data class corresponent és models/Pago.kt.

Diagrama de relacions​

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

Les relacions són totes de tipus un a molts. No es defineixen claus foranes explícites a nivell de Supabase Dashboard; la integritat referencial es gestiona a nivell daplicació.

Seguretat a nivell de fila​

Les polítiques de Row Level Security (RLS) de Supabase no estan configurades en aquesta versió. L'accés a les dades es fa amb la anon key, per la qual cosa qualsevol client amb la clau pot llegir i escriure a totes les taules. En un entorn de producció seria imprescindible definir polítiques RLS adequades o utilitzar la service_role key exclusivament des d'un backend de confiança.

Constants de base de dades​

Els noms de les taules i columnes se centralitzen a DbConstants.kt mitjançant els objectes DbTables i DbColumns, evitant l'ús de strings literals dispersos pel codi:

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"
// ...
}