Add tsoa create endpoints for orgs users and projects

This commit is contained in:
2026-03-03 16:06:30 +00:00
parent 8e223bfbec
commit 2d2aacf2c0
12 changed files with 803 additions and 63 deletions

View File

@@ -28,6 +28,44 @@ function toCamelCaseTask(row: Record<string, unknown>) {
};
}
function getUser(db: Database, userId: string) {
return db
.query(`
SELECT
id,
org_id AS orgId,
full_name AS fullName,
email,
role,
timezone
FROM users
WHERE id = ?
`)
.get(userId);
}
function getProject(db: Database, projectId: string) {
return db
.query(`
SELECT
p.id,
p.org_id AS orgId,
p.key,
p.name,
p.status,
p.owner_user_id AS ownerUserId,
p.due_date AS dueDate,
u.full_name AS ownerName,
COUNT(t.id) AS taskCount
FROM projects p
LEFT JOIN users u ON u.id = p.owner_user_id
LEFT JOIN tasks t ON t.project_id = p.id
WHERE p.id = ?
GROUP BY p.id
`)
.get(projectId);
}
export function listOrganizations(db: Database) {
return db
.query(`
@@ -92,6 +130,25 @@ export function getOrganizationSummary(db: Database, orgId: string) {
};
}
export interface CreateOrganizationInput {
slug: string;
name: string;
plan: string;
industry: string;
}
export function createOrganization(db: Database, input: CreateOrganizationInput) {
const id = `org_${Math.random().toString(36).slice(2, 10)}`;
const now = new Date().toISOString();
db.query(`
INSERT INTO organizations (id, slug, name, plan, industry, created_at)
VALUES (?, ?, ?, ?, ?, ?)
`).run(id, input.slug, input.name, input.plan, input.industry, now);
return getOrganizationSummary(db, id);
}
export function listUsers(db: Database, orgId?: string | null) {
if (orgId) {
return db
@@ -125,6 +182,24 @@ export function listUsers(db: Database, orgId?: string | null) {
.all();
}
export interface CreateUserInput {
orgId: string;
fullName: string;
email: string;
role: string;
timezone: string;
}
export function createUser(db: Database, input: CreateUserInput) {
const id = `user_${Math.random().toString(36).slice(2, 10)}`;
db.query(`
INSERT INTO users (id, org_id, full_name, email, role, timezone)
VALUES (?, ?, ?, ?, ?, ?)
`).run(id, input.orgId, input.fullName, input.email, input.role, input.timezone);
return getUser(db, id);
}
export function listProjects(db: Database, orgId?: string | null) {
const sql = `
SELECT
@@ -148,6 +223,33 @@ export function listProjects(db: Database, orgId?: string | null) {
return orgId ? db.query(sql).all(orgId) : db.query(sql).all();
}
export interface CreateProjectInput {
orgId: string;
key: string;
name: string;
status: string;
ownerUserId: string;
dueDate?: string | null;
}
export function createProject(db: Database, input: CreateProjectInput) {
const id = `proj_${Math.random().toString(36).slice(2, 10)}`;
db.query(`
INSERT INTO projects (id, org_id, key, name, status, owner_user_id, due_date)
VALUES (?, ?, ?, ?, ?, ?, ?)
`).run(
id,
input.orgId,
input.key,
input.name,
input.status,
input.ownerUserId,
input.dueDate ?? null,
);
return getProject(db, id);
}
export function listTasks(db: Database, filters: TaskFilters = {}) {
const conditions: string[] = [];
const values: string[] = [];