[105-9] feat: cron-уборка истёкших access_rules (Story 6.7 backend-слайс) #142

Closed
claude wants to merge 1 commits from feat/coopid-epic-6-access-rules-cleanup into feat/coopid-epic-12
Owner

Безопасный не-визуальный бэкенд-слайс заблокированной Story 6.7 (TTL capability).

Истёкшие точечные права (access_rules.expires_at) при истечении уже инертны — read-path их исключает (expires_at <= now), доступа не дают. Мёртвые строки копились вечно. Добавлены:

  • порт IAccessRulesRepository.deleteExpired(now)
  • PostgresAccessRulesRepository: DELETE ... WHERE expires_at IS NOT NULL AND expires_at <= now RETURNING (детерминированный подсчёт, как в capability-sets)
  • AccessRulesCleanupService: @Cron ежедневно (прецедент CriticalActionsService.expireStale), зарегистрирован в AuthorizationModule

Ключевой инвариант: удаление != отзыв — ничьи фактические права не меняются → без инвалидации сессий и аудита. Удаляются только истёкшие с непустым TTL; бессрочные и действующие не трогаются.

Тесты: jest 3/3 (вызов с Date, ноль-кейс, проброс сбоя), ESLint 0, тайп-чек ts-jest.

Base — feat/coopid-epic-12 (текущий тип кумулятивного CoopID-стека; access_rules пришёл из Эпика 6, в dev ещё не слит). Нижние ветки стека не трогались.

🤖 Generated with Claude Code

Безопасный не-визуальный бэкенд-слайс заблокированной Story 6.7 (TTL capability). Истёкшие точечные права (access_rules.expires_at) при истечении уже инертны — read-path их исключает (expires_at <= now), доступа не дают. Мёртвые строки копились вечно. Добавлены: - порт IAccessRulesRepository.deleteExpired(now) - PostgresAccessRulesRepository: DELETE ... WHERE expires_at IS NOT NULL AND expires_at <= now RETURNING (детерминированный подсчёт, как в capability-sets) - AccessRulesCleanupService: @Cron ежедневно (прецедент CriticalActionsService.expireStale), зарегистрирован в AuthorizationModule Ключевой инвариант: удаление != отзыв — ничьи фактические права не меняются → без инвалидации сессий и аудита. Удаляются только истёкшие с непустым TTL; бессрочные и действующие не трогаются. Тесты: jest 3/3 (вызов с Date, ноль-кейс, проброс сбоя), ESLint 0, тайп-чек ts-jest. Base — feat/coopid-epic-12 (текущий тип кумулятивного CoopID-стека; access_rules пришёл из Эпика 6, в dev ещё не слит). Нижние ветки стека не трогались. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
claude added 1 commit 2026-06-14 22:32:36 +00:00
Точечные права с TTL (expires_at) при истечении уже инертны — read-path
findForPrincipal/findForCapabilitySets исключает их (expires_at <= now), доступа
они не дают. Но мёртвые строки копились вечно. Добавлен AccessRulesCleanupService
(@Cron ежедневно, прецедент CriticalActionsService.expireStale) + порт-метод
deleteExpired + DELETE ... WHERE expires_at IS NOT NULL AND expires_at <= now
RETURNING (детерминированный подсчёт, как в capability-sets). Удаление != отзыв:
ничьи фактические права не меняются → без инвалидации сессий и аудита.
Зачем: завершает TTL-фичу (6.7) — таблица прав не растёт бесконечно, выборка
прав не деградирует; безопасный не-визуальный бэкенд-слайс заблокированной 6.7.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ant added this to the CoopID project 2026-06-15 13:17:41 +00:00
Author
Owner

Схлопнут в единый PR #148 (coopID → dev). Ветка сохранена как резерв, ничего не потеряно.

Схлопнут в единый PR #148 (coopID → dev). Ветка сохранена как резерв, ничего не потеряно.
claude closed this pull request 2026-06-15 13:26:48 +00:00

Pull request closed

Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: C9S/mono#142