Wszystkie wpisy
Dla programistów·7 min czytania

Baza danych m77: kolekcje, filtry i dane użytkowników

Każda aplikacja builder77 ma wbudowaną bazę danych. Oto jak działają kolekcje, filtry, sortowanie i rekordy przypisane do użytkownika — i jak chronić prywatne dane.

77
Zespół builder77
builder77.com

Przez większość czasu w ogóle nie dotkniesz bazy danych bezpośrednio — opisujesz aplikację, a builder77 pisze kod, który zapisuje i odczytuje dane. Ale wiedza o tym, jak to działa, pomaga pisać lepsze prompty, szybciej szukać błędów i podejmować dobre decyzje w kwestii prywatności. Oto przewodnik po m77.db.

Kolekcje i rekordy

Dane trafiają do kolekcji — nazwanych grup rekordów, takich jak tasks, bookings czy posts. Nie trzeba definiować schematu: kolekcja powstaje przy pierwszym zapisie, a każdy rekord to zwykły obiekt z polami, które mu nadasz.

js
const task = await m77.db.create('tasks', { title: 'Write launch post', done: false });
// -> { id, title, done, createdAt, updatedAt, ownerId }

builder77 automatycznie dodaje id, createdAt, updatedAt i ownerId. ownerId jest ustawiane na zalogowanego użytkownika aplikacji, jeśli taki jest — co będzie ważne przy uprawnieniach opisanych niżej.

Odczyt danych: list, get i count

js
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 dopasowuje pola dokładnie, co pokrywa większość potrzeb aplikacji: filtry statusu, kategorie, ID rodzica dla powiązanych rekordów. Przy wyszukiwaniu w trakcie pisania na niewielkiej liście często wczytuje się rekordy i filtruje je w przeglądarce.

Aktualizacja i usuwanie

js
await m77.db.update('tasks', id, { done: true });   // shallow merge
await m77.db.remove('tasks', id);

update scala przekazane pola z istniejącym rekordem, więc wysyłasz tylko to, co się zmieniło.

Dane użytkownika z mine: true

W aplikacjach, w których każda osoba ma własne dane — dzienniki, budżety, trackery nawyków — połącz m77.auth z opcją mine. Gdy użytkownik jest zalogowany, mine: true zwraca tylko rekordy, które sam utworzył.

js
await m77.auth.signIn({ email, password });

const myEntries = await m77.db.list('entries', { mine: true, sort: '-createdAt' });

Wbudowana jest też druga warstwa ochrony: rekord utworzony przez zalogowanego użytkownika może zostać zaktualizowany lub usunięty tylko przez tego samego użytkownika. Nawet jeśli ktoś ręcznie spreparuje zapytanie, API odrzuci zmiany w rekordach, które do niego nie należą.

Dane publiczne a prywatne: krótki przewodnik

  • Treści publiczne (pozycje menu, wpisy na blogu, oferty produktów): do odczytu nie trzeba logowania. Poproś builder77 o dane startowe albo o ekran administracyjny do zarządzania nimi i edytuj je w każdej chwili w zakładce Dane.
  • Zgłoszenia (formularze kontaktowe, listy oczekujących, rezerwacje): każdy może je tworzyć; Ty czytasz je w zakładce Dane.
  • Dane osobowe (notatki, dzienniki zdrowia, finanse): wymagaj logowania i zawsze pobieraj je z mine: true.

Prosta zasada: wszystko w kodzie front-endu Twojej aplikacji jest widoczne dla odwiedzających, a listy bez mine: true może odczytać każdy, kto ma link do aplikacji. Jeśli dane są osobiste, schowaj je za logowaniem i mine. Jeśli cała aplikacja jest tylko dla Ciebie lub Twojego zespołu, włącz opcję Aplikacja prywatna w Ustawieniach.

Zakładka Dane

W kreatorze zakładka Dane pozwala przeglądać każdą kolekcję, edytować i usuwać rekordy, zobaczyć użytkowników aplikacji i przejrzeć przesłane pliki. To najszybszy sposób, by poprawić literówkę w treści, wyczyścić wpisy testowe albo sprawdzić, czy formularz zapisuje to, czego oczekujesz.

Te same dane we Flutterze i innych klientach

SDK webowe to cienka nakładka na REST API, z którego korzystają też eksporty do Fluttera. To znaczy, że każdy klient może czytać i zapisywać te same kolekcje:

http
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)

Tokeny użytkowników aplikacji są ograniczone do jednego projektu, więc tokenu z jednej aplikacji nie da się użyć w innej. Odczyty i zapisy w bazie danych nie zużywają kredytów — buduj aplikację tak bogatą w dane, jak tylko chcesz.

Prompty o danych

Wszystkim tym możesz sterować zwykłym językiem: „zapisuj wydatki z kwotą, kategorią i datą; każdy użytkownik widzi tylko swoje” albo „dodaj pole statusu do rezerwacji i filtr dla oczekujących”. AI zna SDK, więc zwykle wystarczy opisać model danych.

Gotowy, by to zbudować?

Opisz swój pomysł i mniej więcej w minutę otrzymaj pierwszą działającą wersję. Start za darmo, karta kredytowa niepotrzebna.