2025-12-20 23:36:11 +01:00
|
|
|
"""Availability routes for admin to manage booking availability."""
|
2025-12-21 21:54:26 +01:00
|
|
|
|
2025-12-22 00:02:41 +01:00
|
|
|
from datetime import date
|
2025-12-20 23:36:11 +01:00
|
|
|
|
2025-12-25 18:31:13 +01:00
|
|
|
from fastapi import APIRouter, Depends, Query
|
2025-12-20 23:36:11 +01:00
|
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
|
|
|
|
|
|
from auth import require_permission
|
|
|
|
|
from database import get_db
|
2025-12-25 18:31:13 +01:00
|
|
|
from models import Permission, User
|
2025-12-20 23:36:11 +01:00
|
|
|
from schemas import (
|
|
|
|
|
AvailabilityDay,
|
|
|
|
|
AvailabilityResponse,
|
|
|
|
|
CopyAvailabilityRequest,
|
2025-12-21 21:54:26 +01:00
|
|
|
SetAvailabilityRequest,
|
2025-12-20 23:36:11 +01:00
|
|
|
)
|
2025-12-25 18:31:13 +01:00
|
|
|
from services.availability import AvailabilityService
|
2025-12-20 23:36:11 +01:00
|
|
|
|
|
|
|
|
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."""
|
2025-12-25 18:31:13 +01:00
|
|
|
service = AvailabilityService(db)
|
|
|
|
|
return await service.get_availability_for_range(from_date, to_date)
|
2025-12-20 23:36:11 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
@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."""
|
2025-12-25 18:31:13 +01:00
|
|
|
service = AvailabilityService(db)
|
|
|
|
|
return await service.set_availability_for_date(request.date, request.slots)
|
2025-12-20 23:36:11 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
@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."""
|
2025-12-25 18:31:13 +01:00
|
|
|
service = AvailabilityService(db)
|
|
|
|
|
return await service.copy_availability(request.source_date, request.target_dates)
|