-
Notifications
You must be signed in to change notification settings - Fork 0
Remove org_id from units, tasks, unit_occupants, rent_config, payment_records — DB, entities, models, and services (Phase 0) #463
Description
Summary
org_id has been identified as redundant on several tables because org membership is always derivable via property_id → properties → organizations. This issue tracks the full removal across the DB schema, Supabase entities, shared models, and backend services.
org_id has already been removed from common_areas in the #387 migration. This issue covers the remaining tables.
Database (Supabase migrations)
units
- Drop
idx_units_org_idindex - Drop
units_unit_id_org_id_uniquecomposite unique constraint ← blocks downstream FK removals - Drop
org_idcolumn
tasks
- Drop
idx_tasks_org_idandidx_tasks_org_statusindexes - Drop
org_scoped_tasksRLS policy (if not already removed) - Drop
org_idcolumn - Add replacement index
idx_tasks_property_status ON tasks(property_id, status) WHERE deleted_at IS NULL
unit_occupants
- Drop composite FK
unit_occupants_unit_org_fk(FOREIGN KEY (unit_id, org_id) REFERENCES units(unit_id, org_id)) - Add simple FK
FOREIGN KEY (unit_id) REFERENCES units(unit_id) ON DELETE CASCADE - Drop
idx_unit_occupants_org_idindex - Drop unique index
idx_unit_occupants_one_active_per_user(includesorg_idcolumn) — replace with(user_id) WHERE status = 'ACTIVE' AND user_id IS NOT NULL AND deleted_at IS NULL - Drop
org_idcolumn
rent_config
- Drop composite FK
rent_config_unit_org_fk(FOREIGN KEY (unit_id, org_id) REFERENCES units(unit_id, org_id)) - Add simple FK
FOREIGN KEY (unit_id) REFERENCES units(unit_id) ON DELETE CASCADE - Drop
idx_rent_config_org_idindex - Drop
org_idcolumn
payment_records
- Drop composite FK
payment_records_unit_org_fk(FOREIGN KEY (unit_id, org_id) REFERENCES units(unit_id, org_id)) - Add simple FK
FOREIGN KEY (unit_id) REFERENCES units(unit_id) ON DELETE CASCADE - Drop
idx_payment_records_org_idindex - Drop
org_idcolumn
Migration order: composite FKs on unit_occupants, rent_config, payment_records must be dropped before removing the units_unit_id_org_id_unique constraint, which must be dropped before removing org_id from units.
Backend — Supabase Entities
UnitEntity— removeorgId/@SerialName("org_id"); remove fromCreateUnitEntityTaskEntity— removeorgId/@SerialName("org_id"); remove fromCreateTaskEntityUnitOccupantEntity— removeorgIdRentConfigEntity— removeorgId; remove fromCreateRentConfigEntityPaymentRecordEntity— removeorgId; remove fromCreatePaymentRecordEntitySupabaseMappers.kt— removeorgIdfrom all mapper functions for the above entities
Backend — Domain Models
Unit.kt— removeorgId: OrganizationIdTask.kt— removeorgId(already planned in [BE] TaskController + TaskService + TaskDatastore (Phase 0) #387)UnitOccupant.kt— removeorgIdRentConfig.kt— removeorgIdPaymentRecord.kt— removeorgId
Shared Models
UnitModel.kt— removeorgId: OrganizationIdTaskModel.kt— removeorgId(already planned in [BE] TaskController + TaskService + TaskDatastore (Phase 0) #387)UnitOccupantModel.kt— removeorgIdRentConfigModel.kt— removeorgIdPaymentRecordModel.kt— removeorgId- Corresponding
*NetworkRequest/*NetworkResponsemodels — removeorgIdfields
Backend — Datastores & Services
For each affected datastore (SupabaseUnitDatastore, SupabaseTaskDatastore, SupabaseUnitOccupantDatastore, SupabaseRentConfigDatastore, SupabasePaymentRecordDatastore):
- Remove
orgIdparameter fromcreate*methods - Remove
orgIdfilter fromget*/ list queries
For each affected service:
- Remove
orgIdparameter fromcreate*andget*/ list methods - Update callers in controllers
RBAC
All RBAC resolution already goes through propertyId → property → org. No changes needed to RBACService itself, but verify no service method passes orgId as a scoping argument after the above changes.
Tests
- Update unit tests for affected services and controllers (remove
orgIdfrom mock setups) - Update integration tests for affected datastores (remove
orgIdfrom create calls and assertions) - Update JSON test fixtures that include
orgIdfields
Notes
org_idondocumentsis independent (not derived from units) — leave as-is for now- Monetary
Longfields (amount_due,amount_paid,monthly_amount) are intentional (smallest currency unit) — do not treat as migration debt common_areas.org_idhas already been removed in migration20260327000001(part of [BE] TaskController + TaskService + TaskDatastore (Phase 0) #387)