Skip to content

Commit a7f84be

Browse files
committed
♻️ refactor(items): 将物品路由逻辑迁移至服务层
- 新增ItemService处理所有物品相关业务逻辑 - 重构路由函数调用服务层方法 - 移除直接数据库操作实现关注点分离 🗑️ chore(crud): 删除遗留的CRUD模块 - 迁移所有CRUD功能至对应的服务类 - 清理不再使用的遗留代码 💄 style(code): 调整代码格式和导入顺序 - 统一模型文件的导入顺序 - 格式化长参数列表为更易读的多行格式 - 移除未使用的导入依赖
1 parent 0e43866 commit a7f84be

File tree

4 files changed

+44
-123
lines changed

4 files changed

+44
-123
lines changed

backend/app/api/routes/items.py

Lines changed: 30 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
import uuid
22
from typing import Any
33

4-
from fastapi import APIRouter, HTTPException
5-
from sqlmodel import func, select
4+
from fastapi import APIRouter
5+
66

77
from app.api.deps import CurrentUser, SessionDep
8-
from app.models import TokenPayload
9-
from app.model.users import User
8+
from app.model.items import ItemCreate, ItemPublic, ItemsPublic, ItemUpdate
9+
from app.model.users import Message
10+
from app.service.item_service import ItemService
1011

1112
router = APIRouter(prefix="/items", tags=["items"])
1213

@@ -18,42 +19,25 @@ def read_items(
1819
"""
1920
Retrieve items.
2021
"""
21-
22-
if current_user.is_superuser:
23-
count_statement = select(func.count()).select_from(Item)
24-
count = session.exec(count_statement).one()
25-
statement = select(Item).offset(skip).limit(limit)
26-
items = session.exec(statement).all()
27-
else:
28-
count_statement = (
29-
select(func.count())
30-
.select_from(Item)
31-
.where(Item.owner_id == current_user.id)
32-
)
33-
count = session.exec(count_statement).one()
34-
statement = (
35-
select(Item)
36-
.where(Item.owner_id == current_user.id)
37-
.offset(skip)
38-
.limit(limit)
39-
)
40-
items = session.exec(statement).all()
41-
42-
return ItemsPublic(data=items, count=count)
22+
item_service = ItemService(session)
23+
result = item_service.read_items(
24+
owner_id=current_user.id,
25+
is_superuser=current_user.is_superuser,
26+
skip=skip,
27+
limit=limit,
28+
)
29+
return ItemsPublic(data=result["data"], count=result["count"])
4330

4431

4532
@router.get("/{id}", response_model=ItemPublic)
4633
def read_item(session: SessionDep, current_user: CurrentUser, id: uuid.UUID) -> Any:
4734
"""
4835
Get item by ID.
4936
"""
50-
item = session.get(Item, id)
51-
if not item:
52-
raise HTTPException(status_code=404, detail="Item not found")
53-
if not current_user.is_superuser and (item.owner_id != current_user.id):
54-
raise HTTPException(status_code=400, detail="Not enough permissions")
55-
return item
56-
37+
item_service = ItemService(session)
38+
return item_service.read_item(
39+
item_id=id, owner_id=current_user.id, is_superuser=current_user.is_superuser
40+
)
5741

5842
@router.post("/", response_model=ItemPublic)
5943
def create_item(
@@ -62,11 +46,8 @@ def create_item(
6246
"""
6347
Create new item.
6448
"""
65-
item = Item.model_validate(item_in, update={"owner_id": current_user.id})
66-
session.add(item)
67-
session.commit()
68-
session.refresh(item)
69-
return item
49+
item_service = ItemService(session)
50+
return item_service.create_item(item_in, current_user.id)
7051

7152

7253
@router.put("/{id}", response_model=ItemPublic)
@@ -80,17 +61,13 @@ def update_item(
8061
"""
8162
Update an item.
8263
"""
83-
item = session.get(Item, id)
84-
if not item:
85-
raise HTTPException(status_code=404, detail="Item not found")
86-
if not current_user.is_superuser and (item.owner_id != current_user.id):
87-
raise HTTPException(status_code=400, detail="Not enough permissions")
88-
update_dict = item_in.model_dump(exclude_unset=True)
89-
item.sqlmodel_update(update_dict)
90-
session.add(item)
91-
session.commit()
92-
session.refresh(item)
93-
return item
64+
item_service = ItemService(session)
65+
return item_service.update_item(
66+
item_id=id,
67+
item_in=item_in,
68+
owner_id=current_user.id,
69+
is_superuser=current_user.is_superuser,
70+
)
9471

9572

9673
@router.delete("/{id}")
@@ -100,11 +77,7 @@ def delete_item(
10077
"""
10178
Delete an item.
10279
"""
103-
item = session.get(Item, id)
104-
if not item:
105-
raise HTTPException(status_code=404, detail="Item not found")
106-
if not current_user.is_superuser and (item.owner_id != current_user.id):
107-
raise HTTPException(status_code=400, detail="Not enough permissions")
108-
session.delete(item)
109-
session.commit()
110-
return Message(message="Item deleted successfully")
80+
item_service = ItemService(session)
81+
item_service.delete_item(
82+
item_id=id, owner_id=current_user.id, is_superuser=current_user.is_superuser
83+
)

backend/app/crud.py

Lines changed: 0 additions & 54 deletions
This file was deleted.

backend/app/model/items.py

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
import uuid
22
from typing import Any
33

4-
from sqlmodel import Field, Relationship, SQLModel, Session, select, func
5-
from fastapi import HTTPException
4+
from sqlmodel import Field, Relationship, Session, SQLModel, func, select
65

76
from app.model.users import User
87

@@ -33,7 +32,9 @@ class Item(ItemBase, table=True):
3332
owner: User | None = Relationship(back_populates="items")
3433

3534
@classmethod
36-
def create(cls, session: Session, item_in: ItemCreate, owner_id: uuid.UUID) -> "Item":
35+
def create(
36+
cls, session: Session, item_in: ItemCreate, owner_id: uuid.UUID
37+
) -> "Item":
3738
db_item = cls.model_validate(item_in, update={"owner_id": owner_id})
3839
session.add(db_item)
3940
session.commit()
@@ -42,7 +43,12 @@ def create(cls, session: Session, item_in: ItemCreate, owner_id: uuid.UUID) -> "
4243

4344
@classmethod
4445
def get_items(
45-
cls, session: Session, owner_id: uuid.UUID, is_superuser: bool, skip: int = 0, limit: int = 100
46+
cls,
47+
session: Session,
48+
owner_id: uuid.UUID,
49+
is_superuser: bool,
50+
skip: int = 0,
51+
limit: int = 100,
4652
) -> Any:
4753
if is_superuser:
4854
count_statement = select(func.count()).select_from(cls)
@@ -51,16 +57,11 @@ def get_items(
5157
items = session.exec(statement).all()
5258
else:
5359
count_statement = (
54-
select(func.count())
55-
.select_from(cls)
56-
.where(cls.owner_id == owner_id)
60+
select(func.count()).select_from(cls).where(cls.owner_id == owner_id)
5761
)
5862
count = session.exec(count_statement).one()
5963
statement = (
60-
select(cls)
61-
.where(cls.owner_id == owner_id)
62-
.offset(skip)
63-
.limit(limit)
64+
select(cls).where(cls.owner_id == owner_id).offset(skip).limit(limit)
6465
)
6566
items = session.exec(statement).all()
6667
return {"data": items, "count": count}

backend/app/tests/utils/user.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
from fastapi.testclient import TestClient
22
from sqlmodel import Session
33

4-
from app.service.user_service import UserService
4+
55
from app.core.config import settings
66
from app.model.users import User, UserCreate, UserUpdate
7+
from app.service.user_service import UserService
78
from app.tests.utils.utils import random_email, random_lower_string
89

910

0 commit comments

Comments
 (0)