Схема супабазы
Supabase выступает в качестве основного бэкенда приложения. Базовая база данных — PostgreSQL. Ниже описаны каждая таблица, ее столбцы и связи между ними.
Таблица: пользователи
Хранит данные пользователей, зарегистрированных в приложении.
| Столбец | Тип | Ограничения | Описание |
|---|---|---|---|
id | integer | ПК, автоинкремент | Уникальный идентификатор пользователя |
nombre | varchar(100) | НЕ НУЛЕВ | Полное имя пользователя |
dni | varchar(20) | УНИКАЛЬНЫЙ | Документ, удостоверяющий личность. Используется в качестве идентификатора входа |
contraseniaHash | varchar(255) | Сохраненный пароль (в текущей версии — обычный текст) | |
email | varchar(100) | УНИКАЛЬНЫЙ | Электронная почта. Используется для восстановления пароля |
telefono | varchar(20) | Контактный телефон | |
admin | integer | ПО УМОЛЧАНИЮ 0 | Указывает, имеет ли пользователь роль администратора (0 = пользователь, 1 = администратор) |
premium | boolean | ПО УМОЛЧАНИЮ ложь | Указывает, есть ли у пользователя активная Премиум-подписка |
fecha_ini_prem | date | Дата начала премиум-подписки | |
fecha_fin_prem | date | Дата окончания премиум-подписки | |
foto | text | Изображение профиля в кодировке Base64 |
Соответствующий класс данных — models/Usuario.kt.
Таблица: машины
Хранит каталог тренажеров.
| Столбец | Тип | Ограничения | Описание |
|---|---|---|---|
id | integer | ПК, автоинкремент | Уникальный идентификатор машины |
nombre | varchar(100) | НЕ НУЛЕВ | Понятное имя машины |
tipo | varchar(50) | Категория упражнений (кардио, спина, ноги, грудь и т. д.) | |
estado | integer | ПО УМОЛЧАНИЮ 0 | Общее поле статуса |
descripcion | text | Подробное описание машины | |
operativa | boolean | ПО УМОЛЧАНИЮ правда | Указывает, доступна ли машина для бронирования |
mantenimiento_desde | varchar | Дата и время начала периода обслуживания (yyyy-MM-dd HH:mm) | |
mantenimiento_hasta | varchar | Дата и время окончания периода обслуживания (yyyy-MM-dd HH:mm) |
Соответствующий класс данных — models/Maquina.kt.
Таблица: резервы
Сохраняет резервации оборудования, сделанные пользователями.
| Столбец | Тип | Ограничения | Описание |
|---|---|---|---|
id | integer | ПК, автоинкремент | Уникальный идентификатор бронирования |
id_usuario | integer | ФК → user.id | Пользователь, сделавший бронирование |
id_maquina | integer | ФК → cars.id | Зарезервированная машина |
fecha | date | Дата бронирования (yyyy-MM-dd) | |
hora_inicio | time | Время начала зарезервированного слота | |
hora_fin | time | Время окончания зарезервированного слота | |
estado | boolean | ПО УМОЛЧАНИЮ правда | true = активно, false = отменено |
Соответствующие классы данных: models/Reserva.kt и models/ReservaConDetalles.kt. Второй включает встроенные объекты Usuario и Maquina, полученные с помощью синтаксиса отношений PostgREST (*, usuarios(*), maquinas(*)).
Таблица: посуда
Храните питательную посуду из каталога.
| Столбец | Тип | Ограничения | Описание |
|---|---|---|---|
id | integer | ПК, автоинкремент | Уникальный идентификатор блюда |
id_usuario | integer | ФК → user.id | Пользователь, предложивший блюдо (обнуляемое для системных блюд) |
nombre | varchar(100) | НЕ НУЛЕВ | Название блюда |
descripcion | text | Описание или рецепт блюда | |
calorias | double precision | Калорийность одной порции | |
imagen_url | varchar(255) | URL-адрес изображения или строка Base64 изображения номера | |
fecha_subida | timestamp | Дата и время создания записи | |
visibilidad | boolean | ПО УМОЛЧАНИЮ правда | Указывает, видно ли блюдо в каталоге |
tiempo | varchar | Примерное время приготовления (например, «30 минут») | |
aceptado | boolean | ПО УМОЛЧАНИЮ ложь | Указывает, одобрено ли блюдо администратором |
Соответствующий класс данных — models/Plato.kt.
Таблица: user_weight
Хранит историю записей веса каждого пользователя.
| Столбец | Тип | Ограничения | Описание |
|---|---|---|---|
id | integer | ПК, автоинкремент | Уникальный идентификатор записи |
id_usuario | integer | ФК → user.id | Пользователь, которому принадлежит запись |
peso | double precision | НЕ НУЛЕВ | Вес в килограммах |
fecha | date | Дата регистрации (yyyy-MM-dd) |
Приложение накладывает ограничение на одну регистрацию в день на уровне пользовательского интерфейса. На экране проверяется, существует ли уже запись на текущую дату, прежде чем разрешить добавление новой.
Соответствующий класс данных — models/PesoUsuario.kt.
Таблица: выплаты
Хранит историю транзакций по подписке Premium.
| Столбец | Тип | Ограничения | Описание |
|---|---|---|---|
id | integer | ПК, автоинкремент | Уникальный идентификатор платежа |
id_usuario | integer | ФК → user.id | Пользователь, совершивший платеж |
monto | double precision | НЕ НУЛЕВ | Сумма сделки в евро |
fecha_pago | date | Дата оплаты | |
tipo | varchar(50) | Режим подписки (ежемесячная, полугодовая, годовая) | |
metodo_pago | varchar(25) | Используемый способ оплаты (Карта, Bizum) |
Соответствующий класс данных — models/Pago.kt.
Диаграмма отношений
usuarios (id)
|
|--< reservas (id_usuario) >-- maquinas (id)
|
|--< peso_usuario (id_usuario)
|
|--< platos (id_usuario)
|
|--< pagos (id_usuario)
Все отношения - один-ко-многим. На уровне панели управления Supabase не определены явные внешние ключи; Ссылочная целостность управляется на уровне приложения.
Безопасность на уровне строк
Политики безопасности на уровне строк Supabase (RLS) не настроены в этом выпуске. Доступ к данным осуществляется с помощью anon key, поэтому любой клиент с ключом может читать и писать во все таблицы. В производственной среде было бы важно определить соответствующие политики RLS или использовать service_role key исключительно из доверенного бэкэнда.
Константы базы данных
Имена таблиц и столбцов централизованы в DbConstants.kt через объекты DbTables и DbColumns, что позволяет избежать использования литеральных строк, разбросанных по всему коду:
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"
// ...
}