import os import logging from flask import Flask, jsonify, request from motor.motor_asyncio import AsyncIOMotorClient from bson import ObjectId from flask.logging import default_handler import asyncio app = Flask(__name__) # Настройки логирования logger = logging.getLogger("MongoDBRepository") logger.setLevel(logging.DEBUG) logger.addHandler(default_handler) # Настройки MongoDB из переменных окружения mongo_uri = os.getenv("MONGO_URL", "mongodb://localhost:27017") database_name = os.getenv("DB_NAME", "mydatabase") server_collection = os.getenv("SERVER_COLLECTION", "servers") plan_collection = os.getenv("PLAN_COLLECTION", "plans") # Подключение к базе данных client = AsyncIOMotorClient(mongo_uri) db = client[database_name] servers = db[server_collection] plans = db[plan_collection] @app.route('/plans', methods=['POST']) async def add_subscription_plan(): plan_data = request.json result = await plans.insert_one(plan_data) logger.debug(f"Тарифный план добавлен с ID: {result.inserted_id}") return jsonify({"inserted_id": str(result.inserted_id)}), 201 @app.route('/plans/', methods=['GET']) async def get_subscription_plan(plan_id): plan = await plans.find_one({"_id": ObjectId(plan_id)}) if plan: logger.debug(f"Найден тарифный план: {plan}") plan["_id"] = str(plan["_id"]) return jsonify(plan) else: logger.error(f"Тарифный план {plan_id} не найден.") return jsonify({"error": "Plan not found"}), 404 @app.route('/servers', methods=['POST']) async def add_server(): server_data = request.json result = await servers.insert_one(server_data) logger.debug(f"VPN сервер добавлен с ID: {result.inserted_id}") return jsonify({"inserted_id": str(result.inserted_id)}), 201 @app.route('/servers/', methods=['GET']) async def get_server(server_name): server = await servers.find_one({"server.name": server_name}) if server: logger.debug(f"Найден VPN сервер: {server}") server["_id"] = str(server["_id"]) return jsonify(server) else: logger.debug(f"VPN сервер с именем {server_name} не найден.") return jsonify({"error": "Server not found"}), 404 @app.route('/servers/least_clients', methods=['GET']) async def get_server_with_least_clients(): pipeline = [ {"$addFields": {"current_clients": {"$size": {"$ifNull": ["$clients", []]}}}}, {"$sort": {"current_clients": 1}}, {"$limit": 1} ] result = await servers.aggregate(pipeline).to_list(length=1) if result: server = result[0] server["_id"] = str(server["_id"]) logger.debug(f"Найден сервер с наименьшим количеством клиентов: {server}") return jsonify(server) else: logger.debug("Не найдено серверов.") return jsonify({"error": "No servers found"}), 404 @app.route('/servers/', methods=['PUT']) async def update_server(server_id): update_data = request.json result = await servers.update_one({"_id": ObjectId(server_id)}, {"$set": update_data}) if result.matched_count > 0: logger.debug(f"VPN сервер с ID {server_id} обновлен.") return jsonify({"updated": True}) else: logger.debug(f"VPN сервер с ID {server_id} не найден.") return jsonify({"error": "Server not found"}), 404 @app.route('/servers/', methods=['DELETE']) async def delete_server(server_id): result = await servers.delete_one({"_id": ObjectId(server_id)}) if result.deleted_count > 0: logger.debug(f"VPN сервер с ID {server_id} удален.") return jsonify({"deleted": True}) else: logger.debug(f"VPN сервер с ID {server_id} не найден.") return jsonify({"error": "Server not found"}), 404 @app.route('/servers', methods=['GET']) async def list_servers(): server_list = await servers.find().to_list(length=1000) for server in server_list: server["_id"] = str(server["_id"]) logger.debug(f"Найдено {len(server_list)} VPN серверов.") return jsonify(server_list) @app.route('/shutdown', methods=['POST']) async def close_connection(): client.close() logger.debug("Подключение к MongoDB закрыто.") return jsonify({"message": "Connection closed"}), 200 if __name__ == '__main__': loop = asyncio.get_event_loop() loop.run_until_complete(app.run(debug=True))