66 lines
2.2 KiB
Python
66 lines
2.2 KiB
Python
from fastapi import APIRouter, HTTPException
|
|
from typing import List
|
|
from app.models import Project, ProjectCreate
|
|
from app.services.database import get_db
|
|
import json
|
|
|
|
router = APIRouter()
|
|
|
|
@router.get("", response_model=List[Project])
|
|
async def list_projects():
|
|
db = await get_db()
|
|
cursor = await db.execute("""
|
|
SELECT p.*, COUNT(t.id) as ticket_count
|
|
FROM projects p
|
|
LEFT JOIN tickets t ON p.id = t.project_id
|
|
GROUP BY p.id
|
|
""")
|
|
rows = await cursor.fetchall()
|
|
await db.close()
|
|
return [dict(row) for row in rows]
|
|
|
|
@router.post("", response_model=Project)
|
|
async def create_project(project: ProjectCreate):
|
|
db = await get_db()
|
|
try:
|
|
cursor = await db.execute(
|
|
"INSERT INTO projects (name, key, description, webhook_url) VALUES (?, ?, ?, ?)",
|
|
(project.name, project.key.upper(), project.description, project.webhook_url)
|
|
)
|
|
await db.commit()
|
|
project_id = cursor.lastrowid
|
|
|
|
cursor = await db.execute("SELECT * FROM projects WHERE id = ?", (project_id,))
|
|
row = await cursor.fetchone()
|
|
await db.close()
|
|
return {**dict(row), "ticket_count": 0}
|
|
except Exception as e:
|
|
await db.close()
|
|
raise HTTPException(status_code=400, detail=str(e))
|
|
|
|
@router.get("/{project_id}", response_model=Project)
|
|
async def get_project(project_id: int):
|
|
db = await get_db()
|
|
cursor = await db.execute("""
|
|
SELECT p.*, COUNT(t.id) as ticket_count
|
|
FROM projects p
|
|
LEFT JOIN tickets t ON p.id = t.project_id
|
|
WHERE p.id = ?
|
|
GROUP BY p.id
|
|
""", (project_id,))
|
|
row = await cursor.fetchone()
|
|
await db.close()
|
|
if not row:
|
|
raise HTTPException(status_code=404, detail="Project not found")
|
|
return dict(row)
|
|
|
|
@router.delete("/{project_id}")
|
|
async def delete_project(project_id: int):
|
|
db = await get_db()
|
|
await db.execute("DELETE FROM tickets WHERE project_id = ?", (project_id,))
|
|
await db.execute("DELETE FROM webhooks WHERE project_id = ?", (project_id,))
|
|
await db.execute("DELETE FROM projects WHERE id = ?", (project_id,))
|
|
await db.commit()
|
|
await db.close()
|
|
return {"status": "deleted"}
|