- Добавлен app/logger.py — loguru с ротацией (консоль, файл, ошибки) - main.py: логи старта/стопа, graceful shutdown (SIGTERM/SIGINT/stop_signal) - Все хендлеры: логирование ключевых действий пользователя - Логи сохраняются в logs/bot_YYYY-MM-DD.log, ротация 30 дней - Ошибки отдельно в logs/errors_*
107 lines
2.4 KiB
Python
107 lines
2.4 KiB
Python
import json
|
|
from app.logger import logger
|
|
from pathlib import Path
|
|
|
|
DB_DIR = Path(__file__).resolve().parent.parent.parent / "data"
|
|
DB_DIR.mkdir(exist_ok=True)
|
|
|
|
USERS_FILE = DB_DIR / "users.json"
|
|
BOOKINGS_FILE = DB_DIR / "bookings.json"
|
|
|
|
|
|
def _load_json(path, default):
|
|
if path.exists():
|
|
try:
|
|
with open(path, "r", encoding="utf-8") as fh:
|
|
return json.load(fh)
|
|
except (json.JSONDecodeError, OSError):
|
|
return default
|
|
return default
|
|
|
|
|
|
def _save_json(path, data):
|
|
with open(path, "w", encoding="utf-8") as fh:
|
|
json.dump(data, fh, ensure_ascii=False, indent=2)
|
|
|
|
|
|
def load_users():
|
|
return _load_json(USERS_FILE, {})
|
|
|
|
|
|
def save_users(users):
|
|
_save_json(USERS_FILE, users)
|
|
|
|
|
|
def get_user(user_id):
|
|
users = load_users()
|
|
return users.get(str(user_id))
|
|
|
|
|
|
def set_user(user_id, data):
|
|
users = load_users()
|
|
users[str(user_id)] = data
|
|
save_users(users)
|
|
|
|
|
|
def load_bookings():
|
|
return _load_json(BOOKINGS_FILE, [])
|
|
|
|
|
|
def save_bookings(bookings):
|
|
_save_json(BOOKINGS_FILE, bookings)
|
|
|
|
|
|
def create_booking(user_id, service, master, date, time):
|
|
bookings = load_bookings()
|
|
booking = {
|
|
"id": len(bookings) + 1,
|
|
"user_id": user_id,
|
|
"service": service,
|
|
"master": master,
|
|
"date": date,
|
|
"time": time,
|
|
"status": "active",
|
|
}
|
|
bookings.append(booking)
|
|
save_bookings(bookings)
|
|
return booking
|
|
|
|
|
|
def get_busy_times(master, date):
|
|
bookings = load_bookings()
|
|
return [
|
|
b["time"] for b in bookings
|
|
if b["master"] == master and b["date"] == date and b["status"] == "active"
|
|
]
|
|
|
|
|
|
def get_user_bookings(user_id):
|
|
bookings = load_bookings()
|
|
return [
|
|
b for b in bookings
|
|
if b["user_id"] == user_id and b["status"] == "active"
|
|
]
|
|
|
|
|
|
def cancel_booking(booking_id):
|
|
bookings = load_bookings()
|
|
for b in bookings:
|
|
if b["id"] == booking_id:
|
|
b["status"] = "cancelled"
|
|
save_bookings(bookings)
|
|
return True
|
|
return False
|
|
|
|
|
|
def update_booking(booking_id, service, master, date, time):
|
|
bookings = load_bookings()
|
|
for b in bookings:
|
|
if b["id"] == booking_id:
|
|
b["service"] = service
|
|
b["master"] = master
|
|
b["date"] = date
|
|
b["time"] = time
|
|
save_bookings(bookings)
|
|
return b
|
|
return None
|