Action | Type | Resolved On |
|---|---|---|
| Configurable API Redirects | refactoring | - - - |
API routes hardcode redirect paths, which creates issues when working with historical data and reduces flexibility for different use cases.
Routes like api/open/task.ts hardcode redirect paths:
// src/pages/api/open/task.ts:19
return redirect("/benben/projects/" + project + '/' + level);
// src/pages/api/close/task.ts:19
return redirect("/benben/projects/" + project + '/' + level);
// src/pages/api/update/backlog.ts:26
return redirect("/benben/projects");
// src/pages/api/open/goal.ts:17 (with TODO comment)
// TODO - ISSUE (MINOR): when updating goal of previous month, it always redirects to latest goals
return redirect("/" + owner + "/weeks");
Pass the return URL as a hidden form field or use a redirectTo query parameter.
// API route
export const POST: APIRoute = async ({ request, redirect }) => {
const formData = await request.formData();
const returnUrl = String(formData.get("returnUrl")) || "/benben/projects";
// ... perform action ...
return redirect(returnUrl);
};
export const POST: APIRoute = async ({ request, redirect }) => {
const url = new URL(request.url);
const returnUrl = url.searchParams.get("returnTo") || "/benben/projects";
// ... perform action ...
return redirect(returnUrl);
};
// src/lib/redirect.ts
export function calculateRedirectUrl(
action: 'open' | 'close' | 'update',
entity: 'task' | 'goal' | 'idea' | 'backlog',
params: {
project?: string;
owner?: string;
year?: number;
month?: number;
level?: number;
returnUrl?: string;
}
): string {
// Use explicit return URL if provided
if (params.returnUrl) {
return params.returnUrl;
}
// Otherwise calculate based on entity and context
if (entity === 'task' && params.project) {
return `/benben/projects/${params.project}/${params.level ?? ''}`;
}
if (entity === 'goal' && params.owner) {
return `/${params.owner}/weeks`;
}
// Default fallback
return '/benben/projects';
}
src/pages/api/open/task.tssrc/pages/api/close/task.tssrc/pages/api/open/goal.tssrc/pages/api/close/goal.tssrc/pages/api/update/backlog.ts