Skip to content

Commit 79a97e3

Browse files
committed
migrate codebase to fastcrud 0.19.0
1 parent a07ba3e commit 79a97e3

File tree

14 files changed

+774
-785
lines changed

14 files changed

+774
-785
lines changed

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ dependencies = [
2828
"arq>=0.25.0",
2929
"bcrypt>=4.1.1",
3030
"psycopg2-binary>=2.9.9",
31-
"fastcrud>=0.15.5",
31+
"fastcrud>=0.19.0",
3232
"crudadmin>=0.4.2",
3333
"gunicorn>=23.0.0",
3434
"ruff>=0.11.13",

src/app/api/dependencies.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323

2424
async def get_current_user(
2525
token: Annotated[str, Depends(oauth2_scheme)], db: Annotated[AsyncSession, Depends(async_get_db)]
26-
) -> dict[str, Any] | None:
26+
) -> dict[str, Any]:
2727
token_data = await verify_token(token, TokenType.ACCESS, db)
2828
if token_data is None:
2929
raise UnauthorizedException("User not authenticated.")
@@ -34,10 +34,7 @@ async def get_current_user(
3434
user = await crud_users.get(db=db, username=token_data.username_or_email, is_deleted=False)
3535

3636
if user:
37-
if hasattr(user, 'model_dump'):
38-
return user.model_dump()
39-
else:
40-
return user
37+
return user
4138

4239
raise UnauthorizedException("User not authenticated.")
4340

src/app/api/v1/posts.py

Lines changed: 39 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from typing import Annotated, Any, cast
2+
23
from fastapi import APIRouter, Depends, Request
34
from fastcrud import PaginatedListResponse, compute_offset, paginated_response
45
from sqlalchemy.ext.asyncio import AsyncSession
@@ -22,28 +23,30 @@ async def write_post(
2223
post: PostCreate,
2324
current_user: Annotated[dict, Depends(get_current_user)],
2425
db: Annotated[AsyncSession, Depends(async_get_db)],
25-
) -> PostRead:
26-
db_user = await crud_users.get(
27-
db=db, username=username, is_deleted=False, schema_to_select=UserRead, return_as_model=True
28-
)
26+
) -> dict[str, Any]:
27+
db_user = await crud_users.get(db=db, username=username, is_deleted=False, schema_to_select=UserRead)
2928
if db_user is None:
3029
raise NotFoundException("User not found")
3130

32-
db_user = cast(UserRead, db_user)
33-
if current_user["id"] != db_user.id:
31+
db_user = cast(dict[str, Any], db_user)
32+
33+
if current_user["id"] != db_user["id"]:
3434
raise ForbiddenException()
3535

3636
post_internal_dict = post.model_dump()
37-
post_internal_dict["created_by_user_id"] = db_user.id
37+
post_internal_dict["created_by_user_id"] = db_user["id"]
3838

3939
post_internal = PostCreateInternal(**post_internal_dict)
4040
created_post = await crud_posts.create(db=db, object=post_internal)
4141

42-
post_read = await crud_posts.get(db=db, id=created_post.id, schema_to_select=PostRead)
42+
if created_post is None:
43+
raise NotFoundException("Failed to create post")
44+
45+
post_read = await crud_posts.get(db=db, id=created_post["id"], schema_to_select=PostRead)
4346
if post_read is None:
4447
raise NotFoundException("Created post not found")
4548

46-
return cast(PostRead, post_read)
49+
return cast(dict[str, Any], post_read)
4750

4851

4952
@router.get("/{username}/posts", response_model=PaginatedListResponse[PostRead])
@@ -59,22 +62,16 @@ async def read_posts(
5962
page: int = 1,
6063
items_per_page: int = 10,
6164
) -> dict:
62-
db_user = await crud_users.get(
63-
db=db,
64-
username=username,
65-
is_deleted=False,
66-
schema_to_select=UserRead,
67-
return_as_model=True
68-
)
65+
db_user = await crud_users.get(db=db, username=username, is_deleted=False, schema_to_select=UserRead)
6966
if not db_user:
7067
raise NotFoundException("User not found")
7168

72-
db_user = cast(UserRead, db_user)
69+
db_user = cast(dict[str, Any], db_user)
7370
posts_data = await crud_posts.get_multi(
7471
db=db,
7572
offset=compute_offset(page, items_per_page),
7673
limit=items_per_page,
77-
created_by_user_id=db_user.id,
74+
created_by_user_id=db_user["id"],
7875
is_deleted=False,
7976
)
8077

@@ -86,25 +83,20 @@ async def read_posts(
8683
@cache(key_prefix="{username}_post_cache", resource_id_name="id")
8784
async def read_post(
8885
request: Request, username: str, id: int, db: Annotated[AsyncSession, Depends(async_get_db)]
89-
) -> PostRead:
90-
db_user = await crud_users.get(
91-
db=db,
92-
username=username,
93-
is_deleted=False,
94-
schema_to_select=UserRead,
95-
return_as_model=True
96-
)
86+
) -> dict[str, Any]:
87+
db_user = await crud_users.get(db=db, username=username, is_deleted=False, schema_to_select=UserRead)
9788
if db_user is None:
9889
raise NotFoundException("User not found")
9990

100-
db_user = cast(UserRead, db_user)
91+
db_user = cast(dict[str, Any], db_user)
92+
10193
db_post = await crud_posts.get(
102-
db=db, id=id, created_by_user_id=db_user.id, is_deleted=False, schema_to_select=PostRead
94+
db=db, id=id, created_by_user_id=db_user["id"], is_deleted=False, schema_to_select=PostRead
10395
)
10496
if db_post is None:
10597
raise NotFoundException("Post not found")
10698

107-
return cast(PostRead, db_post)
99+
return cast(dict[str, Any], db_post)
108100

109101

110102
@router.patch("/{username}/post/{id}")
@@ -117,24 +109,21 @@ async def patch_post(
117109
current_user: Annotated[dict, Depends(get_current_user)],
118110
db: Annotated[AsyncSession, Depends(async_get_db)],
119111
) -> dict[str, str]:
120-
db_user = await crud_users.get(
121-
db=db,
122-
username=username,
123-
is_deleted=False,
124-
schema_to_select=UserRead,
125-
return_as_model=True
126-
)
112+
db_user = await crud_users.get(db=db, username=username, is_deleted=False, schema_to_select=UserRead)
127113
if db_user is None:
128114
raise NotFoundException("User not found")
129115

130-
db_user = cast(UserRead, db_user)
131-
if current_user["id"] != db_user.id:
116+
db_user = cast(dict[str, Any], db_user)
117+
118+
if current_user["id"] != db_user["id"]:
132119
raise ForbiddenException()
133120

134121
db_post = await crud_posts.get(db=db, id=id, is_deleted=False, schema_to_select=PostRead)
135122
if db_post is None:
136123
raise NotFoundException("Post not found")
137124

125+
db_post = cast(dict[str, Any], db_post)
126+
138127
await crud_posts.update(db=db, object=values, id=id)
139128
return {"message": "Post updated"}
140129

@@ -148,24 +137,21 @@ async def erase_post(
148137
current_user: Annotated[dict, Depends(get_current_user)],
149138
db: Annotated[AsyncSession, Depends(async_get_db)],
150139
) -> dict[str, str]:
151-
db_user = await crud_users.get(
152-
db=db,
153-
username=username,
154-
is_deleted=False,
155-
schema_to_select=UserRead,
156-
return_as_model=True
157-
)
140+
db_user = await crud_users.get(db=db, username=username, is_deleted=False, schema_to_select=UserRead)
158141
if db_user is None:
159142
raise NotFoundException("User not found")
160143

161-
db_user = cast(UserRead, db_user)
162-
if current_user["id"] != db_user.id:
144+
db_user = cast(dict[str, Any], db_user)
145+
146+
if current_user["id"] != db_user["id"]:
163147
raise ForbiddenException()
164148

165149
db_post = await crud_posts.get(db=db, id=id, is_deleted=False, schema_to_select=PostRead)
166150
if db_post is None:
167151
raise NotFoundException("Post not found")
168152

153+
db_post = cast(dict[str, Any], db_post)
154+
169155
await crud_posts.delete(db=db, id=id)
170156

171157
return {"message": "Post deleted"}
@@ -176,19 +162,17 @@ async def erase_post(
176162
async def erase_db_post(
177163
request: Request, username: str, id: int, db: Annotated[AsyncSession, Depends(async_get_db)]
178164
) -> dict[str, str]:
179-
db_user = await crud_users.get(
180-
db=db,
181-
username=username,
182-
is_deleted=False,
183-
schema_to_select=UserRead,
184-
return_as_model=True
185-
)
165+
db_user = await crud_users.get(db=db, username=username, is_deleted=False, schema_to_select=UserRead)
186166
if db_user is None:
187167
raise NotFoundException("User not found")
188168

169+
db_user = cast(dict[str, Any], db_user)
170+
189171
db_post = await crud_posts.get(db=db, id=id, is_deleted=False, schema_to_select=PostRead)
190172
if db_post is None:
191173
raise NotFoundException("Post not found")
192174

175+
db_post = cast(dict[str, Any], db_post)
176+
193177
await crud_posts.db_delete(db=db, id=id)
194-
return {"message": "Post deleted from the database"}
178+
return {"message": "Post deleted from the database"}

src/app/api/v1/rate_limits.py

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,16 @@
1818
@router.post("/tier/{tier_name}/rate_limit", dependencies=[Depends(get_current_superuser)], status_code=201)
1919
async def write_rate_limit(
2020
request: Request, tier_name: str, rate_limit: RateLimitCreate, db: Annotated[AsyncSession, Depends(async_get_db)]
21-
) -> RateLimitRead:
21+
) -> dict[str, Any]:
2222
db_tier = await crud_tiers.get(db=db, name=tier_name, schema_to_select=TierRead)
2323
if not db_tier:
2424
raise NotFoundException("Tier not found")
2525

26-
db_tier = cast(TierRead, db_tier)
26+
db_tier = cast(dict[str, Any], db_tier)
27+
28+
db_tier = cast(dict[str, Any], db_tier)
2729
rate_limit_internal_dict = rate_limit.model_dump()
28-
rate_limit_internal_dict["tier_id"] = db_tier.id
30+
rate_limit_internal_dict["tier_id"] = db_tier["id"]
2931

3032
db_rate_limit = await crud_rate_limits.exists(db=db, name=rate_limit_internal_dict["name"])
3133
if db_rate_limit:
@@ -34,11 +36,14 @@ async def write_rate_limit(
3436
rate_limit_internal = RateLimitCreateInternal(**rate_limit_internal_dict)
3537
created_rate_limit = await crud_rate_limits.create(db=db, object=rate_limit_internal)
3638

37-
rate_limit_read = await crud_rate_limits.get(db=db, id=created_rate_limit.id, schema_to_select=RateLimitRead)
39+
if created_rate_limit is None:
40+
raise NotFoundException("Failed to create rate limit")
41+
42+
rate_limit_read = await crud_rate_limits.get(db=db, id=created_rate_limit["id"], schema_to_select=RateLimitRead)
3843
if rate_limit_read is None:
3944
raise NotFoundException("Created rate limit not found")
4045

41-
return cast(RateLimitRead, rate_limit_read)
46+
return cast(dict[str, Any], rate_limit_read)
4247

4348

4449
@router.get("/tier/{tier_name}/rate_limits", response_model=PaginatedListResponse[RateLimitRead])
@@ -53,12 +58,13 @@ async def read_rate_limits(
5358
if not db_tier:
5459
raise NotFoundException("Tier not found")
5560

56-
db_tier = cast(TierRead, db_tier)
61+
db_tier = cast(dict[str, Any], db_tier)
62+
5763
rate_limits_data = await crud_rate_limits.get_multi(
5864
db=db,
5965
offset=compute_offset(page, items_per_page),
6066
limit=items_per_page,
61-
tier_id=db_tier.id,
67+
tier_id=db_tier["id"],
6268
)
6369

6470
response: dict[str, Any] = paginated_response(crud_data=rate_limits_data, page=page, items_per_page=items_per_page)
@@ -68,17 +74,18 @@ async def read_rate_limits(
6874
@router.get("/tier/{tier_name}/rate_limit/{id}", response_model=RateLimitRead)
6975
async def read_rate_limit(
7076
request: Request, tier_name: str, id: int, db: Annotated[AsyncSession, Depends(async_get_db)]
71-
) -> RateLimitRead:
77+
) -> dict[str, Any]:
7278
db_tier = await crud_tiers.get(db=db, name=tier_name, schema_to_select=TierRead)
7379
if not db_tier:
7480
raise NotFoundException("Tier not found")
7581

76-
db_tier = cast(TierRead, db_tier)
77-
db_rate_limit = await crud_rate_limits.get(db=db, tier_id=db_tier.id, id=id, schema_to_select=RateLimitRead)
82+
db_tier = cast(dict[str, Any], db_tier)
83+
84+
db_rate_limit = await crud_rate_limits.get(db=db, tier_id=db_tier["id"], id=id, schema_to_select=RateLimitRead)
7885
if db_rate_limit is None:
7986
raise NotFoundException("Rate Limit not found")
8087

81-
return cast(RateLimitRead, db_rate_limit)
88+
return cast(dict[str, Any], db_rate_limit)
8289

8390

8491
@router.patch("/tier/{tier_name}/rate_limit/{id}", dependencies=[Depends(get_current_superuser)])
@@ -93,8 +100,9 @@ async def patch_rate_limit(
93100
if not db_tier:
94101
raise NotFoundException("Tier not found")
95102

96-
db_tier = cast(TierRead, db_tier)
97-
db_rate_limit = await crud_rate_limits.get(db=db, tier_id=db_tier.id, id=id, schema_to_select=RateLimitRead)
103+
db_tier = cast(dict[str, Any], db_tier)
104+
105+
db_rate_limit = await crud_rate_limits.get(db=db, tier_id=db_tier["id"], id=id, schema_to_select=RateLimitRead)
98106
if db_rate_limit is None:
99107
raise NotFoundException("Rate Limit not found")
100108

@@ -110,8 +118,9 @@ async def erase_rate_limit(
110118
if not db_tier:
111119
raise NotFoundException("Tier not found")
112120

113-
db_tier = cast(TierRead, db_tier)
114-
db_rate_limit = await crud_rate_limits.get(db=db, tier_id=db_tier.id, id=id, schema_to_select=RateLimitRead)
121+
db_tier = cast(dict[str, Any], db_tier)
122+
123+
db_rate_limit = await crud_rate_limits.get(db=db, tier_id=db_tier["id"], id=id, schema_to_select=RateLimitRead)
115124
if db_rate_limit is None:
116125
raise NotFoundException("Rate Limit not found")
117126

src/app/api/v1/tiers.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
@router.post("/tier", dependencies=[Depends(get_current_superuser)], status_code=201)
1717
async def write_tier(
1818
request: Request, tier: TierCreate, db: Annotated[AsyncSession, Depends(async_get_db)]
19-
) -> TierRead:
19+
) -> dict[str, Any]:
2020
tier_internal_dict = tier.model_dump()
2121
db_tier = await crud_tiers.exists(db=db, name=tier_internal_dict["name"])
2222
if db_tier:
@@ -25,11 +25,14 @@ async def write_tier(
2525
tier_internal = TierCreateInternal(**tier_internal_dict)
2626
created_tier = await crud_tiers.create(db=db, object=tier_internal)
2727

28-
tier_read = await crud_tiers.get(db=db, id=created_tier.id, schema_to_select=TierRead)
28+
if created_tier is None:
29+
raise NotFoundException("Failed to create tier")
30+
31+
tier_read = await crud_tiers.get(db=db, id=created_tier["id"], schema_to_select=TierRead)
2932
if tier_read is None:
3033
raise NotFoundException("Created tier not found")
3134

32-
return cast(TierRead, tier_read)
35+
return cast(dict[str, Any], tier_read)
3336

3437

3538
@router.get("/tiers", response_model=PaginatedListResponse[TierRead])
@@ -43,12 +46,12 @@ async def read_tiers(
4346

4447

4548
@router.get("/tier/{name}", response_model=TierRead)
46-
async def read_tier(request: Request, name: str, db: Annotated[AsyncSession, Depends(async_get_db)]) -> TierRead:
49+
async def read_tier(request: Request, name: str, db: Annotated[AsyncSession, Depends(async_get_db)]) -> dict[str, Any]:
4750
db_tier = await crud_tiers.get(db=db, name=name, schema_to_select=TierRead)
4851
if db_tier is None:
4952
raise NotFoundException("Tier not found")
5053

51-
return cast(TierRead, db_tier)
54+
return cast(dict[str, Any], db_tier)
5255

5356

5457
@router.patch("/tier/{name}", dependencies=[Depends(get_current_superuser)])

0 commit comments

Comments
 (0)