added burger menu with admin page and user invitation link generation
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
"""Admin router for administrative functions."""
|
||||
|
||||
import secrets
|
||||
from datetime import datetime, timedelta, UTC
|
||||
from typing import Annotated
|
||||
from fastapi import APIRouter, Depends
|
||||
from pydantic import BaseModel
|
||||
|
||||
from baby_monitor.routers.auth import verify_admin
|
||||
from baby_monitor.repositories.dependencies.get_invitation_repository import (
|
||||
get_invitation_repository,
|
||||
)
|
||||
from baby_monitor.repositories.interfaces import (
|
||||
InvitationRepositoryInterface,
|
||||
)
|
||||
|
||||
router = APIRouter(prefix="/api/admin", tags=["admin"])
|
||||
|
||||
|
||||
class InvitationResponse(BaseModel):
|
||||
"""Response model for invitation link generation."""
|
||||
|
||||
token: str
|
||||
expires_at: str
|
||||
message: str
|
||||
|
||||
|
||||
@router.post("/generate-invitation", response_model=InvitationResponse)
|
||||
async def generate_invitation_link(
|
||||
user_id: Annotated[int, Depends(verify_admin)],
|
||||
invitation_repository: Annotated[
|
||||
InvitationRepositoryInterface,
|
||||
Depends(get_invitation_repository),
|
||||
],
|
||||
) -> InvitationResponse:
|
||||
"""Generate a new invitation link for user registration.
|
||||
|
||||
The invitation token is valid for 24 hours and can be used once.
|
||||
Requires admin role.
|
||||
|
||||
Args:
|
||||
user_id: Admin user ID (from verify_admin)
|
||||
invitation_repository: Invitation storage backend
|
||||
|
||||
Returns:
|
||||
InvitationResponse with token and expiration details
|
||||
"""
|
||||
|
||||
# Generate secure random token
|
||||
invitation_token = secrets.token_urlsafe(32)
|
||||
|
||||
# Calculate expiration (24 hours from now)
|
||||
expires_at = datetime.now(UTC) + timedelta(hours=24)
|
||||
|
||||
# Store invitation token in database
|
||||
invitation_repository.create_invitation(
|
||||
token=invitation_token,
|
||||
created_by_user_id=user_id,
|
||||
expires_at=expires_at,
|
||||
)
|
||||
|
||||
return InvitationResponse(
|
||||
token=invitation_token,
|
||||
expires_at=expires_at.isoformat(),
|
||||
message="Invitation link generated successfully. Valid for 24 hours.",
|
||||
)
|
||||
Reference in New Issue
Block a user