You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
2.3 KiB
TypeScript
67 lines
2.3 KiB
TypeScript
// frontend/lib/tasks/api.ts
|
|
import type {
|
|
Folder,
|
|
Person,
|
|
Project,
|
|
Risk,
|
|
ScaffoldResult,
|
|
Task,
|
|
TaskComment,
|
|
} from "@/lib/types";
|
|
|
|
const J = { "Content-Type": "application/json" };
|
|
async function ok<T>(r: Response): Promise<T> {
|
|
if (!r.ok) throw new Error(`${r.status} ${r.statusText}`);
|
|
return r.json() as Promise<T>;
|
|
}
|
|
|
|
export const tasksApi = {
|
|
people: () => fetch("/api/people").then((r) => ok<Person[]>(r)),
|
|
|
|
tree: () => fetch("/api/tree").then((r) => ok<Folder[]>(r)),
|
|
|
|
// area/project_id 없으면 전체 작업(top-level 중첩 트리) 반환.
|
|
list: (p: { area?: "work" | "life"; project_id?: string; status?: string; assignee?: string } = {}) => {
|
|
const q = new URLSearchParams(
|
|
Object.entries(p).filter(([, v]) => v != null) as [string, string][],
|
|
);
|
|
const qs = q.toString();
|
|
return fetch(`/api/tasks${qs ? `?${qs}` : ""}`).then((r) => ok<Task[]>(r));
|
|
},
|
|
|
|
get: (id: string) => fetch(`/api/tasks/${id}`).then((r) => ok<Task>(r)),
|
|
|
|
create: (body: Partial<Task> & { title: string; project_id: string }) =>
|
|
fetch("/api/tasks", { method: "POST", headers: J, body: JSON.stringify(body) }).then((r) =>
|
|
ok<Task>(r),
|
|
),
|
|
|
|
patch: (id: string, body: Partial<Task>) =>
|
|
fetch(`/api/tasks/${id}`, { method: "PATCH", headers: J, body: JSON.stringify(body) }).then(
|
|
(r) => ok<Task>(r),
|
|
),
|
|
|
|
remove: (id: string) => fetch(`/api/tasks/${id}`, { method: "DELETE" }).then((r) => r.ok),
|
|
|
|
addComment: (id: string, body: { person_id: string; text: string }) =>
|
|
fetch(`/api/tasks/${id}/comments`, { method: "POST", headers: J, body: JSON.stringify(body) }).then(
|
|
(r) => ok<TaskComment>(r),
|
|
),
|
|
|
|
scaffold: (id: string, body: { create?: boolean; use_llm?: boolean } = {}) =>
|
|
fetch(`/api/tasks/${id}/scaffold`, { method: "POST", headers: J, body: JSON.stringify(body) }).then(
|
|
(r) => ok<ScaffoldResult>(r),
|
|
),
|
|
|
|
risks: (area: "work" | "life" = "work") =>
|
|
fetch(`/api/risks?area=${area}`).then((r) => ok<Risk[]>(r)),
|
|
|
|
createProject: (body: { folder_id: string; parent_id?: string; name: string; tone?: string }) =>
|
|
fetch("/api/projects", { method: "POST", headers: J, body: JSON.stringify(body) }).then((r) =>
|
|
ok<Project>(r),
|
|
),
|
|
|
|
pinProject: (id: string) =>
|
|
fetch(`/api/projects/${id}/pin`, { method: "POST" }).then((r) => ok<Project>(r)),
|
|
};
|