P1: Один personal Default — title, guards, backfill #64

Closed
opened 2026-07-30 21:48:27 +03:00 by cursor-ai · 3 comments
Owner

Проблема

ensure_default_calendar создаёт personal с title = nickname / «Мой календарь»; можно создать несколько personal и удалить «основной»; нет канона единственного дневника под агрегацию записей.

Ожидаемый результат

  • Title при ensure: Default (EN)
  • ≤1 active personal на owner
  • POST type=personal при уже существующем → 409 personal_exists
  • Delete единственного personal → 403 default_calendar
  • personal → commercial на единственном → запрет
  • Backfill: earliest personal → Default; extras с данными → commercial (без требования sub); пустые → delete
  • eunit

Связка

Родительский UX-пакет: EventHubFront (создаётся параллельно). Прогресс по API — комментарии здесь и ссылка в Front-issue.

Приоритет

P1

Файлы (подсказка)

  • src/logic/logic_calendar.erl
  • src/handlers/handler_verify.erl
  • test/unit/logic_calendar_tests.erl
## Проблема `ensure_default_calendar` создаёт personal с title = nickname / «Мой календарь»; можно создать несколько personal и удалить «основной»; нет канона единственного дневника под агрегацию записей. ## Ожидаемый результат - Title при ensure: `Default` (EN) - ≤1 active personal на owner - `POST type=personal` при уже существующем → 409 `personal_exists` - Delete единственного personal → 403 `default_calendar` - `personal → commercial` на единственном → запрет - Backfill: earliest personal → Default; extras с данными → commercial (без требования sub); пустые → delete - eunit ## Связка Родительский UX-пакет: EventHubFront (создаётся параллельно). Прогресс по API — комментарии здесь и ссылка в Front-issue. ## Приоритет P1 ## Файлы (подсказка) - `src/logic/logic_calendar.erl` - `src/handlers/handler_verify.erl` - `test/unit/logic_calendar_tests.erl`
cursor-ai added the Task label 2026-07-30 21:48:27 +03:00
cursor-ai self-assigned this 2026-07-30 21:48:27 +03:00
Author
Owner

Связка UX-пакета (прогресс и Front-часть): EventHub/EventHubFront#46

Scope Back: title Default, ≤1 personal, 409/403 guards, backfill extras → commercial | delete empty, eunit.

Связка UX-пакета (прогресс и Front-часть): https://git.sabilin.com/EventHub/EventHubFront/issues/46 Scope Back: title `Default`, ≤1 personal, 409/403 guards, backfill extras → commercial | delete empty, eunit.
Author
Owner

Прогресс: Back готов (локально)

Реализовано:

  • title ensure/backfill: Default
  • ≤1 personal: create → 409 personal_exists
  • delete personal → 403 default_calendar
  • personal→commercial → 403 default_calendar
  • backfill_single_personal/0 + миграция 20260730200000_single_default_personal
  • eunit logic_calendar_tests — зелёный (15/15)

Файлы: logic_calendar.erl, handlers calendars/by_id, migration, tests.

Коммит/push — по запросу. Дальше Front#46.

## Прогресс: Back готов (локально) Реализовано: - title ensure/backfill: `Default` - ≤1 personal: create → `409 personal_exists` - delete personal → `403 default_calendar` - personal→commercial → `403 default_calendar` - `backfill_single_personal/0` + миграция `20260730200000_single_default_personal` - eunit `logic_calendar_tests` — зелёный (15/15) Файлы: `logic_calendar.erl`, handlers calendars/by_id, migration, tests. Коммит/push — по запросу. Дальше Front#46.
Author
Owner

Проверено на stage API (клиент каталога): ровно 1 personal title=Default; POST второго personal → 409 personal_exists; DELETE Default → 403 default_calendar. Закрываю.

Проверено на stage API (клиент каталога): ровно 1 personal title=Default; POST второго personal → 409 personal_exists; DELETE Default → 403 default_calendar. Закрываю.
Sign in to join this conversation.