Zum Hauptinhalt springen

Firebase-Datenverbindung

Firebase Data Connect ist ein Firebase-Dienst, der eine GraphQL-API auf einer verwalteten PostgreSQL-Datenbank bereitstellt. In Trainium wird es für bestimmte Vorgänge als ergänzendes Backend zu Supabase verwendet.

Konfiguration​

Das Verzeichnis app/dataconnect/ enthält die Data Connect-Konfigurationsartefakte:

dataconnect/
├── dataconnect.yaml # Configuración del servicio
├── schema/
│ └── schema.gql # Definición del esquema de tipos
└── default_connector/
├── connector.yaml # Configuración del conector
└── queries.gql # Queries y mutaciones definidas

dataconnect.yaml​

Definiert den Firebase-Projektnamen, die Region und den Data Connect-Dienstnamen. Die konfigurierte Region ist europe-southwest1.

Connector.yaml​

Definiert den Namen des Standard-Connectors (default) und ordnet die Abfragen aus der Datei queries.gql diesem Connector zu.

GraphQL-Schema (schema.gql)​

Das Schema definiert sechs Haupttypen, die in etwa den Supabase-Tabellen entsprechen:

Maschinentyp​

type Maquinas @table(name: "MAQUINAS") {
id: Int!
nombre: String! @col(dataType: "varchar(100)")
tipo: String @col(dataType: "varchar(50)")
estado: Int! @default(value: 0)
descripcion: String @col(dataType: "text")
operativa: Int! @default(value: 1)
}

Benutzertyp​

type Usuario @table(name: "USUARIO") {
id: Int!
nombre: String! @col(dataType: "varchar(100)")
dni: String @unique @col(dataType: "varchar(20)")
email: String @unique @col(dataType: "varchar(100)")
contraseniaHash: String @col(name: "CONTRASEÑA_HASH", dataType: "varchar(255)")
telefono: String @col(dataType: "varchar(20)")
premium: Boolean @default(value: false)
fechaIniPrem: Date @col(name: "FECHA_INI_PREM")
fechaFinPrem: Date @col(name: "FECHA_FIN_PREM")
fechaReg: Date! @col(name: "FECHA_REG") @default(expr: "request.time")
admin: Int! @default(value: 0)
}

Typ Gerichte​

type Platos @table(name: "PLATOS") {
id: Int!
idUsuario: Usuario
nombre: String! @col(dataType: "varchar(100)")
descripcion: String @col(dataType: "text")
calorias: Float @col(name: "CALORIAS")
imagenUrl: String @col(name: "IMAGEN_URL", dataType: "varchar(255)")
fechaSubida: Date! @col(name: "FECHA_SUBIDA") @default(expr: "request.time")
visibilidad: Boolean @default(value: true)
}

Reservierungstyp​

type Reservas @table(name: "RESERVAS") {
id: Int!
idUsuario: Usuario!
idMaquina: Maquinas!
fecha: Date
horaInicio: String @col(name: "HORA_INICIO", dataType: "time")
horaFin: String @col(name: "HORA_FIN", dataType: "time")
estado: Boolean @default(value: true)
}

TypeUserWeight​

type PesoUsuario @table(name: "PESO_USUARIO") {
id: Int!
idUsuario: Usuario!
peso: Float! @col(name: "PESO")
fecha: Date
}

Zahlungsart​

type Pagos @table(name: "PAGOS") {
id: Int!
idUsuario: Usuario!
monto: Int! @col(name: "monto", dataType: "bigint")
fechaPago: Date @col(name: "fecha_pago")
tipo: String @col(name: "tipo", dataType: "varchar(50)")
metodoPago: String @col(name: "metodo_pago", dataType: "varchar(25)")
}

HTTP-Client (DataConnectClient.kt)​

Für die Kommunikation mit Data Connect wird nicht das Firebase SDK für Android verwendet, sondern ein manueller HTTP-Client, der in DataConnectClient.kt implementiert ist. Dieses Singleton-Objekt sendet POST-Anfragen an den Data Connect-REST-Endpunkt mit dem Abfragetext im JSON-Format.

object DataConnectClient {
private const val API_KEY = "..."
private const val APP_ID = "<app-id-de-ejemplo>..."
private const val ENDPOINT = "https://europe-southwest1-dataconnect.googleapis.com/v1beta/projects/tu-proyecto.../connectors/default:executeGraphql"

suspend fun execute(
query: String,
variables: Map<String, Any?> = emptyMap(),
operationName: String? = null
): JSONObject?
}

Die Authentifizierung mit der Google API erfolgt über den Header x-goog-api-key. Der Endpunkt umfasst die regionale Subdomäne europe-southwest1-dataconnect.googleapis.com, die erforderlich ist, um 404-Antworten zu vermeiden, wenn der Dienst in einer bestimmten Region bereitgestellt wird.

Die Methode execute gibt das Objekt JSONObject der vollständigen Antwort oder null im Falle eines Netzwerkfehlers oder einer erfolglosen HTTP-Antwort zurück. Der Aufruf wird im Dispatcher Dispatchers.IO mit withContext ausgeführt.