Перейти к содержимому

Контент-коллекции (Этап 7)

Коллекции «Этапа 7» описывают публичный контент студии: блог, команду, информацию о компании, процесс работы и контакты. Данные читает Client из мобилки и Public (анонимно — для будущего сайта). Пишут администраторы и Content Editor’ы.

КоллекцияSingletonНазначениеЭкраны мобилки
blog_postsнетновости компании24
employeesнеткоманда студии07
company_infoдатекст + галерея о компании28
how_we_workдапроцесс работы (wrapper)23
how_we_work_stepsнетшаги процесса (O2M от how_we_work)23
company_contactsдаконтактные данные13
company_info_filesнет, hiddenjunction для M2M company_info.images ↔ directus_files

Добавлена в рамках Этапа 7 (её не было на старте MVP). TypeScript-тип — см. dimetra-claude/docs/DATA_MODEL.mdEmployee.

ПолеТипОписание
iduuidPK
full_namestringФИО
rolestringДолжность
biotextКраткая биография
photo_idFK → directus_filesПортретное фото
orderintegerСортировка (меньше — выше)
statusenumactive / archived (archive_field коллекции)
created_attimestampdate-created
ПолеТипОписание
descriptiontext (richtext)Описание компании
imagesM2M → directus_files (alias, через company_info_files)Галерея фото
how_we_work (singleton)
└─ steps (O2M → how_we_work_steps)
id, how_we_work_id (FK), title, description,
image_id (FK → directus_files), order

Клиент читает how_we_work с deep fields steps.* и сортирует их по order.

Поля: phone, email, address, telegram, instagram, website — всё string, один singleton.

import { readItems, readSingleton } from '@directus/sdk';
// Экран 07 — Сотрудники
await client.request(readItems('employees', {
fields: ['id', 'full_name', 'role', 'bio', 'photo_id', 'order'],
filter: { status: { _eq: 'active' } },
sort: ['order'],
}));
// Экран 24 — Новости
await client.request(readItems('blog_posts', {
fields: ['id', 'title', 'slug', 'featured_image_id', 'published_at', 'content'],
filter: { status: { _eq: 'published' } },
sort: ['-published_at'],
}));
// Экран 28 — О компании (singleton + M2M галерея)
await client.request(readSingleton('company_info', {
fields: ['id', 'description', 'images.directus_files_id'],
}));
// Экран 23 — Как мы работаем (singleton + O2M шаги)
await client.request(readSingleton('how_we_work', {
fields: [
'id',
'steps.id',
'steps.title',
'steps.description',
'steps.image_id',
'steps.order',
],
deep: { steps: { _sort: ['order'] } },
}));
// Экран 13 — Контакты
await client.request(readSingleton('company_contacts', {
fields: ['phone', 'email', 'address', 'telegram', 'instagram', 'website'],
}));

Не используйте fields: ['*'] — на company_info это сломается о junction alias (см. docs/directus-api-pitfalls.mdphantom-o2m-aliases-on-fields-star).

Матрица применена скриптом backend/scripts/setup-phase-7.ts, включена в snapshot.

КоллекцияClient (мобилка)Public (анонимно)Content EditorAdministrator
blog_postsreadreadCRUDall
employeesreadreadCRUDall
company_inforeadreadupdateall
how_we_workreadreadupdateall
how_we_work_stepsreadreadCRUDall
company_contactsreadreadupdateall
directus_filescreate, readreadreadall

Project Manager и Bot Service по умолчанию к этим коллекциям доступа не имеют — они работают только с проектами/чатами/платежами.

Seeding и регенерация (для администратора БД)

Заголовок раздела «Seeding и регенерация (для администратора БД)»

Два идемпотентных скрипта в backend/scripts/:

  • setup-phase-7.ts — коллекция employees, alias company_info.images, permissions
  • seed-phase-7.ts — демо-контент (singleton’ы, 5 шагов, 3 сотрудника, 3 поста)

Запуск:

Окно терминала
cd backend
# структура
DIRECTUS_URL=http://localhost:8055 DIRECTUS_TOKEN=<admin-token> \
npx tsx scripts/setup-phase-7.ts
# демо-контент
DIRECTUS_URL=http://localhost:8055 DIRECTUS_TOKEN=<admin-token> \
npx tsx scripts/seed-phase-7.ts

Оба можно перезапускать — существующие записи пропускаются по ключу (slug для постов, full_name для сотрудников, title для шагов).

seed-phase-7.ts перезаписывает singleton’ы company_info и company_contacts только если текущее содержимое выглядит как дефолтный seed «Алматы» (регулярка на /Алматы|727/i) или пустое. Ручные правки от Content Editor’а не затираются — guard проверяет содержимое перед PATCH.

После изменений схемы:

Окно терминала
cd backend && npm run schema:snapshot # → backend/snapshots/schema.yaml
cd .. && DIRECTUS_ADMIN_TOKEN=<t> DIRECTUS_URL=http://localhost:8055 \
npx zx .claude/skills/directus-api/scripts/dump-collections.mjs # → docs/directus-api-registry.md