diff --git a/backend/Dockerfile b/backend/Dockerfile index b862b2b..3639ea9 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -2,6 +2,10 @@ FROM python:3.10-slim WORKDIR /app -RUN pip install fastapi uvicorn +COPY requirements.txt . -CMD ["uvicorn", "api.routes:app", "--host", "0.0.0.0", "--port", "8000", "--reload"] \ No newline at end of file +RUN pip install --no-cache-dir -r requirements.txt + +COPY . . + +CMD ["uvicorn", "api.main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"] diff --git a/backend/api/database/__init__.py b/backend/api/database/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/api/database/connection.py b/backend/api/database/connection.py new file mode 100644 index 0000000..640fac4 --- /dev/null +++ b/backend/api/database/connection.py @@ -0,0 +1,18 @@ +import os +from sqlalchemy import create_engine + +DB_USER = "root" +DB_PASSWORD = "root" +DB_HOST = "db" +DB_PORT = "3306" +DB_NAME = "deckofcards" + +DATABASE_URL = ( + f"mysql+pymysql://{DB_USER}:{DB_PASSWORD}@{DB_HOST}:{DB_PORT}/{DB_NAME}" +) + +engine = create_engine( + DATABASE_URL, + pool_pre_ping=True, + echo=False +) diff --git a/backend/api/database/init_db.py b/backend/api/database/init_db.py new file mode 100644 index 0000000..4fd4e1f --- /dev/null +++ b/backend/api/database/init_db.py @@ -0,0 +1,5 @@ +from .connection import engine +from .models import Base + +def init_db(): + Base.metadata.create_all(bind=engine) diff --git a/backend/api/database/models.py b/backend/api/database/models.py new file mode 100644 index 0000000..6674aab --- /dev/null +++ b/backend/api/database/models.py @@ -0,0 +1,14 @@ +from sqlalchemy.orm import declarative_base +from sqlalchemy import Column, Integer, String, Float + +Base = declarative_base() + +class DoCMFLevel(Base): + __tablename__ = "docmf_levels" + + id = Column(Integer, primary_key=True, index=True) + term = Column(String(50), nullable=False) + core_a = Column(Float, nullable=False) + core_b = Column(Float, nullable=False) + support_c = Column(Float, nullable=False) + support_d = Column(Float, nullable=False) diff --git a/backend/api/database/session.py b/backend/api/database/session.py new file mode 100644 index 0000000..9ba837b --- /dev/null +++ b/backend/api/database/session.py @@ -0,0 +1,15 @@ +from sqlalchemy.orm import sessionmaker +from .connection import engine + +SessionLocal = sessionmaker( + autocommit=False, + autoflush=False, + bind=engine +) + +def get_db(): + db = SessionLocal() + try: + yield db + finally: + db.close() diff --git a/backend/api/main.py b/backend/api/main.py index f7df1ae..897ab2e 100644 --- a/backend/api/main.py +++ b/backend/api/main.py @@ -1,14 +1,25 @@ from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware +from contextlib import asynccontextmanager -from routers.value_function import router as value_router -from routers.docmf_build import router as docmf_build_router -from routers.docmf_evaluate import router as docmf_eval_router -from routers.docmf_simple_validation import router as simple_validation_router -from routers.docmf_validation import router as validation_router +from api.database.init_db import init_db + +# Routers +from api.routers.test_db import router as test_db_router +from api.routers.value_function import router as value_router +from api.routers.docmf_build import router as docmf_build_router +from api.routers.docmf_evaluate import router as docmf_eval_router +from api.routers.docmf_simple_validation import router as simple_validation_router +from api.routers.docmf_validation import router as validation_router -app = FastAPI() +@asynccontextmanager +async def lifespan(app: FastAPI): + init_db() + yield + + +app = FastAPI(lifespan=lifespan) app.add_middleware( CORSMiddleware, @@ -18,6 +29,7 @@ app.add_middleware( allow_headers=["*"], ) +app.include_router(test_db_router, prefix="/api") app.include_router(value_router, prefix="/api/criteria/doc") app.include_router(docmf_build_router, prefix="/api/criteria/doc-mf") app.include_router(docmf_eval_router, prefix="/api/criteria/doc-mf") diff --git a/backend/api/routers/docmf_build.py b/backend/api/routers/docmf_build.py index 3fc355f..24467c4 100644 --- a/backend/api/routers/docmf_build.py +++ b/backend/api/routers/docmf_build.py @@ -1,6 +1,6 @@ from fastapi import APIRouter, HTTPException -from models.docmf_models import DoCMFMultiRequest -from services.docmf_build_service import build_docmf_multi +from api.models.docmf_models import DoCMFMultiRequest +from api.services.docmf_build_service import build_docmf_multi router = APIRouter() diff --git a/backend/api/routers/docmf_evaluate.py b/backend/api/routers/docmf_evaluate.py index f2aae4a..3024fe8 100644 --- a/backend/api/routers/docmf_evaluate.py +++ b/backend/api/routers/docmf_evaluate.py @@ -1,6 +1,6 @@ from fastapi import APIRouter, HTTPException -from models.evaluation_models import EvaluationRequest -from services.docmf_evaluate_service import evaluate_docmf +from api.models.evaluation_models import EvaluationRequest +from api.services.docmf_evaluate_service import evaluate_docmf router = APIRouter() diff --git a/backend/api/routers/docmf_simple_validation.py b/backend/api/routers/docmf_simple_validation.py index 800ec93..425384a 100644 --- a/backend/api/routers/docmf_simple_validation.py +++ b/backend/api/routers/docmf_simple_validation.py @@ -1,6 +1,6 @@ from fastapi import APIRouter, HTTPException -from models.docmf_simple_validation_models import SimpleValidationRequest -from services.docmf_simple_validation_service import validate_simple_levels +from api.models.docmf_simple_validation_models import SimpleValidationRequest +from api.services.docmf_simple_validation_service import validate_simple_levels router = APIRouter() diff --git a/backend/api/routers/docmf_validation.py b/backend/api/routers/docmf_validation.py index a1bb518..92eda8d 100644 --- a/backend/api/routers/docmf_validation.py +++ b/backend/api/routers/docmf_validation.py @@ -1,6 +1,6 @@ from fastapi import APIRouter, HTTPException -from models.docmf_validation_models import ValidationRequest -from services.docmf_validation_service import validate_levels +from api.models.docmf_validation_models import ValidationRequest +from api.services.docmf_validation_service import validate_levels router = APIRouter() diff --git a/backend/api/routers/test_db.py b/backend/api/routers/test_db.py new file mode 100644 index 0000000..d554bfd --- /dev/null +++ b/backend/api/routers/test_db.py @@ -0,0 +1,13 @@ +from fastapi import APIRouter, Depends +from sqlalchemy import text +from api.database.session import get_db + +router = APIRouter() + +@router.get("/test-db") +def test_db_connection(db=Depends(get_db)): + try: + db.execute(text("SELECT 1")) + return {"status": "ok", "message": "Conexión a MySQL correcta"} + except Exception as e: + return {"status": "error", "message": str(e)} diff --git a/backend/api/routers/value_function.py b/backend/api/routers/value_function.py index c30022e..0dfc5a4 100644 --- a/backend/api/routers/value_function.py +++ b/backend/api/routers/value_function.py @@ -1,6 +1,6 @@ from fastapi import APIRouter, HTTPException -from models.value_function_models import ValueFunctionRequest -from services.value_function_service import compute_value_function, compute_points +from api.models.value_function_models import ValueFunctionRequest +from api.services.value_function_service import compute_value_function, compute_points router = APIRouter() diff --git a/backend/api/services/docmf_evaluate_service.py b/backend/api/services/docmf_evaluate_service.py index 37a3562..5b31eb0 100644 --- a/backend/api/services/docmf_evaluate_service.py +++ b/backend/api/services/docmf_evaluate_service.py @@ -1,4 +1,4 @@ -from utils.interpolation import linear_interpolation +from api.utils.interpolation import linear_interpolation def evaluate_docmf(request): x = request.x diff --git a/backend/requirements.txt b/backend/requirements.txt new file mode 100644 index 0000000..bf665b8 --- /dev/null +++ b/backend/requirements.txt @@ -0,0 +1,6 @@ +fastapi +uvicorn +sqlalchemy +pymysql +pydantic +cryptography \ No newline at end of file