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

Отложенная публикация и скрытые посты

При создании поста доступны три режима публикации:

РежимЧто делает
Сейчас (по умолчанию)Пост сразу опубликован, виден всем подписчикам, 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 секунд:

  1. Находит посты где published_at IS NULL AND scheduled_at <= NOW() AND hidden = false.
  2. Для каждого: ставит published_at = NOW().
  3. Запускает fanout_post_to_bot_chats — пост рассылается в чаты подписчиков как mirror-сообщение.
  4. Broadcast :post_published на канал user_posts:<user_id>.

Точность тика — ±60 секунд. Для более точного planning'а используйте более узкое окно с подтверждением через getPost после scheduled_at.

Видимость​

Кто смотритСкрытый (hidden)Запланированный (scheduled_at в будущем)Опубликованный
Автор✅ виден✅ виден✅ виден
Другие❌ скрыт❌ скрыт✅ виден

В списке getMyPosts бот видит все свои посты для управления.