Files
demo_spa_bot/app/services/booking_service.py
T

65 lines
2.0 KiB
Python

from app.db.memory import (
create_booking as db_create_booking,
get_busy_times as db_get_busy_times,
get_user_bookings as db_get_user_bookings,
cancel_booking as db_cancel_booking,
update_booking as db_update_booking,
load_bookings as db_load_bookings,
save_bookings as db_save_bookings,
BOOKINGS_FILE,
)
from app.logger import logger
async def create_booking(user_id, service, master, date, time):
return db_create_booking(user_id, service, master, date, time)
async def get_busy_times(master, date):
return db_get_busy_times(master, date)
async def get_user_bookings(user_id):
return db_get_user_bookings(user_id)
async def cancel_booking(booking_id):
return db_cancel_booking(booking_id)
async def update_booking(booking_id, service, master, date, time):
return db_update_booking(booking_id, service, master, date, time)
async def is_slot_busy(master, date, time):
"""Check if a time slot is already taken by an active booking."""
busy = db_get_busy_times(master, date)
return time in busy
def cleanup_cancelled():
"""Remove cancelled bookings older than the head (keep only last 5 cancelled per user)."""
bookings = db_load_bookings()
active = [b for b in bookings if b["status"] == "active"]
cancelled = [b for b in bookings if b["status"] == "cancelled"]
# Group cancelled by user, keep last 5 per user
from collections import defaultdict
by_user = defaultdict(list)
for b in cancelled:
by_user[b["user_id"]].append(b)
keep_ids = set()
for uid, user_cancel in by_user.items():
# Keep the 5 most recent
user_cancel.sort(key=lambda x: x.get("id", 0), reverse=True)
for b in user_cancel[:5]:
keep_ids.add(b["id"])
# Rebuild: keep active + keep recent cancelled
bookings = active + [b for b in cancelled if b["id"] in keep_ids]
db_save_bookings(bookings)
removed = len(cancelled) - len(keep_ids)
if removed > 0:
logger.info("Cleaned up {n} old cancelled bookings", n=removed)