From 168bd8831c845a14a131a35cc89ab9be86b474bb Mon Sep 17 00:00:00 2001 From: Oliver Bryan <04oliverbryan@gmail.com> Date: Sat, 13 Dec 2025 21:55:09 +0000 Subject: [PATCH] more project routes --- packages/backend/src/index.ts | 4 +++ packages/backend/src/routes/index.ts | 8 ++++++ packages/backend/src/routes/project/all.ts | 9 +++++++ .../backend/src/routes/project/by-owner.ts | 26 +++++++++++++++++++ .../backend/src/routes/project/with-owner.ts | 24 +++++++++++++++++ .../backend/src/routes/project/with-owners.ts | 9 +++++++ 6 files changed, 80 insertions(+) create mode 100644 packages/backend/src/routes/project/all.ts create mode 100644 packages/backend/src/routes/project/by-owner.ts create mode 100644 packages/backend/src/routes/project/with-owner.ts create mode 100644 packages/backend/src/routes/project/with-owners.ts diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts index b2c5cbc..5bcff4b 100644 --- a/packages/backend/src/index.ts +++ b/packages/backend/src/index.ts @@ -89,6 +89,10 @@ const main = async () => { "/project/create": withCors(routes.projectCreate), "/project/update": withCors(routes.projectUpdate), "/project/delete": withCors(routes.projectDelete), + "/projects/by-owner": withCors(routes.projectsByOwner), + "/projects/all": withCors(routes.projectsAll), + "/projects/with-owners": withCors(routes.projectsWithOwners), + "/project/with-owner": withCors(routes.projectWithOwner), }, }); diff --git a/packages/backend/src/routes/index.ts b/packages/backend/src/routes/index.ts index 8cf93f9..7a42061 100644 --- a/packages/backend/src/routes/index.ts +++ b/packages/backend/src/routes/index.ts @@ -7,6 +7,10 @@ import issues from "./issues/all"; import projectCreate from "./project/create"; import projectUpdate from "./project/update"; import projectDelete from "./project/delete"; +import projectsByOwner from "./project/by-owner"; +import projectsAll from "./project/all"; +import projectsWithOwners from "./project/with-owners"; +import projectWithOwner from "./project/with-owner"; export const routes = { issueCreate, @@ -19,4 +23,8 @@ export const routes = { projectCreate, projectUpdate, projectDelete, + projectsByOwner, + projectsAll, + projectsWithOwners, + projectWithOwner, }; diff --git a/packages/backend/src/routes/project/all.ts b/packages/backend/src/routes/project/all.ts new file mode 100644 index 0000000..8d0de39 --- /dev/null +++ b/packages/backend/src/routes/project/all.ts @@ -0,0 +1,9 @@ +import type { BunRequest } from "bun"; +import { getAllProjects } from "../../db/queries"; + +// /projects/all +export default async function projectsAll(req: BunRequest) { + const projects = await getAllProjects(); + + return Response.json(projects); +} diff --git a/packages/backend/src/routes/project/by-owner.ts b/packages/backend/src/routes/project/by-owner.ts new file mode 100644 index 0000000..8365c64 --- /dev/null +++ b/packages/backend/src/routes/project/by-owner.ts @@ -0,0 +1,26 @@ +import type { BunRequest } from "bun"; +import { getProjectsByOwnerID, getUserById } from "../../db/queries"; + +// /projects/by-owner?ownerId=1 +export default async function projectsByOwner(req: BunRequest) { + const url = new URL(req.url); + const ownerId = url.searchParams.get("ownerId"); + + if (!ownerId) { + return new Response("ownerId is required", { status: 400 }); + } + + const ownerIdNumber = Number(ownerId); + if (!Number.isInteger(ownerIdNumber)) { + return new Response("ownerId must be an integer", { status: 400 }); + } + + const owner = await getUserById(ownerIdNumber); + if (!owner) { + return new Response(`user with id ${ownerId} not found`, { status: 404 }); + } + + const projects = await getProjectsByOwnerID(owner.id); + + return Response.json(projects); +} diff --git a/packages/backend/src/routes/project/with-owner.ts b/packages/backend/src/routes/project/with-owner.ts new file mode 100644 index 0000000..62b53a4 --- /dev/null +++ b/packages/backend/src/routes/project/with-owner.ts @@ -0,0 +1,24 @@ +import type { BunRequest } from "bun"; +import { getProjectWithOwnerByID } from "../../db/queries"; + +// /project/with-owner?id=1 +export default async function projectWithOwnerByID(req: BunRequest) { + const url = new URL(req.url); + const id = url.searchParams.get("id"); + + if (!id) { + return new Response("project id is required", { status: 400 }); + } + + const projectId = Number(id); + if (!Number.isInteger(projectId)) { + return new Response("project id must be an integer", { status: 400 }); + } + + const projectWithOwner = await getProjectWithOwnerByID(projectId); + if (!projectWithOwner || !projectWithOwner.Project) { + return new Response(`project with id ${id} not found`, { status: 404 }); + } + + return Response.json(projectWithOwner); +} diff --git a/packages/backend/src/routes/project/with-owners.ts b/packages/backend/src/routes/project/with-owners.ts new file mode 100644 index 0000000..770ff28 --- /dev/null +++ b/packages/backend/src/routes/project/with-owners.ts @@ -0,0 +1,9 @@ +import type { BunRequest } from "bun"; +import { getProjectsWithOwners } from "../../db/queries"; + +// /projects/with-owners +export default async function projectsWithOwners(req: BunRequest) { + const projects = await getProjectsWithOwners(); + + return Response.json(projects); +}