Skip to content

Commit 8caf569

Browse files
committed
feat: add integrity check for requests
1 parent 7f82f03 commit 8caf569

3 files changed

Lines changed: 79 additions & 14 deletions

File tree

src/event/models.py

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from pydantic import BaseModel, ConfigDict
1+
from pydantic import BaseModel, ConfigDict, model_validator
22
import datetime
33

44
class Event(BaseModel):
@@ -31,6 +31,23 @@ class EventCreate(BaseModel):
3131
start_date: datetime.date | None = None
3232
end_date: datetime.date | None = None
3333

34+
@model_validator(mode="after")
35+
def validate_time_range(self) -> "EventCreate":
36+
if self.start_time >= self.end_time:
37+
raise ValueError("The event start must be before the event end")
38+
39+
if self.start_date and self.end_date:
40+
if self.start_date > self.end_date:
41+
raise ValueError("The event repeat start date must be before the end date")
42+
43+
if self.start_date and not self.end_date:
44+
raise ValueError("The event can't have start date but not end date")
45+
46+
if not self.start_date and self.end_date:
47+
raise ValueError("The event can't have end date but not start date")
48+
49+
return self
50+
3451
class EventUpdate(BaseModel):
3552
name: str | None = None
3653
start_time: datetime.datetime | None = None
@@ -40,6 +57,13 @@ class EventUpdate(BaseModel):
4057
start_date: datetime.date | None = None
4158
end_date: datetime.date | None = None
4259

60+
@model_validator(mode="after")
61+
def validate_time_range(self) -> "EventUpdate":
62+
if self.start_time and self.end_time:
63+
if self.start_time > self.end_time:
64+
raise ValueError("The event start time must be before end time")
65+
return self
66+
4367
class EventDelete(BaseModel):
4468
result: bool
4569
eid: int

src/event/tables.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,18 @@ class EventDB(Base):
2323
Text,
2424
nullable=True
2525
)
26-
name: Mapped[str] = mapped_column(String(64))
27-
start_time: Mapped[datetime] = mapped_column(DateTime(timezone=True))
28-
end_time: Mapped[datetime] = mapped_column(DateTime(timezone=True))
29-
repeat: Mapped[str] = mapped_column(String(64))
26+
name: Mapped[str] = mapped_column(
27+
String(64)
28+
)
29+
start_time: Mapped[datetime] = mapped_column(
30+
DateTime(timezone=True)
31+
)
32+
end_time: Mapped[datetime] = mapped_column(
33+
DateTime(timezone=True)
34+
)
35+
repeat: Mapped[str] = mapped_column(
36+
String(64)
37+
)
3038
start_date: Mapped[date] = mapped_column(
3139
Date,
3240
nullable=True

src/event/urls.py

Lines changed: 42 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,9 @@ async def get_events_for_this_year_month(
7474
description="Create a new event",
7575
response_model=Event,
7676
status_code=status.HTTP_201_CREATED,
77-
responses={500: {"description": "failed to fetch new event", "model": DetailModel}},
77+
responses={
78+
500: {"description": "failed to fetch new event", "model": DetailModel},
79+
},
7880
operation_id="create_event",
7981
# dependecies=[Depends()]
8082
)
@@ -108,22 +110,53 @@ async def update_event(
108110
eid: int,
109111
body: EventUpdate
110112
):
111-
event_info = await event.crud.get_event_by_eid(db_session, eid)
112-
113-
if event_info is None:
113+
db_event = await event.crud.get_event_by_eid(db_session, eid)
114+
if db_event is None:
114115
raise HTTPException(
115116
status_code=status.HTTP_404_NOT_FOUND,
116117
detail="Event doesn't exist."
117118
)
119+
120+
final_start_time = body.start_time if body.start_time is not None else db_event.start_time
121+
final_end_time = body.end_time if body.end_time is not None else db_event.end_time
122+
123+
if final_start_time > final_end_time:
124+
raise HTTPException(
125+
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
126+
detail="The event start time must be before the end time"
127+
)
118128

119-
updated_event = body.model_dump(exclude_unset=True)
120-
for key, value in updated_event.items():
121-
setattr(event_info, key, value)
129+
if not body.start_date and body.end_date:
130+
if not db_event.start_date:
131+
raise HTTPException(
132+
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
133+
detail="The event start date and event end date must be initilized at the same time"
134+
)
135+
if db_event.start_date > body.end_date:
136+
raise HTTPException(
137+
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
138+
detail="The event start date must be before the event end date"
139+
)
140+
if body.start_date and not body.end_date:
141+
if not db_event.end_date:
142+
raise HTTPException(
143+
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
144+
detail="The event start date and event end date must be initilized at the same time"
145+
)
146+
if body.start_date > db_event.end_date:
147+
raise HTTPException(
148+
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
149+
detail="The event start date must be before the event end date"
150+
)
151+
152+
updated_data = body.model_dump(exclude_unset=True)
153+
for key, value in updated_data.items():
154+
setattr(db_event, key, value)
122155

123156
await db_session.commit()
124-
await db_session.refresh(event_info)
157+
await db_session.refresh(db_event)
125158

126-
return event_info
159+
return db_event
127160

128161

129162

0 commit comments

Comments
 (0)