11from typing import AsyncIterator , Never
2+
23from fastapi import APIRouter , FastAPI
34from fastapi .concurrency import asynccontextmanager
45from pydantic import BaseModel
56
7+ from app .components .todos .store import Todo , TodoDocument , Todos , TodoStatus , TodoStore
68from app .redis import redis
7- from app .components .todos .store import Todo , TodoDocument , TodoStatus , TodoStore , Todos
89
910todos = TodoStore (redis )
1011
12+
1113@asynccontextmanager
1214async def lifespan (_ : FastAPI ) -> AsyncIterator [Never ]:
1315 # before
@@ -16,35 +18,44 @@ async def lifespan(_: FastAPI) -> AsyncIterator[Never]:
1618 # after
1719 return
1820
21+
1922router = APIRouter (lifespan = lifespan )
2023
24+
2125@router .get ("/" , tags = ["todos" ])
2226async def all () -> Todos :
2327 return await todos .all ()
2428
29+
2530@router .get ("/search" , tags = ["todos" ])
2631async def search (name : str | None = None , status : TodoStatus | None = None ) -> Todos :
2732 return await todos .search (name , status )
2833
34+
2935@router .get ("/{id}" , tags = ["todos" ])
3036async def one (id : str ) -> Todo :
3137 return await todos .one (id )
3238
39+
3340class CreateTodo (BaseModel ):
3441 id : str | None = None
3542 name : str
3643
44+
3745@router .post ("/" , tags = ["todos" ])
3846async def create (todo : CreateTodo ) -> TodoDocument :
3947 return await todos .create (todo .id , todo .name )
4048
49+
4150class UpdateTodo (BaseModel ):
4251 status : TodoStatus
4352
53+
4454@router .patch ("/{id}" , tags = ["todos" ])
4555async def update (id : str , todo : UpdateTodo ) -> Todo :
4656 return await todos .update (id , todo .status )
4757
58+
4859@router .delete ("/{id}" , tags = ["todos" ])
4960async def delete (id : str ) -> None :
5061 return await todos .delete (id )
0 commit comments