🔥 JSON-хранилище: данные в data/*.json вместо in-memory
- Переписан memory.py: теперь загружает/сохраняет users.json и bookings.json в data/ - booking_service.py: импорты через функции, а не переменные - start.py, profile.py: используют get_user/set_user вместо прямого импорта users - Добавлена папка data/ с .gitkeep
This commit is contained in:
+113
-2
@@ -1,2 +1,113 @@
|
||||
users = {}
|
||||
bookings = []
|
||||
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
|
||||
|
||||
@@ -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']}")
|
||||
await message.answer(f👤 Имя: {user[name]})
|
||||
|
||||
@@ -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
|
||||
👋 Добро пожаловать в Demo Bot,
|
||||
reply_markup=menu,
|
||||
)
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user