Skip to content

Commit ba1f917

Browse files
committed
Update code
1 parent 3e4c8a4 commit ba1f917

File tree

5 files changed

+103
-138
lines changed

5 files changed

+103
-138
lines changed

ch06/planner/main.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from fastapi import FastAPI
22
from fastapi.responses import RedirectResponse
3+
from database.database import Settings
34

45
from routes.users import user_router
56
from routes.events import event_router
@@ -8,11 +9,16 @@
89

910
app = FastAPI()
1011

12+
settings = Settings()
13+
1114
# Register routes
1215

1316
app.include_router(user_router, prefix="/user")
1417
app.include_router(event_router, prefix="/event")
1518

19+
@app.on_event("startup")
20+
async def init_db():
21+
await settings.initialize_database()
1622

1723
@app.get("/")
1824
async def home():

ch06/planner/models/events.py

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1-
from typing import List
2-
1+
from beanie import Document
2+
from typing import Optional, List
33
from pydantic import BaseModel
44

55

6-
class Event(BaseModel):
7-
id: int
6+
class Event(Document):
87
title: str
98
image: str
109
description: str
@@ -21,3 +20,25 @@ class Config:
2120
"location": "Google Meet"
2221
}
2322
}
23+
24+
class Collection:
25+
name = "events"
26+
27+
28+
class EventUpdate(BaseModel):
29+
title: Optional[str]
30+
image: Optional[str]
31+
description: Optional[str]
32+
tags: Optional[List[str]]
33+
location: Optional[str]
34+
35+
class Config:
36+
schema_extra = {
37+
"example": {
38+
"title": "FastAPI BookLaunch",
39+
"image": "https://linktomyimage.com/image.png",
40+
"description": "We will be discussing the contents of the FastAPI book in this event.Ensure to come with your own copy to win gifts!",
41+
"tags": ["python", "fastapi", "book", "launch"],
42+
"location": "Google Meet"
43+
}
44+
}

ch06/planner/models/users.py

Lines changed: 7 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,58 +1,28 @@
11
from typing import Optional, List
2+
from beanie import Document, Link
23

3-
from fastapi import Form
44
from pydantic import BaseModel, EmailStr
55

66
from models.events import Event
77

88

9-
class User(BaseModel):
9+
class User(Document):
1010
email: EmailStr
11-
username: str
12-
events: Optional[List[Event]]
11+
password: str
12+
events: Optional[List[Link[Event]]]
1313

14-
@classmethod
15-
def as_form(
16-
cls,
17-
email: EmailStr = Form(...),
18-
username: str = Form(...),
19-
password: str = Form(...)
20-
):
21-
return cls(email=email, username=username, password=password)
14+
class Collection:
15+
name = "users"
2216

2317
class Config:
2418
schema_extra = {
2519
"example": {
2620
"email": "fastapi@packt.com",
27-
"username": "fastapipackt001",
21+
"password": "strong!!!",
2822
"events": [],
2923
}
3024
}
3125

32-
33-
class NewUser(User):
34-
password: str
35-
36-
class Config:
37-
schema_extra = {
38-
"example": {
39-
"email": "fastapi@packt.com",
40-
"password": "Stro0ng!",
41-
"username": "FastPackt"
42-
}
43-
}
44-
45-
4626
class UserSignIn(BaseModel):
4727
email: EmailStr
4828
password: str
49-
50-
@classmethod
51-
def as_form(
52-
cls,
53-
email: EmailStr = Form(...),
54-
password: str = Form(...)
55-
):
56-
return cls(email=email, password=password)
57-
58-

ch06/planner/routes/events.py

Lines changed: 41 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,66 +1,60 @@
1-
from fastapi import APIRouter, Body, HTTPException, Request, status
2-
from fastapi.responses import HTMLResponse
3-
from fastapi.templating import Jinja2Templates
1+
from urllib import response
2+
from beanie import PydanticObjectId
3+
from fastapi import APIRouter, HTTPException, status
4+
from database.database import Database
45

5-
from models.events import Event
6+
from models.events import Event, EventUpdate
67
from typing import List
78

89
event_router = APIRouter(
910
tags=["Events"]
1011
)
1112

12-
templates = Jinja2Templates(directory="templates/")
13+
event_database = Database(Event)
1314

14-
events = []
15+
@event_router.get("/", response_model=List[Event])
16+
async def retrieve_all_events():
17+
events = await event_database.get_all()
18+
return events
1519

1620

17-
@event_router.get("/", response_class=HTMLResponse)
18-
async def retrieve_all_events(request: Request):
19-
return templates.TemplateResponse(
20-
"event.html",
21-
{
22-
"request": request,
23-
"events": events
24-
}
25-
)
26-
27-
28-
@event_router.get("/{id}", response_class=HTMLResponse)
29-
async def retrieve_event(id: int, request: Request):
30-
for event in events:
31-
if event.id == id:
32-
return templates.TemplateResponse(
33-
"event.html",
34-
{
35-
"request": request,
36-
"event": event
37-
}
38-
)
39-
40-
raise HTTPException(
41-
status_code=status.HTTP_404_NOT_FOUND,
42-
detail="Event with supplied ID does not exist"
43-
)
21+
@event_router.get("/{id}", response_model=Event)
22+
async def retrieve_event(id: PydanticObjectId):
23+
event = await event_database.get(id)
24+
if not event:
25+
raise HTTPException(
26+
status_code=status.HTTP_404_NOT_FOUND,
27+
detail="Event with supplied ID does not exist"
28+
)
29+
return event
4430

4531

4632
@event_router.post("/new")
47-
async def create_event(body: Event = Body(...)):
48-
events.append(body)
33+
async def create_event(body: Event):
34+
await event_database.save(body)
4935
return {
5036
"message": "Event created successfully"
5137
}
5238

39+
@event_router.put("/{id}", response_model=Event)
40+
async def update_event(id: PydanticObjectId, body: EventUpdate):
41+
updated_event = await event_database.update(id, body)
42+
if not updated_event:
43+
raise HTTPException(
44+
status_code=status.HTTP_404_NOT_FOUND,
45+
detail="Event with supplied ID does not exist"
46+
)
47+
return updated_event
5348

54-
@event_router.delete("/{id}")
55-
async def delete_event(id: int):
56-
for event in events:
57-
if event.id == id:
58-
events.remove(event)
59-
return {
60-
"message": "Event deleted successfully"
61-
}
6249

63-
raise HTTPException(
64-
status_code=status.HTTP_404_NOT_FOUND,
65-
detail="Event with supplied ID does not exist"
66-
)
50+
@event_router.delete("/{id}")
51+
async def delete_event(id: PydanticObjectId):
52+
event = await event_database.delete(id)
53+
if not event:
54+
raise HTTPException(
55+
status_code=status.HTTP_404_NOT_FOUND,
56+
detail="Event with supplied ID does not exist"
57+
)
58+
return {
59+
"message": "Event deleted successfully."
60+
}

ch06/planner/routes/users.py

Lines changed: 24 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,69 +1,43 @@
1-
from fastapi import APIRouter, HTTPException, Request, status, Depends
2-
from fastapi.templating import Jinja2Templates
1+
from fastapi import APIRouter, HTTPException, status
2+
from database.database import Database
33

4-
from models.users import NewUser, UserSignIn
4+
from models.users import User, UserSignIn
55

66
user_router = APIRouter(
77
tags=["User"],
88
)
99

10-
users = {}
11-
templates = Jinja2Templates(directory="templates/")
12-
10+
user_database = Database(User)
1311

1412
@user_router.post("/signup")
15-
async def sign_user_up(request: Request, data: NewUser = Depends(NewUser.as_form)):
16-
if data.email in users:
13+
async def sign_user_up(user: User):
14+
user_exist = await User.find_one(User.email == user.email)
15+
print(user_exist)
16+
if user_exist:
1717
raise HTTPException(
1818
status_code=status.HTTP_409_CONFLICT,
19-
detail="User with supplied username exists"
19+
detail="User with email provided exists already."
2020
)
21-
22-
users[data.email] = data
23-
24-
return templates.TemplateResponse("user.html", {
25-
"request": request,
26-
"signed_in": True,
27-
})
21+
await user_database.save(user)
22+
return {
23+
"message": "User created successfully"
24+
}
2825

2926

3027
@user_router.post("/signin")
31-
async def sign_user_in(request: Request, user: UserSignIn = Depends(UserSignIn.as_form)):
32-
if user.email not in users:
28+
async def sign_user_in(user: UserSignIn):
29+
user_exist = await User.find_one(User.email == user.email)
30+
if not user_exist:
3331
raise HTTPException(
3432
status_code=status.HTTP_404_NOT_FOUND,
35-
detail="User does not exist"
36-
)
37-
38-
if users[user.email].password != user.password:
39-
raise HTTPException(
40-
status_code=status.HTTP_403_FORBIDDEN,
41-
detail="Wrong credential passed"
33+
detail="User with email does not exist."
4234
)
43-
return templates.TemplateResponse(
44-
"index.html",
45-
{
46-
"request": request,
47-
"signed_in": True
48-
}
49-
)
50-
51-
52-
@user_router.get("/")
53-
async def render_login_page(request: Request):
54-
return templates.TemplateResponse(
55-
"user.html", {
56-
"request": request,
57-
"sign_in": True
58-
}
59-
)
60-
61-
62-
@user_router.get("/signup")
63-
async def render_signup_page(request: Request):
64-
return templates.TemplateResponse(
65-
"user.html", {
66-
"request": request,
67-
"sign_in": False
35+
if user_exist.password == user.password:
36+
return {
37+
"message": "User signed in successfully."
6838
}
39+
40+
raise HTTPException(
41+
status_code=status.HTTP_401_UNAUTHORIZED,
42+
detail="Invalid details passed."
6943
)

0 commit comments

Comments
 (0)