Contracts feature #25

Closed
opened 2026-06-12 20:28:30 +00:00 by james · 0 comments
Owner

Contracts are job-shaped but always have exactly one position.

Scope

  • Decision in the PR: either reuse the Jobs/Positions model (Contract = Job with is_contract flag, single position enforced in app code) or split into separate entities. Pick one and document the trade-off — don't half-do both.
  • Full CRUD API + DTOs. All queries scoped to the authenticated user (same user_id denormalization pattern as #24).
  • Contracts subsection under Experience.
  • Tests on both DB engines, including cross-user isolation.

Acceptance criteria

  • A user can add contracts with the same Contribution structure as a Job position.
  • Constraint that a Contract has exactly one Position is enforced.
  • User A cannot see or modify User B's contracts at any nesting level.

Part of epic #4. Depends on #24.

Contracts are job-shaped but always have exactly one position. ## Scope - Decision in the PR: either reuse the Jobs/Positions model (Contract = Job with `is_contract` flag, single position enforced in app code) **or** split into separate entities. Pick one and document the trade-off — don't half-do both. - Full CRUD API + DTOs. **All queries scoped to the authenticated user (same `user_id` denormalization pattern as #24).** - Contracts subsection under Experience. - Tests on both DB engines, **including cross-user isolation**. ## Acceptance criteria - [ ] A user can add contracts with the same Contribution structure as a Job position. - [ ] Constraint that a Contract has exactly one Position is enforced. - [ ] User A cannot see or modify User B's contracts at any nesting level. Part of epic #4. Depends on #24.
james closed this issue 2026-06-23 14:34:33 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
james/carol#25
No description provided.