-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
91 lines (79 loc) · 2.95 KB
/
main.py
File metadata and controls
91 lines (79 loc) · 2.95 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
from fastapi import FastAPI,HTTPException
from pydantic import BaseModel,Field
from typing import Optional,List
app=FastAPI()
#pydantic model (data schema)
class Todo(BaseModel):
id: int
title:str
description: Optional[str]=None
completed: bool=False #added completed field to compare with incoming request having query paramater 'completed'
class TodoCreate(BaseModel):
title: str = Field(...,min_length=1,description="Title cannot be empty") #Validation enhance using pydantic models.
description: Optional[str]=None
class TodoUpdate(BaseModel):
title: Optional[str]=None
description: Optional[str]=None
#In-Memory data store
todos=[] #acts like a mock database
#CRUD Routes
#Read all
@app.get("/todos",response_model=List[Todo])
def get_todos(completed:Optional[bool]=None, limit:Optional[int]=None,skip:Optional[int]=None):
#Temporary dummy filter since we dont have 'completed' field yet
results=todos
#Simulate skip and limit(like pagination)
if skip:
results=results[skip:]
if limit:
results=results[:limit]
if completed is not None:
results=[todo for todo in results if todo.completed==completed]
return results
#Read one by ID
@app.get("/todos/{item_id}",response_model=Todo)
def get_todo(item_id: int):
for todo in todos:
if todo.id==item_id:
return todo
raise HTTPException(status_code=404,detail="To-do not found")
#Read by adding path parameter
@app.get("/users/{user_id}/items/{item_id}")
def get_user_item(user_id: int,item_id:int):
return {"user_id":user_id,
"item_id":item_id,
"message":f"User {user_id} requested item {item_id}"}
#create
@app.post("/todos",response_model=Todo)
def create_todo(todo_data: TodoCreate):
new_id=len(todos)+1
new_todo=Todo(id=new_id,**todo_data.model_dump())
todos.append(new_todo)
return new_todo
#Update (PUT-full replacement)
@app.put("/todos/{item_id}",response_model=Todo)
def update_todo(item_id:int,updated_todo:TodoCreate):
for i,todo in enumerate(todos):
if todo.id==item_id:
todos[i]=Todo(id=item_id,**updated_todo.model_dump())
return todos[i]
raise HTTPException(status_code=404,detail="To-do not found")
#Partial update (Patch)
@app.patch("/todos/{item_id}",response_model=Todo)
def patch_todo(item_id: int,patch_data:TodoUpdate):
for todo in todos:
if todo.id==item_id:
if patch_data.title is not None:
todo.title=patch_data.title
if patch_data.description is not None:
todo.description=patch_data.description
return todo
raise HTTPException(status_code=404,detail="To-do not found")
#Delete
@app.delete("/todos/{item_id}")
def delete_todo(item_id:int):
for i,todo in enumerate(todos):
if todo.id==item_id:
del todos[i]
return {"message":"To-do deleted successfully"}
raise HTTPException(status_code=404,detail="To-do not found")