diff --git a/backend/api/main.py b/backend/api/main.py index 775db40..a5b71b5 100644 --- a/backend/api/main.py +++ b/backend/api/main.py @@ -16,9 +16,6 @@ from api.routers.test_mongo import router as test_mongo_router from api.routers.docit2mf_build import router as docit2mf_router from api.routers.google_auth import router as google_auth_router - - - @asynccontextmanager async def lifespan(app: FastAPI): yield diff --git a/backend/api/models/docit2mf_models.py b/backend/api/models/docit2mf_models.py index 8464a9a..cd33af4 100644 --- a/backend/api/models/docit2mf_models.py +++ b/backend/api/models/docit2mf_models.py @@ -1,12 +1,8 @@ -# models/docit2mf_models.py - from pydantic import BaseModel, Field, field_validator, ValidationInfo from typing import List, Tuple, Union - BlankCardInput = Union[int, Tuple[int, int], List[int]] - class DoCIT2MFRequest(BaseModel): term: str core: tuple[float, float] = Field(..., description="Núcleo del conjunto difuso: [a, b]") diff --git a/backend/api/models/user_models.py b/backend/api/models/user_models.py index aa55399..3049a70 100644 --- a/backend/api/models/user_models.py +++ b/backend/api/models/user_models.py @@ -1,13 +1,8 @@ -# api/models/user_models.py - from typing import List, Optional, Union from pydantic import BaseModel, EmailStr, Field from datetime import datetime - -# ----------------------------- # MODELOS DE FUNCIONES DIFUSAS -# ----------------------------- class FuzzyTerm(BaseModel): term: str @@ -23,9 +18,7 @@ class IT2FuzzyTerm(BaseModel): upper: FuzzyTerm -# ----------------------------- # HISTORIAL -# ----------------------------- class HistoryItem(BaseModel): id: Optional[str] = Field(default=None, alias="_id") @@ -39,9 +32,7 @@ class HistoryCreateRequest(BaseModel): results: List[Union[FuzzyTerm, IT2FuzzyTerm]] -# ----------------------------- # USUARIOS -# ----------------------------- class UserCreate(BaseModel): username: str diff --git a/backend/api/routers/docit2mf_build.py b/backend/api/routers/docit2mf_build.py index f0761aa..ba604b3 100644 --- a/backend/api/routers/docit2mf_build.py +++ b/backend/api/routers/docit2mf_build.py @@ -1,5 +1,3 @@ -# api/routers/docit2mf_build.py - import logging from fastapi import APIRouter, HTTPException, Request from slowapi import Limiter diff --git a/backend/api/routers/docmf_simple_validation.py b/backend/api/routers/docmf_simple_validation.py index 425384a..33c4d73 100644 --- a/backend/api/routers/docmf_simple_validation.py +++ b/backend/api/routers/docmf_simple_validation.py @@ -9,7 +9,6 @@ def validate_simple_docmf(request: SimpleValidationRequest): results = validate_simple_levels(request.levels) invalid = [r for r in results if not r["valid"]] - # Caso: un solo nivel if len(request.levels) == 1: if invalid: raise HTTPException( @@ -24,7 +23,6 @@ def validate_simple_docmf(request: SimpleValidationRequest): "details": results[0] } - # Caso: varios niveles if invalid: return { "message": "Validación completada.", diff --git a/backend/api/routers/google_auth.py b/backend/api/routers/google_auth.py index 96734a2..2769868 100644 --- a/backend/api/routers/google_auth.py +++ b/backend/api/routers/google_auth.py @@ -14,10 +14,6 @@ GOOGLE_CLIENT_SECRET = os.getenv("GOOGLE_CLIENT_SECRET") REDIRECT_URI = os.getenv("GOOGLE_REDIRECT_URI") SECRET_KEY = os.getenv("SECRET_KEY") - -# ----------------------------- -# 1. LOGIN → REDIRECCIÓN A GOOGLE -# ----------------------------- @router.get("/login") async def google_login(): google_auth_url = ( @@ -32,10 +28,6 @@ async def google_login(): return RedirectResponse(google_auth_url) - -# ----------------------------- -# 2. CALLBACK → GOOGLE DEVUELVE EL CODE -# ----------------------------- @router.get("/callback") async def google_callback(request: Request): diff --git a/backend/api/routers/history.py b/backend/api/routers/history.py index 03c3db1..e3c65e6 100644 --- a/backend/api/routers/history.py +++ b/backend/api/routers/history.py @@ -10,10 +10,6 @@ from api.utils.security import get_current_user router = APIRouter(prefix="/history", tags=["history"]) - -# ----------------------------- -# 1. Añadir un elemento al historial -# ----------------------------- @router.post("/add") async def add_history_item( data: HistoryCreateRequest, @@ -39,10 +35,6 @@ async def add_history_item( "history_item_id": str(history_item_id), } - -# ----------------------------- -# 2. Eliminar un elemento del historial -# ----------------------------- @router.delete("/delete/{history_item_id}") async def delete_history_item( history_item_id: str, @@ -64,9 +56,6 @@ async def delete_history_item( return {"message": "Elemento eliminado del historial"} -# ----------------------------- -# 3. Obtener todos los historiales de todos los usuarios (ordenados) -# ----------------------------- @router.get("/all") async def get_all_histories(): users = await users_collection.find().to_list(None) @@ -90,7 +79,6 @@ async def get_all_histories(): } }) - # Ordenar por fecha all_histories_sorted = sorted( all_histories, key=lambda h: h["history_item"]["created_at"] @@ -98,10 +86,6 @@ async def get_all_histories(): return {"count": len(all_histories_sorted), "histories": all_histories_sorted} - -# ----------------------------- -# 4. Obtener historiales del usuario autenticado (ordenados) -# ----------------------------- @router.get("/user") async def get_user_histories(current_user: dict = Depends(get_current_user)): user_id = current_user["_id"] @@ -116,7 +100,6 @@ async def get_user_histories(current_user: dict = Depends(get_current_user)): history = user.get("history", []) - # Ordenar por fecha history_sorted = sorted(history, key=lambda h: h["created_at"]) formatted_history = [] diff --git a/backend/api/services/docit2mf_build_service.py b/backend/api/services/docit2mf_build_service.py index 77ca7cb..c5e7aee 100644 --- a/backend/api/services/docit2mf_build_service.py +++ b/backend/api/services/docit2mf_build_service.py @@ -1,5 +1,3 @@ -# services/docit2mf_build_service.py - from typing import List, Union from api.models.docit2mf_models import DoCIT2MFRequest from api.models.docmf_models import DoCMFRequest @@ -32,13 +30,11 @@ def _enforce_upper_ge_lower(lower, upper): Garantiza que la UMF (upper) nunca quede por debajo de la LMF (lower). Ajusta los valores de pertenencia si es necesario. """ - # left nodes for i in range(len(lower["left_nodes"])): ly = lower["left_nodes"][i][1] uy = upper["left_nodes"][i][1] upper["left_nodes"][i][1] = max(uy, ly) - # right nodes for i in range(len(lower["right_nodes"])): ly = lower["right_nodes"][i][1] uy = upper["right_nodes"][i][1] @@ -58,9 +54,6 @@ def build_it2mf_from_level(level: DoCIT2MFRequest): } """ - # ------------------------- - # LMF (mínimos) - # ------------------------- left_min = _extract_bounds(level.left_blank_cards, "min") right_min = _extract_bounds(level.right_blank_cards, "min") @@ -74,18 +67,13 @@ def build_it2mf_from_level(level: DoCIT2MFRequest): right_blank_cards=right_min, ) - # Convertir a dict para poder manipular como diccionario lower = build_doc_mf_level(lower_level) if hasattr(lower, "model_dump"): lower = lower.model_dump() - # Asegurar que los nodos son listas mutables y ordenar lower["left_nodes"] = _sort_nodes(lower["left_nodes"]) lower["right_nodes"] = _sort_nodes(lower["right_nodes"]) - # ------------------------- - # UMF (máximos) - # ------------------------- left_max = _extract_bounds(level.left_blank_cards, "max") right_max = _extract_bounds(level.right_blank_cards, "max") @@ -99,18 +87,13 @@ def build_it2mf_from_level(level: DoCIT2MFRequest): right_blank_cards=right_max, ) - # Convertir a dict para poder manipular como diccionario upper = build_doc_mf_level(upper_level) if hasattr(upper, "model_dump"): upper = upper.model_dump() - # Asegurar que los nodos son listas mutables y ordenar upper["left_nodes"] = _sort_nodes(upper["left_nodes"]) upper["right_nodes"] = _sort_nodes(upper["right_nodes"]) - # ------------------------- - # FIX: evitar inversión vertical (UMF < LMF) - # ------------------------- upper = _enforce_upper_ge_lower(lower, upper) return { diff --git a/backend/api/services/docmf_build_service.py b/backend/api/services/docmf_build_service.py index 0d4c406..2f11197 100644 --- a/backend/api/services/docmf_build_service.py +++ b/backend/api/services/docmf_build_service.py @@ -1,5 +1,3 @@ -# services/docmf_build_service.py - from api.models.docmf_models import DoCMFRequest from api.models.user_models import FuzzyTerm @@ -8,7 +6,6 @@ def build_single_docmf(request: DoCMFRequest): a, b = request.core c, d = request.support - # LEFT TL = sum(e + 1 for e in request.left_blank_cards) YL = 1 / TL left_nodes = [] @@ -21,7 +18,6 @@ def build_single_docmf(request: DoCMFRequest): acc += request.left_blank_cards[i - 1] + 1 left_nodes.append((x, round(acc * YL, 4))) - # RIGHT TR = sum(e + 1 for e in request.right_blank_cards) YR = 1 / TR right_nodes = [] diff --git a/backend/api/services/docmf_simple_validation_service.py b/backend/api/services/docmf_simple_validation_service.py index 253f910..4d62818 100644 --- a/backend/api/services/docmf_simple_validation_service.py +++ b/backend/api/services/docmf_simple_validation_service.py @@ -4,7 +4,6 @@ def validate_simple_level(level: dict): a, b = level["core"] c, d = level["support"] - # Validación: núcleo dentro del soporte if not (c <= a < b <= d): errors.append("El núcleo debe estar completamente dentro del soporte.") diff --git a/backend/api/services/docmf_validation_service.py b/backend/api/services/docmf_validation_service.py index 97ccfa5..e49b90c 100644 --- a/backend/api/services/docmf_validation_service.py +++ b/backend/api/services/docmf_validation_service.py @@ -4,11 +4,9 @@ def validate_single_level(level: dict): a, b = level["core"] c, d = level["support"] - # Core dentro del soporte if not (c <= a < b <= d): errors.append("El núcleo debe estar completamente dentro del soporte.") - # Nodos cubren correctamente el soporte left = level["left_nodes"] right = level["right_nodes"]