Tests: SpikerSoft.Business.Tests/Domain/Map/RecordedRoutes/Commands/TrimRecordedRouteCommandHandlerTests.cs + …ValidatorTests.cs, plus SpikerSoft.API.Tests/Controllers/RecordedRoutesControllerTests.cs.
Live: unauthenticated POST https://api.spikersoft.com/api/recorded-routes/000000000000000000000000/trim → 401, while POST …/000000000000000000000000/bogusnothing → 404. The 401-vs-404 split proves the trim route is registered in the deployed API, not merely on master.
Not migrated: nothing left to do. (The iOS consumer, #994, is the piece still outstanding in this epic — migrated to spikerj/spikersoft-ios#16.)
— Opus 5 Agent
Verified complete 2026-08-07 — closing.
- **Code:** `spikersoft-backend@f8f402cd` (PR #527, `feat/recorded-route-trim-993`, commit `d2b81036`) —
- `SpikerSoft.Api/Domain/Map/RecordedRoutes/RecordedRoutesController.cs:218` → `[HttpPost("{id}/trim")]`
- `SpikerSoft.Business/Domain/Map/RecordedRoutes/Commands/TrimRecordedRoute/` — `TrimRecordedRouteCommand.cs`, `TrimRecordedRouteCommandHandler.cs`, `TrimRecordedRouteCommandValidator.cs`
- `SpikerSoft.Data/DTOs/RecordedRouteDtos.cs` — `TrimRecordedRouteRequestDto`
- Tests: `SpikerSoft.Business.Tests/Domain/Map/RecordedRoutes/Commands/TrimRecordedRouteCommandHandlerTests.cs` + `…ValidatorTests.cs`, plus `SpikerSoft.API.Tests/Controllers/RecordedRoutesControllerTests.cs`.
- **Live:** unauthenticated `POST https://api.spikersoft.com/api/recorded-routes/000000000000000000000000/trim` → **401**, while `POST …/000000000000000000000000/bogusnothing` → **404**. The 401-vs-404 split proves the trim route is registered in the **deployed** API, not merely on master.
- **Shipped by:** PR #527.
Not migrated: nothing left to do. (The iOS consumer, #994, is the piece still outstanding in this epic — migrated to spikerj/spikersoft-ios#16.)
— Opus 5 Agent
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Part of epic #992. Lands first.
TrimRecordedRouteRequestDto {KeepStartIndex, KeepEndIndex, ExpectedPointCount?}inRecordedRouteDtos.cs.Commands/TrimRecordedRoute/command + validator (shape rules only) + handler: load owner-scoped tracked summary (404 convention), load points doc, validate indices against deserialized array length (never summary PointCount), 409RecordedRouteTrimConflictExceptionon ExpectedPointCount mismatch, no-op short-circuit, inclusive slice + segment rebase, recompute viaRouteStatsCalculator, ordered writes: delete analysis doc → replace PointsJson → update summary. Log ids/counts only — never coordinates.[HttpPost("{id}/trim")](UpdateMetadata try/catch shape + Conflict catch);RecordedRouteMapper.ToDetailDto(route, points).GpsTraceBuilder; pin the shared trim fixture (apply+stats). BuildSpikerSoft.UnitTests.slnf.Verified complete 2026-08-07 — closing.
spikersoft-backend@f8f402cd(PR #527,feat/recorded-route-trim-993, commitd2b81036) —SpikerSoft.Api/Domain/Map/RecordedRoutes/RecordedRoutesController.cs:218→[HttpPost("{id}/trim")]SpikerSoft.Business/Domain/Map/RecordedRoutes/Commands/TrimRecordedRoute/—TrimRecordedRouteCommand.cs,TrimRecordedRouteCommandHandler.cs,TrimRecordedRouteCommandValidator.csSpikerSoft.Data/DTOs/RecordedRouteDtos.cs—TrimRecordedRouteRequestDtoSpikerSoft.Business.Tests/Domain/Map/RecordedRoutes/Commands/TrimRecordedRouteCommandHandlerTests.cs+…ValidatorTests.cs, plusSpikerSoft.API.Tests/Controllers/RecordedRoutesControllerTests.cs.POST https://api.spikersoft.com/api/recorded-routes/000000000000000000000000/trim→ 401, whilePOST …/000000000000000000000000/bogusnothing→ 404. The 401-vs-404 split proves the trim route is registered in the deployed API, not merely on master.Not migrated: nothing left to do. (The iOS consumer, #994, is the piece still outstanding in this epic — migrated to spikerj/spikersoft-ios#16.)
— Opus 5 Agent