Files
medods_vk/app.py
T

231 lines
7.2 KiB
Python

from flask import Flask, request, jsonify
from config import Config
from db import VkAPI, db, MedodsAPI, ApiEndpoint
from scheduler import start_scheduler
from http_client import send_request
import logging
import os
app = Flask(__name__)
app.config.from_object(Config)
db.init_app(app)
os.makedirs("logs", exist_ok=True)
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s | %(levelname)s | %(name)s | %(message)s",
handlers=[
logging.FileHandler(Config.LOG_FILE, encoding="utf-8"),
logging.StreamHandler(),
],
)
logger = logging.getLogger(__name__)
from flask import render_template
@app.route("/")
def index():
return render_template("index.html")
@app.route("/medods", methods=["GET"])
def medods():
medods_api = MedodsAPI.query.first()
data = {}
if medods_api:
apiKey = False
if medods_api.identity and medods_api.secretKey:
apiKey = True
data = {
"url": medods_api.url,
"apiKey": apiKey,
}
return render_template("medods.html", data=data)
@app.route("/vk")
def vk():
vkDB = VkAPI.query.first()
data = {}
if vkDB:
data = {"vk_settings": vkDB.toDict()}
return render_template("vk.html", data=data)
@app.route("/posts")
def posts():
return render_template("posts.html")
@app.before_request
def init():
db.create_all()
start_scheduler()
logger.info("Приложение запущено")
@app.route("/settings/medods", methods=["POST"])
def medods_url():
data = request.json
logger.info(data)
apiKey = data.get("apiKey", None)
url = data.get("url", None)
if url is not None:
logger.info("Получен url")
try:
medodsRecord = MedodsAPI.query.first()
medodsRecord.url = url
db.session.commit()
logger.info("Обновлен url")
except Exception:
db.session.merge(MedodsAPI(url=url))
db.session.commit()
logger.info("Добавлен url")
if apiKey:
logger.info("Получены ключи")
try:
medodsRecord = MedodsAPI.query.first()
medodsRecord.identity = apiKey["identity"]
medodsRecord.secretKey = apiKey["secretKey"]
db.session.commit()
logger.info("Обновлены ключи")
except Exception:
db.session.merge(
MedodsAPI(identity=apiKey["identity"], secretKey=apiKey["secretKey"])
)
db.session.commit()
logger.info("Добавлены ключи")
return jsonify({"ok": True})
# return jsonify({"ok": False}), 400
@app.route("/settings/requests", methods=["GET", "POST", "PATCH", "DELETE"])
def get_requests():
requestData = (
request.json if request.method in ["POST", "PATCH", "DELETE"] else None
)
match request.method:
case "DELETE":
logger.info("Удален запрос")
logger.info(requestData)
return jsonify({"status": "ok"})
case "POST":
logger.info("Добавлен/обновлен запрос")
if "id" in requestData:
logger.info("Обновлен запрос")
try:
db.session.execute(
db.update(ApiEndpoint)
.where(ApiEndpoint.id == requestData["id"])
.values(
method=requestData.get("method"),
title=requestData.get("title"),
url_path=requestData.get("url_path"),
payload=requestData.get("payload", {}),
query_params=requestData.get("query_params", {}),
)
)
db.session.commit()
except Exception as e:
logger.error(f"Ошибка при обновлении запроса: {e}")
return jsonify({"status": "ok"})
else:
logger.info("Добавлен запрос")
try:
db.session.merge(ApiEndpoint(**requestData))
db.session.commit()
except Exception as e:
logger.error(f"Ошибка при добавлении запроса: {e}")
return jsonify({"status": "ok"})
case "PATCH":
logger.info("Выполнен запрос")
requestParams = ApiEndpoint.query.filter_by(id=requestData["id"]).first()
medodsDB = MedodsAPI.query.first()
baseUrl = medodsDB.url
response = send_request(
requestParams.method,
f"{baseUrl}{requestParams.url_path}",
requestParams.payload,
requestParams.query_params,
)
exitData = {}
try:
exitData = response.json()
except:
exitData = response.text
return jsonify(exitData)
case "GET":
logger.info("Получен список запросов")
requestsDB = ApiEndpoint.query.all()
requestsList = [r.toDict() for r in requestsDB]
logger.info(requestsList)
return jsonify(
{
"status": "ok",
"requests": requestsList,
}
)
case _:
logger.error("Неверный метод запроса")
return jsonify({"status": "error"}), 405
@app.route("/settings/vk", methods=["POST"])
def settings_vk():
requestData = request.json
logger.info(requestData)
if "id" in requestData:
logger.info("Обновлен запрос")
try:
db.session.execute(
db.update(VkAPI)
.where(VkAPI.id == requestData["id"])
.values(
group_id=(
int(requestData.get("group_id", 0))
if requestData.get("group_id")
else 0
),
access_token=requestData.get("access_token"),
base_photo_url=(
int(requestData.get("base_photo_url", 0))
if requestData.get("base_photo_url")
else 0
),
)
)
db.session.commit()
except Exception as e:
logger.error(f"Ошибка при обновлении запроса: {e}")
return jsonify({"status": "ok"})
else:
logger.info("Добавлен запрос")
try:
db.session.merge(VkAPI(**requestData))
db.session.commit()
except Exception as e:
logger.error(f"Ошибка при добавлении запроса: {e}")
return jsonify({"status": "ok"})
@app.route("/request", methods=["POST"])
def make_request():
data = request.json
response = send_request(
data["method"], data["url"], data.get("payload"), data.get("headers")
)
return jsonify({"status": response.status_code})
if __name__ == "__main__":
app.run(debug=True)