119 lines
4.6 KiB
Python
119 lines
4.6 KiB
Python
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))
|