Skip to content

Commit 2afe2e6

Browse files
authored
Merge pull request #223 from itsmeakhil/optimise-code-base-with-ponytail
Initial optimisation
2 parents 3d1b81d + 0f5dcce commit 2afe2e6

89 files changed

Lines changed: 1406 additions & 1776 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

apps/backend/app/api/routes/api_client/api.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
from fastapi import APIRouter, BackgroundTasks, Depends, Query
22

3-
from app.api.routes.auth.services import get_current_uid
3+
from app.api.routes.api_client import collections_delta
44
from app.api.routes.api_client import services as api_client_svc
55
from app.api.routes.api_client.schema import (
6+
HISTORY_MAX_ITEMS,
67
ApiClientCollectionCreate,
78
ApiClientCollectionOut,
89
ApiClientCollectionUpdate,
@@ -11,10 +12,8 @@
1112
ApiClientEnvironmentUpdate,
1213
ApiClientHistoryCreate,
1314
ApiClientHistoryOut,
14-
HISTORY_MAX_ITEMS,
1515
)
16-
from app.api.routes.api_client import collections_delta
17-
16+
from app.api.routes.auth.services import get_current_uid
1817

1918
router = APIRouter(prefix="/api-client", tags=["api-client"])
2019
router.include_router(collections_delta.router)

apps/backend/app/api/routes/api_client/collections_delta.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,17 @@
1717
from pymongo import ReturnDocument
1818
from pymongo.errors import PyMongoError
1919

20-
from app.api.routes.auth.services import get_current_uid
2120
from app.api.routes.api_client.schema import (
2221
AddItemOp,
22+
ApiClientCollectionOut,
2323
ApplyDeltaRequest,
2424
ApplyDeltaResponse,
25-
ApiClientCollectionOut,
2625
DeleteItemOp,
2726
MoveItemOp,
2827
Op,
2928
UpdateItemOp,
3029
)
30+
from app.api.routes.auth.services import get_current_uid
3131
from app.core.cache import bump_version
3232
from app.database import db_manager
3333
from app.utils.collection_name import API_CLIENT_COLLECTIONS

apps/backend/app/api/routes/api_client/schema.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import Annotated, Any, Literal, Optional, Union
1+
from typing import Annotated, Any, Literal
22

33
from pydantic import BaseModel, ConfigDict, Field
44

@@ -15,8 +15,8 @@ class ApiClientCollectionCreate(BaseModel):
1515
class ApiClientCollectionUpdate(BaseModel):
1616
model_config = ConfigDict(extra="ignore")
1717

18-
name: Optional[str] = Field(default=None, min_length=1)
19-
items: Optional[list[dict[str, Any]]] = None
18+
name: str | None = Field(default=None, min_length=1)
19+
items: list[dict[str, Any]] | None = None
2020

2121

2222
class ApiClientCollectionOut(ApiClientCollectionBase):
@@ -37,8 +37,8 @@ class ApiClientEnvironmentCreate(BaseModel):
3737
class ApiClientEnvironmentUpdate(BaseModel):
3838
model_config = ConfigDict(extra="ignore")
3939

40-
name: Optional[str] = Field(default=None, min_length=1)
41-
variables: Optional[list[dict[str, Any]]] = None
40+
name: str | None = Field(default=None, min_length=1)
41+
variables: list[dict[str, Any]] | None = None
4242

4343

4444
class ApiClientEnvironmentOut(ApiClientEnvironmentBase):
@@ -56,7 +56,7 @@ class AddItemOp(BaseModel):
5656
type: Literal["add"]
5757
parent_id: str
5858
item: dict[str, Any]
59-
position: Optional[int] = None
59+
position: int | None = None
6060

6161

6262
class UpdateItemOp(BaseModel):
@@ -78,7 +78,7 @@ class MoveItemOp(BaseModel):
7878

7979

8080
Op = Annotated[
81-
Union[AddItemOp, UpdateItemOp, DeleteItemOp, MoveItemOp],
81+
AddItemOp | UpdateItemOp | DeleteItemOp | MoveItemOp,
8282
Field(discriminator="type"),
8383
]
8484

@@ -103,8 +103,8 @@ class ApiClientHistoryCreate(BaseModel):
103103
body: dict[str, Any] = Field(default_factory=dict)
104104
auth: dict[str, Any] = Field(default_factory=dict)
105105
name: str = Field(min_length=1)
106-
status: Optional[int] = None
107-
timestamp: Optional[int] = None
106+
status: int | None = None
107+
timestamp: int | None = None
108108

109109

110110
class ApiClientHistoryOut(BaseModel):
@@ -119,5 +119,5 @@ class ApiClientHistoryOut(BaseModel):
119119
auth: dict[str, Any]
120120
name: str
121121
timestamp: int
122-
status: Optional[int] = None
122+
status: int | None = None
123123

apps/backend/app/api/routes/api_client/services.py

Lines changed: 20 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,10 @@
44
from bson import ObjectId
55
from bson.errors import InvalidId
66
from fastapi import HTTPException, status
7-
from pymongo import ReturnDocument
87
from pymongo.errors import PyMongoError
98

10-
from app.utils.collection_name import (
11-
API_CLIENT_COLLECTIONS,
12-
API_CLIENT_ENVIRONMENTS,
13-
API_CLIENT_HISTORY,
14-
)
159
from app.api.routes.api_client.schema import (
10+
HISTORY_MAX_ITEMS,
1611
ApiClientCollectionCreate,
1712
ApiClientCollectionOut,
1813
ApiClientCollectionUpdate,
@@ -21,10 +16,15 @@
2116
ApiClientEnvironmentUpdate,
2217
ApiClientHistoryCreate,
2318
ApiClientHistoryOut,
24-
HISTORY_MAX_ITEMS,
2519
)
26-
from app.core.cache import cached, bump_version
20+
from app.core.cache import bump_version, cached
2721
from app.database import db_manager
22+
from app.utils.collection_name import (
23+
API_CLIENT_COLLECTIONS,
24+
API_CLIENT_ENVIRONMENTS,
25+
API_CLIENT_HISTORY,
26+
)
27+
from app.utils.crud import safe_delete_one, safe_insert, safe_update_one
2828

2929
HISTORY_TRIM_BATCH_SIZE = 500
3030

@@ -70,13 +70,7 @@ async def list_collections(*, uid: str) -> list[ApiClientCollectionOut]:
7070

7171
async def create_collection(uid: str, body: ApiClientCollectionCreate) -> ApiClientCollectionOut:
7272
doc: dict[str, Any] = {"created_by": uid, "name": body.name, "items": []}
73-
try:
74-
result = await db_manager.insert_one(API_CLIENT_COLLECTIONS, doc)
75-
except PyMongoError as exc:
76-
raise HTTPException(
77-
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail="Failed to create collection."
78-
) from exc
79-
doc["_id"] = result.inserted_id
73+
await safe_insert(API_CLIENT_COLLECTIONS, doc, name="Collection")
8074
await bump_version(ns="api_client", uid=uid)
8175
return _collection_to_out(doc)
8276

@@ -89,28 +83,16 @@ async def patch_collection(uid: str, collection_id: str, body: ApiClientCollecti
8983
if not doc:
9084
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Collection not found.")
9185
return _collection_to_out(doc)
92-
try:
93-
doc = await db_manager.find_one_and_update(
94-
API_CLIENT_COLLECTIONS,
95-
{"_id": oid, "created_by": uid},
96-
{"$set": patch},
97-
return_document=ReturnDocument.AFTER,
98-
)
99-
except PyMongoError as exc:
100-
raise HTTPException(
101-
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail="Failed to update collection."
102-
) from exc
103-
if not doc:
104-
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Collection not found.")
86+
doc = await safe_update_one(
87+
API_CLIENT_COLLECTIONS, {"_id": oid, "created_by": uid}, patch, name="Collection"
88+
)
10589
await bump_version(ns="api_client", uid=uid)
10690
return _collection_to_out(doc)
10791

10892

10993
async def delete_collection(uid: str, collection_id: str) -> None:
11094
oid = _parse_oid(collection_id, kind="collection")
111-
result = await db_manager.delete_one(API_CLIENT_COLLECTIONS, {"_id": oid, "created_by": uid})
112-
if result.deleted_count == 0:
113-
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Collection not found.")
95+
await safe_delete_one(API_CLIENT_COLLECTIONS, {"_id": oid, "created_by": uid}, name="Collection")
11496
await bump_version(ns="api_client", uid=uid)
11597

11698

@@ -127,13 +109,7 @@ async def list_environments(*, uid: str) -> list[ApiClientEnvironmentOut]:
127109

128110
async def create_environment(uid: str, body: ApiClientEnvironmentCreate) -> ApiClientEnvironmentOut:
129111
doc: dict[str, Any] = {"created_by": uid, "name": body.name, "variables": []}
130-
try:
131-
result = await db_manager.insert_one(API_CLIENT_ENVIRONMENTS, doc)
132-
except PyMongoError as exc:
133-
raise HTTPException(
134-
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail="Failed to create environment."
135-
) from exc
136-
doc["_id"] = result.inserted_id
112+
await safe_insert(API_CLIENT_ENVIRONMENTS, doc, name="Environment")
137113
await bump_version(ns="api_client", uid=uid)
138114
return _env_to_out(doc)
139115

@@ -146,28 +122,16 @@ async def patch_environment(uid: str, environment_id: str, body: ApiClientEnviro
146122
if not doc:
147123
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Environment not found.")
148124
return _env_to_out(doc)
149-
try:
150-
doc = await db_manager.find_one_and_update(
151-
API_CLIENT_ENVIRONMENTS,
152-
{"_id": oid, "created_by": uid},
153-
{"$set": patch},
154-
return_document=ReturnDocument.AFTER,
155-
)
156-
except PyMongoError as exc:
157-
raise HTTPException(
158-
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail="Failed to update environment."
159-
) from exc
160-
if not doc:
161-
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Environment not found.")
125+
doc = await safe_update_one(
126+
API_CLIENT_ENVIRONMENTS, {"_id": oid, "created_by": uid}, patch, name="Environment"
127+
)
162128
await bump_version(ns="api_client", uid=uid)
163129
return _env_to_out(doc)
164130

165131

166132
async def delete_environment(uid: str, environment_id: str) -> None:
167133
oid = _parse_oid(environment_id, kind="environment")
168-
result = await db_manager.delete_one(API_CLIENT_ENVIRONMENTS, {"_id": oid, "created_by": uid})
169-
if result.deleted_count == 0:
170-
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Environment not found.")
134+
await safe_delete_one(API_CLIENT_ENVIRONMENTS, {"_id": oid, "created_by": uid}, name="Environment")
171135
await bump_version(ns="api_client", uid=uid)
172136

173137

@@ -228,22 +192,14 @@ async def create_history(uid: str, body: ApiClientHistoryCreate) -> ApiClientHis
228192
"timestamp": ts,
229193
"status": body.status,
230194
}
231-
try:
232-
result = await db_manager.insert_one(API_CLIENT_HISTORY, doc)
233-
except PyMongoError as exc:
234-
raise HTTPException(
235-
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail="Failed to save history entry."
236-
) from exc
237-
doc["_id"] = result.inserted_id
195+
await safe_insert(API_CLIENT_HISTORY, doc, name="History entry")
238196
await bump_version(ns="api_client", uid=uid)
239197
return _history_doc_to_out(doc)
240198

241199

242200
async def delete_history_entry(uid: str, entry_id: str) -> None:
243201
oid = _parse_oid(entry_id, kind="history")
244-
result = await db_manager.delete_one(API_CLIENT_HISTORY, {"_id": oid, "created_by": uid})
245-
if result.deleted_count == 0:
246-
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="History entry not found.")
202+
await safe_delete_one(API_CLIENT_HISTORY, {"_id": oid, "created_by": uid}, name="History entry")
247203
await bump_version(ns="api_client", uid=uid)
248204

249205

apps/backend/app/api/routes/bookmarks/api.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
from fastapi import APIRouter, Depends, Query
21

3-
from typing import Optional
2+
from fastapi import APIRouter, Depends, Query
43

54
from app.api.routes.auth.services import get_current_uid
65
from app.api.routes.bookmarks import services as bm_svc
@@ -46,12 +45,12 @@ async def clear_all(uid: str = Depends(get_current_uid)) -> dict[str, int]:
4645
@bookmarks_router.get("", response_model=list[BookmarkOut], summary="List bookmarks")
4746
async def list_bookmarks(
4847
uid: str = Depends(get_current_uid),
49-
folder_id: Optional[str] = Query(
48+
folder_id: str | None = Query(
5049
default=None,
5150
alias="folderId",
5251
),
5352
skip: int = Query(default=0, ge=0),
54-
limit: Optional[int] = Query(default=None, ge=1, le=500),
53+
limit: int | None = Query(default=None, ge=1, le=500),
5554
) -> list[BookmarkOut]:
5655
return await bm_svc.list_bookmarks(uid=uid, folder_id=folder_id, skip=skip, limit=limit)
5756

@@ -106,7 +105,7 @@ async def remove_bookmark(
106105
async def list_folders(
107106
uid: str = Depends(get_current_uid),
108107
skip: int = Query(default=0, ge=0),
109-
limit: Optional[int] = Query(default=None, ge=1, le=500),
108+
limit: int | None = Query(default=None, ge=1, le=500),
110109
) -> list[BookmarkFolderOut]:
111110
return await bm_svc.list_folders(uid=uid, skip=skip, limit=limit)
112111

apps/backend/app/api/routes/bookmarks/schema.py

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
db.bookmarkFolders.create_index([("created_by", 1), ("createdAt", 1)])
2121
"""
2222

23-
from typing import Any, Optional
2423

2524
from pydantic import BaseModel, ConfigDict, Field
2625

@@ -36,31 +35,31 @@ class BookmarkBase(BaseModel):
3635

3736
title: str = Field(min_length=1)
3837
url: str = Field(min_length=1)
39-
description: Optional[str] = None
40-
favicon: Optional[str] = None
38+
description: str | None = None
39+
favicon: str | None = None
4140
tags: list[str] = Field(default_factory=list)
42-
folderId: Optional[str] = None
41+
folderId: str | None = None
4342

4443

4544
class BookmarkCreate(BookmarkBase):
4645
"""Optional ``id`` — if omitted, server generates one (client uses timestamp-random)."""
4746

48-
id: Optional[str] = None
47+
id: str | None = None
4948

5049

5150
class BookmarkUpdate(BaseModel):
5251
model_config = ConfigDict(extra="ignore")
5352

54-
title: Optional[str] = Field(default=None, min_length=1)
55-
url: Optional[str] = Field(default=None, min_length=1)
56-
description: Optional[str] = None
57-
favicon: Optional[str] = None
58-
tags: Optional[list[str]] = None
59-
folderId: Optional[str] = None
53+
title: str | None = Field(default=None, min_length=1)
54+
url: str | None = Field(default=None, min_length=1)
55+
description: str | None = None
56+
favicon: str | None = None
57+
tags: list[str] | None = None
58+
folderId: str | None = None
6059

6160

6261
class BookmarkMove(BaseModel):
63-
folderId: Optional[str] = None
62+
folderId: str | None = None
6463

6564

6665
class BookmarkOut(BookmarkBase):
@@ -73,24 +72,24 @@ class BookmarkFolderBase(BaseModel):
7372
model_config = ConfigDict(extra="ignore")
7473

7574
name: str = Field(min_length=1)
76-
parentId: Optional[str] = None
77-
color: Optional[str] = None
78-
icon: Optional[str] = None
79-
isExpanded: Optional[bool] = None
75+
parentId: str | None = None
76+
color: str | None = None
77+
icon: str | None = None
78+
isExpanded: bool | None = None
8079

8180

8281
class BookmarkFolderCreate(BookmarkFolderBase):
83-
id: Optional[str] = None
82+
id: str | None = None
8483

8584

8685
class BookmarkFolderUpdate(BaseModel):
8786
model_config = ConfigDict(extra="ignore")
8887

89-
name: Optional[str] = Field(default=None, min_length=1)
90-
parentId: Optional[str] = None
91-
color: Optional[str] = None
92-
icon: Optional[str] = None
93-
isExpanded: Optional[bool] = None
88+
name: str | None = Field(default=None, min_length=1)
89+
parentId: str | None = None
90+
color: str | None = None
91+
icon: str | None = None
92+
isExpanded: bool | None = None
9493

9594

9695
class BookmarkFolderExpanded(BaseModel):

0 commit comments

Comments
 (0)