[frontend] change task URLs from /tasks/:id to /task/:slug/:number#38
[frontend] change task URLs from /tasks/:id to /task/:slug/:number#38capcom6 wants to merge 1 commit into
Conversation
📝 WalkthroughWalkthroughTask retrieval now supports project slug and sequential number identifiers. Frontend routes, navigation, task detail loading, editing, mutations, attachment handling, legacy redirects, and recent-project parsing use the canonical task URL. ChangesCanonical task route migration
Estimated code review effort: 3 (Moderate) | ~25 minutes Sequence Diagram(s)sequenceDiagram
participant User
participant Frontend
participant TaskAPI
participant TaskService
User->>Frontend: Open /task/{slug}/{number}
Frontend->>TaskAPI: GET /tasks/{slug}/{number}
TaskAPI->>TaskService: GetByProjectAndNumber(slug, number)
TaskService-->>TaskAPI: Task details
TaskAPI-->>Frontend: TaskDetailsResponse
Frontend-->>User: Render task detail
Possibly related PRs
Suggested reviewers: 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
🤖 Pull request artifacts
|
|
@coderabbitai full review |
✅ Action performedFull review finished. |
|
@coderabbitai full review |
✅ Action performedFull review finished. Your plan includes PR reviews subject to rate limits. More reviews will be available in 35 minutes. |
|
@coderabbitai full review |
✅ Action performedFull review finished. Your plan includes PR reviews subject to rate limits. More reviews will be available in 58 minutes. |
38ca146 to
2ce88f3
Compare
2ce88f3 to
63d96f4
Compare
|
@coderabbitai full review |
✅ Action performedFull review finished. Your plan includes PR reviews subject to rate limits. More reviews will be available in 57 minutes. |
|
@coderabbitai full review |
✅ Action performedFull review finished. |
There was a problem hiding this comment.
Actionable comments posted: 2
🧹 Nitpick comments (1)
frontend/src/lib/pages/task-new.svelte (1)
61-61: 🎯 Functional Correctness | 🔵 Trivial | 💤 Low valueConsider URL-encoding the project slug in the navigate call.
parseProjectSlugFromPathinrecent-projects.svelte.tsusesdecodeURIComponenton the slug, implying slugs may contain encoded characters. UsingencodeURIComponenthere ensures round-trip consistency.♻️ Proposed refactor
- navigate(`/task/${task.project_slug}/${task.number}`); + navigate(`/task/${encodeURIComponent(task.project_slug)}/${task.number}`);🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@frontend/src/lib/pages/task-new.svelte` at line 61, URL-encode the project slug before constructing the task route in the navigation call. Update the navigate call in the task creation flow to wrap task.project_slug with encodeURIComponent, preserving compatibility with parseProjectSlugFromPath’s decodeURIComponent handling.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@internal/server/tasks/handler.go`:
- Around line 189-198: Remove the unreachable empty-slug validation from
getByProjectAndNumber, and after parsing the task number, reject values less
than 1 with a fiber.StatusBadRequest error matching the existing invalid-number
handling.
In `@requests.http`:
- Around line 251-255: Update the “Get task by project slug and number” example
request to use the registered two-segment route `/tasks/{slug}/{number}`; remove
the extra `by-project` segment so it targets `/tasks/my-new-project/1`,
consistent with the handler route and Swagger documentation.
---
Nitpick comments:
In `@frontend/src/lib/pages/task-new.svelte`:
- Line 61: URL-encode the project slug before constructing the task route in the
navigation call. Update the navigate call in the task creation flow to wrap
task.project_slug with encodeURIComponent, preserving compatibility with
parseProjectSlugFromPath’s decodeURIComponent handling.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 945a3c63-575b-49b1-9518-0a093d605d2f
📒 Files selected for processing (12)
frontend/src/App.sveltefrontend/src/lib/api/tasks.tsfrontend/src/lib/pages/dashboard-personal.sveltefrontend/src/lib/pages/dashboard-tasks.sveltefrontend/src/lib/pages/project-tasks.sveltefrontend/src/lib/pages/task-detail.sveltefrontend/src/lib/pages/task-edit.sveltefrontend/src/lib/pages/task-new.sveltefrontend/src/lib/stores/recent-projects.svelte.tsinternal/server/docs/docs.gointernal/server/tasks/handler.gorequests.http
3bfe17d to
2bbd06e
Compare
11d870a to
408e38c
Compare
- Add backend endpoint GET /api/v1/tasks/by-project/:slug/:number - Update frontend routes: /task/:slug/:number and /task/:slug/:number/edit - Update all navigation calls to use project_slug + number - Replace onMount with for reactive data fetching on param change - Fix infinite loop in App.svelte by removing sync call from effect body - Use plain variable instead of for assigning mutex - Update parseProjectSlugFromPath to recognize new URL pattern - Add example request to requests.http
408e38c to
f02a191
Compare
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@frontend/src/lib/pages/task-redirect.svelte`:
- Around line 9-23: Update the $effect in task-redirect.svelte to track whether
the effect has been invalidated or the component unmounted, and return a cleanup
function that marks it inactive. Guard both the getTask(id) success handler
before calling navigate and the error handler before assigning error, so stale
requests cannot redirect or update state.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 50939855-7111-44fc-84dd-55a5fcb21f02
📒 Files selected for processing (14)
frontend/src/App.sveltefrontend/src/lib/api/tasks.tsfrontend/src/lib/components/TaskTable.sveltefrontend/src/lib/pages/dashboard-personal.sveltefrontend/src/lib/pages/dashboard-tasks.sveltefrontend/src/lib/pages/project-tasks.sveltefrontend/src/lib/pages/task-detail.sveltefrontend/src/lib/pages/task-edit.sveltefrontend/src/lib/pages/task-new.sveltefrontend/src/lib/pages/task-redirect.sveltefrontend/src/lib/stores/recent-projects.svelte.tsinternal/server/docs/docs.gointernal/server/tasks/handler.gorequests.http
🚧 Files skipped from review as they are similar to previous changes (11)
- frontend/src/lib/pages/project-tasks.svelte
- requests.http
- frontend/src/lib/pages/task-new.svelte
- frontend/src/lib/pages/dashboard-tasks.svelte
- frontend/src/lib/pages/dashboard-personal.svelte
- frontend/src/lib/pages/task-edit.svelte
- frontend/src/App.svelte
- internal/server/tasks/handler.go
- frontend/src/lib/stores/recent-projects.svelte.ts
- internal/server/docs/docs.go
- frontend/src/lib/pages/task-detail.svelte
| $effect(() => { | ||
| const id = Number(params.id); | ||
| if (!id) { | ||
| error = "Invalid task ID"; | ||
| return; | ||
| } | ||
|
|
||
| getTask(id) | ||
| .then((task) => { | ||
| navigate(`/task/${task.project_slug}/${task.number}`); | ||
| }) | ||
| .catch((e: any) => { | ||
| error = e.message || "Failed to load task"; | ||
| }); | ||
| }); |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Prevent race conditions and state updates after unmount.
Since $effect tracks dependencies and re-runs when params.id changes, an older network request might resolve after a newer one, causing a redirection to the wrong task. Furthermore, if the component unmounts before the request completes, navigate will still be invoked and could interrupt the user's manual navigation.
Add a cleanup function to ignore the promise result if the effect is invalidated or unmounted.
🛡️ Proposed fix to add an effect cleanup flag
$effect(() => {
+ let cancelled = false;
const id = Number(params.id);
if (!id) {
error = "Invalid task ID";
return;
}
getTask(id)
.then((task) => {
- navigate(`/task/${task.project_slug}/${task.number}`);
+ if (!cancelled) {
+ navigate(`/task/${task.project_slug}/${task.number}`);
+ }
})
.catch((e: any) => {
- error = e.message || "Failed to load task";
+ if (!cancelled) {
+ error = e.message || "Failed to load task";
+ }
});
+
+ return () => {
+ cancelled = true;
+ };
});📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| $effect(() => { | |
| const id = Number(params.id); | |
| if (!id) { | |
| error = "Invalid task ID"; | |
| return; | |
| } | |
| getTask(id) | |
| .then((task) => { | |
| navigate(`/task/${task.project_slug}/${task.number}`); | |
| }) | |
| .catch((e: any) => { | |
| error = e.message || "Failed to load task"; | |
| }); | |
| }); | |
| $effect(() => { | |
| let cancelled = false; | |
| const id = Number(params.id); | |
| if (!id) { | |
| error = "Invalid task ID"; | |
| return; | |
| } | |
| getTask(id) | |
| .then((task) => { | |
| if (!cancelled) { | |
| navigate(`/task/${task.project_slug}/${task.number}`); | |
| } | |
| }) | |
| .catch((e: any) => { | |
| if (!cancelled) { | |
| error = e.message || "Failed to load task"; | |
| } | |
| }); | |
| return () => { | |
| cancelled = true; | |
| }; | |
| }); |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@frontend/src/lib/pages/task-redirect.svelte` around lines 9 - 23, Update the
$effect in task-redirect.svelte to track whether the effect has been invalidated
or the component unmounted, and return a cleanup function that marks it
inactive. Guard both the getTask(id) success handler before calling navigate and
the error handler before assigning error, so stale requests cannot redirect or
update state.
Summary by CodeRabbit
/tasks/{slug}/{number}), including edit support./task/{slug}/{number}route./task/{slug}/{number}instead of legacy ID-based paths.