Отложенная публикация и скрытые посты
При создании поста доступны три режима публикации:
| Режим | Что делает |
|---|---|
| Сейчас (по умолчанию) | Пост сразу опубликован, виден всем подписчикам, mirror идёт в чаты. |
| По расписанию | Пост создаётся, но скрыт. В указанное время автоматически публикуется. |
| Скрытым (черновик) | Пост сохранён, виден только владельцу. Можно потом опубликовать или удалить. |
Поля в БД
posts.scheduled_at timestamp NULL -- когда опубликовать
posts.published_at timestamp NULL -- когда фактически опубликован
posts.hidden boolean -- черновик, не публикуется автоматически
Пост виден другим пользователям, если hidden = false AND published_at IS NOT NULL AND published_at <= NOW(). Сам автор всегда видит все свои посты, включая черновики и запланированные.
Создание запланированного поста
curl -X POST "https://api.telefon.chat/api/bot$TOKEN/createPost" \
-H "Content-Type: application/json" \
-d '{
"text": "Конференция начнётся через час!",
"scheduled_at": "2026-05-15T18:00:00Z"
}'
Поле scheduled_at принимается в формате ISO 8601, время в UTC. Если время в прошлом — пост публикуется немедленно.
В ответе будут:
published_at: null(ещё не опубликован)scheduled_at: "2026-05-15T18:00:00Z"
Создание скрытого черновика
curl -X POST "https://api.telefon.chat/api/bot$TOKEN/createPost" \
-H "Content-Type: application/json" \
-d '{
"text": "Пока черновик, доделаю позже.",
"hidden": true
}'
Чтобы потом опубликовать, используйте editPost (через будущий метод изменения статуса) или удалите и создайте заново. Поддержка прямого editPost для смены hidden/scheduled_at — в работе.
Worker
Telefon.Posts.ScheduledPostsWorker — GenServer, тикает раз в 60 секунд:
- Находит посты где
published_at IS NULL AND scheduled_at <= NOW() AND hidden = false. - Для каждого: ставит
published_at = NOW(). - Запускает
fanout_post_to_bot_chats— пост рассылается в чаты подписчиков как mirror-сообщение. - Broadcast
:post_publishedна каналuser_posts:<user_id>.
Точность тика — ±60 секунд. Для более точного planning'а используйте более узкое окно с подтверждением через getPost после scheduled_at.
Видимость
| Кто смотрит | Скрытый (hidden) | Запланированный (scheduled_at в будущем) | Опубликованный |
|---|---|---|---|
| Автор | ✅ виден | ✅ виден | ✅ виден |
| Другие | ❌ скрыт | ❌ скрыт | ✅ виден |
В списке getMyPosts бот видит все свои посты для управления.