Skip to content

Commit 231bbae

Browse files
committed
fix(Projects-service): fix runtime errors and complete missing setup
- Se solucionaron errores de inicialización al ejecutar el servicio. - Se añadieron variables de entorno y dependencias necesarias. - se cambiaron los `Models` y `Schemas` para que siguieran un Modelo de DTO. - se agrego un `.gitignore` para no subir las variables de entorno - se reajustaron las llamadas, haciendolas asincronas y utilizando los DTO
1 parent b562c79 commit 231bbae

21 files changed

+330
-97
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
.env
Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,7 @@
1-
DB_USE = "JSONDB" # Change this to "PostgreSQL" or "MongoDB" as needed
1+
from pydantic_settings import BaseSettings
2+
from pydantic import Field
3+
4+
5+
class Settings(BaseSettings):
6+
"""Configuración de la aplicación"""
7+
DB_USE: str = Field(..., env="DB_USE")
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
from fastapi import FastAPI
2+
from fastapi.middleware.cors import CORSMiddleware
3+
from projects_routes import router as projects_router
4+
from src.database.database import Base, engine
5+
import os
6+
7+
app = FastAPI(title="Projects Service", version="1.0.0")
8+
9+
# Configurar CORS
10+
app.add_middleware(
11+
CORSMiddleware,
12+
allow_origins=["*"],
13+
allow_credentials=True,
14+
allow_methods=["*"],
15+
allow_headers=["*"],
16+
)
17+
18+
19+
@app.get("/")
20+
def read_root():
21+
return {"message": "Welcome to the Projects Service!"}
22+
23+
24+
@app.get("/health")
25+
def health_check():
26+
return {"status": "healthy"}
27+
28+
29+
# Incluir rutas
30+
app.include_router(projects_router, prefix="/projects", tags=["projects"])
31+
32+
# Crear tablas
33+
Base.metadata.create_all(bind=engine)
34+
35+
if __name__ == "__main__":
36+
import uvicorn
37+
38+
HOST = os.getenv("PROJECTS_SERVICE_HOST", "localhost")
39+
PORT = int(os.getenv("PROJECTS_SERVICE_PORT", 8001))
40+
uvicorn.run(app, host=HOST, port=PORT)
Lines changed: 44 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,56 @@
1-
from fastapi import APIRouter, HTTPException
2-
from config import DB_USE
3-
from src import ProjectCreate, ProjectOut
4-
from src import get_repo
5-
import os
1+
from fastapi import APIRouter, Depends, HTTPException
2+
from sqlalchemy.orm import Session
3+
from typing import List
4+
from src.database.database import get_db
5+
from src.database.repository import ProjectRepository
6+
from src.schemas.project_dto import (ProjectCreateDTO, ProjectUpdateDTO,
7+
ProjectOutputDTO)
68

7-
ProjectRouter = APIRouter()
9+
router = APIRouter()
810

9-
HOST = os.getenv("PROJECTS_SERVICE_HOST", "0.0.0.0")
10-
PORT = os.getenv("PROJECTS_SERVICE_PORT", 8001)
11+
NOT_FOUND = "Proyecto no encontrado {id}"
1112

12-
db = get_repo(DB_USE)
1313

14+
@router.post("/", response_model=ProjectOutputDTO)
15+
def create_project(project: ProjectCreateDTO, db: Session = Depends(get_db)):
16+
repository = ProjectRepository(db)
17+
return repository.create(project)
1418

15-
@ProjectRouter.post("/projects/", response_model=ProjectOut)
16-
def create_project(project: ProjectCreate):
17-
"""Create a new project."""
18-
return db.create_project(project)
1919

20-
21-
@ProjectRouter.get("/projects/", response_model=list[ProjectOut])
22-
def get_projects():
23-
"""Get all projects."""
24-
return db.get_projects()
25-
26-
27-
@ProjectRouter.get("/projects/{project_id}", response_model=ProjectOut)
28-
def get_project(project_id: str):
29-
"""Get a project by ID."""
30-
project = db.get_project(project_id)
31-
if not project:
32-
raise HTTPException(status_code=404, detail="Project not found")
20+
@router.get("/{project_id}", response_model=ProjectOutputDTO)
21+
def get_project(project_id: int,
22+
db: Session = Depends(get_db)):
23+
repository = ProjectRepository(db)
24+
project = repository.get_by_id(project_id)
25+
if project is None:
26+
raise HTTPException(status_code=404,
27+
detail=NOT_FOUND.format(id=project_id))
3328
return project
3429

3530

36-
@ProjectRouter.delete("/projects/{project_id}")
37-
def delete_project(project_id: str):
38-
"""Delete a project by ID."""
39-
db.delete_project(project_id)
40-
return {"detail": "Project deleted"}
31+
@router.get("/", response_model=List[ProjectOutputDTO])
32+
def get_projects(db: Session = Depends(get_db)):
33+
repository = ProjectRepository(db)
34+
return repository.get_all()
4135

4236

43-
@ProjectRouter.put("/projects/{project_id}", response_model=ProjectOut)
44-
def update_project(project_id: str, project: ProjectCreate):
45-
"""Update a project by ID."""
46-
updated_project = db.update_project(project_id, project)
47-
if not updated_project:
48-
raise HTTPException(status_code=404, detail="Project not found")
37+
@router.put("/{project_id}", response_model=ProjectOutputDTO)
38+
def update_project(project_id: int,
39+
project: ProjectUpdateDTO,
40+
db: Session = Depends(get_db)):
41+
repository = ProjectRepository(db)
42+
updated_project = repository.update(project_id, project)
43+
if updated_project is None:
44+
raise HTTPException(status_code=404,
45+
detail=NOT_FOUND.format(id=project_id))
4946
return updated_project
47+
48+
49+
@router.delete("/{project_id}")
50+
def delete_project(project_id: int,
51+
db: Session = Depends(get_db)):
52+
repository = ProjectRepository(db)
53+
if not repository.delete(project_id):
54+
raise HTTPException(status_code=404,
55+
detail=NOT_FOUND.format(id=project_id))
56+
return {"message": "Proyecto eliminado"}
Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
fastapi==0.95.2
22
uvicorn[standard]==0.22.0
3-
psycopg2-binary==2.9.6 # For PostgreSQL database connection
4-
python-dotenv==1.0.0
3+
sqlalchemy==2.0.0
4+
psycopg2-binary==2.9.6
5+
python-dotenv==1.0.0
6+
pydantic==2.0.0
7+
pydantic-settings==2.0.0
Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,20 @@
1-
from database.DBSelect import get_repo
2-
from models.projects import Project
3-
from schemas.projects_schema import ProjectCreate, ProjectOut
4-
1+
from src.database.DBSelect import get_repo
2+
from src.models.projects import Project
3+
from src.schemas import (ProjectOutputDTO, ProjectCreateDTO,
4+
ProjectUpdateDTO)
5+
from src.database.AbstractDB import AbstractDB
6+
from src.database.JSONDB import JSONDB
7+
from src.database.MongoDB import MongoDB
8+
from src.database.PostgreSQLDB import PostgreSQLDB
59

610
__all__ = [
711
"get_repo",
812
"Project",
9-
"ProjectCreate",
10-
"ProjectOut",
13+
"ProjectCreateDTO",
14+
"ProjectOutputDTO",
15+
"ProjectUpdateDTO",
16+
"AbstractDB",
17+
"JSONDB",
18+
"MongoDB",
19+
"PostgreSQLDB"
1120
]

backend/api/Projetcs-service/src/database/AbstradDB.py renamed to backend/api/Projetcs-service/src/database/AbstractDB.py

File renamed without changes.
Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,23 @@
1-
from database.JSONDB import JSONDB
2-
from database.PostgreSQLDB import PostgreSQLDB
3-
from sqlalchemy import SessionLocal
4-
from pymongo import MongoClient
5-
from database.MongoDB import MongoDB
1+
import os
2+
from src.database.database import SessionLocal
3+
from src.database.JSONDB import JSONDB
4+
from src.database.PostgreSQLDB import PostgreSQLDB
5+
from src.database.MongoDB import MongoDB
66

77

8-
def get_repo(db_type: str):
9-
"""Get the appropriate database repository based on the type."""
10-
if db_type == "JSONDB":
11-
return JSONDB("projects.json")
12-
13-
elif db_type == "PostgreSQL":
14-
return PostgreSQLDB(SessionLocal())
8+
def get_repo():
9+
"""
10+
Selecciona el repositorio de base de datos según la configuración
11+
"""
12+
db_type = os.getenv("DB_USE", "JSONDB")
1513

14+
if db_type == "PostgreSQL":
15+
db = SessionLocal()
16+
try:
17+
return PostgreSQLDB(db)
18+
finally:
19+
db.close()
1620
elif db_type == "MongoDB":
17-
return MongoDB(MongoClient("mongodb://localhost:27017/"),
18-
"projects_db")
19-
21+
return MongoDB()
2022
else:
21-
raise ValueError("Unknown DB type")
23+
return JSONDB("projects.json")

backend/api/Projetcs-service/src/database/JSONDB.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
from database.AbstradDB import AbstractDB
2-
from models.projects import Project
3-
from schemas.projects_schema import ProjectCreate
1+
from src.database.AbstractDB import AbstractDB
2+
from src.models.projects import Project
3+
from src.schemas import ProjectCreateDTO as ProjectCreate
44
import json
55

66
file_path = "projectsDB.json"
@@ -40,7 +40,7 @@ def get_projects(self) -> list[Project]:
4040
"""Retrieve all projects from the database."""
4141
return [Project(**project) for project in self.projects]
4242

43-
def get_project(self, project_id: int) -> Project:
43+
def get_project(self, project_id: int) -> Project | None:
4444
"""Retrieve a specific project by its ID."""
4545
for project in self.projects:
4646
if project["id"] == project_id:
@@ -56,7 +56,7 @@ def delete_project(self, project_id: int) -> None:
5656

5757
def update_project(
5858
self, project_id: int, project_data: ProjectCreate
59-
) -> Project:
59+
) -> Project | None:
6060
"""Update an existing project."""
6161
for project in self.projects:
6262
if project["id"] == project_id:

backend/api/Projetcs-service/src/database/MongoDB.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
from pymongo import MongoClient
2-
from database.AbstradDB import AbstractDB
3-
from models.projects import Project
2+
from src.database import AbstractDB
3+
from src.models.projects import Project
44

55

6-
class MondoDB(AbstractDB):
6+
class MongoDB(AbstractDB):
77
def __init__(self, uri: str, db_name: str):
88
"""Initialize the MongoDB client and database."""
99
self.uri = uri
@@ -23,7 +23,7 @@ def get_projects(self) -> list[Project]:
2323
projects = self.collection.find()
2424
return [Project(**project) for project in projects]
2525

26-
def get_project(self, project_id: str) -> Project:
26+
def get_project(self, project_id: str) -> Project | None:
2727
"""Retrieve a specific project by its ID."""
2828
project = self.collection.find_one({"_id": project_id})
2929
if project:

0 commit comments

Comments
 (0)