Skip to main content

Overview

The Administrador (Administrator) role has unrestricted access to all platform features. Administrators can manage users, create and modify destinations, upload multimedia content, and perform all operations available to editors and visitors.
The administrator role is identified as "administrador" in the database and code.

Core Capabilities

User Management

Administrators have complete control over user accounts:

View All Users

List and view details of all registered users

Assign Roles

Change user roles between visitante, editor, and administrador

Delete Users

Permanently remove user accounts from the system

View Any Profile

Access any user’s profile information

List All Users

@router.get("/listar", dependencies=[Depends(require_admin)])
def listar_usuarios(db=Depends(get_database)):
    repo = UsuarioRepositoryImpl(db)
    uc = ListarUsuarios(repo)
    return [u.__dict__ for u in uc.ejecutar()]
Endpoint: GET /usuarios/listar
Source: src/infrastructure/api/routers/usuario_router.py:83-87

Assign User Roles

@router.patch("/{user_id}/rol", dependencies=[Depends(require_admin)])
def asignar_rol(user_id: str, data: dict, db=Depends(get_database)):
    nuevo_rol = data.get("rol")
    repo = UsuarioRepositoryImpl(db)
    use_case = AsignarRol(repo)
    usuario = use_case.ejecutar(user_id, nuevo_rol)
    return {"message": "Rol actualizado correctamente", "nuevo_rol": usuario.rol}
Endpoint: PATCH /usuarios/{user_id}/rol
Source: src/infrastructure/api/routers/usuario_router.py:202-220
Role changes take effect immediately. Ensure you understand the implications before modifying user roles.

Delete Users

@router.delete("/borrar/{user_id}", dependencies=[Depends(require_admin)])
def eliminar_usuario(user_id: str, db=Depends(get_database)):
    repo = UsuarioRepositoryImpl(db)
    uc = EliminarUsuario(repo)
    usuario = uc.ejecutar(user_id)
    return {"message": "Usuario eliminado", "usuario": usuario.__dict__}
Endpoint: DELETE /usuarios/borrar/{user_id}
Source: src/infrastructure/api/routers/usuario_router.py:104-114

Destination Management

Administrators have full CRUD access to destinations:

Create Destinations

@router.post("/")
def crear_destino(data: dict, db=Depends(get_database), admin = Depends(require_admin)):
    repo = DestinoRepositoryImpl(db)
    use_case = AgregarDestinoUseCase(repo)
    destino_id = use_case.ejecutar(data)
    return {"message": "Destino creado correctamente", "id": destino_id}
Endpoint: POST /destinos/
Source: src/infrastructure/api/routers/destinos_router.py:20-28

Edit Destinations

@router.put("/{id}")
def editar_destino(id: str, data: dict, db=Depends(get_database), admin = Depends(require_admin)):
    repo = DestinoRepositoryImpl(db)
    use_case = EditarDestinoUseCase(repo)
    use_case.ejecutar(id, data)
    return {"message": "Destino actualizado correctamente"}
Endpoint: PUT /destinos/{id}
Source: src/infrastructure/api/routers/destinos_router.py:36-44

Delete Destinations

Administrators can permanently delete destinations after removing all multimedia:
@router.delete("/{destino_id}/force")
def eliminar_destino_fisico(destino_id: str, db=Depends(get_database), admin = Depends(require_admin)):
    repo = DestinoRepositoryImpl(db)
    destino = repo.obtener_por_id(destino_id)
    
    # Validate no multimedia attached
    multimedia_actual = destino.get("multimedia", [])
    if multimedia_actual:
        raise HTTPException(
            status_code=400,
            detail="Este destino tiene archivos multimedia. Elimínelos primero."
        )
    
    # Delete from database and Cloudinary
    use_case = EliminarDestinoUseCase(repo)
    eliminado = use_case.eliminar_fisico(destino_id)
    cloudinary.api.delete_folder(f"destinations/{destino_id}")
Endpoint: DELETE /destinos/{destino_id}/force
Source: src/infrastructure/api/routers/destinos_router.py:56-91
Destinations must have all multimedia removed before deletion. The system enforces this validation.

Multimedia Management

Administrators control multimedia uploads to Cloudinary:

Upload Multimedia

@router.post("/{id}/multimedia")
async def subir_multimedia_destino(
    id: str,
    files: List[UploadFile] = File(...),
    db=Depends(get_database), admin = Depends(require_admin)
):
    # Validates 1-3 files per request
    # Maximum 10 files per destination
    # Uploads to cloudinary.com/destinations/{id}/
Endpoint: POST /destinos/{id}/multimedia
Source: src/infrastructure/api/routers/destinos_router.py:96-201
Constraints:
  • 1-3 files per request
  • Maximum 10 files per destination
  • Supports images and videos
  • Automatic Cloudinary organization

Delete Multimedia

@router.delete("/{id}/multimedia")
async def eliminar_multimedia_destino(
    id: str,
    public_id: str,
    db=Depends(get_database), admin = Depends(require_admin)
):
    # Removes from both MongoDB and Cloudinary
    use_case = EliminarMultimediaDestinoUseCase(repo)
    eliminado_db = await use_case.execute(id, public_id)
    cloudinary.uploader.destroy(public_id, resource_type=tipo_cloudinary)
Endpoint: DELETE /destinos/{id}/multimedia?public_id={public_id}
Source: src/infrastructure/api/routers/destinos_router.py:205-254

Route Management

Administrators inherit all editor permissions for route management. See the Editor Role documentation for route operations.

Self-Management Privileges

Administrators can update any user profile, including their own:
@router.put("/actualizar/{user_id}")
def actualizar_usuario(user_id: str, data: dict, token_data = Depends(get_current_user)):
    # Admin can update any user
    if token_data.id != user_id and token_data.rol != "admin":
        raise HTTPException(status_code=403, detail="No tienes permisos")
    
    # Admin can change roles
    if token_data.rol == "admin":
        rol = data.get("rol")
Endpoint: PUT /usuarios/actualizar/{user_id}
Source: src/infrastructure/api/routers/usuario_router.py:34-78

Permission Enforcement

The require_admin dependency ensures only administrators can access protected endpoints:
def require_admin(request: Request):
    """
    Acceso total.
    """
    return _require_role(request, ["administrador"])
Source: src/infrastructure/security/jwt_utils.py:102-106

Usage Example

@router.delete("/borrar/{user_id}", dependencies=[Depends(require_admin)])
def eliminar_usuario(user_id: str, db=Depends(get_database)):
    # Only administrators can execute this endpoint

Admin-Only Endpoints

The following endpoints require administrator privileges:
EndpointMethodPurpose
/usuarios/listarGETList all users
/usuarios/borrar/{user_id}DELETEDelete user account
/usuarios/{user_id}/rolPATCHAssign user role
/destinos/POSTCreate destination
/destinos/{id}PUTUpdate destination
/destinos/{destino_id}/forceDELETEDelete destination
/destinos/{id}/multimediaPOSTUpload multimedia
/destinos/{id}/multimediaDELETEDelete multimedia

Inherited Permissions

Administrators automatically inherit all permissions from:

Editor Permissions

Route creation, updates, and status management

Visitor Permissions

Browsing, favorites, and tracking features

Best Practices

Security Considerations:
  • Limit the number of administrator accounts
  • Regularly audit admin actions
  • Use role assignment carefully
  • Ensure multimedia is removed before deleting destinations
Administrators should use the visitor and editor interfaces for routine tasks to minimize the risk of accidental modifications.

Build docs developers (and LLMs) love