Add 'packages/backend/' from commit 'acce648ee5e7e3a3006451e637c0db654820cc48'

git-subtree-dir: packages/backend
git-subtree-mainline: d0babd62af
git-subtree-split: acce648ee5
This commit is contained in:
Oliver Bryan
2025-12-13 20:21:47 +00:00
33 changed files with 1306 additions and 0 deletions

View File

@@ -0,0 +1,59 @@
import { eq, sql, and } from "drizzle-orm";
import { db } from "../client";
import { Issue } from "../schema";
export async function createIssue(projectId: number, title: string, description: string) {
// prevents two issues with the same unique number
return await db.transaction(async (tx) => {
// raw sql for speed
// most recent issue from project
const [lastIssue] = await tx
.select({ max: sql<number>`MAX(${Issue.number})` })
.from(Issue)
.where(eq(Issue.projectId, projectId));
const nextNumber = (lastIssue?.max || 0) + 1;
// 2. create new issue
const [newIssue] = await tx
.insert(Issue)
.values({
projectId,
title,
description,
number: nextNumber,
})
.returning();
return newIssue;
});
}
export async function deleteIssue(id: number) {
return await db.delete(Issue).where(eq(Issue.id, id));
}
export async function updateIssue(id: number, updates: { title?: string; description?: string }) {
return await db.update(Issue).set(updates).where(eq(Issue.id, id)).returning();
}
export async function getIssues() {
return await db.select().from(Issue);
}
export async function getIssuesByProject(projectId: number) {
return await db.select().from(Issue).where(eq(Issue.projectId, projectId));
}
export async function getIssueByID(id: number) {
const [issue] = await db.select().from(Issue).where(eq(Issue.id, id));
return issue;
}
export async function getIssueByNumber(projectId: number, number: number) {
const [issue] = await db
.select()
.from(Issue)
.where(and(eq(Issue.projectId, projectId), eq(Issue.number, number)));
return issue;
}