🔥 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:
DevProject Agent
2026-06-14 19:22:27 +04:00
parent da1487d99e
commit 866a01d700
5 changed files with 144 additions and 96 deletions
+113 -2
View File
@@ -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
+6 -5
View File
@@ -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]})
+7 -6
View File
@@ -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,
)
+17 -82
View File
@@ -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)
View File