From 02256e68bf0a435ff983732f835ea4c9afc3603c Mon Sep 17 00:00:00 2001 From: katboi01 Date: Sun, 12 Jan 2025 10:27:10 +0100 Subject: [PATCH] added account post count endpoint --- modules/Archive/database.py | 77 +++++++++++++++---- .../endpoints/get_accounts_post_count.py | 13 ++++ modules/Archive/endpoints/get_post.py | 18 +---- modules/Archive/endpoints/get_posts.py | 18 +---- modules/Archive/endpoints/get_posts_count.py | 18 +---- modules/Archive/endpoints/query.py | 17 +--- modules/Archive/endpoints/set_action.py | 14 +--- 7 files changed, 91 insertions(+), 84 deletions(-) create mode 100644 modules/Archive/endpoints/get_accounts_post_count.py diff --git a/modules/Archive/database.py b/modules/Archive/database.py index 1ed029b..8ed1240 100644 --- a/modules/Archive/database.py +++ b/modules/Archive/database.py @@ -1,9 +1,11 @@ +import json +from flask import Flask from .databaseController import DatabaseController -from .endpoints.query import Archive_Query -from .endpoints.get_post import Archive_GetPost -from .endpoints.get_posts import Archive_GetPosts -from .endpoints.set_action import Archive_SetAction -from .endpoints.get_posts_count import Archive_GetPostsCount +from .endpoints.query import Query +from .endpoints.get_post import GetPost +from .endpoints.get_posts import GetPosts +from .endpoints.set_action import SetAction +from .endpoints.get_posts_count import GetPostsCount def get_post_dictionary(id, error_id, action_taken, text, files, date, x_handle, x_rating): if files == "" or files is None: @@ -19,22 +21,49 @@ def get_post_dictionary(id, error_id, action_taken, text, files, date, x_handle, class Database: db : DatabaseController = None + app : Flask = None def __init__(self, api) -> None: - app = api.app - if "Archive" in app.databases: - del app.databases["Archive"] + self.app = api.app + if "Archive" in self.app.databases: + del self.app.databases["Archive"] self.reload_data() - app.databases["Archive"] = self + self.app.databases["Archive"] = self - api.add_resource(Archive_Query, "/Archive/Query") - api.add_resource(Archive_GetPost, "/Archive/GetPost/") - api.add_resource(Archive_GetPosts, "/Archive/GetPosts") - api.add_resource(Archive_GetPostsCount, "/Archive/GetPosts/Count") - api.add_resource(Archive_SetAction, "/Archive/SetAction") + api.add_resource(Query, "/Archive/Query") + api.add_resource(GetPost, "/Archive/GetPost/") + api.add_resource(GetPosts, "/Archive/GetPosts") + api.add_resource(GetPostsCount, "/Archive/GetPosts/Count") + api.add_resource(SetAction, "/Archive/SetAction") + def get_accounts(self): + query = f''' + SELECT x_handle, id FROM accounts + ORDER BY x_handle ASC''' + + results = self.db.run_query(query) + accounts = [] + if results is not None: + accounts = [{"x_handle": result[0], "id": result[1]} for result in results] + return accounts + + def get_account_stats(self): + query = '''SELECT x_handle, + SUM(IIF(x_posts.action_taken = 0, 1, 0)) as undecided, + SUM(IIF(x_posts.action_taken = 1, 1, 0)) as approved, + SUM(IIF(x_posts.action_taken = 2, 1, 0)) as deleted, + SUM(IIF(x_posts.action_taken = 3, 1, 0)) as hidden, + SUM(IIF(x_post_details.id is NULL, 1, 0)) as invalid +FROM x_posts + LEFT JOIN accounts on accounts.id = x_posts.account_id + LEFT JOIN x_post_details on x_post_details.id = x_posts.id +GROUP BY account_id +ORDER BY x_handle''' + results = self.db.run_query(query) + return [{"x_handle": result[0], "undecided": result[1], "approved": result[2], "deleted": result[3], "hidden": result[4], "invalid": result[5]} for result in results] + def get_post(self, id): query = f'''SELECT x_posts.id, x_posts.error_id, x_posts.action_taken, x_post_details.text, x_post_details.files, x_post_details.date, accounts.x_handle, accounts.rating from x_posts LEFT JOIN x_post_details @@ -99,5 +128,25 @@ class Database: posts.append(get_post_dictionary(result[0], -1, result[1], result[2], result[3], result[4], result[5], result[6])) return posts + def wrap_query_response(self, result, mode = "json"): + if result is None: + response = self.app.response_class(status=400) + else: + if mode == "json": + response = self.app.response_class( + response=json.dumps(result, ensure_ascii=False, indent=1), + status=200, + mimetype='application/json' + ) + elif mode == "text": + response = self.app.response_class( + response=str(result), + status=200, + mimetype='text/plain' + ) + + response.headers.add("Access-Control-Allow-Origin", "*") + return response + def reload_data(self): self.db = DatabaseController("/home/pi/python/Katbots/JapariArchive/database.db") \ No newline at end of file diff --git a/modules/Archive/endpoints/get_accounts_post_count.py b/modules/Archive/endpoints/get_accounts_post_count.py new file mode 100644 index 0000000..308a1df --- /dev/null +++ b/modules/Archive/endpoints/get_accounts_post_count.py @@ -0,0 +1,13 @@ +from __future__ import annotations +from flask_restful import Resource +from flask import current_app as app +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from modules.Archive.database import Database + +class AccountsPostCount(Resource): + def get(self): + db : Database = app.databases["Archive"] + result = db.get_account_stats() + return db.wrap_query_response(result) \ No newline at end of file diff --git a/modules/Archive/endpoints/get_post.py b/modules/Archive/endpoints/get_post.py index 405ba39..d83d432 100644 --- a/modules/Archive/endpoints/get_post.py +++ b/modules/Archive/endpoints/get_post.py @@ -1,27 +1,15 @@ from __future__ import annotations -import json from flask_restful import Resource -from flask import current_app as app, jsonify, request +from flask import current_app as app from typing import TYPE_CHECKING if TYPE_CHECKING: from modules.Archive.database import Database -class Archive_GetPost(Resource): +class GetPost(Resource): def get(self, id): id = int(id) db : Database = app.databases["Archive"] result = db.get_post(id) - - if result is None: - response = app.response_class(status=404) - else: - response = app.response_class( - response=json.dumps(result, ensure_ascii=False, indent=1), - status=200, - mimetype='application/json' - ) - - response.headers.add("Access-Control-Allow-Origin", "*") - return response \ No newline at end of file + return db.wrap_query_response(result) \ No newline at end of file diff --git a/modules/Archive/endpoints/get_posts.py b/modules/Archive/endpoints/get_posts.py index 9fe0fbf..05d235c 100644 --- a/modules/Archive/endpoints/get_posts.py +++ b/modules/Archive/endpoints/get_posts.py @@ -1,13 +1,12 @@ from __future__ import annotations -import json from flask_restful import Resource -from flask import current_app as app, jsonify, request +from flask import current_app as app, request from typing import TYPE_CHECKING if TYPE_CHECKING: from modules.Archive.database import Database -class Archive_GetPosts(Resource): +class GetPosts(Resource): def get(self): db : Database = app.databases["Archive"] try: @@ -53,15 +52,4 @@ class Archive_GetPosts(Resource): offset = real_page * count result = db.get_posts(count, artist, actions_taken=actions, last_id= -1, offset= offset, include_ratings= ratings, order=order) - - if result is None: - response = app.response_class(status=400) - else: - response = app.response_class( - response=json.dumps(result, ensure_ascii=False, indent=1), - status=200, - mimetype='application/json' - ) - - response.headers.add("Access-Control-Allow-Origin", "*") - return response \ No newline at end of file + return db.wrap_query_response(result) \ No newline at end of file diff --git a/modules/Archive/endpoints/get_posts_count.py b/modules/Archive/endpoints/get_posts_count.py index a1f31d7..68712f4 100644 --- a/modules/Archive/endpoints/get_posts_count.py +++ b/modules/Archive/endpoints/get_posts_count.py @@ -1,13 +1,12 @@ from __future__ import annotations -import json from flask_restful import Resource -from flask import current_app as app, jsonify, request +from flask import current_app as app, request from typing import TYPE_CHECKING if TYPE_CHECKING: from modules.Archive.database import Database -class Archive_GetPostsCount(Resource): +class GetPostsCount(Resource): def get(self): db : Database = app.databases["Archive"] try: @@ -40,15 +39,4 @@ class Archive_GetPostsCount(Resource): ratings = ["SFW", "NSFW"] result = db.get_posts_count(artist, actions_taken=actions, last_id= -1, include_ratings= ratings) - - if result is None: - response = app.response_class(status=400) - else: - response = app.response_class( - response=str(result), - status=200, - mimetype='text/plain' - ) - - response.headers.add("Access-Control-Allow-Origin", "*") - return response \ No newline at end of file + return db.wrap_query_response(result, mode="text") \ No newline at end of file diff --git a/modules/Archive/endpoints/query.py b/modules/Archive/endpoints/query.py index 669add4..61a96cd 100644 --- a/modules/Archive/endpoints/query.py +++ b/modules/Archive/endpoints/query.py @@ -1,13 +1,12 @@ from __future__ import annotations -import json from flask_restful import Resource -from flask import current_app as app, jsonify, request +from flask import current_app as app, request from typing import TYPE_CHECKING if TYPE_CHECKING: from modules.Archive.database import Database -class Archive_Query(Resource): +class Query(Resource): def post(self): query = request.data.decode("utf-8") @@ -15,14 +14,4 @@ class Archive_Query(Resource): result = db.db.run_query(query) - if result is None: - response = app.response_class(status=400) - else: - response = app.response_class( - response=json.dumps(result, ensure_ascii=False, indent=1), - status=200, - mimetype='application/json' - ) - - response.headers.add("Access-Control-Allow-Origin", "*") - return response \ No newline at end of file + return db.wrap_query_response(result) \ No newline at end of file diff --git a/modules/Archive/endpoints/set_action.py b/modules/Archive/endpoints/set_action.py index 242a5a0..eb6da8c 100644 --- a/modules/Archive/endpoints/set_action.py +++ b/modules/Archive/endpoints/set_action.py @@ -1,13 +1,13 @@ from __future__ import annotations import json from flask_restful import Resource -from flask import current_app as app, jsonify, request +from flask import current_app as app, request from typing import TYPE_CHECKING if TYPE_CHECKING: from modules.Archive.database import Database -class Archive_SetAction(Resource): +class SetAction(Resource): def post(self): data = json.loads(request.data) @@ -32,12 +32,4 @@ class Archive_SetAction(Resource): query += " AND action_taken = 0" result = db.db.run_command(query) - - response = app.response_class( - response=str(result), - status=200, - mimetype='text/plain' - ) - - response.headers.add("Access-Control-Allow-Origin", "*") - return response \ No newline at end of file + return db.wrap_query_response(result, mode="text") \ No newline at end of file