[backend] Модель данных: identity / clinical / audit, репозитории, create_all #6
Notifications
Due Date
No due date set.
Blocks
Depends on
#10 [bot][A] Движок диалога: конвейер scrub → safety → FSM → мониторинг, согласие, возраст, кризис
MedITron/PTSRaiAgent
#12 [backend][B] API этапа 1: реальная реализация вместо фикстур
MedITron/PTSRaiAgent
#13 [backend][B] Шедулер на демо-часах: напоминания о дозах, missed через 2 ч, чек-ины, шкалы по расписанию, молчание
MedITron/PTSRaiAgent
#14 [backend][B] Адаптеры: mis_mock, esia_mock, ГРЛС-выдержки, notify, outbox
MedITron/PTSRaiAgent
#18 [backend][B] seed: ветеран Андрей (13 дней) + 7 пациентов кабинета
MedITron/PTSRaiAgent
#1 [devops] Каркас: uv-проект, docker-compose, Makefile, CI
MedITron/PTSRaiAgent
Reference: MedITron/PTSRaiAgent#6
Reference in New Issue
Block a user
Описание
SPEC §5 + ADR-002 (
daily_checkins) + ADR-003 (две БД в одном Postgres, без Alembic).Желаемый результат
app/db/identity.py: patients (token, display_name, snils, tg_chat_id, birth_year, sex, clinic_id, doctor_id, consent_at, consent_ver, revoked_at), doctors, connect_codes (код подключения от врача → токен).app/db/clinical.py: patient_profile (token, modules[], therapy_start, next_visit, age_band, sex — без ФИО), item_responses, scale_results, daily_checkins (mood, med_taken, sleep_bucket, alcohol_bucket, side_effects, quit_intent, free_text_scrubbed), prescriptions, doses, alerts, messages, dialog_state (token, state, data JSONB), safety_plans.app/db/audit.py:audit(actor, action, token, details).init_db()на старте приложения.Как проверить
make up→ таблицы созданы в обеих БД;tests/test_db.pyна sqlite/aiosqlite или на compose-Postgres.Лог выполнения
2026-10-03
2026-10-03
app/db/identity.py—IdentityBase:patients,doctors,connect_codes;app/db/identity_repo.py— регистрация, согласие/отзыв, привязка чата, коды подключения, дежурные врачи.app/db/clinical.py—ClinicalBase:patient_profiles,item_responses,scale_results(+item9,scheduled,flags),daily_checkins(unique token+day),prescriptions,doses,alerts,messages,dialog_state,safety_plans,clock_state.app/db/audit.py—AuditLog(в clinical) +audit(session, *, actor, action, token, details, ts).app/db/repo.py— тонкие хелперы clinical (чек-ины с merge, шкалы, алерты +ack_alertс аудитом, dialog_state, сообщения, офсет демо-часов).app/db/session.py— два ленивых engine/sessionmaker,get_identity_session()/get_clinical_session(),configure(),dispose();app/db/bootstrap.py—init_db()(create_all в обеих БД); вызов в lifespanapp/main.py.app/db/types.py—JSONType(JSONB на Postgres),TZDateTime(UTC, наивные datetime отклоняются — ADR-005).tests/test_db.py— 17 тестов (sqlite in-memory, две раздельные БД): create_all, CRUD, уникальность СНИЛС/чата/чек-ина за день, ack → audit, upsert dialog_state, rollback, guardrail #5 (AST + граф импортов). Тот же набор зелёный на compose-Postgres (TEST_PG_IDENTITY_URL/TEST_PG_CLINICAL_URL); рольclinical_appне может подключиться кidentity.server_default=now()— время всегда передаётся параметром изapp.core.clock.birth_yearвместоage_band(возрастную группу считает UI); поле алкоголя —alcohol_bucket(как в ADR-002).session.pyне импортирует модели, поэтому clinical-код может его использовать без identity; оба набора метаданных видит толькоbootstrap.py.test_smokeбез Postgres); в compose Postgres поднимается до app.