From c22692ed1d24b910e2bf46f024df9e63fd148594 Mon Sep 17 00:00:00 2001 From: qzl Date: Sat, 28 Feb 2026 12:48:01 +0800 Subject: [PATCH] refactor: simplify code - extract constants, reduce complexity --- backend/src/v1/inbox_messages/dependencies.py | 2 +- backend/src/v1/inbox_messages/service.py | 22 ++++----------- backend/src/v1/schedule_items/router.py | 12 +------- backend/src/v1/schedule_items/schemas.py | 12 ++++++-- backend/src/v1/schedule_items/service.py | 28 ++++++------------- 5 files changed, 25 insertions(+), 51 deletions(-) diff --git a/backend/src/v1/inbox_messages/dependencies.py b/backend/src/v1/inbox_messages/dependencies.py index d65ebb1..5a1cb30 100644 --- a/backend/src/v1/inbox_messages/dependencies.py +++ b/backend/src/v1/inbox_messages/dependencies.py @@ -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 diff --git a/backend/src/v1/inbox_messages/service.py b/backend/src/v1/inbox_messages/service.py index 467a67b..4a299e2 100644 --- a/backend/src/v1/inbox_messages/service.py +++ b/backend/src/v1/inbox_messages/service.py @@ -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) diff --git a/backend/src/v1/schedule_items/router.py b/backend/src/v1/schedule_items/router.py index 0ff63da..e2d9922 100644 --- a/backend/src/v1/schedule_items/router.py +++ b/backend/src/v1/schedule_items/router.py @@ -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) diff --git a/backend/src/v1/schedule_items/schemas.py b/backend/src/v1/schedule_items/schemas.py index ef05511..ac4a849 100644 --- a/backend/src/v1/schedule_items/schemas.py +++ b/backend/src/v1/schedule_items/schemas.py @@ -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 diff --git a/backend/src/v1/schedule_items/service.py b/backend/src/v1/schedule_items/service.py index 89b0596..73642e5 100644 --- a/backend/src/v1/schedule_items/service.py +++ b/backend/src/v1/schedule_items/service.py @@ -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"