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 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.service import InboxMessageService
from v1.users.dependencies import get_current_user
+5 -17
View File
@@ -1,6 +1,5 @@
from __future__ import annotations
from enum import Enum
from typing import TYPE_CHECKING
from uuid import UUID
@@ -74,13 +73,12 @@ class InboxMessageService(BaseService):
message = await self._repository.get_by_id(message_id, user_id)
if message is None:
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(
status_code=400, detail="Inbox message already handled"
)
if (
self._type_value(message.message_type)
!= InboxMessageType.CALENDAR.value
message.message_type.value != InboxMessageType.CALENDAR.value
or message.schedule_item_id is None
):
raise HTTPException(
@@ -139,7 +137,7 @@ class InboxMessageService(BaseService):
message = await self._repository.get_by_id(message_id, user_id)
if message is None:
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(
status_code=400, detail="Inbox message already handled"
)
@@ -170,11 +168,11 @@ class InboxMessageService(BaseService):
id=message.id,
recipient_id=message.recipient_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,
content=message.content,
is_read=bool(message.is_read),
status=InboxMessageStatus(self._status_value(message.status)),
status=InboxMessageStatus(message.status),
created_at=message.created_at,
)
@@ -186,13 +184,3 @@ class InboxMessageService(BaseService):
return int(data.get("permission", 0))
except (json.JSONDecodeError, ValueError, TypeError):
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]:
request = ScheduleItemListRequest(start_at=start_at, end_at=end_at)
items = await service.list_by_date_range(request)
return [
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
]
return [ScheduleItemListItem.model_validate(item) for item in items]
@router.get("/{item_id}", response_model=ScheduleItemResponse)
+9 -3
View File
@@ -98,6 +98,12 @@ class ScheduleItemListRequest(BaseModel):
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):
model_config: ClassVar[ConfigDict] = ConfigDict(extra="forbid")
@@ -109,11 +115,11 @@ class ScheduleItemShareRequest(BaseModel):
def _permission_value(self) -> int:
value = 0
if self.permission_view:
value |= 1
value |= _PERMISSION_VIEW
if self.permission_edit:
value |= 4
value |= _PERMISSION_EDIT
if self.permission_invite:
value |= 2
value |= _PERMISSION_INVITE
return value
+9 -19
View File
@@ -112,26 +112,16 @@ class ScheduleItemService(BaseService):
if existing is None:
raise HTTPException(status_code=404, detail="Schedule item not found")
update_data: dict = {}
if request.title is not None:
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()
# Build update dict from non-null fields
update_data = request.model_dump(exclude_unset=True)
next_start = (
request.start_at if request.start_at is not None else existing.start_at
)
next_end = request.end_at if request.end_at is not None else existing.end_at
# Handle metadata separately (model_dump returns dict)
if "metadata" in update_data and update_data["metadata"] is not None:
update_data["metadata"] = update_data["metadata"].model_dump()
# 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:
raise HTTPException(
status_code=400, detail="end_at must be after start_at"