mirror of
https://github.com/a-mayb3/Kanban_clone_backend.git
synced 2026-03-21 10:05:38 +01:00
Started working on projects related endpoints
This commit is contained in:
parent
0b676688c2
commit
abd4d5e988
6 changed files with 93 additions and 63 deletions
19
database.py
19
database.py
|
|
@ -2,9 +2,28 @@ from sqlalchemy import create_engine
|
||||||
from sqlalchemy.orm import sessionmaker
|
from sqlalchemy.orm import sessionmaker
|
||||||
from sqlalchemy.ext.declarative import declarative_base
|
from sqlalchemy.ext.declarative import declarative_base
|
||||||
|
|
||||||
|
from pydantic import BaseModel, ConfigDict
|
||||||
|
|
||||||
|
from fastapi import Depends
|
||||||
|
from sqlalchemy.orm import Session
|
||||||
|
from typing import Annotated
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
URL_DATABASE = "sqlite:///./kanban_clone.db"
|
URL_DATABASE = "sqlite:///./kanban_clone.db"
|
||||||
|
|
||||||
engine = create_engine(URL_DATABASE)
|
engine = create_engine(URL_DATABASE)
|
||||||
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
|
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
|
||||||
|
|
||||||
Base = declarative_base()
|
Base = declarative_base()
|
||||||
|
|
||||||
|
Base.metadata.create_all(bind=engine)
|
||||||
|
|
||||||
|
def get_db():
|
||||||
|
db = SessionLocal()
|
||||||
|
try:
|
||||||
|
yield db
|
||||||
|
finally:
|
||||||
|
db.close()
|
||||||
|
|
||||||
|
db_dependency = Annotated[Session, Depends(get_db)]
|
||||||
64
main.py
64
main.py
|
|
@ -1,66 +1,10 @@
|
||||||
from enum import Enum
|
|
||||||
from fastapi import FastAPI, HTTPException, Depends
|
from fastapi import FastAPI, HTTPException, Depends
|
||||||
from pydantic import BaseModel, ConfigDict
|
|
||||||
from typing import List, Annotated, Optional
|
|
||||||
|
|
||||||
import models
|
from routers.tasks import router as tasks_router
|
||||||
from database import SessionLocal, engine
|
from routers.projects import router as projects_router
|
||||||
from sqlalchemy.orm import Session, joinedload
|
|
||||||
|
|
||||||
from misc.tasks import TaskBase
|
|
||||||
from misc.users import UserBase
|
|
||||||
from misc.projects import ProjectBase, ProjectCreate
|
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
models.Base.metadata.create_all(bind=engine)
|
app.include_router(tasks_router)
|
||||||
|
app.include_router(projects_router)
|
||||||
def get_db():
|
|
||||||
db = SessionLocal()
|
|
||||||
try:
|
|
||||||
yield db
|
|
||||||
finally:
|
|
||||||
db.close()
|
|
||||||
|
|
||||||
db_dependency = Annotated[Session, Depends(get_db)]
|
|
||||||
|
|
||||||
@app.post("/projects/", response_model=ProjectBase)
|
|
||||||
def create_project(project: ProjectCreate, db: db_dependency):
|
|
||||||
db_project = models.Project(name=project.name, description=project.description)
|
|
||||||
db.add(db_project)
|
|
||||||
db.commit()
|
|
||||||
db.refresh(db_project)
|
|
||||||
|
|
||||||
for task in project.tasks:
|
|
||||||
db_task = models.Task(
|
|
||||||
title=task.title,
|
|
||||||
description=task.description,
|
|
||||||
status=task.status.value,
|
|
||||||
project_id=db_project.id
|
|
||||||
)
|
|
||||||
db.add(db_task)
|
|
||||||
db.commit()
|
|
||||||
|
|
||||||
if project.user_ids:
|
|
||||||
users = db.query(models.User).filter(models.User.id.in_(project.user_ids)).all()
|
|
||||||
db_project.users.extend(users)
|
|
||||||
db.commit()
|
|
||||||
|
|
||||||
db_project = db.query(models.Project).options(
|
|
||||||
joinedload(models.Project.tasks),
|
|
||||||
joinedload(models.Project.users)
|
|
||||||
).filter(models.Project.id == db_project.id).first()
|
|
||||||
|
|
||||||
return db_project
|
|
||||||
|
|
||||||
@app.get("/projects/{project_id}", response_model=ProjectBase)
|
|
||||||
def read_project(project_id: int, db: db_dependency):
|
|
||||||
db_project = db.query(models.Project).options(
|
|
||||||
joinedload(models.Project.tasks),
|
|
||||||
joinedload(models.Project.users)
|
|
||||||
).filter(models.Project.id == project_id).first()
|
|
||||||
if db_project is None:
|
|
||||||
raise HTTPException(status_code=404, detail="Project not found")
|
|
||||||
return db_project
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
from sqlalchemy import Column, ForeignKey, String, Integer, Table
|
from sqlalchemy import Column, ForeignKey, String, Integer, Table
|
||||||
from sqlalchemy.orm import relationship
|
from sqlalchemy.orm import relationship
|
||||||
from database import Base
|
from database import Base
|
||||||
from pydantic import BaseModel
|
|
||||||
from typing import Optional, List
|
from typing import Optional, List
|
||||||
|
|
||||||
project_user = Table(
|
project_user = Table(
|
||||||
|
|
|
||||||
52
routers/projects.py
Normal file
52
routers/projects.py
Normal file
|
|
@ -0,0 +1,52 @@
|
||||||
|
from fastapi import APIRouter, HTTPException, Depends
|
||||||
|
from typing import List, Annotated
|
||||||
|
|
||||||
|
from database import db_dependency
|
||||||
|
|
||||||
|
import schemas.tasks as tasks
|
||||||
|
import schemas.projects as projects
|
||||||
|
|
||||||
|
router = APIRouter(prefix="/projects", tags=["projects"])
|
||||||
|
|
||||||
|
@router.get("/{project_id}", response_model=projects.ProjectBase)
|
||||||
|
def read_project(project_id: int, db: db_dependency):
|
||||||
|
db_project = db.query(projects.models.Project).filter(projects.models.Project.id == project_id).first()
|
||||||
|
if db_project is None:
|
||||||
|
raise HTTPException(status_code=404, detail="Project not found")
|
||||||
|
return db_project
|
||||||
|
|
||||||
|
@router.get("/{project_id}/tasks", response_model=List[tasks.TaskBase])
|
||||||
|
def read_tasks_from_project(project_id: int, db: db_dependency):
|
||||||
|
db_tasks = db.query(tasks.models.Task).filter(tasks.models.Task.project_id == project_id).all()
|
||||||
|
return db_tasks
|
||||||
|
|
||||||
|
@router.get("/{project_id}/tasks/{task_id}", response_model=tasks.TaskBase)
|
||||||
|
def read_task_from_project(project_id: int, task_id: int, db: db_dependency):
|
||||||
|
db_task = db.query(tasks.models.Task).filter(tasks.models.Task.project_id == project_id, tasks.models.Task.id == task_id).first()
|
||||||
|
if db_task is None:
|
||||||
|
raise HTTPException(status_code=404, detail="Task not found in the specified project")
|
||||||
|
return db_task
|
||||||
|
|
||||||
|
@router.post("/", response_model=projects.ProjectCreate)
|
||||||
|
def create_project(project: projects.ProjectCreate, db: db_dependency):
|
||||||
|
db_project = projects.models.Project(
|
||||||
|
name=project.name,
|
||||||
|
description=project.description
|
||||||
|
)
|
||||||
|
db.add(db_project)
|
||||||
|
db.commit()
|
||||||
|
db.refresh(db_project)
|
||||||
|
return db_project
|
||||||
|
|
||||||
|
@router.post("/{project_id}/tasks", response_model=tasks.TaskBase)
|
||||||
|
def create_task_in_project(project_id: int, task: tasks.TaskBase, db: db_dependency):
|
||||||
|
db_task = tasks.models.Task(
|
||||||
|
title=task.title,
|
||||||
|
description=task.description,
|
||||||
|
status=task.status,
|
||||||
|
project_id=project_id
|
||||||
|
)
|
||||||
|
db.add(db_task)
|
||||||
|
db.commit()
|
||||||
|
db.refresh(db_task)
|
||||||
|
return db_task
|
||||||
16
routers/tasks.py
Normal file
16
routers/tasks.py
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
from typing import List
|
||||||
|
from schemas.tasks import TaskBase
|
||||||
|
from fastapi import APIRouter, HTTPException, Depends
|
||||||
|
|
||||||
|
from database import db_dependency
|
||||||
|
|
||||||
|
import models
|
||||||
|
|
||||||
|
router = APIRouter(prefix="/tasks", tags=["tasks"])
|
||||||
|
|
||||||
|
# """Get tasks from a specified project"""
|
||||||
|
# @router.get("/from_project/{project_id}", response_model=List[TaskBase])
|
||||||
|
# def read_tasks_from_project(project_id: int, db: db_dependency):
|
||||||
|
# db_tasks = db.query(models.Task).filter(models.Task.project_id == project_id).all()
|
||||||
|
# return db_tasks
|
||||||
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
from pydantic import BaseModel, ConfigDict
|
from pydantic import BaseModel, ConfigDict
|
||||||
from typing import List, Optional
|
from typing import List, Optional
|
||||||
|
|
||||||
from misc.tasks import TaskBase
|
from schemas.tasks import TaskBase
|
||||||
from misc.users import UserBase
|
from schemas.users import UserBase
|
||||||
|
|
||||||
class ProjectBase(BaseModel):
|
class ProjectBase(BaseModel):
|
||||||
model_config = ConfigDict(from_attributes=True)
|
model_config = ConfigDict(from_attributes=True)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue