Skip to content

Commit 13e8214

Browse files
committed
❇️ [refactor][backend] Payment to Event internal renames
1 parent 5cf26be commit 13e8214

13 files changed

Lines changed: 194 additions & 194 deletions

File tree

backend/kayman/crud/event.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
from collections.abc import Sequence
2+
from datetime import date
3+
4+
from sqlmodel import Session, func, select
5+
6+
from kayman.schemas.event import (
7+
Event,
8+
EventBase,
9+
EventCreate,
10+
PaymentEntry,
11+
)
12+
13+
14+
def create_event(
15+
session: Session, event: EventCreate, commit: bool = True
16+
) -> EventBase:
17+
db_event = Event.model_validate(event)
18+
session.add(db_event)
19+
if commit:
20+
session.commit()
21+
session.refresh(db_event)
22+
else:
23+
session.flush()
24+
return db_event
25+
26+
27+
def read_event(session: Session, event_id: int) -> Event | None:
28+
return session.get(Event, event_id)
29+
30+
31+
def read_events(
32+
session: Session, event_date: date | None = None, category_id: int | None = None
33+
) -> Sequence[Event]:
34+
scalar = select(Event).distinct()
35+
if event_date:
36+
scalar = scalar.where(func.date(Event.timestamp) == event_date)
37+
if category_id:
38+
scalar = scalar.join(PaymentEntry).where(
39+
PaymentEntry.category_id == category_id
40+
)
41+
events = session.exec(scalar).all()
42+
return events

backend/kayman/crud/payment.py

Lines changed: 0 additions & 42 deletions
This file was deleted.

backend/kayman/routers/payment.py

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,15 @@
77

88
from kayman.auth import get_client
99
from kayman.core.db import get_session
10-
from kayman.crud.payment import (
11-
create_payment,
12-
read_payment,
13-
read_payments,
10+
from kayman.crud.event import (
11+
create_event,
12+
read_event,
13+
read_events,
1414
)
1515
from kayman.crud.payment_entry import create_payment_entries
1616
from kayman.crud.transaction import create_transactions
1717
from kayman.logics.account import update_balances_with_transactions
18-
from kayman.logics.payment import validate_total
18+
from kayman.logics.event import validate_total
1919
from kayman.schemas.api_models import PaymentCreateDetailed, PaymentReadDetailed
2020
from kayman.schemas.event import (
2121
Event,
@@ -264,9 +264,9 @@ def create(
264264
except ValueError as err:
265265
raise HTTPException(status_code=400, detail=err.args[0]) from err
266266

267-
# Store payment
268-
db_payment = create_payment(session, body.payment, commit=False)
269-
payment_id = EventRead.model_validate(db_payment).id
267+
# Store event
268+
db_event = create_event(session, body.payment, commit=False)
269+
event_id = EventRead.model_validate(db_event).id
270270

271271
# Store entries
272272
entries = []
@@ -275,7 +275,7 @@ def create(
275275
PaymentEntryBase.model_validate(
276276
entry_create,
277277
update={
278-
"payment_id": payment_id,
278+
"payment_id": event_id,
279279
"index": entry_index,
280280
},
281281
)
@@ -289,7 +289,7 @@ def create(
289289
TransactionBase.model_validate(
290290
transaction,
291291
update={
292-
"payment_id": payment_id,
292+
"payment_id": event_id,
293293
"index": transaction_index,
294294
},
295295
)
@@ -299,25 +299,25 @@ def create(
299299
# Modify account balance
300300
update_balances_with_transactions(session, body.transactions, commit=False)
301301

302-
# Read the new payment
303-
new_payment = read_payment(session, payment_id)
304-
if new_payment is None:
302+
# Read the new event
303+
new_event = read_event(session, event_id)
304+
if new_event is None:
305305
raise HTTPException(status_code=500, detail="Failed to create payment")
306306

307307
# Commit all changes
308308
session.commit()
309309

310-
return new_payment
310+
return new_event
311311

312312

313313
@payment_router.get(
314314
"/{payment_id}", name="Read Payment", response_model=PaymentReadDetailed
315315
)
316316
def read(*, session: Session = Depends(get_session), payment_id: int) -> EventBase:
317-
payment = read_payment(session, payment_id)
318-
if payment is None:
317+
event = read_event(session, payment_id)
318+
if event is None:
319319
raise HTTPException(status_code=404, detail="Payment not found")
320-
return payment
320+
return event
321321

322322

323323
@payment_router.get("", name="Read Payments", response_model=list[PaymentReadDetailed])
@@ -327,21 +327,21 @@ def reads(
327327
payment_date: date | None = None,
328328
category_id: int | None = None,
329329
) -> Sequence[EventBase]:
330-
return read_payments(session, payment_date, category_id)
330+
return read_events(session, payment_date, category_id)
331331

332332

333333
@payment_router.patch("", name="Update Payment", response_model=EventRead)
334-
def update(*, session: Session = Depends(get_session), payment: Event) -> EventBase:
335-
session.merge(payment)
334+
def update(*, session: Session = Depends(get_session), event: Event) -> EventBase:
335+
session.merge(event)
336336
session.commit()
337-
session.refresh(payment)
338-
return payment
337+
session.refresh(event)
338+
return event
339339

340340

341341
@payment_router.delete("/{id}", name="Delete Payment")
342342
def delete(*, session: Session = Depends(get_session), id: int) -> None:
343-
payment = session.get(Event, id)
344-
if payment is None:
343+
event = session.get(Event, id)
344+
if event is None:
345345
raise HTTPException(status_code=404, detail="Payment not found")
346-
session.delete(payment)
346+
session.delete(event)
347347
session.commit()
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
from datetime import datetime
2+
3+
from sqlmodel import Session
4+
5+
from kayman.crud.event import create_event, read_event, read_events
6+
from kayman.tests.factories import (
7+
CategoryFactory,
8+
EventFactory,
9+
PaymentEntryFactory,
10+
)
11+
12+
13+
def test_create_event(session: Session, session_2: Session):
14+
event = EventFactory.build()
15+
db_event = create_event(session, event)
16+
db_read_event = read_event(session_2, db_event.id)
17+
18+
assert db_read_event.id is not None
19+
assert db_read_event.description == event.description
20+
assert db_read_event.timestamp == event.timestamp
21+
assert db_read_event.timezone == event.timezone
22+
assert db_read_event.type == event.type
23+
24+
25+
def test_create_event_no_commit(session: Session, session_2: Session):
26+
event = EventFactory.build()
27+
28+
# The event should be created in the session
29+
session_event = create_event(session, event, commit=False)
30+
assert session_event.id is not None # Auto int should be set
31+
assert session_event.description == event.description
32+
assert session_event.timestamp == event.timestamp
33+
assert session_event.timezone == event.timezone
34+
assert session_event.type == event.type
35+
36+
# The event should not be visible to other sessions (yet)
37+
session_2_event = read_event(session_2, session_event.id)
38+
assert session_2_event is None
39+
40+
# Commit the event from main session
41+
session.commit()
42+
43+
# The event should now be visible to other sessions
44+
session_3_event = read_event(session_2, session_event.id)
45+
assert session_3_event is not None
46+
assert session_3_event.id == session_event.id
47+
assert session_3_event.description == session_event.description
48+
assert session_3_event.timestamp == session_event.timestamp
49+
assert session_3_event.timezone == session_event.timezone
50+
assert session_3_event.type == session_event.type
51+
52+
53+
def test_read_event(session: Session):
54+
event = EventFactory()
55+
assert read_event(session, event.id) == event
56+
57+
58+
def test_read_events_all(session: Session):
59+
for _ in range(10):
60+
EventFactory()
61+
62+
assert len(read_events(session)) == 10
63+
64+
65+
def test_read_events_by_date(session: Session):
66+
EventFactory(timestamp=datetime(2025, 1, 1))
67+
EventFactory(timestamp=datetime(2025, 1, 2))
68+
69+
assert len(read_events(session, event_date="2025-01-01")) == 1
70+
assert len(read_events(session, event_date="2025-01-02")) == 1
71+
72+
73+
def test_read_events_by_category(session: Session):
74+
category_1 = CategoryFactory()
75+
category_2 = CategoryFactory()
76+
category_3 = CategoryFactory()
77+
event_1 = EventFactory(
78+
entries=[
79+
PaymentEntryFactory(category=category_1),
80+
PaymentEntryFactory(category=category_2),
81+
]
82+
)
83+
event_2 = EventFactory(
84+
entries=[
85+
PaymentEntryFactory(category=category_1),
86+
PaymentEntryFactory(category=category_3),
87+
]
88+
)
89+
90+
events = read_events(session, category_id=category_1.id)
91+
event_ids = {event.id for event in events}
92+
assert len(events) == 2
93+
assert event_1.id in event_ids
94+
assert event_2.id in event_ids
95+
96+
events = read_events(session, category_id=category_2.id)
97+
assert len(events) == 1
98+
assert events[0].id == event_1.id
99+
100+
events = read_events(session, category_id=category_3.id)
101+
assert len(events) == 1
102+
assert events[0].id == event_2.id

0 commit comments

Comments
 (0)