Pular para o conteúdo principal

Esquema de Supabase

Supabase atua como backend principal do aplicativo. O banco de dados subjacente é PostgreSQL. Cada tabela, suas colunas e os relacionamentos entre elas são descritos abaixo.

Tabela: usuários​

Armazena os dados dos usuários cadastrados no aplicativo.

ColunaTipoRestriçõesDescrição
idintegerPK, incremento automáticoIdentificador único de usuário
nombrevarchar(100)NÃO NULONome completo do usuário
dnivarchar(20)ÚNICODocumento Nacional de Identidade. É usado como identificador de login
contraseniaHashvarchar(255)Senha armazenada (texto simples na versão atual)
emailvarchar(100)ÚNICOE-mail. Usado para recuperação de senha
telefonovarchar(20)Telefone de contato
adminintegerPADRÃO 0Indica se o usuário possui função de administrador (0 = usuário, 1 = admin)
premiumbooleanPADRÃO falsoIndica se o usuário possui assinatura Premium ativa
fecha_ini_premdateData de início da assinatura premium
fecha_fin_premdateData de término da assinatura premium
fototextImagem de perfil codificada em Base64

A classe de dados correspondente é models/Usuario.kt.

Tabela: máquinas​

Armazena o catálogo de máquinas de ginástica.

ColunaTipoRestriçõesDescrição
idintegerPK, incremento automáticoIdentificador único da máquina
nombrevarchar(100)NÃO NULONome amigável da máquina
tipovarchar(50)Categoria de exercício (cardio, costas, pernas, peito, etc.)
estadointegerPADRÃO 0Campo de status genérico
descripciontextDescrição detalhada da máquina
operativabooleanPADRÃO verdadeiroIndica se a máquina está disponível para reservas
mantenimiento_desdevarcharData e hora de início do período de manutenção (yyyy-MM-dd HH:mm)
mantenimiento_hastavarcharData e hora de fim do período de manutenção (yyyy-MM-dd HH:mm)

A classe de dados correspondente é models/Maquina.kt.

Tabela: reservas​

Armazena reservas de máquinas feitas pelos usuários.

ColunaTipoRestriçõesDescrição
idintegerPK, incremento automáticoIdentificador único de reserva
id_usuariointegerFK → usuários.idUsuário que fez a reserva
id_maquinaintegerFK → máquinas.idMáquina reservada
fechadateData da reserva (yyyy-MM-dd)
hora_iniciotimeHora de início do slot reservado
hora_fintimeHora de término do slot reservado
estadobooleanPADRÃO verdadeirotrue = ativo, false = cancelado

As classes de dados correspondentes são models/Reserva.kt e models/ReservaConDetalles.kt. O segundo inclui os objetos incorporados Usuario e Maquina, obtidos através da sintaxe de relacionamento PostgREST (*, usuarios(*), maquinas(*)).

Mesa: pratos​

Armazene pratos nutritivos do catálogo.

ColunaTipoRestriçõesDescrição
idintegerPK, incremento automáticoIdentificador único de prato
id_usuariointegerFK → usuários.idUsuário que sugeriu o prato (anulável para pratos do sistema)
nombrevarchar(100)NÃO NULONome do prato
descripciontextDescrição ou receita do prato
caloriasdouble precisionConteúdo calórico por porção
imagen_urlvarchar(255)URL da imagem ou string Base64 da imagem da placa
fecha_subidatimestampData e hora de criação do registro
visibilidadbooleanPADRÃO verdadeiroIndica se o prato está visível no catálogo
tiempovarcharTempo estimado de preparação (por exemplo, "30 minutos")
aceptadobooleanPADRÃO falsoIndica se o prato foi aprovado por um administrador

A classe de dados correspondente é models/Plato.kt.

Tabela: peso_usuário​

Armazena o histórico de registros de peso de cada usuário.

ColunaTipoRestriçõesDescrição
idintegerPK, incremento automáticoIdentificador único de registo
id_usuariointegerFK → usuários.idUsuário a quem pertence o registro
pesodouble precisionNÃO NULOPeso em quilogramas
fechadateData de registo (yyyy-MM-dd)

A aplicação impõe a restrição de um único registo por dia ao nível da UI. A tela verifica se já existe um registro para a data atual antes de permitir que um novo seja adicionado.

A classe de dados correspondente é models/PesoUsuario.kt.

Tabela: pagamentos​

Armazena o histórico de transações de assinatura Premium.

ColunaTipoRestriçõesDescrição
idintegerPK, incremento automáticoIdentificador único de pagamento
id_usuariointegerFK → usuários.idUsuário que efetuou o pagamento
montodouble precisionNÃO NULOMontante da transação em euros
fecha_pagodateData em que o pagamento foi efetuado
tipovarchar(50)Modalidade de assinatura (Mensal, Semestral, Anual)
metodo_pagovarchar(25)Forma de pagamento utilizada (Cartão, Bizum)

A classe de dados correspondente é models/Pago.kt.

Diagrama de relacionamento​

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

Os relacionamentos são todos um-para-muitos. Nenhuma chave estrangeira explícita é definida no nível do Painel Supabase; A integridade referencial é gerenciada no nível do aplicativo.

Segurança em nível de linha​

As políticas Supabase Row Level Security (RLS) não estão configuradas nesta versão. O acesso aos dados é feito com o anon key, portanto qualquer cliente com a chave pode ler e escrever em todas as tabelas. Num ambiente de produção seria essencial definir políticas RLS apropriadas ou usar service_role key exclusivamente a partir de um backend confiável.

Constantes do banco de dados​

Os nomes das tabelas e colunas são centralizados em DbConstants.kt através dos objetos DbTables e DbColumns, evitando o uso de strings literais espalhadas pelo 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"
// ...
}