WIP
This commit is contained in:
parent
d986461019
commit
3d048feb9a
28
app.py
28
app.py
@ -1,10 +1,11 @@
|
|||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
from flask import Flask, render_template, request, abort
|
from flask import Flask, render_template, request, abort, jsonify
|
||||||
import peewee
|
import peewee
|
||||||
from playhouse.shortcuts import model_to_dict
|
from playhouse.shortcuts import model_to_dict
|
||||||
|
|
||||||
import database
|
import database
|
||||||
|
import util
|
||||||
|
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
app.config["DEBUG"] = True
|
app.config["DEBUG"] = True
|
||||||
@ -105,6 +106,31 @@ def transaction(uuid=None):
|
|||||||
# Default if no method is hit
|
# Default if no method is hit
|
||||||
abort(400)
|
abort(400)
|
||||||
|
|
||||||
|
@app.route("/transactions/visualize", methods=["GET"])
|
||||||
|
def visualize_transactions():
|
||||||
|
args = request.args.to_dict()
|
||||||
|
required_args = ['user_id', 'period', 'date'] # Example date format: '2023-01-25'
|
||||||
|
if not all(arg in args for arg in required_args):
|
||||||
|
abort(400, "Missing required query parameters: user_id, period, date")
|
||||||
|
|
||||||
|
user_id = args['user_id'].strip()
|
||||||
|
period = args['period'].strip()
|
||||||
|
try:
|
||||||
|
date = datetime.strptime(args['date'], '%Y-%m-%d')
|
||||||
|
except ValueError:
|
||||||
|
abort(400, "Invalid date format, use YYYY-MM-DD")
|
||||||
|
|
||||||
|
try:
|
||||||
|
start_date, end_date = util.get_start_end_dates(period, date)
|
||||||
|
result = util.aggregate_transactions_by_category(user_id, start_date, end_date)
|
||||||
|
return jsonify(result)
|
||||||
|
except ValueError as e:
|
||||||
|
abort(400, str(e))
|
||||||
|
except peewee.DoesNotExist:
|
||||||
|
abort(404)
|
||||||
|
except Exception as e:
|
||||||
|
abort(500, str(e))
|
||||||
|
|
||||||
@app.route("/categories", methods=["GET", "POST"])
|
@app.route("/categories", methods=["GET", "POST"])
|
||||||
def categories():
|
def categories():
|
||||||
if request.method == "GET":
|
if request.method == "GET":
|
||||||
|
9
sql_queries.txt
Normal file
9
sql_queries.txt
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
SELECT
|
||||||
|
category.name,
|
||||||
|
SUM(transaction.amount) AS total
|
||||||
|
FROM "main"."transaction" as transaction
|
||||||
|
JOIN "main"."transactioncategory" as category ON transaction.subcategory = category.primary_key
|
||||||
|
WHERE transaction.user = 'faab09bcdcc44038907d054ca990a7f4'
|
||||||
|
AND transaction.transaction_date >= '2022-10-01'
|
||||||
|
AND transaction.transaction_date < '2022-11-01'
|
||||||
|
GROUP BY category.name;
|
33
util.py
Executable file
33
util.py
Executable file
@ -0,0 +1,33 @@
|
|||||||
|
from datetime import timedelta
|
||||||
|
from peewee import fn
|
||||||
|
import database
|
||||||
|
|
||||||
|
def get_start_end_dates(period, date):
|
||||||
|
if period == 'daily':
|
||||||
|
start_date = date
|
||||||
|
end_date = date + timedelta(days=1)
|
||||||
|
elif period == 'weekly':
|
||||||
|
start_date = date - timedelta(days=date.weekday())
|
||||||
|
end_date = start_date + timedelta(days=7)
|
||||||
|
elif period == 'monthly':
|
||||||
|
start_date = date.replace(day=1)
|
||||||
|
next_month = start_date + timedelta(days=32)
|
||||||
|
end_date = next_month.replace(day=1)
|
||||||
|
elif period == 'yearly':
|
||||||
|
start_date = date.replace(day=1, month=1)
|
||||||
|
end_date = start_date.replace(year=start_date.year + 1)
|
||||||
|
else:
|
||||||
|
raise ValueError("Invalid period specified")
|
||||||
|
|
||||||
|
return start_date, end_date
|
||||||
|
|
||||||
|
def aggregate_transactions_by_category(user_id, start_date, end_date):
|
||||||
|
query = (database.Transaction
|
||||||
|
.select(database.TransactionCategory.name, fn.SUM(database.Transaction.amount).alias('total'))
|
||||||
|
.join(database.TransactionCategory, on=(database.Transaction.subcategory == database.TransactionCategory.primary_key))
|
||||||
|
.where(
|
||||||
|
(database.Transaction.user == user_id) &
|
||||||
|
(database.Transaction.transaction_date >= start_date) &
|
||||||
|
(database.Transaction.transaction_date < end_date))
|
||||||
|
.group_by(database.TransactionCategory.name))
|
||||||
|
return [{transaction.subcategory.name: transaction.total} for transaction in query]
|
Loading…
Reference in New Issue
Block a user