Skip to content

Commit c3530fb

Browse files
feat(projects): Routes for projects
Routes dedicated for dealing with projects in database with methofs of GET, PUT, DELETE and POST.
1 parent 062f45c commit c3530fb

File tree

5 files changed

+128
-3
lines changed

5 files changed

+128
-3
lines changed

src/models/project_model.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from sqlalchemy import Column, Integer, String, Text, ForeignKey, TIMESTAMP, func
2+
from sqlalchemy.orm import relationship
3+
from src.modules.database_conection import Base
4+
5+
class Project(Base):
6+
__tablename__ = "projects"
7+
8+
id = Column(Integer, primary_key=True, index=True)
9+
user_id = Column(Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False)
10+
title = Column(String(255), nullable=False)
11+
description = Column(Text)
12+
created_at = Column(TIMESTAMP, server_default=func.now())
13+
updated_at = Column(TIMESTAMP, server_default=func.now(), onupdate=func.now())
14+
15+
user = relationship("User", back_populates="projects")

src/models/user_model.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
from sqlalchemy import Column, Integer, String, Date, TIMESTAMP
21
from sqlalchemy.sql import func
2+
from sqlalchemy.orm import relationship
33
from src.modules.database_conection import Base
4+
from sqlalchemy import Column, Integer, String, Date, TIMESTAMP
45

56
class User(Base):
67
"""
@@ -25,3 +26,5 @@ class User(Base):
2526
password_hash = Column(String(255), nullable=False)
2627
created_at = Column(TIMESTAMP, server_default=func.now(), nullable=False)
2728
updated_at = Column(TIMESTAMP, server_default=func.now(), onupdate=func.now(), nullable=False)
29+
30+
projects = relationship("Project", back_populates="user", cascade="all, delete-orphan")

src/modules/modules_api.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
from fastapi import APIRouter
2-
from src.routes.authentication_routes import authentication_router
2+
33
from src.routes.user_routes import user_router
4+
from src.routes.project_routes import project_router
5+
from src.routes.authentication_routes import authentication_router
46

57
# -------------------- API ROUTES -------------------- #
68
router = APIRouter()
79

810
router.include_router(authentication_router)
9-
router.include_router(user_router)
11+
router.include_router(user_router)
12+
router.include_router(project_router)

src/routes/project_routes.py

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
from fastapi import APIRouter, Depends, HTTPException, status
2+
from sqlalchemy.orm import Session
3+
from typing import List
4+
5+
from src.utils.security import get_current_user
6+
from src.models.user_model import User
7+
from src.models.project_model import Project
8+
from src.utils.utils import get_db
9+
from src.schemas.projects.projects_schema import ProjectCreate, ProjectResponse
10+
11+
project_router = APIRouter(prefix="/projects", tags=["projects"])
12+
13+
14+
@project_router.post(
15+
"/", response_model=ProjectResponse, status_code=status.HTTP_201_CREATED
16+
)
17+
def create_project(
18+
project: ProjectCreate,
19+
db: Session = Depends(get_db),
20+
current_user: User = Depends(get_current_user),
21+
):
22+
new_project = Project(
23+
user_id=current_user.id, title=project.title, description=project.description
24+
)
25+
db.add(new_project)
26+
db.commit()
27+
db.refresh(new_project)
28+
return new_project
29+
30+
31+
@project_router.get("/", response_model=List[ProjectResponse])
32+
def list_projects(
33+
db: Session = Depends(get_db), current_user: User = Depends(get_current_user)
34+
):
35+
return db.query(Project).filter(Project.user_id == current_user.id).all()
36+
37+
38+
@project_router.get("/{project_id}", response_model=ProjectResponse)
39+
def get_project(
40+
project_id: int,
41+
db: Session = Depends(get_db),
42+
current_user: User = Depends(get_current_user),
43+
):
44+
project = (
45+
db.query(Project)
46+
.filter(Project.id == project_id, Project.user_id == current_user.id)
47+
.first()
48+
)
49+
if not project:
50+
raise HTTPException(status_code=404, detail="Projeto não encontrado.")
51+
return project
52+
53+
54+
@project_router.put("/{project_id}", response_model=ProjectResponse)
55+
def update_project(
56+
project_id: int,
57+
updated: ProjectCreate,
58+
db: Session = Depends(get_db),
59+
current_user: User = Depends(get_current_user),
60+
):
61+
project = (
62+
db.query(Project)
63+
.filter(Project.id == project_id, Project.user_id == current_user.id)
64+
.first()
65+
)
66+
if not project:
67+
raise HTTPException(status_code=404, detail="Projeto não encontrado.")
68+
project.title = updated.title
69+
project.description = updated.description
70+
db.commit()
71+
db.refresh(project)
72+
return project
73+
74+
75+
@project_router.delete("/{project_id}", status_code=status.HTTP_204_NO_CONTENT)
76+
def delete_project(
77+
project_id: int,
78+
db: Session = Depends(get_db),
79+
current_user: User = Depends(get_current_user),
80+
):
81+
project = (
82+
db.query(Project)
83+
.filter(Project.id == project_id, Project.user_id == current_user.id)
84+
.first()
85+
)
86+
if not project:
87+
raise HTTPException(status_code=404, detail="Projeto não encontrado.")
88+
db.delete(project)
89+
db.commit()
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from pydantic import BaseModel
2+
from typing import Optional
3+
from datetime import datetime
4+
5+
class ProjectCreate(BaseModel):
6+
title: str
7+
description: Optional[str] = None
8+
9+
class ProjectResponse(ProjectCreate):
10+
id: int
11+
created_at: datetime
12+
updated_at: datetime
13+
14+
class Config:
15+
from_attributes = True

0 commit comments

Comments
 (0)