refactor: simplify code - extract constants, reduce complexity

This commit is contained in:
qzl
2026-02-28 12:48:01 +08:00
parent ce8cd1d31f
commit c22692ed1d
5 changed files with 25 additions and 51 deletions
@@ -6,7 +6,7 @@ from fastapi import Depends
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from core.auth.models import CurrentUser from core.auth.models import CurrentUser
from core.db.session import get_db from core.db import get_db
from v1.inbox_messages.repository import SQLAlchemyInboxMessageRepository from v1.inbox_messages.repository import SQLAlchemyInboxMessageRepository
from v1.inbox_messages.service import InboxMessageService from v1.inbox_messages.service import InboxMessageService
from v1.users.dependencies import get_current_user from v1.users.dependencies import get_current_user
+5 -17
View File
@@ -1,6 +1,5 @@
from __future__ import annotations from __future__ import annotations
from enum import Enum
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
from uuid import UUID from uuid import UUID
@@ -74,13 +73,12 @@ class InboxMessageService(BaseService):
message = await self._repository.get_by_id(message_id, user_id) message = await self._repository.get_by_id(message_id, user_id)
if message is None: if message is None:
raise HTTPException(status_code=404, detail="Inbox message not found") raise HTTPException(status_code=404, detail="Inbox message not found")
if self._status_value(message.status) != InboxMessageStatus.PENDING.value: if message.status.value != InboxMessageStatus.PENDING.value:
raise HTTPException( raise HTTPException(
status_code=400, detail="Inbox message already handled" status_code=400, detail="Inbox message already handled"
) )
if ( if (
self._type_value(message.message_type) message.message_type.value != InboxMessageType.CALENDAR.value
!= InboxMessageType.CALENDAR.value
or message.schedule_item_id is None or message.schedule_item_id is None
): ):
raise HTTPException( raise HTTPException(
@@ -139,7 +137,7 @@ class InboxMessageService(BaseService):
message = await self._repository.get_by_id(message_id, user_id) message = await self._repository.get_by_id(message_id, user_id)
if message is None: if message is None:
raise HTTPException(status_code=404, detail="Inbox message not found") raise HTTPException(status_code=404, detail="Inbox message not found")
if self._status_value(message.status) != InboxMessageStatus.PENDING.value: if message.status.value != InboxMessageStatus.PENDING.value:
raise HTTPException( raise HTTPException(
status_code=400, detail="Inbox message already handled" status_code=400, detail="Inbox message already handled"
) )
@@ -170,11 +168,11 @@ class InboxMessageService(BaseService):
id=message.id, id=message.id,
recipient_id=message.recipient_id, recipient_id=message.recipient_id,
sender_id=message.sender_id, sender_id=message.sender_id,
message_type=InboxMessageType(self._type_value(message.message_type)), message_type=InboxMessageType(message.message_type),
schedule_item_id=message.schedule_item_id, schedule_item_id=message.schedule_item_id,
content=message.content, content=message.content,
is_read=bool(message.is_read), is_read=bool(message.is_read),
status=InboxMessageStatus(self._status_value(message.status)), status=InboxMessageStatus(message.status),
created_at=message.created_at, created_at=message.created_at,
) )
@@ -186,13 +184,3 @@ class InboxMessageService(BaseService):
return int(data.get("permission", 0)) return int(data.get("permission", 0))
except (json.JSONDecodeError, ValueError, TypeError): except (json.JSONDecodeError, ValueError, TypeError):
return 0 return 0
def _status_value(self, status: object) -> str:
if isinstance(status, Enum):
return str(status.value)
return str(status)
def _type_value(self, message_type: object) -> str:
if isinstance(message_type, Enum):
return str(message_type.value)
return str(message_type)
+1 -11
View File
@@ -38,17 +38,7 @@ async def list_schedule_items(
) -> list[ScheduleItemListItem]: ) -> list[ScheduleItemListItem]:
request = ScheduleItemListRequest(start_at=start_at, end_at=end_at) request = ScheduleItemListRequest(start_at=start_at, end_at=end_at)
items = await service.list_by_date_range(request) items = await service.list_by_date_range(request)
return [ return [ScheduleItemListItem.model_validate(item) for item in items]
ScheduleItemListItem(
id=item.id,
title=item.title,
start_at=item.start_at,
end_at=item.end_at,
timezone=item.timezone,
status=item.status,
)
for item in items
]
@router.get("/{item_id}", response_model=ScheduleItemResponse) @router.get("/{item_id}", response_model=ScheduleItemResponse)
+9 -3
View File
@@ -98,6 +98,12 @@ class ScheduleItemListRequest(BaseModel):
end_at: datetime end_at: datetime
# Permission bit constants (matching PermissionBits in inbox_messages/schemas.py)
_PERMISSION_VIEW = 1 # 001
_PERMISSION_INVITE = 2 # 010
_PERMISSION_EDIT = 4 # 100
class ScheduleItemShareRequest(BaseModel): class ScheduleItemShareRequest(BaseModel):
model_config: ClassVar[ConfigDict] = ConfigDict(extra="forbid") model_config: ClassVar[ConfigDict] = ConfigDict(extra="forbid")
@@ -109,11 +115,11 @@ class ScheduleItemShareRequest(BaseModel):
def _permission_value(self) -> int: def _permission_value(self) -> int:
value = 0 value = 0
if self.permission_view: if self.permission_view:
value |= 1 value |= _PERMISSION_VIEW
if self.permission_edit: if self.permission_edit:
value |= 4 value |= _PERMISSION_EDIT
if self.permission_invite: if self.permission_invite:
value |= 2 value |= _PERMISSION_INVITE
return value return value
+9 -19
View File
@@ -112,26 +112,16 @@ class ScheduleItemService(BaseService):
if existing is None: if existing is None:
raise HTTPException(status_code=404, detail="Schedule item not found") raise HTTPException(status_code=404, detail="Schedule item not found")
update_data: dict = {} # Build update dict from non-null fields
if request.title is not None: update_data = request.model_dump(exclude_unset=True)
update_data["title"] = request.title
if request.description is not None:
update_data["description"] = request.description
if request.start_at is not None:
update_data["start_at"] = request.start_at
if request.end_at is not None:
update_data["end_at"] = request.end_at
if request.timezone is not None:
update_data["timezone"] = request.timezone
if request.status is not None:
update_data["status"] = request.status
if request.metadata is not None:
update_data["metadata"] = request.metadata.model_dump()
next_start = ( # Handle metadata separately (model_dump returns dict)
request.start_at if request.start_at is not None else existing.start_at if "metadata" in update_data and update_data["metadata"] is not None:
) update_data["metadata"] = update_data["metadata"].model_dump()
next_end = request.end_at if request.end_at is not None else existing.end_at
# Validate time range
next_start = update_data.get("start_at", existing.start_at)
next_end = update_data.get("end_at", existing.end_at)
if next_end is not None and next_end <= next_start: if next_end is not None and next_end <= next_start:
raise HTTPException( raise HTTPException(
status_code=400, detail="end_at must be after start_at" status_code=400, detail="end_at must be after start_at"