Все статьи
Разработчикам·7 мин чтения

База данных m77: коллекции, фильтры и данные пользователей

Каждое приложение builder77 поставляется со встроенной базой данных. Как работают коллекции, фильтры, сортировка и личные записи пользователей — и как сохранить приватные данные приватными.

77
Команда builder77
builder77.com

Чаще всего вы вообще не будете работать с базой данных напрямую: вы описываете приложение, а builder77 пишет код, который сохраняет и читает данные. Но понимание того, как всё устроено, помогает писать лучшие промпты, быстрее находить ошибки и принимать правильные решения о конфиденциальности. Вот обзор m77.db.

Коллекции и записи

Данные хранятся в коллекциях — именованных группах записей вроде tasks, bookings или posts. Схему описывать не нужно: коллекция создаётся при первой записи в неё, а каждая запись — это обычный объект с любыми полями, которые вы передали.

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

builder77 автоматически добавляет id, createdAt, updatedAt и ownerId. ownerId получает значение вошедшего пользователя приложения, если он есть, — это важно для прав доступа, о которых ниже.

Чтение данных: list, get и 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 ищет точные совпадения полей, и этого хватает для большинства задач: фильтры по статусу, категории, ID родительской записи для связанных данных. Для поиска по мере ввода в небольшом списке обычно загружают записи и фильтруют их в браузере.

Обновление и удаление

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

update объединяет переданные поля с существующей записью, поэтому отправлять нужно только то, что изменилось.

Личные данные пользователя с mine: true

Для приложений, где у каждого свои данные — дневники, бюджеты, трекеры привычек, — сочетайте m77.auth с параметром mine. Когда пользователь вошёл, mine: true возвращает только созданные им записи.

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

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

Есть и второй встроенный уровень защиты: запись, созданную вошедшим пользователем, может изменить или удалить только этот же пользователь. Даже если кто-то вручную составит запрос, API отклонит изменения чужих записей.

Публичные и приватные данные: краткий гайд

  • Публичный контент (пункты меню, статьи блога, карточки товаров): для чтения вход не нужен. Попросите builder77 добавить начальные данные или экран администратора для управления ими и редактируйте их в любое время на вкладке «Данные».
  • Заявки (контактные формы, списки ожидания, записи): создать их может любой; вы читаете их на вкладке «Данные».
  • Личные данные (заметки, записи о здоровье, финансы): требуйте вход и всегда запрашивайте с mine: true.

Простое правило: всё, что есть во фронтенд-коде приложения, видно посетителям, а списки без mine: true может прочитать любой, у кого есть ссылка на приложение. Если данные личные, спрячьте их за входом и mine. Если всё приложение предназначено только для вас или вашей команды, включите Приватное приложение в настройках.

Вкладка «Данные»

Вкладка Данные в конструкторе позволяет просматривать все коллекции, редактировать и удалять записи, видеть пользователей приложения и загруженные файлы. Это самый быстрый способ исправить опечатку в контенте, удалить тестовые записи или проверить, что форма сохраняет именно то, что нужно.

Те же данные из Flutter и других клиентов

Веб-SDK — это тонкая обёртка над REST API, который используют и Flutter-экспорты. Значит, любой клиент может читать и записывать одни и те же коллекции:

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)

Токены пользователей приложения привязаны к одному проекту, поэтому токен одного приложения нельзя использовать в другом. Чтение и запись в базу данных не расходуют кредиты — создавайте приложения с любым объёмом данных.

Промпты для данных

Всем этим можно управлять обычным языком: «храни расходы с суммой, категорией и датой; каждый пользователь видит только свои» или «добавь поле статуса к записям и фильтр для ожидающих». ИИ знает SDK, так что обычно достаточно описать модель данных.

Готовы создать?

Опишите идею и получите рабочую первую версию примерно за минуту. Начать можно бесплатно, банковская карта не нужна.