Fixed metrics api to recieve all metrics

This commit is contained in:
2026-05-06 01:30:20 -06:00
parent 543ba8870c
commit 7331dcb086
5 changed files with 213 additions and 459 deletions

View File

@@ -2,76 +2,67 @@
from fastapi import APIRouter, HTTPException, Depends
from fastapi.responses import JSONResponse
from infrastructure.api.moderations.schemas import (
DeleteReportRequest,
CloseAccountRequest,
BanUserRequest,
WarnUserRequest,
ReviewContentRequest,
ModerationActionResponse
DeleteReportRequest, CloseAccountRequest, BanUserRequest,
WarnUserRequest, ReviewContentRequest, ModerationActionResponse
)
from infrastructure.api.auth import get_current_admin_user
from application.services.moderation_services import (
DeleteReportUseCase,
CloseAccountUseCase,
BanUserUseCase,
WarnUserUseCase,
ReviewContentUseCase
DeleteReportUseCase, CloseAccountUseCase, BanUserUseCase,
WarnUserUseCase, ReviewContentUseCase
)
from infrastructure.adapters.persistence.mongodb import mongodb
from infrastructure.adapters.persistence.db import get_db
from infrastructure.adapters.moderation_repository_mongo import ModerationRepositoryMongo
from infrastructure.adapters.rabbitmq.sender import send_to_queue
from infrastructure.adapters.rabbitmq.messages import ModerationMessage, ModerationEventType
from domain.users import User
from sqlalchemy.orm import Session
import logging
from datetime import datetime
logger = logging.getLogger(__name__)
router = APIRouter()
# Instanciar repositorio de moderación
moderation_repo = ModerationRepositoryMongo()
def _publish_moderation_event(event_type: ModerationEventType, **kwargs):
try:
msg = ModerationMessage(event_type=event_type, fecha_creacion=datetime.utcnow().isoformat(), **kwargs)
payload = msg.to_dict()
send_to_queue('moderations_queue', payload)
send_to_queue('metrics_moderations_queue', payload)
except Exception as e:
logger.warning(f"Error publicando evento de moderación a RabbitMQ: {e}")
@router.post("/reports/delete", response_model=ModerationActionResponse)
async def delete_report(
request: DeleteReportRequest,
current_admin: User = Depends(get_current_admin_user)
):
async def delete_report(request: DeleteReportRequest, current_admin: User = Depends(get_current_admin_user)):
"""
Eliminar un reporte como moderador (requiere permisos de admin)
- **report_id**: ID del reporte a eliminar
- **reason**: Razón de la eliminación (mínimo 5 caracteres)
- **description**: Descripción adicional (opcional)
"""
try:
use_case = DeleteReportUseCase(moderation_repo)
result = use_case.execute(
moderator_id=current_admin.user_id,
report_id=request.report_id,
reason=request.reason,
description=request.description
)
result = use_case.execute(moderator_id=current_admin.user_id, report_id=request.report_id, reason=request.reason, description=request.description)
if result["status"] == "error":
raise HTTPException(status_code=400, detail=result["message"])
_publish_moderation_event(ModerationEventType.DELETE_REPORT, moderator_id=current_admin.user_id, report_id=request.report_id, reason=request.reason, description=request.description, action_id=result.get("action_id"))
return ModerationActionResponse(**result)
except HTTPException:
raise
except Exception as e:
logger.error(f"Error in delete_report: {e}")
raise HTTPException(status_code=500, detail="Error interno del servidor")
@router.post("/accounts/close", response_model=ModerationActionResponse)
async def close_account(
request: CloseAccountRequest,
current_admin: User = Depends(get_current_admin_user)
):
async def close_account(request: CloseAccountRequest, current_admin: User = Depends(get_current_admin_user)):
"""
Cerrar una cuenta de usuario (requiere permisos de admin)
- **user_id**: ID del usuario cuya cuenta cerrar
- **reason**: Razón del cierre (mínimo 5 caracteres)
- **description**: Descripción adicional (opcional)
@@ -79,32 +70,23 @@ async def close_account(
"""
try:
use_case = CloseAccountUseCase(moderation_repo)
result = use_case.execute(
moderator_id=current_admin.user_id,
user_id=request.user_id,
reason=request.reason,
description=request.description,
is_permanent=request.is_permanent
)
result = use_case.execute(moderator_id=current_admin.user_id, user_id=request.user_id, reason=request.reason, description=request.description, is_permanent=request.is_permanent)
if result["status"] == "error":
raise HTTPException(status_code=400, detail=result["message"])
_publish_moderation_event(ModerationEventType.CLOSE_ACCOUNT, moderator_id=current_admin.user_id, user_id=request.user_id, reason=request.reason, description=request.description, is_permanent=request.is_permanent, action_id=result.get("action_id"))
return ModerationActionResponse(**result)
except HTTPException:
raise
except Exception as e:
logger.error(f"Error in close_account: {e}")
raise HTTPException(status_code=500, detail="Error interno del servidor")
@router.post("/users/ban", response_model=ModerationActionResponse)
async def ban_user(
request: BanUserRequest,
current_admin: User = Depends(get_current_admin_user)
):
async def ban_user(request: BanUserRequest, current_admin: User = Depends(get_current_admin_user)):
"""
Banear a un usuario (requiere permisos de admin)
- **user_id**: ID del usuario a banear
- **reason**: Razón del ban (mínimo 5 caracteres)
- **duration_days**: Duración del ban en días (None para permanente)
@@ -112,63 +94,46 @@ async def ban_user(
"""
try:
use_case = BanUserUseCase(moderation_repo)
result = use_case.execute(
moderator_id=current_admin.user_id,
user_id=request.user_id,
reason=request.reason,
duration_days=request.duration_days,
description=request.description
)
result = use_case.execute(moderator_id=current_admin.user_id, user_id=request.user_id, reason=request.reason, duration_days=request.duration_days, description=request.description)
if result["status"] == "error":
raise HTTPException(status_code=400, detail=result["message"])
_publish_moderation_event(ModerationEventType.BAN_USER, moderator_id=current_admin.user_id, user_id=request.user_id, reason=request.reason, duration_days=request.duration_days, description=request.description, is_permanent=request.duration_days is None, action_id=result.get("action_id"))
return ModerationActionResponse(**result)
except HTTPException:
raise
except Exception as e:
logger.error(f"Error in ban_user: {e}")
raise HTTPException(status_code=500, detail="Error interno del servidor")
@router.post("/users/warn", response_model=ModerationActionResponse)
async def warn_user(
request: WarnUserRequest,
current_admin: User = Depends(get_current_admin_user)
):
async def warn_user(request: WarnUserRequest, current_admin: User = Depends(get_current_admin_user)):
"""
Advertir a un usuario (requiere permisos de admin)
- **user_id**: ID del usuario a advertir
- **reason**: Razón de la advertencia (mínimo 5 caracteres)
- **description**: Descripción adicional (opcional)
"""
try:
use_case = WarnUserUseCase(moderation_repo)
result = use_case.execute(
moderator_id=current_admin.user_id,
user_id=request.user_id,
reason=request.reason,
description=request.description
)
result = use_case.execute(moderator_id=current_admin.user_id, user_id=request.user_id, reason=request.reason, description=request.description)
if result["status"] == "error":
raise HTTPException(status_code=400, detail=result["message"])
_publish_moderation_event(ModerationEventType.WARN_USER, moderator_id=current_admin.user_id, user_id=request.user_id, reason=request.reason, description=request.description, action_id=result.get("action_id"))
return ModerationActionResponse(**result)
except HTTPException:
raise
except Exception as e:
logger.error(f"Error in warn_user: {e}")
raise HTTPException(status_code=500, detail="Error interno del servidor")
@router.post("/content/review", response_model=ModerationActionResponse)
async def review_content(
request: ReviewContentRequest,
current_admin: User = Depends(get_current_admin_user)
):
async def review_content(request: ReviewContentRequest, current_admin: User = Depends(get_current_admin_user)):
"""
Revisar y actuar sobre contenido reportado (requiere permisos de admin)
- **report_id**: ID del reporte a revisar
- **action**: Acción a tomar (approve, reject, needs_more_info)
- **reason**: Razón de la decisión (opcional)
@@ -176,19 +141,13 @@ async def review_content(
"""
try:
use_case = ReviewContentUseCase(moderation_repo)
result = use_case.execute(
moderator_id=current_admin.user_id,
report_id=request.report_id,
action=request.action,
reason=request.reason,
notes=request.notes
)
result = use_case.execute(moderator_id=current_admin.user_id, report_id=request.report_id, action=request.action, reason=request.reason, notes=request.notes)
if result["status"] == "error":
raise HTTPException(status_code=400, detail=result["message"])
_publish_moderation_event(ModerationEventType.REVIEW_CONTENT, moderator_id=current_admin.user_id, report_id=request.report_id, review_action=request.action, reason=request.reason, notes=request.notes, action_id=result.get("action_id"))
return ModerationActionResponse(**result)
except HTTPException:
raise
except Exception as e:
logger.error(f"Error in review_content: {e}")
raise HTTPException(status_code=500, detail="Error interno del servidor")
raise HTTPException(status_code=500, detail="Error interno del servidor")