Logo SyntaxTerror

Consultas Firestore PixelGym

Listado de consultas extraídas del código (sin PDF) · Firebase/Firestore

Cómo leer esto rápido

Cada bloque indica el fichero y el rango de líneas donde aparece una operación Firestore. Puedes copiar cualquier fragmento con el botón 📋.

📄 app/src/main/java/com/example/aplicacion/MainActivity.kt 1 fragmento(s)

Fragmentos del proyecto donde se usan operaciones Firestore.

Rango: líneas 197-210
val user = ServiceLocator.authRepository.getCurrentUser()
if (user != null && binding.navigationView.headerCount > 0) {
val headerView = binding.navigationView.getHeaderView(0)
val tvName = headerView.findViewById<android.widget.TextView>(R.id.textViewName)
// buscamos el documento del usuario por su UID
val db = com.google.firebase.firestore.FirebaseFirestore.getInstance()
db.collection("usuarios").document(user.uid).get()
.addOnSuccessListener { document ->
if (document != null && document.exists()) {
// extraemos el campo "nombre_usuario" y lo mostramos, si no existe mostramos el email
val nick = document.getString("nombre_usuario") ?: user.email
tvName?.text = nick
} else {
Pagina 2

PixelGym2 - Consultas Firestore extraidas

📄 app/src/main/java/com/example/aplicacion/firebase/AuthRepository.kt 1 fragmento(s)

Fragmentos del proyecto donde se usan operaciones Firestore.

Rango: líneas 71-84
Result.failure(e)
}
}
suspend fun fetchTarifas(): List<Tarifa> {
return try {
// Necesitamos obtener la instancia de Firestore primero
val db = com.google.firebase.firestore.FirebaseFirestore.getInstance()
val snapshot = db.collection("tarifas").get().await()
snapshot.toObjects(Tarifa::class.java)
} catch (e: Exception) {
android.util.Log.e("ERROR_REPO", "Error cargando tarifas: ${e.message}")
emptyList()
}
}
Pagina 3

PixelGym2 - Consultas Firestore extraidas

📄 app/src/main/java/com/example/aplicacion/firebase/FirebaseProvider.kt 1 fragmento(s)

Fragmentos del proyecto donde se usan operaciones Firestore.

Rango: líneas 1-19
package com.example.aplicacion.firebase
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.firestore.FirebaseFirestore
// Proveedor de instancias de FirebaseAuth y FirebaseFirestore utilizando el patrón Singleton todo empieza aqui
object FirebaseProvider {
@Volatile private var auth: FirebaseAuth? = null
@Volatile private var firestore: FirebaseFirestore? = null
fun provideAuth(): FirebaseAuth =
auth ?: synchronized(this) {
auth ?: FirebaseAuth.getInstance().also { auth = it }
}
fun provideFirestore(): FirebaseFirestore =
firestore ?: synchronized(this) {
firestore ?: FirebaseFirestore.getInstance().also { firestore = it }
}
}
Pagina 4

PixelGym2 - Consultas Firestore extraidas

📄 app/src/main/java/com/example/aplicacion/firebase/GymRepository.kt 4 fragmento(s)

Fragmentos del proyecto donde se usan operaciones Firestore.

Rango: líneas 1-19
package com.example.aplicacion.firebase
import com.example.aplicacion.firebase.data.SesionDataSource
import com.example.aplicacion.model.Actividad
import com.example.aplicacion.model.Reserva
import com.example.aplicacion.model.Sesion
import com.google.firebase.firestore.FirebaseFirestore
import com.google.firebase.firestore.FieldValue
import kotlinx.coroutines.tasks.await
class GymRepository(private val sesionDataSource: SesionDataSource) {
private val db = FirebaseFirestore.getInstance()
suspend fun fetchSesiones(): List<Sesion> = sesionDataSource.getSesiones()
suspend fun fetchMisReservas(userId: String): List<Reserva> = sesionDataSource.getMisReservas(userId)
suspend fun fetchActividades(): List<Actividad> = sesionDataSource.getActividades()
Rango: líneas 25-47
/**
* Obtiene los créditos actuales del usuario
*/
suspend fun fetchCreditosUsuario(userId: String): Int {
return try {
val snapshot = db.collection("usuarios").document(userId).get().await()
snapshot.getLong("creditos")?.toInt() ?: 0
} catch (e: Exception) {
0
}
}
suspend fun fetchUserData(userId: String): Map<String, Any>? {
return try {
// Vamos a la colección "usuarios" y buscamos el documento por ID
val document = db.collection("usuarios").document(userId).get().await()
// Devolvemos los datos del documento como un Mapa (String -> Valor)
document.data
} catch (e: Exception) {
// Si hay algún error (falta de red, etc.), devolvemos nulo para no romper la app
println("ERROR_REPO: No se han podido obtener los datos del usuario: ${e.message}")
Rango: líneas 52-69
// PROCESO DE RESERVA COMPLETO (Transacción)
// 1. Descuenta créditos al usuario
// 2. Suma 1 al aforo de la sesión
// 3. Crea el documento de reserva
suspend fun addReserva(userId: String, sesion: Sesion): Boolean {
val userRef = db.collection("usuarios").document(userId)
val sesionRef = db.collection("sesiones").document(sesion.id)
val docReservaRef = db.collection("reservas").document()
return try {
db.runTransaction { transaction ->
val userSnap = transaction.get(userRef)
val sesionSnap = transaction.get(sesionRef)
// 1. EXTRAER CRÉDITOS (Búsqueda flexible)
val suscripcion = userSnap.get("suscripcion_actual") as? Map<*, *>
val creditosActuales = (suscripcion?.get("creditos") as? Number)?.toLong()
Rango: líneas 119-136
// ELIMINAR RESERVA (Transacción inversa)
// Devuelve el crédito y libera la plaza
suspend fun eliminarReserva(reserva: Reserva): Boolean {
Pagina 5

PixelGym2 - Consultas Firestore extraidas
val userRef = db.collection("usuarios").document(reserva.uid)
val sesionRef = db.collection("sesiones").document(reserva.id_sesion_reservada)
val reservaRef = db.collection("reservas").document(reserva.id_reserva)
return try {
db.runTransaction { transaction ->
// Usamos el coste que guardamos en la reserva convertido a Long por Firestore
val costeADevolver = reserva.coste.toLong()
// ACTUALIZACIÓN DE CRÉDITOS
// Usamos FieldValue.increment con el coste real,
transaction.update(userRef, "suscripcion_actual.creditos", FieldValue.increment(costeADevolver))
// CTUALIZACIÓN DE SESIÓN: Restamos 1 a las plazas ocupadas
Pagina 6

PixelGym2 - Consultas Firestore extraidas

📄 app/src/main/java/com/example/aplicacion/firebase/data/SesionDataSource.kt 1 fragmento(s)

Fragmentos del proyecto donde se usan operaciones Firestore.

Rango: líneas 1-64
package com.example.aplicacion.firebase.data
import com.example.aplicacion.model.Actividad
import com.example.aplicacion.model.Reserva
import com.example.aplicacion.model.Sesion
import com.google.firebase.firestore.FirebaseFirestore
import kotlinx.coroutines.tasks.await
class SesionDataSource {
private val db = FirebaseFirestore.getInstance()
suspend fun getSesiones(): List<Sesion> = try {
val snapshot = db.collection("sesiones").get().await()
snapshot.documents.mapNotNull { doc ->
val sesion = doc.toObject(Sesion::class.java)
sesion?.copy(id = doc.id) // <--- Aquí inyectamos el ID del documento
}
} catch (e: Exception) { emptyList() }
suspend fun getMisReservas(userId: String): List<Reserva> = try {
db.collection("reservas")
.whereEqualTo("uid", userId)
.get().await().toObjects(Reserva::class.java)
} catch (e: Exception) {
emptyList()
}
suspend fun realizarReserva(reserva: Reserva): Boolean = try {
db.collection("reservas").add(reserva).await()
true
} catch (e: Exception) { false }
suspend fun eliminarReserva(idReserva: String): Boolean = try {
db.collection("reservas").document(idReserva).delete().await()
true
} catch (e: Exception) { false }
suspend fun getActividades(): List<Actividad> = try {
db.collection("actividades").get().await().toObjects(Actividad::class.java)
} catch (e: Exception) { emptyList() }
suspend fun getSesionesPorNombre(nombre: String): List<Sesion> = try {
val snapshot = db.collection("sesiones")
.whereEqualTo("nombre_actividad", nombre)
.get().await()
snapshot.documents.mapNotNull { doc ->
val sesion = doc.toObject(Sesion::class.java)
sesion?.copy(id = doc.id) // <--- Aquí también
}
} catch (e: Exception) { emptyList() }
// Función necesaria para cargarSesionesPorFecha
suspend fun getSesionesPorNombreYFecha(nombre: String, fecha: String): List<Sesion> = try {
val snapshot = db.collection("sesiones")
.whereEqualTo("nombre_actividad", nombre)
.whereEqualTo("fecha", fecha)
.get().await()
snapshot.documents.mapNotNull { doc ->
val sesion = doc.toObject(Sesion::class.java)
sesion?.copy(id = doc.id) // <--- Y aquí
}
} catch (e: Exception) { emptyList() }
Pagina 7

PixelGym2 - Consultas Firestore extraidas

📄 app/src/main/java/com/example/aplicacion/firebase/data/UserDataSource.kt 2 fragmento(s)

Fragmentos del proyecto donde se usan operaciones Firestore.

Rango: líneas 1-12
package com.example.aplicacion.firebase.data
import com.google.firebase.firestore.FirebaseFirestore
import kotlinx.coroutines.tasks.await
class UserDataSource(private val db: FirebaseFirestore) {
suspend fun saveUserInFirestore(
uid: String,
nombreUsuario: String,
email: String,
idPlan: String,
Rango: líneas 30-42
"mes_anio" to getMesAnioActual(), // Usamos la función que ya tienes abajo
"sesiones_gastadas" to 0
)
)
// Esto creará la colección "usuarios" si no existe al insertar el primer documento
db.collection("usuarios").document(uid).set(userMap).await()
}
private fun getMesAnioActual(): String {
val sdf = java.text.SimpleDateFormat("MM_yyyy", java.util.Locale.getDefault())
return sdf.format(java.util.Date())
}
Pagina 8

PixelGym2 - Consultas Firestore extraidas

📄 app/src/main/java/com/example/aplicacion/fragments/DetalleActividadFragment.kt 2 fragmento(s)

Fragmentos del proyecto donde se usan operaciones Firestore.

Rango: líneas 7-28
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import com.example.aplicacion.databinding.FragmentDetalleActividadBinding
import com.example.aplicacion.utils.ImageMapper
import com.example.aplicacion.viewmodels.GymViewModel
// AÑADIMOS ESTA IMPORTACIÓN
import com.google.firebase.firestore.FirebaseFirestore
class DetalleActividadFragment : Fragment() {
private var _binding: FragmentDetalleActividadBinding? = null
private val binding get() = _binding!!
private val gymViewModel: GymViewModel by activityViewModels()
// Instancia de Firestore
private val db = FirebaseFirestore.getInstance()
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
_binding = FragmentDetalleActividadBinding.inflate(inflater, container, false)
return binding.root
}
Rango: líneas 42-55
com.bumptech.glide.Glide.with(this)
.load(resourceId)
.centerCrop()
.into(binding.ivActividadDetalle)
// --- NUEVO BLOQUE: CONSULTA DE SESIONES ---
db.collection("sesiones")
.whereEqualTo("nombre_actividad", itActividad.nombre)
.get()
.addOnSuccessListener { documentos ->
val listaHoras = documentos.mapNotNull { it.getString("hora_inicio") }
.distinct()
.sorted()
Pagina 9

PixelGym2 - Consultas Firestore extraidas

📄 app/src/main/java/com/example/aplicacion/viewmodels/GymViewModel.kt 6 fragmento(s)

Fragmentos del proyecto donde se usan operaciones Firestore.

Rango: líneas 179-199
}
}
}
// --- FUNCIONES DE MANTENIMIENTO ---
fun resetTotalGimnasioPruebas() {
val db = com.google.firebase.firestore.FirebaseFirestore.getInstance()
// 1 LISTA TOTAL: Borramos todo para empezar de cero absoluto
val colecciones = listOf("sesiones", "profesores", "salas", "reservas", "actividades", "tarifas", "usuarios")
var contadorColecciones = 0
colecciones.forEach { nombreColeccion ->
db.collection(nombreColeccion).get().addOnSuccessListener { snapshot ->
val batch = db.batch()
for (doc in snapshot) {
batch.delete(doc.reference)
}
batch.commit().addOnCompleteListener {
Rango: líneas 210-222
if (contadorColecciones == colecciones.size) ejecutarGrabacionDatosPrueba()
}
}
}
private fun ejecutarGrabacionDatosPrueba() {
val db = com.google.firebase.firestore.FirebaseFirestore.getInstance()
// --- 1 ACTIVIDADES -------
val catalogoActividades = listOf(
mapOf("nombre" to "Spinning", "coste" to 1, "imagen" to "im_rec_spinning", "categoria" to R.string.info_categoria,
"descripcion" to R.string.spinning_about),
mapOf("nombre" to "Cardio", "coste" to 1, "imagen" to "im_rec_cardio", "categoria" to R.string.info_categoria,
"descripcion" to R.string.cardio_about),
mapOf("nombre" to "Zumba", "coste" to 1, "imagen" to "im_rec_zumba", "categoria" to R.string.baile, "descripcion" to
R.string.zumba_about),
Rango: líneas 225-237
mapOf("nombre" to R.string.acti_pilates, "coste" to 2, "imagen" to "im_rec_pilates", "categoria" to
R.string.cuerpo_mente, "descripcion" to R.string.pilates_about),
mapOf("nombre" to "Crossfit", "coste" to 2, "imagen" to "im_rec_crossfit", "categoria" to R.string.fuerza, "descripcion"
to R.string.crossfit_about),
mapOf("nombre" to "Fitboxing", "coste" to 5, "imagen" to "im_rec_fitboxing", "categoria" to R.string.info_categoria,
"descripcion" to R.string.fitboxing_about)
)
catalogoActividades.forEach { a ->
db.collection("actividades").document(a["nombre"].toString()).set(a)
}
// --- 2 PROFESORES ------
val profesores = listOf(
mapOf("id" to "P01", "nombre" to "Carlos Ruiz"),
mapOf("id" to "P02", "nombre" to "Marta Sanz"),
Rango: líneas 239-255
mapOf("id" to "P04", "nombre" to "Laura Punch"),
mapOf("id" to "P05", "nombre" to "Sonia Zen"),
mapOf("id" to "P06", "nombre" to "Elena Core"),
mapOf("id" to "P07", "nombre" to "Dani Flow"),
mapOf("id" to "P08", "nombre" to "Thor")
)
profesores.forEach { p -> db.collection("profesores").document(p["id"] as String).set(p) }
// --- 3 SALAS ----------
val salas = listOf("Sala Ciclo", "Zona Fuerza", "Sala Zen", "Estudio 1")
Pagina 10

PixelGym2 - Consultas Firestore extraidas
salas.forEach { s -> db.collection("salas").document(s).set(mapOf("nombre" to s)) }
// --- 4 SESIONES (Generación Automática) ----------------------------------
val sdf = java.text.SimpleDateFormat("dd/MM/yyyy", java.util.Locale.getDefault())
for (dia in 22..28) {
val cal = java.util.Calendar.getInstance().apply { set(2026, java.util.Calendar.FEBRUARY, dia) }
Rango: líneas 269-282
"plazas_ocupadas" to 0,
"imagen_url" to actividad["imagen"],
"coste" to actividad["coste"],
"estado_sesion" to "ACTIVA"
)
db.collection("sesiones").document(idMañana).set(sesionBase.plus("hora_inicio" to "10:00"))
db.collection("sesiones").document(idTarde).set(sesionBase.plus("hora_inicio" to "18:00"))
}
}
// --- 5 TARIFAS ----------------
val tarifas = listOf(
mapOf("nombre" to "Simple", "creditos" to 4, "precio" to 15.99, "descripcion" to "Ideal para probar el gimnasio"),
Rango: líneas 284-293
mapOf("nombre" to "Estándar", "creditos" to 12, "precio" to 40.79, "descripcion" to "Tres créditos por semana"),
mapOf("nombre" to "VIP", "creditos" to 16, "precio" to 51.19, "descripcion" to "Cuatro créditos por semana"),
mapOf("nombre" to "Infinito", "creditos" to 999, "precio" to 59.99, "descripcion" to "Acceso total ilimitado")
)
tarifas.forEach { t ->
db.collection("tarifas").document(t["nombre"].toString()).set(t)
}
}
}