diff --git a/app/db/memory.py b/app/db/memory.py index 481f953..3e762f6 100644 --- a/app/db/memory.py +++ b/app/db/memory.py @@ -1,2 +1,113 @@ -users = {} -bookings = [] \ No newline at end of file +import json +import os +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 f: + return json.load(f) + except (json.JSONDecodeError, OSError): + return default + return default + + +def _save_json(path, data): + with open(path, w, encoding=utf-8) as f: + json.dump(data, f, ensure_ascii=False, indent=2) + + +# ——— Users ——— + +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) + + +# ——— Bookings ——— + +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 diff --git a/app/handlers/profile.py b/app/handlers/profile.py index 206793a..b673ecc 100644 --- a/app/handlers/profile.py +++ b/app/handlers/profile.py @@ -2,18 +2,19 @@ from aiogram import Router, F from aiogram.types import Message from aiogram.fsm.context import FSMContext -from app.db.memory import users +from app.db.memory import get_user router = Router() -@router.message(F.text == "👤 Профиль") + +@router.message(F.text == 👤 Профиль) async def profile(message: Message, state: FSMContext): await state.clear() - user = users.get(message.from_user.id) + user = get_user(message.from_user.id) if not user: - await message.answer("Профиль не найден") + await message.answer(Профиль не найден) return - await message.answer(f"👤 Имя: {user['name']}") \ No newline at end of file + await message.answer(f👤 Имя: {user[name]}) diff --git a/app/handlers/start.py b/app/handlers/start.py index bf8cdda..afec390 100644 --- a/app/handlers/start.py +++ b/app/handlers/start.py @@ -3,17 +3,18 @@ from aiogram.filters import CommandStart from aiogram.types import Message from app.keyboards.menu import menu -from app.db.memory import users +from app.db.memory import get_user, set_user router = Router() + @router.message(CommandStart()) async def start(message: Message): - users[message.from_user.id] = { - "name": message.from_user.full_name - } + user_id = message.from_user.id + if not get_user(user_id): + set_user(user_id, {name: message.from_user.full_name}) await message.answer( - "👋 Добро пожаловать в Demo Bot", - reply_markup=menu - ) \ No newline at end of file + 👋 Добро пожаловать в Demo Bot, + reply_markup=menu, + ) diff --git a/app/services/booking_service.py b/app/services/booking_service.py index fe6de45..42538cb 100644 --- a/app/services/booking_service.py +++ b/app/services/booking_service.py @@ -1,92 +1,27 @@ -from app.db.memory import bookings +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, +) -def create_booking( - user_id: int, - service: str, - date: str, - master: str, - time: str -): - booking = { - "id": len(bookings) + 1, - "user_id": user_id, - "service": service, - "date": date, - "master": master, - "time": time, - "status": "active" - } - - bookings.append(booking) - - return booking +async def create_booking(user_id, service, master, date, time): + return db_create_booking(user_id, service, master, date, time) -def get_busy_times( - master: str, - date: str -): - busy_times = [] - - for booking in bookings: - - if ( - booking["master"] == master - and booking["date"] == date - and booking["status"] == "active" - ): - busy_times.append( - booking["time"] - ) - - return busy_times +async def get_busy_times(master, date): + return db_get_busy_times(master, date) -def get_user_bookings( - user_id: int -): - result = [] +async def get_user_bookings(user_id): + return db_get_user_bookings(user_id) - for booking in bookings: - if ( - booking["user_id"] == user_id - and booking["status"] == "active" - ): - result.append(booking) +async def cancel_booking(booking_id): + return db_cancel_booking(booking_id) - return result -def cancel_booking( - booking_id: int -): - - for booking in bookings: - - if booking["id"] == booking_id: - booking["status"] = "cancelled" - return True - - return False - -def update_booking( - booking_id: int, - service: str, - master: str, - date: str, - time: str -): - - for booking in bookings: - - if booking["id"] == booking_id: - - booking["service"] = service - booking["master"] = master - booking["date"] = date - booking["time"] = time - - return booking - - return None +async def update_booking(booking_id, service, master, date, time): + return db_update_booking(booking_id, service, master, date, time) diff --git a/data/.gitkeep b/data/.gitkeep new file mode 100644 index 0000000..e69de29