Repository navigation
LED 123 define entity lifecycle states - #264
Merged
Merged
Conversation
LED 122 terminal tombstone states
…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'
…e tombstoned commodities
…tions LED 125 commodity lifecycle actions
… lifecycle-aware lookup
…cy and stale operations
…delete-idempotent LED-130 feat(accounts): make account terminal delete idempotent using lifecycle-aware lookup
Contributor
There was a problem hiding this comment.
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 для агента. |
…d to verify active operations
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.