arbret/backend/validate_constants.py
counterweight 6c1a05d93d
Phase 0: Add booking permissions and constants
- Add AppointmentStatus enum (booked, cancelled_by_user, cancelled_by_admin)
- Add booking permissions for regular users (book_appointment, view_own_appointments, cancel_own_appointment)
- Add availability/appointments permissions for admin (manage_availability, view_all_appointments, cancel_any_appointment)
- Add booking constants to shared/constants.json (slotDurationMinutes, maxAdvanceDays, minAdvanceDays, noteMaxLength)
- Update validate_constants.py to validate new sections
2025-12-20 23:30:08 +01:00

63 lines
2.5 KiB
Python

"""Validate shared constants match backend definitions."""
import json
from pathlib import Path
from models import ROLE_ADMIN, ROLE_REGULAR, InviteStatus, AppointmentStatus
def validate_shared_constants() -> None:
"""
Validate that shared/constants.json matches backend definitions.
Raises ValueError if there's a mismatch.
"""
constants_path = Path(__file__).parent.parent / "shared" / "constants.json"
if not constants_path.exists():
raise ValueError(f"Shared constants file not found: {constants_path}")
with open(constants_path) as f:
constants = json.load(f)
# Validate roles
expected_roles = {"ADMIN": ROLE_ADMIN, "REGULAR": ROLE_REGULAR}
if constants.get("roles") != expected_roles:
raise ValueError(
f"Role mismatch in shared/constants.json. "
f"Expected: {expected_roles}, Got: {constants.get('roles')}"
)
# Validate invite statuses
expected_invite_statuses = {s.name: s.value for s in InviteStatus}
if constants.get("inviteStatuses") != expected_invite_statuses:
raise ValueError(
f"Invite status mismatch in shared/constants.json. "
f"Expected: {expected_invite_statuses}, Got: {constants.get('inviteStatuses')}"
)
# Validate appointment statuses
expected_appointment_statuses = {s.name: s.value for s in AppointmentStatus}
if constants.get("appointmentStatuses") != expected_appointment_statuses:
raise ValueError(
f"Appointment status mismatch in shared/constants.json. "
f"Expected: {expected_appointment_statuses}, Got: {constants.get('appointmentStatuses')}"
)
# Validate booking constants exist with required fields
booking = constants.get("booking", {})
required_booking_fields = ["slotDurationMinutes", "maxAdvanceDays", "minAdvanceDays", "noteMaxLength"]
for field in required_booking_fields:
if field not in booking:
raise ValueError(f"Missing booking constant '{field}' in shared/constants.json")
# Validate validation rules exist (structure check only)
validation = constants.get("validation", {})
required_fields = ["telegram", "signal", "nostrNpub"]
for field in required_fields:
if field not in validation:
raise ValueError(f"Missing validation rules for '{field}' in shared/constants.json")
if __name__ == "__main__":
validate_shared_constants()
print("✓ Shared constants are valid")