Skip to content
This repository was archived by the owner on Jun 19, 2026. It is now read-only.

Commit a84775d

Browse files
committed
fixed the CI issue
1 parent 7e3072b commit a84775d

10 files changed

Lines changed: 92 additions & 40 deletions

File tree

packages/backend/app/__init__.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,10 @@ def create_app(settings: Settings | None = None) -> Flask:
2626

2727
# Logging
2828
log_level = os.getenv("LOG_LEVEL", "INFO").upper()
29-
logging.basicConfig(level=getattr(logging, log_level, logging.INFO),
30-
format="%(asctime)s %(levelname)s [%(name)s] %(message)s")
29+
logging.basicConfig(
30+
level=getattr(logging, log_level, logging.INFO),
31+
format="%(asctime)s %(levelname)s [%(name)s] %(message)s",
32+
)
3133
logger = logging.getLogger("finmind")
3234
logger.info("Starting FinMind backend with log level %s", log_level)
3335

packages/backend/app/models.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,9 @@ class UserSubscription(db.Model):
9292
__tablename__ = "user_subscriptions"
9393
id = db.Column(db.Integer, primary_key=True)
9494
user_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False)
95-
plan_id = db.Column(db.Integer, db.ForeignKey("subscription_plans.id"), nullable=False)
95+
plan_id = db.Column(
96+
db.Integer, db.ForeignKey("subscription_plans.id"), nullable=False
97+
)
9698
active = db.Column(db.Boolean, default=False, nullable=False)
9799
started_at = db.Column(db.DateTime, default=datetime.utcnow, nullable=False)
98100

packages/backend/app/routes/auth.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
from flask import Blueprint, request, jsonify
22
from werkzeug.security import generate_password_hash, check_password_hash
3-
from flask_jwt_extended import create_access_token, create_refresh_token, jwt_required, get_jwt_identity
3+
from flask_jwt_extended import (
4+
create_access_token,
5+
create_refresh_token,
6+
jwt_required,
7+
get_jwt_identity,
8+
)
49
from ..extensions import db
510
from ..models import User
611
import logging

packages/backend/app/routes/bills.py

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,28 @@
1414
@jwt_required()
1515
def list_bills():
1616
uid = int(get_jwt_identity())
17-
items = db.session.query(Bill).filter_by(user_id=uid, active=True).order_by(Bill.next_due_date).all()
17+
items = (
18+
db.session.query(Bill)
19+
.filter_by(user_id=uid, active=True)
20+
.order_by(Bill.next_due_date)
21+
.all()
22+
)
1823
logger.info("List bills user=%s count=%s", uid, len(items))
19-
return jsonify([
20-
{
21-
"id": b.id,
22-
"name": b.name,
23-
"amount": float(b.amount),
24-
"currency": b.currency,
25-
"next_due_date": b.next_due_date.isoformat(),
26-
"cadence": b.cadence.value,
27-
"channel_whatsapp": b.channel_whatsapp,
28-
"channel_email": b.channel_email,
29-
}
30-
for b in items
31-
])
24+
return jsonify(
25+
[
26+
{
27+
"id": b.id,
28+
"name": b.name,
29+
"amount": float(b.amount),
30+
"currency": b.currency,
31+
"next_due_date": b.next_due_date.isoformat(),
32+
"cadence": b.cadence.value,
33+
"channel_whatsapp": b.channel_whatsapp,
34+
"channel_email": b.channel_email,
35+
}
36+
for b in items
37+
]
38+
)
3239

3340

3441
@bp.post("")
@@ -71,5 +78,7 @@ def mark_paid(bill_id: int):
7178
b.active = False
7279
db.session.commit()
7380
cache_delete_patterns([f"user:{uid}:upcoming_bills*"])
74-
logger.info("Marked bill paid id=%s user=%s next_due_date=%s", b.id, uid, b.next_due_date)
81+
logger.info(
82+
"Marked bill paid id=%s user=%s next_due_date=%s", b.id, uid, b.next_due_date
83+
)
7584
return jsonify(message="updated")

packages/backend/app/routes/categories.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@
1212
@jwt_required()
1313
def list_categories():
1414
uid = int(get_jwt_identity())
15-
items = db.session.query(Category).filter_by(user_id=uid).order_by(Category.name).all()
15+
items = (
16+
db.session.query(Category).filter_by(user_id=uid).order_by(Category.name).all()
17+
)
1618
logger.info("List categories for user=%s count=%s", uid, len(items))
1719
return jsonify([{"id": c.id, "name": c.name} for c in items])
1820

packages/backend/app/routes/expenses.py

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,14 +47,20 @@ def create_expense():
4747
currency=data.get("currency", "USD"),
4848
category_id=data.get("category_id"),
4949
notes=data.get("notes"),
50-
spent_at=date.fromisoformat(data.get("spent_at")) if data.get("spent_at") else date.today(),
50+
spent_at=(
51+
date.fromisoformat(data.get("spent_at"))
52+
if data.get("spent_at")
53+
else date.today()
54+
),
5155
)
5256
db.session.add(e)
5357
db.session.commit()
5458
logger.info("Created expense id=%s user=%s amount=%s", e.id, uid, e.amount)
5559
# Invalidate caches
56-
cache_delete_patterns([
57-
monthly_summary_key(uid, e.spent_at.strftime("%Y-%m")),
58-
f"insights:{uid}:*",
59-
])
60+
cache_delete_patterns(
61+
[
62+
monthly_summary_key(uid, e.spent_at.strftime("%Y-%m")),
63+
f"insights:{uid}:*",
64+
]
65+
)
6066
return jsonify(id=e.id), 201

packages/backend/app/routes/reminders.py

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,25 @@
1414
@jwt_required()
1515
def list_reminders():
1616
uid = int(get_jwt_identity())
17-
items = db.session.query(Reminder).filter_by(user_id=uid).order_by(Reminder.send_at).all()
17+
items = (
18+
db.session.query(Reminder)
19+
.filter_by(user_id=uid)
20+
.order_by(Reminder.send_at)
21+
.all()
22+
)
1823
logger.info("List reminders user=%s count=%s", uid, len(items))
19-
return jsonify([
20-
{
21-
"id": r.id,
22-
"message": r.message,
23-
"send_at": r.send_at.isoformat(),
24-
"sent": r.sent,
25-
"channel": r.channel,
26-
}
27-
for r in items
28-
])
24+
return jsonify(
25+
[
26+
{
27+
"id": r.id,
28+
"message": r.message,
29+
"send_at": r.send_at.isoformat(),
30+
"sent": r.sent,
31+
"channel": r.channel,
32+
}
33+
for r in items
34+
]
35+
)
2936

3037

3138
@bp.post("")
@@ -52,7 +59,9 @@ def run_due():
5259
now = datetime.utcnow() + timedelta(minutes=1)
5360
items = (
5461
db.session.query(Reminder)
55-
.filter(Reminder.user_id == uid, Reminder.sent == False, Reminder.send_at <= now)
62+
.filter(
63+
Reminder.user_id == uid, Reminder.sent == False, Reminder.send_at <= now
64+
)
5665
.all()
5766
)
5867
for r in items:

packages/backend/app/services/ai.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,11 @@ def _heuristic_budget(uid: int, ym: str):
1818
year, month = map(int, ym.split("-"))
1919
total = (
2020
db.session.query(func.coalesce(func.sum(Expense.amount), 0))
21-
.filter(Expense.user_id == uid, extract("year", Expense.spent_at) == year, extract("month", Expense.spent_at) == month)
21+
.filter(
22+
Expense.user_id == uid,
23+
extract("year", Expense.spent_at) == year,
24+
extract("month", Expense.spent_at) == month,
25+
)
2226
.scalar()
2327
)
2428
# Suggest 90% of last spend with 50/30/20 breakdown
@@ -42,7 +46,11 @@ def monthly_budget_suggestion(uid: int, ym: str):
4246
year, month = map(int, ym.split("-"))
4347
rows = (
4448
db.session.query(Expense.category_id, func.sum(Expense.amount))
45-
.filter(Expense.user_id == uid, extract("year", Expense.spent_at) == year, extract("month", Expense.spent_at) == month)
49+
.filter(
50+
Expense.user_id == uid,
51+
extract("year", Expense.spent_at) == year,
52+
extract("month", Expense.spent_at) == month,
53+
)
4654
.group_by(Expense.category_id)
4755
.all()
4856
)

packages/backend/app/services/reminders.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,12 @@ def send_email(to_email: str, subject: str, body: str):
3737

3838

3939
def send_whatsapp(to_number: str, body: str):
40-
if not (_settings.twilio_account_sid and _settings.twilio_auth_token and _settings.twilio_whatsapp_from and TwilioClient):
40+
if not (
41+
_settings.twilio_account_sid
42+
and _settings.twilio_auth_token
43+
and _settings.twilio_whatsapp_from
44+
and TwilioClient
45+
):
4146
return False
4247
try:
4348
client = TwilioClient(_settings.twilio_account_sid, _settings.twilio_auth_token)

packages/backend/requirements.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,7 @@ requests==2.32.3
1313
openai==1.37.1
1414
twilio==9.3.2
1515
pytest==8.2.2
16+
black==24.8.0
17+
flake8==7.0.0
18+
bandit==1.7.9
19+

0 commit comments

Comments
 (0)