Jobs with positions and contributions #24

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

Structurally the most complex item in the career domain. Three nested entities.

Scope

Data:

  • Job: company name, start date, end date (nullable for current). Carries a user_id FK.
  • Position: title, start date, end date (nullable), FK to Job. user_id denormalized onto Position for queryability and isolation safety.
  • Contribution: problem statement, value proposition, accomplishment measurement, FK to Position. user_id denormalized here too.

UI:

  • Jobs list under Experience.
  • Drill into a Job to view/edit its positions.
  • Drill into a Position to view/edit its contributions.

Backend:

  • Entities + migrations for all three.
  • Cascading deletes (deleting a Job removes its Positions and Contributions). Handle in app code if engines diverge on FK cascade behavior.
  • Full CRUD API + DTOs. All queries scoped to the authenticated user at every level (Job, Position, Contribution); cross-user access returns 404.
  • Tests on both DB engines, including cascade behavior and cross-user isolation at every nesting level.

Acceptance criteria

  • A user can build a full career history: multiple jobs, multiple positions per job, multiple contributions per position.
  • Cascading delete behavior is identical on both engines.
  • User A cannot see, modify, or delete User B's jobs, positions, or contributions — including via direct ID access at any nesting level.

Part of epic #4. Depends on #8, #10, #20.

Structurally the most complex item in the career domain. Three nested entities. ## Scope Data: - `Job`: company name, start date, end date (nullable for current). **Carries a `user_id` FK.** - `Position`: title, start date, end date (nullable), FK to Job. **`user_id` denormalized onto Position for queryability and isolation safety.** - `Contribution`: problem statement, value proposition, accomplishment measurement, FK to Position. **`user_id` denormalized here too.** UI: - Jobs list under Experience. - Drill into a Job to view/edit its positions. - Drill into a Position to view/edit its contributions. Backend: - Entities + migrations for all three. - Cascading deletes (deleting a Job removes its Positions and Contributions). Handle in app code if engines diverge on FK cascade behavior. - Full CRUD API + DTOs. **All queries scoped to the authenticated user at every level (Job, Position, Contribution); cross-user access returns 404.** - Tests on both DB engines, including cascade behavior **and cross-user isolation at every nesting level**. ## Acceptance criteria - [ ] A user can build a full career history: multiple jobs, multiple positions per job, multiple contributions per position. - [ ] Cascading delete behavior is identical on both engines. - [ ] User A cannot see, modify, or delete User B's jobs, positions, or contributions — including via direct ID access at any nesting level. Part of epic #4. Depends on #8, #10, #20.
james closed this issue 2026-06-20 15:17:48 +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#24
No description provided.