🔥 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 = {}
|
import json
|
||||||
bookings = []
|
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.types import Message
|
||||||
from aiogram.fsm.context import FSMContext
|
from aiogram.fsm.context import FSMContext
|
||||||
|
|
||||||
from app.db.memory import users
|
from app.db.memory import get_user
|
||||||
|
|
||||||
router = Router()
|
router = Router()
|
||||||
|
|
||||||
@router.message(F.text == "👤 Профиль")
|
|
||||||
|
@router.message(F.text == 👤 Профиль)
|
||||||
async def profile(message: Message, state: FSMContext):
|
async def profile(message: Message, state: FSMContext):
|
||||||
await state.clear()
|
await state.clear()
|
||||||
|
|
||||||
user = users.get(message.from_user.id)
|
user = get_user(message.from_user.id)
|
||||||
|
|
||||||
if not user:
|
if not user:
|
||||||
await message.answer("Профиль не найден")
|
await message.answer(Профиль не найден)
|
||||||
return
|
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 aiogram.types import Message
|
||||||
|
|
||||||
from app.keyboards.menu import menu
|
from app.keyboards.menu import menu
|
||||||
from app.db.memory import users
|
from app.db.memory import get_user, set_user
|
||||||
|
|
||||||
router = Router()
|
router = Router()
|
||||||
|
|
||||||
|
|
||||||
@router.message(CommandStart())
|
@router.message(CommandStart())
|
||||||
async def start(message: Message):
|
async def start(message: Message):
|
||||||
users[message.from_user.id] = {
|
user_id = message.from_user.id
|
||||||
"name": message.from_user.full_name
|
if not get_user(user_id):
|
||||||
}
|
set_user(user_id, {name: message.from_user.full_name})
|
||||||
|
|
||||||
await message.answer(
|
await message.answer(
|
||||||
"👋 Добро пожаловать в Demo Bot",
|
👋 Добро пожаловать в Demo Bot,
|
||||||
reply_markup=menu
|
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,
|
||||||
def create_booking(
|
get_user_bookings as db_get_user_bookings,
|
||||||
user_id: int,
|
cancel_booking as db_cancel_booking,
|
||||||
service: str,
|
update_booking as db_update_booking,
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
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 create_booking(user_id, service, master, date, time):
|
||||||
|
return db_create_booking(user_id, service, master, date, time)
|
||||||
|
|
||||||
|
|
||||||
def get_user_bookings(
|
async def get_busy_times(master, date):
|
||||||
user_id: int
|
return db_get_busy_times(master, date)
|
||||||
):
|
|
||||||
result = []
|
|
||||||
|
|
||||||
for booking in bookings:
|
|
||||||
|
|
||||||
if (
|
async def get_user_bookings(user_id):
|
||||||
booking["user_id"] == user_id
|
return db_get_user_bookings(user_id)
|
||||||
and booking["status"] == "active"
|
|
||||||
):
|
|
||||||
result.append(booking)
|
|
||||||
|
|
||||||
return result
|
|
||||||
|
|
||||||
def cancel_booking(
|
async def cancel_booking(booking_id):
|
||||||
booking_id: int
|
return db_cancel_booking(booking_id)
|
||||||
):
|
|
||||||
|
|
||||||
for booking in bookings:
|
|
||||||
|
|
||||||
if booking["id"] == booking_id:
|
async def update_booking(booking_id, service, master, date, time):
|
||||||
booking["status"] = "cancelled"
|
return db_update_booking(booking_id, service, master, date, time)
|
||||||
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
|
|
||||||
|
|||||||
Reference in New Issue
Block a user