Backend — Tracker model, refactor Purchase → Entry #32

Closed
opened 2026-05-01 21:31:42 +02:00 by myrmidex · 0 comments
Owner

Update backend models, controllers, and routes to match the new schema from #31.

Models

  • Create Tracker model: belongsTo User, belongsTo Asset (nullable), hasMany Entry, hasMany Milestone
  • Rename PurchaseEntry: update fillable/casts (sharesquantity, price_per_shareunit_price)
  • Update Milestone: add tracker_id, scope queries to tracker
  • Update User: drop asset_id, price_tracking_enabled; add hasOne Tracker
  • Update Asset: remove users() relationship

Controllers

  • Rename PurchaseControllerEntryController, update all field names
  • Replace AssetController::current() / setCurrent() with TrackerController
  • TrackerController: show (get active tracker), store (create tracker during onboarding), update (update label/unit/asset/price_tracking)
  • Update PricingController: scope to tracker->asset_id
  • Update MilestoneController: scope to tracker

Routes (flat — active tracker resolved server-side)

  • GET/POST /tracker — show/create active tracker
  • PATCH /tracker — update tracker (label, unit, asset, price_tracking_enabled)
  • GET/POST /entries, DELETE /entries/{entry} — replaces /purchases
  • GET/POST /milestones — scoped to tracker
  • Keep /pricing/* unchanged, scope internally

Design decisions

  • User::default()->tracker resolves the active tracker everywhere
  • No nested routes yet — added when multi-tracker UI lands
  • User::first() pattern unchanged for now
Update backend models, controllers, and routes to match the new schema from #31. ## Models - Create `Tracker` model: `belongsTo User`, `belongsTo Asset (nullable)`, `hasMany Entry`, `hasMany Milestone` - Rename `Purchase` → `Entry`: update fillable/casts (`shares`→`quantity`, `price_per_share`→`unit_price`) - Update `Milestone`: add `tracker_id`, scope queries to tracker - Update `User`: drop `asset_id`, `price_tracking_enabled`; add `hasOne Tracker` - Update `Asset`: remove `users()` relationship ## Controllers - Rename `PurchaseController` → `EntryController`, update all field names - Replace `AssetController::current()` / `setCurrent()` with `TrackerController` - `TrackerController`: `show` (get active tracker), `store` (create tracker during onboarding), `update` (update label/unit/asset/price_tracking) - Update `PricingController`: scope to `tracker->asset_id` - Update `MilestoneController`: scope to tracker ## Routes (flat — active tracker resolved server-side) - `GET/POST /tracker` — show/create active tracker - `PATCH /tracker` — update tracker (label, unit, asset, price_tracking_enabled) - `GET/POST /entries`, `DELETE /entries/{entry}` — replaces `/purchases` - `GET/POST /milestones` — scoped to tracker - Keep `/pricing/*` unchanged, scope internally ## Design decisions - `User::default()->tracker` resolves the active tracker everywhere - No nested routes yet — added when multi-tracker UI lands - `User::first()` pattern unchanged for now
myrmidex added this to the v0.4.0 milestone 2026-05-01 21:31:42 +02:00
myrmidex added the
enhancement
label 2026-05-01 21:31:42 +02:00
myrmidex self-assigned this 2026-05-01 21:31:42 +02:00
myrmidex modified the milestone from v0.4.0 to v0.3.0 2026-05-02 16:19:29 +02: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: lvl0/incr#32
No description provided.