massage 1
This commit is contained in:
118
app/mongodb1.py
Normal file
118
app/mongodb1.py
Normal file
@@ -0,0 +1,118 @@
|
||||
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))
|
||||
Reference in New Issue
Block a user