Перейти к основному содержанию

Модели данных

Все классы данных в пакете models помечены @Serializable из kotlinx.serialization. По умолчанию они неизменяемы и используются как для десериализации ответов Supabase, так и для сериализации тел запросов на вставку и обновление.


Пользователь​

Фичеро: models/Usuario.kt Супабаза Таблы: usuarios

@Serializable
data class Usuario(
@SerialName("id")
val id: Int = 0,
val nombre: String,
val dni: String,
val contraseniaHash: String,
val admin: Int,
val premium: Boolean,
val email: String? = null,
val telefono: String? = null,
val foto: String? = null,
@SerialName("fecha_ini_prem")
val fechaInicio: String? = null,
@SerialName("fecha_fin_prem")
val fechaFin: String? = null
)
ПолеТипОбнуляемыйОписание
idIntНетАвтоинкрементный ПК (по умолчанию 0 при вставке)
nombreStringНетПолное имя
dniStringНетDNI используется в качестве учетных данных для входа
contraseniaHashStringНетПароль (в этой версии обычный текст)
adminIntНет0 = пользователь, 1 = администратор
premiumBooleanНетСтатус подписки
emailString?ДаЭлектронная почта
telefonoString?ДаКонтактный телефон
fotoString?ДаИзображение профиля в Base64
fechaInicioString?ДаДата начала премиум-подписки (yyyy-MM-dd)
fechaFinString?ДаДата окончания премиум-подписки (yyyy-MM-dd)

Поля fechaInicio и fechaFin считываются в ProfileViewModel для расчета оставшихся дней подписки Premium и отображения их в ProfileScreen.


##Данныесессии

Фичеро: models/SesionData.kt

data class SesionData(
val userId: Int,
val userName: String,
val isAdmin: Boolean,
val isPremium: Boolean,
val token: String = ""
)

Модель, используемая SecureSessionManager для представления постоянного сеанса пользователя. Он не помечен @Serializable, поскольку не сериализован в JSON; оно хранится поле за полем в SharedPreferences.


Машина​

Фичеро: models/Maquina.kt Супабаза Таблы: maquinas

@Serializable
data class Maquina(
val id: Int,
val nombre: String,
val tipo: String? = null,
val estado: Int = 0,
val descripcion: String? = null,
val operativa: Boolean = true,
val foto: String? = null,
val mantenimiento_desde: String? = null,
val mantenimiento_hasta: String? = null
)
ПолеТипОбнуляемыйОписание
idIntНетАвтоинкрементный ПК
nombreStringНетИмя машины
tipoString?ДаКатегория упражнений
estadoIntНетОбщее поле статуса (значение по умолчанию 0)
descripcionString?ДаПодробное описание
operativaBooleanНетtrue = доступно для бронирования
fotoString?ДаИзображение машины в Base64
mantenimiento_desdeString?ДаНачало периода технического обслуживания (yyyy-MM-dd HH:mm)
mantenimiento_hastaString?ДаОкончание периода обслуживания (yyyy-MM-dd HH:mm)

Резерва​

Фичеро: models/Reserva.kt Супабаза Таблы: reservas

@Serializable
data class Reserva(
val id: Int? = null,
@SerialName("id_usuario") val idUsuario: Int,
@SerialName("id_maquina") val idMaquina: Int,
val fecha: String,
@SerialName("hora_inicio") val horaInicio: String,
@SerialName("hora_fin") val horaFin: String,
val estado: Boolean = true
)
ПолеТипОбнуляемыйОписание
idInt?ДаPK (нуль при вставке, назначенный Supabase)
idUsuarioIntНетФК → user.id
idMaquinaIntНетФК → cars.id
fechaStringНетДата бронирования (yyyy-MM-dd)
horaInicioStringНетВремя начала (HH:mm)
horaFinStringНетВремя окончания (HH:mm). Максимум 60 минут после horaInicio
estadoBooleanНетtrue = активно, false = отменено

РезерваКонДетальлес​

Расширенный класс данных для запросов со встроенными связями (неявное соединение PostgREST).

@Serializable
data class ReservaConDetalles(
val id: Int,
val fecha: String,
@SerialName("hora_inicio") val horaInicio: String,
@SerialName("hora_fin") val horaFin: String,
val estado: Boolean,
@SerialName("usuarios") val usuario: Usuario? = null,
@SerialName("maquinas") val maquina: Maquina? = null
)

Он получается с помощью столбца "*, usuarios(*), maquinas(*)".


Платон​

Фичеро: models/Plato.kt Супабаза Таблы: platos

@Serializable
data class Plato(
val id: Int? = null,
@SerialName("id_usuario") val idUsuario: Int? = null,
val nombre: String,
val descripcion: String? = null,
val calorias: Double? = null,
@SerialName("imagen_url") val imagenUrl: String? = null,
@SerialName("fecha_subida") val fechaSubida: String? = null,
val visibilidad: Boolean = true,
val tiempo: String? = null,
val aceptado: Boolean = false
)
ПолеТипОбнуляемыйОписание
idInt?ДаPK (ноль на вставке)
idUsuarioInt?ДаFK →users.id(null для системных блюд)
nombreStringНетНазвание блюда
descripcionString?ДаРецепт или описание
caloriasDouble?ДаКалорийность на порцию
imagenUrlString?ДаИзображение Base64 Строка
fechaSubidaString?ДаВременная метка создания
visibilidadBooleanНетtrue = виден в каталоге
tiempoString?ДаВремя подготовки в произвольном тексте (например, "30 minutos")
aceptadoBooleanНетfalse = ожидает модерации администратором

ПесоУсуарио​

Фичеро: models/PesoUsuario.kt Супабаза Таблы: peso_usuario

@Serializable
data class PesoUsuario(
val id: Int? = null,
@SerialName("id_usuario") val idUsuario: Int,
val peso: Double,
val fecha: String
)
ПолеТипОбнуляемыйОписание
idInt?ДаPK (ноль на вставке)
idUsuarioIntНетФК → user.id
pesoDoubleНетВес в килограммах
fechaStringНетДата регистрации (yyyy-MM-dd)

Платить​

Фичеро: models/Pago.kt Супабаза Таблы: pagos

@Serializable
data class Pago(
val id: Int? = null,
@SerialName("id_usuario") val idUsuario: Int,
val monto: Double,
@SerialName("fecha_pago") val fechaPago: String,
val tipo: String,
@SerialName("metodo_pago") val metodoPago: String
)
ПолеТипОбнуляемыйОписание
idInt?ДаPK (ноль на вставке)
idUsuarioIntНетФК → user.id
montoDoubleНетСумма в евро
fechaPagoStringНетДата платежа (yyyy-MM-dd)
tipoStringНетФормат: ежемесячно, полугодовой, годовой
metodoPagoStringНетМетод: Кард, Бизум