مخطط سوبباس
تعمل Supabase كواجهة خلفية رئيسية للتطبيق. قاعدة البيانات الأساسية هي PostgreSQL. يتم وصف كل جدول وأعمدته والعلاقات بينهما أدناه.
الجدول: المستخدمين
يخزن بيانات المستخدمين المسجلين في التطبيق.
| العمود | اكتب | القيود | الوصف |
|---|---|---|---|
id | integer | PK، الزيادة التلقائية | معرف المستخدم الفريد |
nombre | varchar(100) | ليست فارغة | اسم المستخدم الكامل |
dni | varchar(20) | فريد | وثيقة الهوية الوطنية. يتم استخدامه كمعرف تسجيل الدخول |
contraseniaHash | varchar(255) | كلمة المرور المخزنة (نص عادي في الإصدار الحالي) | |
email | varchar(100) | فريد | بريد إلكتروني. تستخدم لاستعادة كلمة المرور |
telefono | varchar(20) | رقم هاتف الاتصال | |
admin | integer | الافتراضي 0 | يشير إلى ما إذا كان المستخدم لديه دور مسؤول (0 = مستخدم، 1 = مسؤول) |
premium | boolean | الافتراضي خطأ | يشير إلى ما إذا كان المستخدم لديه اشتراك Premium نشط |
fecha_ini_prem | date | تاريخ بدء الاشتراك المميز | |
fecha_fin_prem | date | تاريخ انتهاء الاشتراك المميز | |
foto | text | صورة الملف الشخصي المشفرة Base64 |
فئة البيانات المقابلة هي models/Usuario.kt.
الجدول: الآلات
يخزن كتالوج آلات الصالة الرياضية.
| العمود | اكتب | القيود | الوصف |
|---|---|---|---|
id | integer | PK، الزيادة التلقائية | معرف الجهاز الفريد |
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 | PK، الزيادة التلقائية | معرف الحجز الفريد |
id_usuario | integer | FK → users.id | المستخدم الذي قام بالحجز |
id_maquina | integer | FK → Machines.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 | PK، الزيادة التلقائية | معرف الطبق الفريد |
id_usuario | integer | FK → users.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.
الجدول: وزن المستخدم
يخزن تاريخ سجلات الوزن لكل مستخدم.
| العمود | اكتب | القيود | الوصف |
|---|---|---|---|
id | integer | PK، الزيادة التلقائية | معرف السجل الفريد |
id_usuario | integer | FK → users.id | المستخدم الذي ينتمي إليه السجل |
peso | double precision | ليست فارغة | الوزن بالكيلو جرام |
fecha | date | تاريخ التسجيل (yyyy-MM-dd) |
يفرض التطبيق قيودًا على تسجيل واحد يوميًا على مستوى واجهة المستخدم. تتحقق الشاشة مما إذا كان هناك سجل موجود بالفعل للتاريخ الحالي قبل السماح بإضافة سجل جديد.
فئة البيانات المقابلة هي models/PesoUsuario.kt.
الجدول: المدفوعات
يخزن سجل معاملات الاشتراك المميز.
| العمود | اكتب | القيود | الوصف |
|---|---|---|---|
id | integer | PK، الزيادة التلقائية | معرف الدفع الفريد |
id_usuario | integer | FK → users.id | المستخدم الذي قام بالدفع |
monto | double precision | ليست فارغة | مبلغ المعاملة باليورو |
fecha_pago | date | تاريخ السداد | |
tipo | varchar(50) | وضع الاشتراك (شهري، نصف سنوي، سنوي) | |
metodo_pago | varchar(25) | طريقة الدفع المستخدمة (بطاقة، بيزوم) |
فئة البيانات المقابلة هي models/Pago.kt.
مخطط العلاقة
usuarios (id)
|
|--< reservas (id_usuario) >-- maquinas (id)
|
|--< peso_usuario (id_usuario)
|
|--< platos (id_usuario)
|
|--< pagos (id_usuario)
العلاقات كلها واحد إلى متعدد. لم يتم تحديد أي مفاتيح خارجية صريحة على مستوى لوحة معلومات Supabase؛ تتم إدارة التكامل المرجعي على مستوى التطبيق.
الأمان على مستوى الصف
لم يتم تكوين سياسات Supabase Row Level Security (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"
// ...
}