De m77-database gebruiken: collecties, filters en data per gebruiker
Elke builder77-app heeft een ingebouwde database. Zo werken collecties, filters, sorteren en records per gebruiker — en zo houd je privédata privé.
Meestal kom je nooit direct aan de database — je beschrijft je app en builder77 schrijft de code die data opslaat en uitleest. Maar weten hoe het werkt helpt je betere prompts te schrijven, sneller te debuggen en goede keuzes te maken rond privacy. Hier is een rondleiding door m77.db.
Collecties en records
Data staat in collecties — benoemde groepen records zoals tasks, bookings of posts. Er is geen schema om te definiëren: een collectie ontstaat zodra je er voor het eerst naar schrijft, en elk record is een gewoon object met de velden die je het geeft.
const task = await m77.db.create('tasks', { title: 'Write launch post', done: false });
// -> { id, title, done, createdAt, updatedAt, ownerId }builder77 voegt id, createdAt, updatedAt en ownerId automatisch toe. ownerId wordt ingesteld op de ingelogde appgebruiker als die er is, en dat wordt verderop belangrijk voor de rechten.
Data lezen: list, get en count
const open = await m77.db.list('tasks', {
where: { done: false }, // exact-match filter
sort: '-createdAt', // '-' = descending
limit: 50 // up to 500
});
const one = await m77.db.get('tasks', id); // record or null
const doneCount = await m77.db.count('tasks', { where: { done: true } });where vergelijkt velden op exacte overeenkomst, en dat dekt de meeste behoeften van een app: statusfilters, categorieën, een parent-ID voor gerelateerde records. Voor zoeken-tijdens-typen in een niet al te lange lijst laad je meestal de records en filter je in de browser.
Bijwerken en verwijderen
await m77.db.update('tasks', id, { done: true }); // shallow merge
await m77.db.remove('tasks', id);update voegt de velden die je meegeeft samen met het bestaande record, dus je hoeft alleen te sturen wat er veranderd is.
Data per gebruiker met mine: true
Voor apps waarin iedereen zijn eigen data heeft — dagboeken, budgetten, habit trackers — combineer je m77.auth met de optie mine. Als een gebruiker is ingelogd, geeft mine: true alleen de records terug die hij zelf heeft aangemaakt.
await m77.auth.signIn({ email, password });
const myEntries = await m77.db.list('entries', { mine: true, sort: '-createdAt' });Er zit een tweede beschermingslaag ingebouwd: een record dat door een ingelogde gebruiker is aangemaakt, kan alleen door diezelfde gebruiker worden bijgewerkt of verwijderd. Zelfs als iemand met de hand een verzoek in elkaar zet, weigert de API wijzigingen aan records die niet van hem zijn.
Openbare vs. privédata: een korte gids
- Openbare content (menukaarten, blogposts, productoverzichten): je hoeft niet in te loggen om ze te lezen. Laat builder77 voorbeelddata toevoegen of een beheerscherm bouwen om ze te beheren, en bewerk ze wanneer je wilt in het tabblad Data.
- Inzendingen (contactformulieren, wachtlijsten, boekingen): iedereen kan ze aanmaken; jij leest ze in het tabblad Data.
- Persoonlijke data (notities, gezondheidslogboeken, financiën): vereis inloggen en vraag altijd op met
mine: true.
Eén vuistregel: alles in de front-endcode van je app is zichtbaar voor bezoekers, en lijsten zonder mine: true kan iedereen lezen die de link naar de app heeft. Is data persoonlijk, zet die dan achter inloggen en mine. Is de hele app alleen voor jou of je team, zet dan Privé-app aan in Instellingen.
Het tabblad Data
In de builder kun je in het tabblad Data elke collectie doorbladeren, records bewerken of verwijderen, de gebruikers van je app zien en geüploade bestanden bekijken. Het is de snelste manier om een typfout in content te herstellen, testitems op te ruimen of te controleren of een formulier opslaat wat je verwacht.
Dezelfde data vanuit Flutter en andere clients
De web-SDK is een dunne laag rond een REST API, en die gebruiken Flutter-exports ook. Dat betekent dat elke client dezelfde collecties kan lezen en beschrijven:
GET /api/runtime/<projectId>/db/tasks?where={"done":false}&sort=-createdAt&limit=100
POST /api/runtime/<projectId>/db/tasks { "data": { "title": "Hi" } }
Authorization: Bearer <appUserToken> (optional, from /auth/signin)Tokens van appgebruikers gelden voor één project, dus een token van de ene app kan niet bij een andere worden gebruikt. Lezen uit en schrijven naar de database kost geen credits — bouw een app die zo data-intensief is als je wilt.
Data beschrijven in je prompts
Je kunt dit allemaal in gewone taal sturen: “sla uitgaven op met bedrag, categorie en datum; elke gebruiker ziet alleen zijn eigen uitgaven”, of “voeg een statusveld toe aan boekingen en een filter voor openstaande boekingen”. De AI kent de SDK, dus het datamodel beschrijven is meestal genoeg.