aboutsummaryrefslogtreecommitdiffstats
path: root/backend/app.py
diff options
context:
space:
mode:
Diffstat (limited to 'backend/app.py')
-rw-r--r--backend/app.py66
1 files changed, 40 insertions, 26 deletions
diff --git a/backend/app.py b/backend/app.py
index b29ca17..5e3fa7c 100644
--- a/backend/app.py
+++ b/backend/app.py
@@ -3,15 +3,18 @@ Flask app for serving the static files
"""
from flask import Flask, send_file, jsonify
from flask_cors import CORS
-from sql.sql_handler import SQLHandler
+from sql.pg_handler import PostgresHandler
import fileutil as fs
import datetime
import pandas
from sklearn.linear_model import Ridge
import numpy as np
+import os
+from dotenv import load_dotenv
+
+load_dotenv()
app = Flask(__name__)
-CONFIG = fs.load_config("config.ini")
CORS(app)
# Optional setting to use any of the custom options below
@@ -25,27 +28,42 @@ ALL_EXCLUDE_MANUAL_DATA = False
# For when you only want to serve actual data you collected at those specific endpoints
INDIVIDUAL_EXCLUDE_MANUAL_DATA = True
+def create_database_connection():
+ """
+ Creates a database connection using the environment variables
+ :param: auth_append: str = "" - If you want to use a different set of variables for persisitance of sessions
+ """
+ hostname = os.environ.get("POSTGRES_HOST")
+ user = os.environ.get("POSTGRES_USER")
+ password = os.environ.get("POSTGRES_PASSWORD")
+ database = os.environ.get("POSTGRES_DATABASE")
+ return PostgresHandler(host_name=hostname, username=user, password=password, database=database, port=5432)
+
@app.route("/")
def index():
- return send_file("index.html")
+ try:
+ return send_file("index.html")
+ except Exception as e:
+ return jsonify({"error": str(e)})
@app.route("/api/subscribers")
def api_subscribers():
- server = SQLHandler(CONFIG["SQL"]["host"], CONFIG["SQL"]["user"], CONFIG["SQL"]["password"], CONFIG["SQL"]["database"])
- data = server.execute_query("SELECT * FROM subscriber_data INNER JOIN 24h_historical ON subscriber_data.channel_id = 24h_historical.channel_id ORDER BY subscriber_count DESC")
- channel_data_list = [{"channel_name":row[3], "profile_pic": row[2], "subscribers": row[4], "sub_org": row[5], "video_count": row[6], "day_diff": int(row[4] - int(row[10]))} for row in data]
- subscriber_data = {"timestamp": datetime.datetime.now(),"channel_data":channel_data_list}
+ server = create_database_connection()
+ query = 'SELECT sd.*, h.* FROM subscriber_data sd INNER JOIN "24h_historical" h ON sd.channel_id = h.channel_id ORDER BY sd.subscriber_count DESC'
+ data = server.execute_query(query)
+ channel_data_list = [{"channel_name": row[3], "profile_pic": row[2], "subscribers": row[4], "sub_org": row[5], "video_count": row[6], "day_diff": int(row[4] - int(row[10]))} for row in data]
+ subscriber_data = {"timestamp": datetime.datetime.now(), "channel_data": channel_data_list}
return jsonify(subscriber_data)
@app.route("/api/subscribers/<channel_name>")
def api_subscribers_channel(channel_name):
- server = SQLHandler(CONFIG["SQL"]["host"], CONFIG["SQL"]["user"], CONFIG["SQL"]["password"], CONFIG["SQL"]["database"])
- data = server.execute_query("SELECT * FROM subscriber_data_historical WHERE name = %s AND timestamp > %s", (channel_name, START_DATE))
- sorted_data = sorted(data, key=lambda row: row[5].strftime("%Y-%m-%d"))
+ server = create_database_connection()
+ query = "SELECT * FROM subscriber_data_historical WHERE name = %s AND timestamp > %s ORDER BY TO_CHAR(timestamp, 'YYYY-MM-DD')"
+ data = server.execute_query(query, (channel_name, START_DATE))
labels = []
data_points = []
seen_dates = set()
- for row in sorted_data:
+ for row in data:
date_string = row[5].strftime("%Y-%m-%d")
if date_string in seen_dates:
continue
@@ -54,16 +72,15 @@ def api_subscribers_channel(channel_name):
seen_dates.add(date_string)
return jsonify({"labels": labels, "datasets": data_points})
-
@app.route("/api/subscribers/<channel_name>/7d")
def api_subscribers_channel_7d(channel_name):
- server = SQLHandler(CONFIG["SQL"]["host"], CONFIG["SQL"]["user"], CONFIG["SQL"]["password"], CONFIG["SQL"]["database"])
- data = server.execute_query("SELECT * FROM subscriber_data_historical WHERE name = %s", (channel_name,))
- sorted_data = sorted(data, key=lambda row: row[5].strftime("%Y-%m-%d"))
+ server = create_database_connection()
+ query = "SELECT * FROM subscriber_data_historical WHERE name = %s ORDER BY TO_CHAR(timestamp, 'YYYY-MM-DD')"
+ data = server.execute_query(query, (channel_name,))
labels = []
data_points = []
seen_dates = set()
- for row in sorted_data:
+ for row in data:
date_string = row[5].strftime("%Y-%m-%d")
if date_string in seen_dates:
continue
@@ -81,9 +98,10 @@ def get_channel_information(channel_name):
return ((subscriber_count // 100000) + 1) * 100000
else:
return ((subscriber_count // 1000000) + 1) * 1000000
- server = SQLHandler(CONFIG["SQL"]["host"], CONFIG["SQL"]["user"], CONFIG["SQL"]["password"], CONFIG["SQL"]["database"])
- data = server.execute_query("SELECT * FROM subscriber_data WHERE name = %s", (channel_name,))
- channel_data = {"channel_id":data[0][1],"channel_name":data[0][3], "profile_pic": data[0][2], "subscribers": data[0][4], "sub_org": data[0][5], "video_count": data[0][6]}
+ server = create_database_connection()
+ query = "SELECT * FROM subscriber_data WHERE name = %s"
+ data = server.execute_query(query, (channel_name,))
+ channel_data = {"channel_id": data[0][1], "channel_name": data[0][3], "profile_pic": data[0][2], "subscribers": data[0][4], "sub_org": data[0][5], "video_count": data[0][6]}
historical_data = server.execute_query("SELECT * FROM subscriber_data_historical WHERE name = %s", (channel_name,))
current_subscriber_count = data[0][4]
subscriber_points = []
@@ -123,18 +141,14 @@ def get_channel_information(channel_name):
channel_data["days_until_next_milestone"] = "N/A"
channel_data["next_milestone"] = "N/A"
return jsonify(channel_data)
-
@app.route("/api/announcement")
def api_announcement():
- """
- Can be used to show a particular message/error on the NEXT interface
- """
- announcement_data = {"message": "None", "show_message": False} # stub TODO
+ announcement_data = {"message": "None", "show_message": False}
+ return jsonify(announcement_data)
@app.errorhandler(404)
def not_found(error):
return jsonify(error=str(error)), 404
-
if __name__ == "__main__":
- app.run(debug=True, port=5001)
+ app.run(debug=True)
send patches to the email below
yukais@pinapelz.com
include the subject [PATCH repo_name]
pinapelz.com
homepage