Add tsoa create endpoints for orgs users and projects
This commit is contained in:
@@ -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[] = [];
|
||||
|
||||
Reference in New Issue
Block a user