Files
backend/app/mongodb1.py
2024-12-21 12:38:57 +00:00

119 lines
4.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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/<plan_id>', 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/<server_name>', 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/<server_id>', 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/<server_id>', 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))