arbret/backend/routes/availability.py

54 lines
2 KiB
Python
Raw Normal View History

"""Availability routes for admin to manage booking availability."""
from datetime import date
from fastapi import APIRouter, Depends, Query
from sqlalchemy.ext.asyncio import AsyncSession
from auth import require_permission
from database import get_db
from models import Permission, User
from schemas import (
AvailabilityDay,
AvailabilityResponse,
CopyAvailabilityRequest,
SetAvailabilityRequest,
)
from services.availability import AvailabilityService
router = APIRouter(prefix="/api/admin/availability", tags=["availability"])
@router.get("", response_model=AvailabilityResponse)
async def get_availability(
from_date: date = Query(..., alias="from", description="Start date (inclusive)"),
to_date: date = Query(..., alias="to", description="End date (inclusive)"),
db: AsyncSession = Depends(get_db),
_current_user: User = Depends(require_permission(Permission.MANAGE_AVAILABILITY)),
) -> AvailabilityResponse:
"""Get availability slots for a date range."""
service = AvailabilityService(db)
return await service.get_availability_for_range(from_date, to_date)
@router.put("", response_model=AvailabilityDay)
async def set_availability(
request: SetAvailabilityRequest,
db: AsyncSession = Depends(get_db),
_current_user: User = Depends(require_permission(Permission.MANAGE_AVAILABILITY)),
) -> AvailabilityDay:
"""Set availability for a specific date. Replaces any existing availability."""
service = AvailabilityService(db)
return await service.set_availability_for_date(request.date, request.slots)
@router.post("/copy", response_model=AvailabilityResponse)
async def copy_availability(
request: CopyAvailabilityRequest,
db: AsyncSession = Depends(get_db),
_current_user: User = Depends(require_permission(Permission.MANAGE_AVAILABILITY)),
) -> AvailabilityResponse:
"""Copy availability from one day to multiple target days."""
service = AvailabilityService(db)
return await service.copy_availability(request.source_date, request.target_dates)