БФЛ КонтентДокументация проекта
Разделы документации
Для разработчика

Таблицы и состояния

Обновлено 16 сентября 2026БФЛ Контент
На этой странице
  1. Общий материал и отдельные копии
  2. bfl_collab_audit
  3. bfl_collab_deliveries
  4. bfl_collab_members
  5. bfl_collab_registrations
  6. data_table_user_BFLNewsBatchV04
  7. data_table_user_BFLNewsClaimV04
  8. data_table_user_BFLNewsItemV04
  9. data_table_user_KszG5ycOvocFLwHW

В экспортированной структуре 8 таблиц, 193 столбца и 22 индекса. Четыре Data Tables хранят материалы, подборки, карточки и захваты статей. Четыре таблицы collaboration хранят участников, регистрации, аудит и отдельные доставки.

Общий материал и отдельные копии

owner_chat_id остаётся владельцем проекта. created_by_user_id обозначает создателя, operation_actor_user_id/chat_id — инициатора текущей операции, feedback_actor_user_id/feedback_chat_id — держателя сессии правки. Получатель конкретной копии хранится в журнале доставок.

ОбъектСостояния и смысл
Готовая версияawaiting_approval допускает решение актуального участника
Доработкаawaiting_feedback закрепляет приглашение за одним участником; новая версия делает прежнюю superseded
ПубликацияОбщий захват publishing предшествует отправке; подтверждение Telegram даёт published
Отклонениеrejected сохраняет историю без публикации
Доставкаsending до сети; затем sent, rejected, unknown, revoked или not_sent

Уникальная пара draft/version и ключ исходного события предотвращают повторное создание. Уникальная комбинация purpose/entity_key/recipient_user_id защищает отдельную доставку. Одна транзакция не может одновременно зафиксировать PostgreSQL и Telegram: неизвестный исход требует сверки, а не слепого повтора.

Справочник ниже описывает структуру. Реальных строк материалов, участников или журнала в публичной документации нет.

Актуальные определения получены из information_schema/pg_indexes, пользовательские строки в экспорт не включены. Четыре прежние бизнес-таблицы сохранены; добавлено четыре таблицы совместной работы и 6+3 nullable-колонки Data Tables. В этом исправлении DDL и права БД не менялись. Прежние строки сверены до восстановления; затем изменялась только подтверждённая исходная версия и штатные журналы исполнения/доставки. Актуальные агрегаты см. verification.json.

owner_chat_id — владелец проекта. created_by_user_id — создатель, operation_actor_user_id/chat_id — участник текущей операции, feedback_actor_user_id/chat_id — держатель сессии, delivery_tracking=multiuser_v1 — новый учёт копий. Для старых строк допустим fallback к владельцу.

ОбъектЛогическая связь
ПодборкаПредлагает карточки новостей.
Выбор статьиЗакрепляет canonical_url и связывает статью с материалом.
Версия материалаХранит источник, факты, родительскую версию и результат согласования.
Исходная иллюстрацияМожет использоваться при сборке нескольких обложек.
ПубликацияПодтверждается message_id в записи версии.

Связи логические; SQL foreign keys на материалы не добавлялись. Доставка сверяет recipient_user_id + chat_id + message_id + материал/версию. Unique(purpose, entity_key, recipient_user_id) резервирует одну сетевую отправку. Unique role допускает одного владельца и одного редактора. Active=false проверяется заново до внешних действий. Регистрация сама не назначает роль.

Статусы материалов и правила retry/resume сохранены. Ключевые переходы: awaiting_approval → publishing → published / publication_outcome_unknown; awaiting_approval → awaiting_feedback → superseded + новая версия; awaiting_approval → rejected. Переключение пользователя не отменяет guards неизвестного результата. Статусы доставки: sending → sent / rejected / unknown / revoked / not_sent. Состояние sending после аварии также требует сверки, а не повторной отправки.

bfl_collab_audit

СтолбецТипNullableDefault
idbigintNO
actor_user_idbigintYES
actiontextNO
draft_keytextYES
versionintegerYES
batch_keytextYES
item_keytextYES
event_keytextNO
resulttextNO
detailsjsonbNO'{}'::jsonb
created_attimestamp with time zoneNOnow()

Индексы:

CREATE INDEX bfl_collab_audit_event ON public.bfl_collab_audit USING btree (event_key);
CREATE UNIQUE INDEX bfl_collab_audit_pkey ON public.bfl_collab_audit USING btree (id);

bfl_collab_deliveries

СтолбецТипNullableDefault
idbigintNO
purposetextNO
entity_keytextNO
recipient_user_idbigintNO
chat_idbigintNO
message_idbigintYES
draft_keytextYES
versionintegerYES
batch_keytextYES
item_keytextYES
operation_idtextYES
actor_user_idbigintNO
event_keytextNO
request_hashtextNO
statetextNO
resultjsonbYES
error_codetextNO''::text
attemptsintegerNO1
buttons_removedbooleanNOfalse
created_attimestamp with time zoneNOnow()
updated_attimestamp with time zoneNOnow()

Индексы:

CREATE UNIQUE INDEX bfl_collab_deliveries_pkey ON public.bfl_collab_deliveries USING btree (id);
CREATE UNIQUE INDEX bfl_collab_deliveries_purpose_entity_key_recipient_user_id_key ON public.bfl_collab_deliveries USING btree (purpose, entity_key, recipient_user_id);
CREATE INDEX bfl_collab_delivery_copy ON public.bfl_collab_deliveries USING btree (chat_id, message_id) WHERE (state = 'sent'::text);
CREATE INDEX bfl_collab_delivery_draft ON public.bfl_collab_deliveries USING btree (draft_key, version);

bfl_collab_members

СтолбецТипNullableDefault
telegram_user_idbigintNO
private_chat_idbigintNO
roletextNO
activebooleanNOfalse
usernametextNO''::text
receive_batchesbooleanNOtrue
receive_previewsbooleanNOtrue
verified_update_idbigintYES
verified_attimestamp with time zoneNOnow()
updated_attimestamp with time zoneNOnow()

Индексы:

CREATE UNIQUE INDEX bfl_collab_members_pkey ON public.bfl_collab_members USING btree (telegram_user_id);
CREATE UNIQUE INDEX bfl_collab_members_private_chat_id_key ON public.bfl_collab_members USING btree (private_chat_id);
CREATE UNIQUE INDEX bfl_collab_one_role ON public.bfl_collab_members USING btree (role);

bfl_collab_registrations

СтолбецТипNullableDefault
telegram_user_idbigintNO
private_chat_idbigintNO
usernametextNO''::text
update_idbigintNO
seen_attimestamp with time zoneNOnow()
execution_idtextNO''::text

Индексы:

CREATE UNIQUE INDEX bfl_collab_registrations_pkey ON public.bfl_collab_registrations USING btree (telegram_user_id);

data_table_user_BFLNewsBatchV04

СтолбецТипNullableDefault
idintegerNO
batch_keytextYES
owner_chat_idtextYES
event_keytextYES
origintextYES
topictextYES
window_jsontextYES
statustextYES
created_attextYES
expires_attextYES
response_idtextYES
search_urls_jsontextYES
actual_sources_jsontextYES
diagnostics_jsontextYES
status_message_idtextYES
operation_idtextYES
notification_texttextYES
notification_locktextYES
notification_errortextYES
notification_statetextYES
notification_historytextYES
notification_rankdouble precisionYES
notification_retry_afterdouble precisionYES
daysdouble precisionYES
candidate_countdouble precisionYES
read_countdouble precisionYES
accepted_countdouble precisionYES
partialdouble precisionYES
createdAttimestamp with time zoneNOCURRENT_TIMESTAMP(3)
updatedAttimestamp with time zoneNOCURRENT_TIMESTAMP(3)
created_by_user_idtextYES
operation_actor_user_idtextYES
operation_actor_chat_idtextYES

Индексы:

CREATE UNIQUE INDEX "PK_8c0793b6be01a7559a9b4cee145" ON public."data_table_user_BFLNewsBatchV04" USING btree (id);
CREATE UNIQUE INDEX bfl_news_batch_event_unique ON public."data_table_user_BFLNewsBatchV04" USING btree (event_key);
CREATE UNIQUE INDEX bfl_news_batch_key_unique ON public."data_table_user_BFLNewsBatchV04" USING btree (batch_key);

data_table_user_BFLNewsClaimV04

СтолбецТипNullableDefault
idintegerNO
selection_keytextYES
canonical_urltextYES
item_keytextYES
batch_keytextYES
owner_chat_idtextYES
draft_keytextYES
stagetextYES
source_event_keytextYES
createdAttimestamp with time zoneNOCURRENT_TIMESTAMP(3)
updatedAttimestamp with time zoneNOCURRENT_TIMESTAMP(3)

Индексы:

CREATE UNIQUE INDEX "PK_990ef810376ed844bb58fdfb782" ON public."data_table_user_BFLNewsClaimV04" USING btree (id);
CREATE UNIQUE INDEX bfl_news_claim_item_unique ON public."data_table_user_BFLNewsClaimV04" USING btree (batch_key, item_key);
CREATE UNIQUE INDEX bfl_news_claim_selection_unique ON public."data_table_user_BFLNewsClaimV04" USING btree (selection_key);
CREATE UNIQUE INDEX bfl_news_claim_url_unique ON public."data_table_user_BFLNewsClaimV04" USING btree (canonical_url);

data_table_user_BFLNewsItemV04

СтолбецТипNullableDefault
idintegerNO
item_keytextYES
batch_keytextYES
owner_chat_idtextYES
canonical_urltextYES
fact_packtextYES
statustextYES
message_idtextYES
selected_draft_idtextYES
error_codetextYES
createdAttimestamp with time zoneNOCURRENT_TIMESTAMP(3)
updatedAttimestamp with time zoneNOCURRENT_TIMESTAMP(3)

Индексы:

CREATE UNIQUE INDEX "PK_e4887149ef82ffc44e25ac9dc30" ON public."data_table_user_BFLNewsItemV04" USING btree (id);
CREATE UNIQUE INDEX bfl_news_item_key_unique ON public."data_table_user_BFLNewsItemV04" USING btree (batch_key, item_key);

data_table_user_KszG5ycOvocFLwHW

СтолбецТипNullableDefault
idintegerNO
draft_keytextYES
versiondouble precisionYES
topictextYES
texttextYES
statustextYES
owner_chat_idtextYES
source_event_keytextYES
approval_message_idtextYES
feedback_prompt_message_idtextYES
feedbacktextYES
published_message_idtextYES
last_event_keytextYES
createdAttimestamp with time zoneNOCURRENT_TIMESTAMP(3)
updatedAttimestamp with time zoneNOCURRENT_TIMESTAMP(3)
cover_titletextYES
cover_subtitletextYES
cover_categorytextYES
cover_image_idtextYES
asset_idtextYES
sha256textYES
template_versiontextYES
template_fingerprinttextYES
cover_request_sha256textYES
cover_asset_pathtextYES
telegram_file_idtextYES
preview_photo_message_idtextYES
preview_text_message_idtextYES
channel_photo_message_idtextYES
channel_text_message_idtextYES
channel_send_modetextYES
channel_captiontextYES
channel_texttextYES
channel_photo_statetextYES
channel_text_statetextYES
preview_photo_statetextYES
preview_text_statetextYES
publication_event_keytextYES
cover_widthdouble precisionYES
cover_heightdouble precisionYES
formattextYES
captiontextYES
image_prompttextYES
image_modeltextYES
image_settingstextYES
image_usagetextYES
image_request_prompttextYES
source_image_idtextYES
image_statetextYES
image_request_keytextYES
image_response_idtextYES
image_binary_reftextYES
error_stagetextYES
error_codetextYES
error_http_statustextYES
channel_message_idtextYES
caption_lengthdouble precisionYES
shortening_attemptsdouble precisionYES
image_attemptsdouble precisionYES
editorial_notestextYES
previous_captiontextYES
exact_revision_jsontextYES
recovery_of_eventtextYES
recovery_reasontextYES
operation_idtextYES
status_message_idtextYES
notification_texttextYES
notification_locktextYES
notification_errortextYES
notification_statetextYES
notification_historytextYES
parent_versiondouble precisionYES
cover_origin_versiondouble precisionYES
notification_rankdouble precisionYES
notification_retry_afterdouble precisionYES
origintextYES
news_item_idtextYES
news_batch_idtextYES
source_urltextYES
fact_packtextYES
bodytextYES
news_validationtextYES
body_limitdouble precisionYES
created_by_user_idtextYES
operation_actor_user_idtextYES
operation_actor_chat_idtextYES
feedback_actor_user_idtextYES
feedback_chat_idtextYES
delivery_trackingtextYES

Индексы:

CREATE UNIQUE INDEX "PK_e7f7c93ff982283653c0ebe3aeb" ON public."data_table_user_KszG5ycOvocFLwHW" USING btree (id);
CREATE UNIQUE INDEX bfl_draft_version_unique ON public."data_table_user_KszG5ycOvocFLwHW" USING btree (draft_key, version);
CREATE UNIQUE INDEX bfl_source_event_unique ON public."data_table_user_KszG5ycOvocFLwHW" USING btree (source_event_key) WHERE ((source_event_key IS NOT NULL) AND (source_event_key <> ''::text));