-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathurls.py
More file actions
134 lines (107 loc) · 3.72 KB
/
urls.py
File metadata and controls
134 lines (107 loc) · 3.72 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
from datetime import date, datetime
from fastapi import APIRouter, Depends, HTTPException, status
from fastapi.encoders import jsonable_encoder
from fastapi.responses import JSONResponse
from pydantic import ValidationError
import database
import event.crud
from dependencies import perm_admin
from event.models import Event, EventCreate, EventDelete, EventUpdate
from event.tables import EventDB
from utils.shared_models import DetailModel, SuccessResponse
router = APIRouter(
prefix="/event",
tags=["event"],
)
@router.get(
"",
description="Get all events",
response_model=list[Event],
operation_id="get_all_events",
)
async def get_all_events(
db_session: database.DBSession,
):
events_list = await event.crud.get_all_events(db_session)
return events_list
@router.get(
"/{year}",
description="Get events that start OR end in this year",
response_model=list[Event],
operation_id="get_events_for_this_year",
)
async def get_events_for_this_year(
db_session: database.DBSession,
year: int,
):
events_list = await event.crud.get_events_for_this_year(db_session, year)
return events_list
@router.get(
"/{year}/{month}",
description="Get events that start OR end in the given year and month",
response_model=list[Event],
operation_id="get_events_for_this_year_month",
)
async def get_events_for_this_year_month(db_session: database.DBSession, year: int, month: int):
events_list = await event.crud.get_events_for_this_year_month(db_session, year, month)
return events_list
@router.post(
"",
description="Create a new event",
response_model=Event,
status_code=status.HTTP_201_CREATED,
responses={
500: {"description": "failed to fetch new event", "model": DetailModel},
},
operation_id="create_event",
dependencies=[Depends(perm_admin)],
)
async def create_event(db_session: database.DBSession, body: EventCreate):
new_event = EventDB(**body.model_dump())
await event.crud.create_event(
db_session,
new_event,
)
await db_session.commit()
await db_session.refresh(new_event)
return new_event
@router.patch(
"/{eid}",
description="Update an Event detail",
response_model=Event,
responses={404: {"description": "Event doesn't exist."}},
operation_id="update_event",
dependencies=[Depends(perm_admin)],
)
async def update_event(db_session: database.DBSession, eid: int, body: EventUpdate):
db_event = await event.crud.get_event_by_eid(db_session, eid)
if db_event is None:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Event doesn't exist.")
db_data = Event.model_validate(db_event).model_dump()
patch_data = body.model_dump(exclude_unset=True)
merged_data = {**db_data, **patch_data}
try:
Event.model_validate(merged_data)
except ValidationError as e:
raise HTTPException(
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, detail=jsonable_encoder(e.errors())
) from e
for key, value in patch_data.items():
setattr(db_event, key, value)
await db_session.commit()
await db_session.refresh(db_event)
return db_event
@router.delete(
"/{eid}",
description="Delete an event",
response_model=EventDelete,
responses={404: {"description": "Event doesn't exist."}},
operation_id="delete_event",
dependencies=[Depends(perm_admin)],
)
async def delete_event(db_session: database.DBSession, eid: int):
rows_deleted = await event.crud.delete_event(db_session, eid)
if rows_deleted == 0:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Event doesn't exist.")
await db_session.commit()
return EventDelete(result=True, eid=eid)