Skip to content

LED 123 define entity lifecycle states - #264

Merged
gorushkin merged 35 commits into
mainfrom
LED-123-define-entity-lifecycle-states
Aug 6, 2026
Merged

gorushkin merged 35 commits into
mainfrom
LED-123-define-entity-lifecycle-states

Conversation

@gorushkin

Copy link
Copy Markdown
Owner

No description provided.

gorushkin added 30 commits July 27, 2026 12:15
…erminal-delete

LED 124 account close reopen terminal delete
- Refactored account repository to simplify status handling in `getWhereClauseForGetAll`.
- Updated lifecycle methods in account and commodity repositories to ensure idempotency for open/close actions.
- Changed commodity repository to use `delete` instead of `softDelete`, aligning with new deletion semantics.
- Adjusted tests to reflect changes in lifecycle methods and status filters for commodities and accounts.
- Updated validation schemas to default to "open" for commodities and adjusted related tests.
- Enhanced integration tests for accounts and commodities to ensure correct filtering and lifecycle behavior.
- Documented changes in domain and architecture ADRs regarding terminal tombstone behavior and idempotency.
- Renamed LifecycleAction to AccountLifecycleAction for clarity.
- Updated AccountLifecycleUpdateInput to use the new action type.
- Introduced getByIdForLifecycle method in CommodityRepository for lifecycle management.
- Modified delete and update methods in CommodityRepository to return void instead of CommoditySnapshot.
- Updated DeleteCommodityUseCase and UpdateCommodityUseCase to utilize TransactionManagerInterface for transaction handling.
- Adjusted tests to reflect changes in repository methods and ensure proper lifecycle handling.
- Updated integration tests to verify behavior when dealing with deleted commodities.
…unique indexes for account and commodity relationships
… for clarity

refactor(accounts): rename mockArchiveAccountUseCase to mockDeleteAccountUseCase
refactor(accounts): update integration tests to use 'inactive' status instead of 'archived'
refactor(commodities): update test cases to use 'inactive' status instead of 'archived'
refactor(error): restrict operation for CLOSED_COMMODITY_REFERENCE to 'create_account'
…tions

LED 125 commodity lifecycle actions
…delete-idempotent

LED-130 feat(accounts): make account terminal delete idempotent using lifecycle-aware lookup

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

PR вводит явные состояния жизненного цикла для user-owned сущностей (reversible isClosed vs terminal isTombstone) и проводит это через shared-схемы валидации/типы, backend domain/application/infrastructure слои, HTTP роуты, ошибки и миграции.

Changes:

  • Добавлены isClosed + операции close/open для Account и Commodity, а DELETE закреплён как terminal tombstone delete.
  • Обновлены query-фильтры списков (status=open|closed|all) и shared-константы/валидации под новый lifecycle.
  • Разделена бизнес-политика и integrity-инварианты (новые policies, репозиторные методы существования активных ссылок), обновлены ошибки/доки/ADR и Drizzle-миграции.

Reviewed changes

Copilot reviewed 126 out of 128 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
packages/shared/src/validation/commodities.ts Перенос commodity-валидаций + добавление query schema для status.
packages/shared/src/validation/commodities.test.ts Тесты дефолта/вариантов commodityQuerySchema.
packages/shared/src/validation/baseValidations.ts Удаление commodity/queryStatus валидаций из общего файла.
packages/shared/src/validation/accounts.ts Строгие схемы create/update, status-query, правила “не пустой update”.
packages/shared/src/validation/accounts.test.ts Тесты для accountUpdateSchema (не пустой) и accountQuerySchema.
packages/shared/src/types/types.ts Удаление commodity/queryStatus типов из общего types файла.
packages/shared/src/types/error-contract.ts Новые публичные коды/контексты ошибок для lifecycle/policy.
packages/shared/src/types/commodity.ts Переезд commodity типов на zod-схемы + добавление isClosed в DTO.
packages/shared/src/types/account.ts Добавление isClosed в AccountResponseDTO.
packages/shared/src/constants/index.ts Экспорт commodity-констант.
packages/shared/src/constants/commodities.ts Константы значений фильтра статуса commodities.
packages/shared/src/constants/accounts.ts Константы типов аккаунта + значений фильтра статуса.
docs/ERROR_ARCHITECTURE.md Обновление примеров/описания ошибок под lifecycle.
docs/DOMAIN.md Документация правил close/open/delete для Account/Commodity.
docs/DATABASE_SCHEMA.md Обновление ERD/описаний полей + composite FK/unique.
docs/architecture/adr/README.md ADR 0019 помечен superseded, добавлены ADR 0020/0021.
docs/architecture/adr/0021-split-commodity-reference-business-policy-from-persistence-integrity.md Новый ADR про split policy vs persistence integrity.
docs/architecture/adr/0020-terminal-tombstone-and-reversible-entity-states.md Новый ADR про терминальную tombstone и reversible close.
docs/architecture/adr/0019-repository-enforced-commodity-reference-validation.md ADR 0019 помечен как superseded + ссылка на ADR 0021.
docs/architecture/adr/0016-backend-request-flow.md Уточнение ответственности infrastructure слоя под ADR 0021.
docs/architecture/adr/0006-commodity-registry-before-currency-validation.md Обновление терминологии active/archived → open/closed + ссылки ADR.
apps/backend/src/types/fastify.d.ts JWT payload: exp?: number.
apps/backend/src/presentation/http/test-utils/index.ts Новый публичный реэкспорт http test client.
apps/backend/src/presentation/http/test-utils/http-test-client.ts Утилита для server.inject с авторизацией.
apps/backend/src/presentation/http/error-handler.ts Новые коды ошибок + BAD_REQUEST для invalid JSON/Fastify errors.
apps/backend/src/presentation/http/error-handler.test.ts Тесты маппинга новых coded ошибок и conflict.
apps/backend/src/presentation/http/commodities/commodity.routes.ts DELETE → delete + добавлены /:id/close и /:id/open.
apps/backend/src/presentation/http/commodities/commodity.controller.ts commodityQuerySchema, delete/close/open use cases.
apps/backend/src/presentation/http/commodities/commodity.controller.test.ts Тесты контроллера под новые query/delete/close/open.
apps/backend/src/presentation/http/accounts/account.routes.ts GET /accounts получает query; добавлены close/open; delete переименован.
apps/backend/src/presentation/http/accounts/account.controller.ts Query parsing + delete/close/open use cases.
apps/backend/src/presentation/http/accounts/account.controller.test.ts Тесты контроллера под query/delete/close/open.
apps/backend/src/infrastructure/infrastructure.errors.ts AccountPersistenceConflictError для write-contract invariants.
apps/backend/src/infrastructure/db/transaction/transaction.repository.ts existsActiveByCommodityId для policy проверок.
apps/backend/src/infrastructure/db/transaction/transaction.repository.test.ts Тесты для existsActiveByCommodityId.
apps/backend/src/infrastructure/db/operations/operation.repository.ts existsActiveByAccountId для policy удаления аккаунта.
apps/backend/src/infrastructure/db/commodities/commodity.repository.ts Lifecycle-aware getAll/getById, delete, close/open, rowsAffected checks.
apps/backend/src/infrastructure/db/commodities/commodity-persistence.mapper.ts Проброс isClosed в маппинг.
apps/backend/src/infrastructure/db/commodities/commodity-persistence.mapper.test.ts Тесты маппинга с isClosed.
apps/backend/src/infrastructure/db/BaseRepository.ts Хелперы ensureWriteSucceeded/ensureRowsAffected.
apps/backend/src/infrastructure/db/accounts/account-persistence.mapper.ts Проброс isClosed в маппинг.
apps/backend/src/infrastructure/db/accounts/account-persistence.mapper.test.ts Тесты маппинга с isClosed.
apps/backend/src/domain/domain.errors.ts operation: 'use' + ClosedAccountOperationError.
apps/backend/src/domain/domain.errors.test.ts Тесты нового контекста ошибок (use, closed-account).
apps/backend/src/domain/domain-core/transitions.ts Новый тип TransitionResult.
apps/backend/src/domain/domain-core/index.ts Экспорт TransitionResult.
apps/backend/src/domain/domain-core/behaviors/SoftDelete.ts Optional error params + дефолтные ошибки.
apps/backend/src/domain/domain-core/behaviors/tests/SoftDelete.test.ts Обновление ожиданий под дефолтные ошибки.
apps/backend/src/domain/commodities/types.ts CommoditySnapshot включает isClosed.
apps/backend/src/domain/commodities/commodity.test.ts delete() idempotent + close/open semantics и тесты.
apps/backend/src/domain/commodities/commodity.entity.ts isClosed, delete/close/open с TransitionResult.
apps/backend/src/domain/accounts/types.ts AccountSnapshot включает isClosed.
apps/backend/src/domain/accounts/index.ts Экспорт CreateAccountProps через публичный API домена.
apps/backend/src/domain/accounts/account.entity.ts isClosed, delete/close/open, DeletedEntityOperationError forUpdate.
apps/backend/src/domain/accounts/account.entity.test.ts Тесты idempotent delete, close/open, запрет close после delete.
apps/backend/src/di/types.ts DI типы: новые use cases + добавлен OperationRepository.
apps/backend/src/di/container.ts Wiring policies/use cases, новые зависимости transactionManager.
apps/backend/src/db/test-db.ts Поддержка isClosed + новые helpers для удаления по id.
apps/backend/src/db/schemas/common.ts Общая колонка is_closed.
apps/backend/src/db/schemas/commodities.ts is_closed + unique(userId,id) для composite FK.
apps/backend/src/db/schemas/accounts.ts is_closed + composite FK (userId, commodityId) → commodities.
apps/backend/src/application/usecases/commodities/updateCommodity.ts Update внутри транзакции; repo update теперь void.
apps/backend/src/application/usecases/commodities/openCommodity.ts Новый use case open (idempotent).
apps/backend/src/application/usecases/commodities/index.ts Экспорт delete/close/open вместо archive.
apps/backend/src/application/usecases/commodities/getAllCommodities.ts Query DTO вместо старого QueryStatus.
apps/backend/src/application/usecases/commodities/deleteCommodity.ts Новый use case terminal delete + policy refs.
apps/backend/src/application/usecases/commodities/closeCommodity.ts Новый use case close (idempotent).
apps/backend/src/application/usecases/commodities/archiveCommodity.ts Удалён старый archive use case.
apps/backend/src/application/usecases/commodities/tests/updateCommodity.test.ts Тесты с transactionManager + deleted commodity.
apps/backend/src/application/usecases/commodities/tests/openCommodity.test.ts Тесты open use case.
apps/backend/src/application/usecases/commodities/tests/getAllCommodities.test.ts Тесты getAll под новый query объект.
apps/backend/src/application/usecases/commodities/tests/deleteCommodity.test.ts Тесты delete use case + idempotency + refs policy.
apps/backend/src/application/usecases/commodities/tests/createCommodity.test.ts Обновление ожиданий snapshot (isClosed).
apps/backend/src/application/usecases/commodities/tests/closeCommodity.test.ts Тесты close use case.
apps/backend/src/application/usecases/commodities/tests/archiveCommodity.test.ts Удалены тесты старого archive use case.
apps/backend/src/application/usecases/accounts/updateAccount.ts Политика смены type + запрет type update для closed + транзакция.
apps/backend/src/application/usecases/accounts/openAccount.ts Новый use case open (idempotent).
apps/backend/src/application/usecases/accounts/index.ts Экспорт delete/close/open вместо archive.
apps/backend/src/application/usecases/accounts/getAllAccounts.ts Query DTO для list accounts.
apps/backend/src/application/usecases/accounts/deleteAccount.ts Новый use case terminal delete + policy ops.
apps/backend/src/application/usecases/accounts/createAccount.ts Create внутри транзакции + policy commodity reference.
apps/backend/src/application/usecases/accounts/closeAccount.ts Новый use case close (idempotent).
apps/backend/src/application/usecases/accounts/archiveAccount.ts Удалён старый archive use case.
apps/backend/src/application/usecases/accounts/tests/updateAccount.test.ts Тесты policy/type change/closed update + transactionManager.
apps/backend/src/application/usecases/accounts/tests/openAccount.test.ts Тесты open use case.
apps/backend/src/application/usecases/accounts/tests/getAllAccounts.test.ts Тесты getAll под новый query объект.
apps/backend/src/application/usecases/accounts/tests/getAccountById.test.ts Обновление snapshot ожиданий (isClosed).
apps/backend/src/application/usecases/accounts/tests/deleteAccount.test.ts Тесты delete use case + idempotency + policy.
apps/backend/src/application/usecases/accounts/tests/createAccount.test.ts Тесты create use case с commodityReferencePolicy.
apps/backend/src/application/usecases/accounts/tests/closeAccount.test.ts Тесты close use case.
apps/backend/src/application/usecases/accounts/tests/archiveAccount.test.ts Удалены тесты старого archive use case.
apps/backend/src/application/services/TransactionService/transaction.context-loader.ts Запрет использования closed/tombstoned accounts в новых операциях.
apps/backend/src/application/services/TransactionService/tests/transaction.context-loader.test.ts Тесты ошибок для closed/tombstoned account.
apps/backend/src/application/services/index.ts Экспорт новых policies.
apps/backend/src/application/services/CommodityReferencePolicy/index.ts Новый public export policy.
apps/backend/src/application/services/CommodityReferencePolicy/commodity-reference.policy.ts Policy для “usable commodity” и “no active references”.
apps/backend/src/application/services/CommodityReferencePolicy/tests/commodity-reference.policy.test.ts Тесты политики commodity reference.
apps/backend/src/application/services/AccountOperationPolicy/index.ts Новый public export policy.
apps/backend/src/application/services/AccountOperationPolicy/account-operation.policy.ts Policy запрета операций при active operations.
apps/backend/src/application/services/AccountOperationPolicy/tests/account-operation.policy.test.ts Тесты policy для операций аккаунта.
apps/backend/src/application/mappers/commodity.mapper.ts Проброс isClosed в response DTO.
apps/backend/src/application/mappers/account.mapper.ts Переход на публичный экспорт CreateAccountProps + isClosed в response.
apps/backend/src/application/mappers/account.mapper.test.ts Тесты маппинга с isClosed.
apps/backend/src/application/interfaces/TransactionRepository.interface.ts Добавлен existsActiveByCommodityId.
apps/backend/src/application/interfaces/OperationRepository.interface.ts Добавлен existsActiveByAccountId.
apps/backend/src/application/interfaces/index.ts Переэкспорт lifecycle типов и новых repo input типов.
apps/backend/src/application/interfaces/CommodityRepository.interface.ts Новый lifecycle API (getByIdForLifecycle, delete, open/close), query object.
apps/backend/src/application/interfaces/AccountRepository.interface.ts Новый lifecycle API (query, getByIdForLifecycle, delete, open/close, exists*).
apps/backend/src/application/application.errors.ts Новые coded application errors для lifecycle/policy.
apps/backend/src/application/application.errors.test.ts Тесты новых application errors и их контекстов.
apps/backend/drizzle/meta/0000_snapshot.json Обновление drizzle snapshot (schema changes).
apps/backend/drizzle/meta/_journal.json Обновление журнала миграций.
apps/backend/drizzle/0003_bored_daredevil.sql Миграция accounts с is_closed + composite FK.
apps/backend/drizzle/0002_numerous_alice.sql Индекс commodities(userId,id) + перестройка accounts.
apps/backend/drizzle/0001_adorable_star_brand.sql Добавление commodities.is_closed.
apps/backend/drizzle/0000_clammy_invisible_woman.sql Базовая миграция с accounts.is_closed.
.vscode/settings.json Удалены локальные инструкции генерации commit message.
.gitignore Добавлен coverage.
.agents/skills/ledgerly-commit-message/SKILL.md Добавлен skill с правилами commit message.
.agents/skills/ledgerly-commit-message/agents/openai.yaml Метаданные skill для агента.

Comment thread packages/shared/src/types/commodity.ts Outdated
Comment thread packages/shared/src/types/commodity.ts Outdated
@gorushkin
gorushkin merged commit bcd1dbb into main Aug 6, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants