From c9bdfde5ba79150cc8b15229fdc2c5da1f3f3a8c Mon Sep 17 00:00:00 2001 From: Oliver Bryan <04oliverbryan@gmail.com> Date: Mon, 12 Jan 2026 01:08:40 +0000 Subject: [PATCH] frontend helpers for sprint routes --- packages/frontend/src/lib/server/index.ts | 1 + .../src/lib/server/sprint/byProject.ts | 25 ++++++++++ .../frontend/src/lib/server/sprint/create.ts | 47 +++++++++++++++++++ .../frontend/src/lib/server/sprint/index.ts | 2 + 4 files changed, 75 insertions(+) create mode 100644 packages/frontend/src/lib/server/sprint/byProject.ts create mode 100644 packages/frontend/src/lib/server/sprint/create.ts create mode 100644 packages/frontend/src/lib/server/sprint/index.ts diff --git a/packages/frontend/src/lib/server/index.ts b/packages/frontend/src/lib/server/index.ts index 177ddab..46cfce6 100644 --- a/packages/frontend/src/lib/server/index.ts +++ b/packages/frontend/src/lib/server/index.ts @@ -1,6 +1,7 @@ export * as issue from "@/lib/server/issue"; export * as organisation from "@/lib/server/organisation"; export * as project from "@/lib/server/project"; +export * as sprint from "@/lib/server/sprint"; export * as timer from "@/lib/server/timer"; export * as user from "@/lib/server/user"; diff --git a/packages/frontend/src/lib/server/sprint/byProject.ts b/packages/frontend/src/lib/server/sprint/byProject.ts new file mode 100644 index 0000000..b93a24d --- /dev/null +++ b/packages/frontend/src/lib/server/sprint/byProject.ts @@ -0,0 +1,25 @@ +import { getServerURL } from "@/lib/utils"; +import type { ServerQueryInput } from ".."; + +export async function byProject({ + projectId, + onSuccess, + onError, +}: { + projectId: number; +} & ServerQueryInput) { + const url = new URL(`${getServerURL()}/sprints/by-project`); + url.searchParams.set("projectId", `${projectId}`); + + const res = await fetch(url.toString(), { + credentials: "include", + }); + + if (!res.ok) { + const error = await res.text(); + onError?.(error || `failed to get sprints (${res.status})`); + } else { + const data = await res.json(); + onSuccess?.(data, res); + } +} diff --git a/packages/frontend/src/lib/server/sprint/create.ts b/packages/frontend/src/lib/server/sprint/create.ts new file mode 100644 index 0000000..136c609 --- /dev/null +++ b/packages/frontend/src/lib/server/sprint/create.ts @@ -0,0 +1,47 @@ +import { getCsrfToken, getServerURL } from "@/lib/utils"; +import type { ServerQueryInput } from ".."; + +export async function create({ + projectId, + name, + color, + startDate, + endDate, + onSuccess, + onError, +}: { + projectId: number; + name: string; + color: string; + startDate: Date; + endDate: Date; +} & ServerQueryInput) { + const url = new URL(`${getServerURL()}/sprint/create`); + url.searchParams.set("projectId", `${projectId}`); + url.searchParams.set("name", name.trim()); + url.searchParams.set("color", color); + url.searchParams.set("startDate", startDate.toISOString()); + url.searchParams.set("endDate", endDate.toISOString()); + + const csrfToken = getCsrfToken(); + const headers: HeadersInit = {}; + if (csrfToken) headers["X-CSRF-Token"] = csrfToken; + + const res = await fetch(url.toString(), { + headers, + credentials: "include", + }); + + if (!res.ok) { + const error = await res.text(); + onError?.(error || `failed to create sprint (${res.status})`); + } else { + const data = await res.json(); + if (!data.id) { + onError?.(`failed to create sprint (${res.status})`); + return; + } + + onSuccess?.(data, res); + } +} diff --git a/packages/frontend/src/lib/server/sprint/index.ts b/packages/frontend/src/lib/server/sprint/index.ts new file mode 100644 index 0000000..6287fde --- /dev/null +++ b/packages/frontend/src/lib/server/sprint/index.ts @@ -0,0 +1,2 @@ +export { byProject } from "@/lib/server/sprint/byProject"; +export { create } from "@/lib/server/sprint/create";