|
|
|
|
@@ -1,5 +1,5 @@
|
|
|
|
|
"""Endpoints de moderación para gestión de reportes, cuentas y usuarios"""
|
|
|
|
|
from fastapi import APIRouter, HTTPException
|
|
|
|
|
from fastapi import APIRouter, HTTPException, Depends
|
|
|
|
|
from fastapi.responses import JSONResponse
|
|
|
|
|
from infrastructure.api.moderations.schemas import (
|
|
|
|
|
DeleteReportRequest,
|
|
|
|
|
@@ -9,6 +9,7 @@ from infrastructure.api.moderations.schemas import (
|
|
|
|
|
ReviewContentRequest,
|
|
|
|
|
ModerationActionResponse
|
|
|
|
|
)
|
|
|
|
|
from infrastructure.api.auth import get_current_admin_user
|
|
|
|
|
from application.services.moderation_services import (
|
|
|
|
|
DeleteReportUseCase,
|
|
|
|
|
CloseAccountUseCase,
|
|
|
|
|
@@ -19,6 +20,7 @@ from application.services.moderation_services import (
|
|
|
|
|
from infrastructure.adapters.persistence.mongodb import mongodb
|
|
|
|
|
from infrastructure.adapters.persistence.db import get_db
|
|
|
|
|
from infrastructure.adapters.moderation_repository_mongo import ModerationRepositoryMongo
|
|
|
|
|
from domain.users import User
|
|
|
|
|
from sqlalchemy.orm import Session
|
|
|
|
|
import logging
|
|
|
|
|
|
|
|
|
|
@@ -32,11 +34,13 @@ moderation_repo = ModerationRepositoryMongo()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@router.post("/reports/delete", response_model=ModerationActionResponse)
|
|
|
|
|
async def delete_report(request: DeleteReportRequest):
|
|
|
|
|
async def delete_report(
|
|
|
|
|
request: DeleteReportRequest,
|
|
|
|
|
current_admin: User = Depends(get_current_admin_user)
|
|
|
|
|
):
|
|
|
|
|
"""
|
|
|
|
|
Eliminar un reporte como moderador
|
|
|
|
|
Eliminar un reporte como moderador (requiere permisos de admin)
|
|
|
|
|
|
|
|
|
|
- **moderator_id**: ID del moderador que ejecuta la acción
|
|
|
|
|
- **report_id**: ID del reporte a eliminar
|
|
|
|
|
- **reason**: Razón de la eliminación (mínimo 5 caracteres)
|
|
|
|
|
- **description**: Descripción adicional (opcional)
|
|
|
|
|
@@ -44,7 +48,7 @@ async def delete_report(request: DeleteReportRequest):
|
|
|
|
|
try:
|
|
|
|
|
use_case = DeleteReportUseCase(moderation_repo)
|
|
|
|
|
result = use_case.execute(
|
|
|
|
|
moderator_id=request.moderator_id,
|
|
|
|
|
moderator_id=current_admin.user_id,
|
|
|
|
|
report_id=request.report_id,
|
|
|
|
|
reason=request.reason,
|
|
|
|
|
description=request.description
|
|
|
|
|
@@ -61,11 +65,13 @@ async def delete_report(request: DeleteReportRequest):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@router.post("/accounts/close", response_model=ModerationActionResponse)
|
|
|
|
|
async def close_account(request: CloseAccountRequest):
|
|
|
|
|
async def close_account(
|
|
|
|
|
request: CloseAccountRequest,
|
|
|
|
|
current_admin: User = Depends(get_current_admin_user)
|
|
|
|
|
):
|
|
|
|
|
"""
|
|
|
|
|
Cerrar una cuenta de usuario
|
|
|
|
|
Cerrar una cuenta de usuario (requiere permisos de admin)
|
|
|
|
|
|
|
|
|
|
- **moderator_id**: ID del moderador
|
|
|
|
|
- **user_id**: ID del usuario cuya cuenta cerrar
|
|
|
|
|
- **reason**: Razón del cierre (mínimo 5 caracteres)
|
|
|
|
|
- **description**: Descripción adicional (opcional)
|
|
|
|
|
@@ -74,7 +80,7 @@ async def close_account(request: CloseAccountRequest):
|
|
|
|
|
try:
|
|
|
|
|
use_case = CloseAccountUseCase(moderation_repo)
|
|
|
|
|
result = use_case.execute(
|
|
|
|
|
moderator_id=request.moderator_id,
|
|
|
|
|
moderator_id=current_admin.user_id,
|
|
|
|
|
user_id=request.user_id,
|
|
|
|
|
reason=request.reason,
|
|
|
|
|
description=request.description,
|
|
|
|
|
@@ -92,11 +98,13 @@ async def close_account(request: CloseAccountRequest):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@router.post("/users/ban", response_model=ModerationActionResponse)
|
|
|
|
|
async def ban_user(request: BanUserRequest):
|
|
|
|
|
async def ban_user(
|
|
|
|
|
request: BanUserRequest,
|
|
|
|
|
current_admin: User = Depends(get_current_admin_user)
|
|
|
|
|
):
|
|
|
|
|
"""
|
|
|
|
|
Banear a un usuario
|
|
|
|
|
Banear a un usuario (requiere permisos de admin)
|
|
|
|
|
|
|
|
|
|
- **moderator_id**: ID del moderador
|
|
|
|
|
- **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)
|
|
|
|
|
@@ -105,7 +113,7 @@ async def ban_user(request: BanUserRequest):
|
|
|
|
|
try:
|
|
|
|
|
use_case = BanUserUseCase(moderation_repo)
|
|
|
|
|
result = use_case.execute(
|
|
|
|
|
moderator_id=request.moderator_id,
|
|
|
|
|
moderator_id=current_admin.user_id,
|
|
|
|
|
user_id=request.user_id,
|
|
|
|
|
reason=request.reason,
|
|
|
|
|
duration_days=request.duration_days,
|
|
|
|
|
@@ -123,11 +131,13 @@ async def ban_user(request: BanUserRequest):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@router.post("/users/warn", response_model=ModerationActionResponse)
|
|
|
|
|
async def warn_user(request: WarnUserRequest):
|
|
|
|
|
async def warn_user(
|
|
|
|
|
request: WarnUserRequest,
|
|
|
|
|
current_admin: User = Depends(get_current_admin_user)
|
|
|
|
|
):
|
|
|
|
|
"""
|
|
|
|
|
Advertir a un usuario
|
|
|
|
|
Advertir a un usuario (requiere permisos de admin)
|
|
|
|
|
|
|
|
|
|
- **moderator_id**: ID del moderador
|
|
|
|
|
- **user_id**: ID del usuario a advertir
|
|
|
|
|
- **reason**: Razón de la advertencia (mínimo 5 caracteres)
|
|
|
|
|
- **description**: Descripción adicional (opcional)
|
|
|
|
|
@@ -135,7 +145,7 @@ async def warn_user(request: WarnUserRequest):
|
|
|
|
|
try:
|
|
|
|
|
use_case = WarnUserUseCase(moderation_repo)
|
|
|
|
|
result = use_case.execute(
|
|
|
|
|
moderator_id=request.moderator_id,
|
|
|
|
|
moderator_id=current_admin.user_id,
|
|
|
|
|
user_id=request.user_id,
|
|
|
|
|
reason=request.reason,
|
|
|
|
|
description=request.description
|
|
|
|
|
@@ -152,11 +162,13 @@ async def warn_user(request: WarnUserRequest):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@router.post("/content/review", response_model=ModerationActionResponse)
|
|
|
|
|
async def review_content(request: ReviewContentRequest):
|
|
|
|
|
async def review_content(
|
|
|
|
|
request: ReviewContentRequest,
|
|
|
|
|
current_admin: User = Depends(get_current_admin_user)
|
|
|
|
|
):
|
|
|
|
|
"""
|
|
|
|
|
Revisar y actuar sobre contenido reportado
|
|
|
|
|
Revisar y actuar sobre contenido reportado (requiere permisos de admin)
|
|
|
|
|
|
|
|
|
|
- **moderator_id**: ID del moderador
|
|
|
|
|
- **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)
|
|
|
|
|
@@ -165,7 +177,7 @@ async def review_content(request: ReviewContentRequest):
|
|
|
|
|
try:
|
|
|
|
|
use_case = ReviewContentUseCase(moderation_repo)
|
|
|
|
|
result = use_case.execute(
|
|
|
|
|
moderator_id=request.moderator_id,
|
|
|
|
|
moderator_id=current_admin.user_id,
|
|
|
|
|
report_id=request.report_id,
|
|
|
|
|
action=request.action,
|
|
|
|
|
reason=request.reason,
|
|
|
|
|
|